version 1.193.2.1, 2007/08/15 13:49:38 |
version 1.193.2.2, 2007/09/03 10:23:07 |
Line 285 if_alloc_sadl(struct ifnet *ifp) |
|
Line 285 if_alloc_sadl(struct ifnet *ifp) |
|
|
|
namelen = strlen(ifp->if_xname); |
namelen = strlen(ifp->if_xname); |
addrlen = ifp->if_addrlen; |
addrlen = ifp->if_addrlen; |
socksize = roundup( |
socksize = roundup(sockaddr_dl_measure(namelen, addrlen), sizeof(long)); |
MAX(sizeof(*sdl), |
|
sockaddr_dl_measure(namelen, addrlen)), sizeof(long)); |
|
ifasize = sizeof(*ifa) + 2 * socksize; |
ifasize = sizeof(*ifa) + 2 * socksize; |
ifa = (struct ifaddr *)malloc(ifasize, M_IFADDR, M_WAITOK); |
ifa = (struct ifaddr *)malloc(ifasize, M_IFADDR, M_WAITOK); |
memset(ifa, 0, ifasize); |
memset(ifa, 0, ifasize); |
Line 295 if_alloc_sadl(struct ifnet *ifp) |
|
Line 293 if_alloc_sadl(struct ifnet *ifp) |
|
sdl = (struct sockaddr_dl *)(ifa + 1); |
sdl = (struct sockaddr_dl *)(ifa + 1); |
mask = (struct sockaddr_dl *)(socksize + (char *)sdl); |
mask = (struct sockaddr_dl *)(socksize + (char *)sdl); |
|
|
sockaddr_dl_init(sdl, ifp->if_index, ifp->if_type, |
sockaddr_dl_init(sdl, socksize, ifp->if_index, ifp->if_type, |
ifp->if_xname, namelen, NULL, addrlen); |
ifp->if_xname, namelen, NULL, addrlen); |
mask->sdl_len = sockaddr_dl_measure(namelen, 0); |
mask->sdl_len = sockaddr_dl_measure(namelen, 0); |
while (namelen != 0) |
memset(&mask->sdl_data[0], 0xff, namelen); |
mask->sdl_data[--namelen] = 0xff; |
|
|
|
ifnet_addrs[ifp->if_index] = ifa; |
ifnet_addrs[ifp->if_index] = ifa; |
IFAREF(ifa); |
IFAREF(ifa); |
Line 1335 ifioctl(struct socket *so, u_long cmd, v |
|
Line 1332 ifioctl(struct socket *so, u_long cmd, v |
|
} |
} |
|
|
#ifdef COMPAT_OIFREQ |
#ifdef COMPAT_OIFREQ |
cmd = cvtcmd(cmd); |
cmd = compat_cvtcmd(cmd); |
if (cmd != ocmd) { |
if (cmd != ocmd) { |
oifr = data; |
oifr = data; |
data = ifr = &ifrb; |
data = ifr = &ifrb; |
Line 1386 ifioctl(struct socket *so, u_long cmd, v |
|
Line 1383 ifioctl(struct socket *so, u_long cmd, v |
|
case SIOCDELMULTI: |
case SIOCDELMULTI: |
case SIOCSIFMEDIA: |
case SIOCSIFMEDIA: |
case SIOCSDRVSPEC: |
case SIOCSDRVSPEC: |
|
case SIOCG80211: |
|
case SIOCS80211: |
case SIOCS80211NWID: |
case SIOCS80211NWID: |
case SIOCS80211NWKEY: |
case SIOCS80211NWKEY: |
case SIOCS80211POWER: |
case SIOCS80211POWER: |
Line 1555 ifioctl(struct socket *so, u_long cmd, v |
|
Line 1554 ifioctl(struct socket *so, u_long cmd, v |
|
case SIOCGIFPDSTADDR: |
case SIOCGIFPDSTADDR: |
case SIOCGLIFPHYADDR: |
case SIOCGLIFPHYADDR: |
case SIOCGIFMEDIA: |
case SIOCGIFMEDIA: |
|
case SIOCG80211: |
|
case SIOCS80211: |
|
case SIOCS80211NWID: |
|
case SIOCS80211NWKEY: |
|
case SIOCS80211POWER: |
|
case SIOCS80211BSSID: |
|
case SIOCS80211CHANNEL: |
if (ifp->if_ioctl == NULL) |
if (ifp->if_ioctl == NULL) |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
error = (*ifp->if_ioctl)(ifp, cmd, data); |
error = (*ifp->if_ioctl)(ifp, cmd, data); |
break; |
break; |
|
|
case SIOCSDRVSPEC: |
case SIOCSDRVSPEC: |
case SIOCS80211NWID: |
|
case SIOCS80211NWKEY: |
|
case SIOCS80211POWER: |
|
case SIOCS80211BSSID: |
|
case SIOCS80211CHANNEL: |
|
default: |
default: |
if (so->so_proto == NULL) |
if (so->so_proto == NULL) |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
Line 1667 ifconf(u_long cmd, void *data) |
|
Line 1668 ifconf(u_long cmd, void *data) |
|
return (0); |
return (0); |
} |
} |
|
|
|
int |
|
ifreq_setaddr(const u_long cmd, struct ifreq *ifr, const struct sockaddr *sa) |
|
{ |
|
uint8_t len; |
|
u_long ncmd; |
|
const uint8_t osockspace = sizeof(ifr->ifr_addr); |
|
const uint8_t sockspace = sizeof(ifr->ifr_ifru.ifru_space); |
|
|
|
#ifdef INET6 |
|
if (cmd == SIOCGIFPSRCADDR_IN6 || cmd == SIOCGIFPDSTADDR_IN6) |
|
len = MIN(sizeof(struct sockaddr_in6), sa->sa_len); |
|
else |
|
#endif /* INET6 */ |
|
if ((ncmd = compat_cvtcmd(cmd)) != cmd) |
|
len = MIN(sockspace, sa->sa_len); |
|
else |
|
len = MIN(osockspace, sa->sa_len); |
|
sockaddr_copy(&ifr->ifr_addr, len, sa); |
|
if (len < sa->sa_len) |
|
return EFBIG; |
|
return 0; |
|
} |
|
|
/* |
/* |
* Queue message on interface, and start output if interface |
* Queue message on interface, and start output if interface |
* not yet active. |
* not yet active. |