[BACK]Return to if.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / net

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/net/if.c between version 1.62.4.6 and 1.63

version 1.62.4.6, 2000/12/31 17:57:40 version 1.63, 2000/07/02 00:20:48
Line 121 
Line 121 
   
 #include <net/if.h>  #include <net/if.h>
 #include <net/if_dl.h>  #include <net/if_dl.h>
 #include <net/if_ether.h>  
 #include <net/if_ieee80211.h>  
 #include <net/if_types.h>  #include <net/if_types.h>
 #include <net/radix.h>  #include <net/radix.h>
 #include <net/route.h>  #include <net/route.h>
Line 134 
Line 132 
 #ifdef INET6  #ifdef INET6
 /*XXX*/  /*XXX*/
 #include <netinet/in.h>  #include <netinet/in.h>
 #include <netinet6/in6_var.h>  
 #endif  #endif
   
 int     ifqmaxlen = IFQ_MAXLEN;  int     ifqmaxlen = IFQ_MAXLEN;
Line 151  extern void nd6_setmtu __P((struct ifnet
Line 148  extern void nd6_setmtu __P((struct ifnet
 int     if_rt_walktree __P((struct radix_node *, void *));  int     if_rt_walktree __P((struct radix_node *, void *));
   
 struct if_clone *if_clone_lookup __P((const char *, int *));  struct if_clone *if_clone_lookup __P((const char *, int *));
 int if_clone_list __P((struct if_clonereq *));  
   
 LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);  LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);
 int if_cloners_count;  
   
 /*  /*
  * Network interface utility routines.   * Network interface utility routines.
Line 581  if_clone_attach(ifc)
Line 576  if_clone_attach(ifc)
 {  {
   
         LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);          LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);
         if_cloners_count++;  
 }  }
   
 /*  /*
Line 593  if_clone_detach(ifc)
Line 587  if_clone_detach(ifc)
 {  {
   
         LIST_REMOVE(ifc, ifc_list);          LIST_REMOVE(ifc, ifc_list);
         if_cloners_count--;  
 }  
   
 /*  
  * Provide list of interface cloners to userspace.  
  */  
 int  
 if_clone_list(ifcr)  
         struct if_clonereq *ifcr;  
 {  
         char outbuf[IFNAMSIZ], *dst;  
         struct if_clone *ifc;  
         int count, error = 0;  
   
         ifcr->ifcr_total = if_cloners_count;  
         if ((dst = ifcr->ifcr_buffer) == NULL) {  
                 /* Just asking how many there are. */  
                 return (0);  
         }  
   
         if (ifcr->ifcr_count < 0)  
                 return (EINVAL);  
   
         count = (if_cloners_count < ifcr->ifcr_count) ?  
             if_cloners_count : ifcr->ifcr_count;  
   
         for (ifc = LIST_FIRST(&if_cloners); ifc != NULL && count != 0;  
              ifc = LIST_NEXT(ifc, ifc_list), count--, dst += IFNAMSIZ) {  
                 strncpy(outbuf, ifc->ifc_name, IFNAMSIZ);  
                 outbuf[IFNAMSIZ - 1] = '\0';    /* sanity */  
                 error = copyout(outbuf, dst, IFNAMSIZ);  
                 if (error)  
                         break;  
         }  
   
         return (error);  
 }  }
   
 /*  /*
Line 1015  ifioctl(so, cmd, data, p)
Line 973  ifioctl(so, cmd, data, p)
   
         switch (cmd) {          switch (cmd) {
         case SIOCIFCREATE:          case SIOCIFCREATE:
                   return (if_clone_create(ifr->ifr_name));
         case SIOCIFDESTROY:          case SIOCIFDESTROY:
                 if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)                  return (if_clone_destroy(ifr->ifr_name));
                         return (error);  
                 return ((cmd == SIOCIFCREATE) ?  
                         if_clone_create(ifr->ifr_name) :  
                         if_clone_destroy(ifr->ifr_name));  
   
         case SIOCIFGCLONERS:  
                 return (if_clone_list((struct if_clonereq *)data));  
         }          }
   
         ifp = ifunit(ifr->ifr_name);          ifp = ifunit(ifr->ifr_name);
Line 1090  ifioctl(so, cmd, data, p)
Line 1042  ifioctl(so, cmd, data, p)
                 }                  }
                 break;                  break;
         }          }
         case SIOCSIFPHYADDR:  
         case SIOCDIFPHYADDR:  
 #ifdef INET6  
         case SIOCSIFPHYADDR_IN6:  
 #endif  
         case SIOCADDMULTI:          case SIOCADDMULTI:
         case SIOCDELMULTI:          case SIOCDELMULTI:
         case SIOCSIFMEDIA:          case SIOCSIFMEDIA:
                 if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)                  if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
                         return (error);                          return (error);
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case SIOCGIFPSRCADDR:  
         case SIOCGIFPDSTADDR:  
         case SIOCGIFMEDIA:          case SIOCGIFMEDIA:
                 if (ifp->if_ioctl == 0)                  if (ifp->if_ioctl == 0)
                         return (EOPNOTSUPP);                          return (EOPNOTSUPP);
Line 1110  ifioctl(so, cmd, data, p)
Line 1055  ifioctl(so, cmd, data, p)
                 break;                  break;
   
         case SIOCSDRVSPEC:          case SIOCSDRVSPEC:
         case SIOCS80211NWID:  
         case SIOCS80211NWKEY:  
                 /* XXX:  need to pass proc pointer through to driver... */                  /* XXX:  need to pass proc pointer through to driver... */
                 if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)                  if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
                         return (error);                          return (error);
Line 1209  ifconf(cmd, data)
Line 1152  ifconf(cmd, data)
         int space = ifc->ifc_len, error = 0;          int space = ifc->ifc_len, error = 0;
   
         ifrp = ifc->ifc_req;          ifrp = ifc->ifc_req;
         for (ifp = ifnet.tqh_first; ifp != 0; ifp = ifp->if_list.tqe_next) {          for (ifp = ifnet.tqh_first;
               space >= sizeof (ifr) && ifp != 0; ifp = ifp->if_list.tqe_next) {
                 bcopy(ifp->if_xname, ifr.ifr_name, IFNAMSIZ);                  bcopy(ifp->if_xname, ifr.ifr_name, IFNAMSIZ);
                 if ((ifa = ifp->if_addrlist.tqh_first) == 0) {                  if ((ifa = ifp->if_addrlist.tqh_first) == 0) {
                         bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));                          bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
                         if (space >= (int)sizeof (ifr)) {                          error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,                              sizeof(ifr));
                                                 sizeof(ifr));                          if (error)
                                 if (error)                                  break;
                                         break;  
                         }  
                         space -= sizeof (ifr), ifrp++;                          space -= sizeof (ifr), ifrp++;
                 } else                  } else
                     for (; ifa != 0; ifa = ifa->ifa_list.tqe_next) {                      for (; space >= sizeof (ifr) && ifa != 0; ifa = ifa->ifa_list.tqe_next) {
                         struct sockaddr *sa = ifa->ifa_addr;                          struct sockaddr *sa = ifa->ifa_addr;
 #if defined(COMPAT_43) || defined(COMPAT_LINUX) || defined(COMPAT_SVR4)  #if defined(COMPAT_43) || defined(COMPAT_LINUX) || defined(COMPAT_SVR4)
                         if (cmd == OSIOCGIFCONF) {                          if (cmd == OSIOCGIFCONF) {
Line 1229  ifconf(cmd, data)
Line 1171  ifconf(cmd, data)
                                          (struct osockaddr *)&ifr.ifr_addr;                                           (struct osockaddr *)&ifr.ifr_addr;
                                 ifr.ifr_addr = *sa;                                  ifr.ifr_addr = *sa;
                                 osa->sa_family = sa->sa_family;                                  osa->sa_family = sa->sa_family;
                                 if (space >= (int)sizeof (ifr)) {                                  error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
                                         error = copyout((caddr_t)&ifr,                                                  sizeof (ifr));
                                                         (caddr_t)ifrp,                                  ifrp++;
                                                         sizeof (ifr));  
                                         ifrp++;  
                                 }  
                         } else                          } else
 #endif  #endif
                         if (sa->sa_len <= sizeof(*sa)) {                          if (sa->sa_len <= sizeof(*sa)) {
                                 ifr.ifr_addr = *sa;                                  ifr.ifr_addr = *sa;
                                 if (space >= (int)sizeof (ifr)) {                                  error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
                                         error = copyout((caddr_t)&ifr,                                                  sizeof (ifr));
                                                         (caddr_t)ifrp,                                  ifrp++;
                                                         sizeof (ifr));  
                                         ifrp++;  
                                 }  
                         } else {                          } else {
                                 space -= sa->sa_len - sizeof(*sa);                                  space -= sa->sa_len - sizeof(*sa);
                                 if (space >= (int)sizeof (ifr)) {                                  if (space < sizeof (ifr))
                                         error = copyout((caddr_t)&ifr,                                          break;
                                                         (caddr_t)ifrp,                                  error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
                                                         sizeof (ifr.ifr_name));                                                  sizeof (ifr.ifr_name));
                                         if (error == 0) {                                  if (error == 0)
                                                 error = copyout((caddr_t)sa,                                      error = copyout((caddr_t)sa,
                                                   (caddr_t)&ifrp->ifr_addr,                                        (caddr_t)&ifrp->ifr_addr, sa->sa_len);
                                                   sa->sa_len);                                  ifrp = (struct ifreq *)
                                         }                                          (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
                                         ifrp = (struct ifreq *)  
                                                 (sa->sa_len +  
                                                  (caddr_t)&ifrp->ifr_addr);  
                                 }  
                         }                          }
                         if (error)                          if (error)
                                 break;                                  break;

Legend:
Removed from v.1.62.4.6  
changed lines
  Added in v.1.63

CVSweb <webmaster@jp.NetBSD.org>