version 1.62.4.6, 2000/12/31 17:57:40 |
version 1.63, 2000/07/02 00:20:48 |
|
|
|
|
#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> |
|
|
#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; |