Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net/rtsock.c
Show First 20 Lines • Show All 1,560 Lines • ▼ Show 20 Lines | if (w->w_req && w->w_tmem) { | ||||
rtm->rtm_addrs = info.rti_addrs; | rtm->rtm_addrs = info.rti_addrs; | ||||
error = SYSCTL_OUT(w->w_req, (caddr_t)rtm, size); | error = SYSCTL_OUT(w->w_req, (caddr_t)rtm, size); | ||||
return (error); | return (error); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
sysctl_iflist_ifml(struct ifnet *ifp, struct rt_addrinfo *info, | sysctl_iflist_ifml(struct ifnet *ifp, const struct if_data *src_ifd, | ||||
struct walkarg *w, int len) | struct rt_addrinfo *info, struct walkarg *w, int len) | ||||
{ | { | ||||
struct if_msghdrl *ifm; | struct if_msghdrl *ifm; | ||||
struct if_data *ifd; | struct if_data *ifd; | ||||
ifm = (struct if_msghdrl *)w->w_tmem; | ifm = (struct if_msghdrl *)w->w_tmem; | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if (w->w_req->flags & SCTL_MASK32) { | if (w->w_req->flags & SCTL_MASK32) { | ||||
Show All 14 Lines | #endif | ||||
ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ||||
ifm->ifm_index = ifp->if_index; | ifm->ifm_index = ifp->if_index; | ||||
ifm->_ifm_spare1 = 0; | ifm->_ifm_spare1 = 0; | ||||
ifm->ifm_len = sizeof(*ifm); | ifm->ifm_len = sizeof(*ifm); | ||||
ifm->ifm_data_off = offsetof(struct if_msghdrl, ifm_data); | ifm->ifm_data_off = offsetof(struct if_msghdrl, ifm_data); | ||||
ifd = &ifm->ifm_data; | ifd = &ifm->ifm_data; | ||||
} | } | ||||
if_data_copy(ifp, ifd); | memcpy(ifd, src_ifd, sizeof(*ifd)); | ||||
return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); | return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); | ||||
} | } | ||||
static int | static int | ||||
sysctl_iflist_ifm(struct ifnet *ifp, struct rt_addrinfo *info, | sysctl_iflist_ifm(struct ifnet *ifp, const struct if_data *src_ifd, | ||||
struct walkarg *w, int len) | struct rt_addrinfo *info, struct walkarg *w, int len) | ||||
{ | { | ||||
struct if_msghdr *ifm; | struct if_msghdr *ifm; | ||||
struct if_data *ifd; | struct if_data *ifd; | ||||
ifm = (struct if_msghdr *)w->w_tmem; | ifm = (struct if_msghdr *)w->w_tmem; | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if (w->w_req->flags & SCTL_MASK32) { | if (w->w_req->flags & SCTL_MASK32) { | ||||
struct if_msghdr32 *ifm32; | struct if_msghdr32 *ifm32; | ||||
ifm32 = (struct if_msghdr32 *)ifm; | ifm32 = (struct if_msghdr32 *)ifm; | ||||
ifm32->ifm_addrs = info->rti_addrs; | ifm32->ifm_addrs = info->rti_addrs; | ||||
ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ||||
ifm32->ifm_index = ifp->if_index; | ifm32->ifm_index = ifp->if_index; | ||||
ifd = &ifm32->ifm_data; | ifd = &ifm32->ifm_data; | ||||
} else | } else | ||||
#endif | #endif | ||||
{ | { | ||||
ifm->ifm_addrs = info->rti_addrs; | ifm->ifm_addrs = info->rti_addrs; | ||||
ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; | ||||
ifm->ifm_index = ifp->if_index; | ifm->ifm_index = ifp->if_index; | ||||
ifd = &ifm->ifm_data; | ifd = &ifm->ifm_data; | ||||
} | } | ||||
if_data_copy(ifp, ifd); | memcpy(ifd, src_ifd, sizeof(*ifd)); | ||||
return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); | return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); | ||||
} | } | ||||
static int | static int | ||||
sysctl_iflist_ifaml(struct ifaddr *ifa, struct rt_addrinfo *info, | sysctl_iflist_ifaml(struct ifaddr *ifa, struct rt_addrinfo *info, | ||||
struct walkarg *w, int len) | struct walkarg *w, int len) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | sysctl_iflist_ifam(struct ifaddr *ifa, struct rt_addrinfo *info, | ||||
return (SYSCTL_OUT(w->w_req, w->w_tmem, len)); | return (SYSCTL_OUT(w->w_req, w->w_tmem, len)); | ||||
} | } | ||||
static int | static int | ||||
sysctl_iflist(int af, struct walkarg *w) | sysctl_iflist(int af, struct walkarg *w) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifaddr *ifa; | struct ifaddr *ifa; | ||||
struct if_data ifd; | |||||
struct rt_addrinfo info; | struct rt_addrinfo info; | ||||
int len, error = 0; | int len, error = 0; | ||||
struct sockaddr_storage ss; | struct sockaddr_storage ss; | ||||
bzero((caddr_t)&info, sizeof(info)); | bzero((caddr_t)&info, sizeof(info)); | ||||
bzero(&ifd, sizeof(ifd)); | |||||
IFNET_RLOCK_NOSLEEP(); | IFNET_RLOCK_NOSLEEP(); | ||||
TAILQ_FOREACH(ifp, &V_ifnet, if_link) { | TAILQ_FOREACH(ifp, &V_ifnet, if_link) { | ||||
if (w->w_arg && w->w_arg != ifp->if_index) | if (w->w_arg && w->w_arg != ifp->if_index) | ||||
continue; | continue; | ||||
if_data_copy(ifp, &ifd); | |||||
IF_ADDR_RLOCK(ifp); | IF_ADDR_RLOCK(ifp); | ||||
ifa = ifp->if_addr; | ifa = ifp->if_addr; | ||||
info.rti_info[RTAX_IFP] = ifa->ifa_addr; | info.rti_info[RTAX_IFP] = ifa->ifa_addr; | ||||
error = rtsock_msg_buffer(RTM_IFINFO, &info, w, &len); | error = rtsock_msg_buffer(RTM_IFINFO, &info, w, &len); | ||||
if (error != 0) | if (error != 0) | ||||
goto done; | goto done; | ||||
info.rti_info[RTAX_IFP] = NULL; | info.rti_info[RTAX_IFP] = NULL; | ||||
if (w->w_req && w->w_tmem) { | if (w->w_req && w->w_tmem) { | ||||
if (w->w_op == NET_RT_IFLISTL) | if (w->w_op == NET_RT_IFLISTL) | ||||
error = sysctl_iflist_ifml(ifp, &info, w, len); | error = sysctl_iflist_ifml(ifp, &ifd, &info, w, | ||||
len); | |||||
else | else | ||||
error = sysctl_iflist_ifm(ifp, &info, w, len); | error = sysctl_iflist_ifm(ifp, &ifd, &info, w, | ||||
len); | |||||
if (error) | if (error) | ||||
goto done; | goto done; | ||||
} | } | ||||
while ((ifa = TAILQ_NEXT(ifa, ifa_link)) != NULL) { | while ((ifa = TAILQ_NEXT(ifa, ifa_link)) != NULL) { | ||||
if (af && af != ifa->ifa_addr->sa_family) | if (af && af != ifa->ifa_addr->sa_family) | ||||
continue; | continue; | ||||
if (prison_if(w->w_req->td->td_ucred, | if (prison_if(w->w_req->td->td_ucred, | ||||
ifa->ifa_addr) != 0) | ifa->ifa_addr) != 0) | ||||
▲ Show 20 Lines • Show All 207 Lines • Show Last 20 Lines |