Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if.c
Show First 20 Lines • Show All 160 Lines • ▼ Show 20 Lines | |||||
struct ifgroupreq32 { | struct ifgroupreq32 { | ||||
char ifgr_name[IFNAMSIZ]; | char ifgr_name[IFNAMSIZ]; | ||||
u_int ifgr_len; | u_int ifgr_len; | ||||
union { | union { | ||||
char ifgru_group[IFNAMSIZ]; | char ifgru_group[IFNAMSIZ]; | ||||
uint32_t ifgru_groups; | uint32_t ifgru_groups; | ||||
} ifgr_ifgru; | } ifgr_ifgru; | ||||
}; | }; | ||||
#define SIOCAIFGROUP32 _IOC_NEWTYPE(SIOCAIFGROUP, struct ifgroupreq32) | |||||
#define SIOCGIFGROUP32 _IOC_NEWTYPE(SIOCGIFGROUP, struct ifgroupreq32) | |||||
#define SIOCDIFGROUP32 _IOC_NEWTYPE(SIOCDIFGROUP, struct ifgroupreq32) | |||||
#define SIOCGIFGMEMB32 _IOC_NEWTYPE(SIOCGIFGMEMB, struct ifgroupreq32) | |||||
struct ifmediareq32 { | struct ifmediareq32 { | ||||
char ifm_name[IFNAMSIZ]; | char ifm_name[IFNAMSIZ]; | ||||
int ifm_current; | int ifm_current; | ||||
int ifm_mask; | int ifm_mask; | ||||
int ifm_status; | int ifm_status; | ||||
int ifm_active; | int ifm_active; | ||||
int ifm_count; | int ifm_count; | ||||
uint32_t ifm_ulist; /* (int *) */ | uint32_t ifm_ulist; /* (int *) */ | ||||
}; | }; | ||||
#define SIOCGIFMEDIA32 _IOC_NEWTYPE(SIOCGIFMEDIA, struct ifmediareq32) | #define SIOCGIFMEDIA32 _IOC_NEWTYPE(SIOCGIFMEDIA, struct ifmediareq32) | ||||
#define SIOCGIFXMEDIA32 _IOC_NEWTYPE(SIOCGIFXMEDIA, struct ifmediareq32) | #define SIOCGIFXMEDIA32 _IOC_NEWTYPE(SIOCGIFXMEDIA, struct ifmediareq32) | ||||
#endif /* COMPAT_FREEBSD32 */ | |||||
#define _CASE_IOC_IFGROUPREQ_32(cmd) \ | |||||
_IOC_NEWTYPE((cmd), struct ifgroupreq32): case | |||||
#else /* !COMPAT_FREEBSD32 */ | |||||
#define _CASE_IOC_IFGROUPREQ_32(cmd) | |||||
#endif /* !COMPAT_FREEBSD32 */ | |||||
#define CASE_IOC_IFGROUPREQ(cmd) \ | |||||
_CASE_IOC_IFGROUPREQ_32(cmd) \ | |||||
(cmd) | |||||
union ifreq_union { | union ifreq_union { | ||||
struct ifreq ifr; | struct ifreq ifr; | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
struct ifreq32 ifr32; | struct ifreq32 ifr32; | ||||
#endif | #endif | ||||
}; | }; | ||||
union ifgroupreq_union { | |||||
struct ifgroupreq ifgr; | |||||
#ifdef COMPAT_FREEBSD32 | |||||
struct ifgroupreq32 ifgr32; | |||||
#endif | |||||
}; | |||||
SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, | SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, | ||||
"Link layers"); | "Link layers"); | ||||
SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, | SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, | ||||
"Generic link-management"); | "Generic link-management"); | ||||
SYSCTL_INT(_net_link, OID_AUTO, ifqmaxlen, CTLFLAG_RDTUN, | SYSCTL_INT(_net_link, OID_AUTO, ifqmaxlen, CTLFLAG_RDTUN, | ||||
&ifqmaxlen, 0, "max send queue size"); | &ifqmaxlen, 0, "max send queue size"); | ||||
▲ Show 20 Lines • Show All 1,444 Lines • ▼ Show 20 Lines | if_delgroups(struct ifnet *ifp) | ||||
while ((ifgl = CK_STAILQ_FIRST(&ifp->if_groups)) != NULL) { | while ((ifgl = CK_STAILQ_FIRST(&ifp->if_groups)) != NULL) { | ||||
strlcpy(groupname, ifgl->ifgl_group->ifg_group, IFNAMSIZ); | strlcpy(groupname, ifgl->ifgl_group->ifg_group, IFNAMSIZ); | ||||
_if_delgroup_locked(ifp, ifgl, groupname); | _if_delgroup_locked(ifp, ifgl, groupname); | ||||
IFNET_WLOCK(); | IFNET_WLOCK(); | ||||
} | } | ||||
IFNET_WUNLOCK(); | IFNET_WUNLOCK(); | ||||
} | } | ||||
static char * | |||||
ifgr_group_get(void *ifgrp) | |||||
{ | |||||
union ifgroupreq_union *ifgrup; | |||||
ifgrup = ifgrp; | |||||
#ifdef COMPAT_FREEBSD32 | |||||
if (SV_CURPROC_FLAG(SV_ILP32)) | |||||
return (&ifgrup->ifgr32.ifgr_ifgru.ifgru_group[0]); | |||||
#endif | |||||
return (&ifgrup->ifgr.ifgr_ifgru.ifgru_group[0]); | |||||
} | |||||
static struct ifg_req * | |||||
ifgr_groups_get(void *ifgrp) | |||||
{ | |||||
union ifgroupreq_union *ifgrup; | |||||
ifgrup = ifgrp; | |||||
#ifdef COMPAT_FREEBSD32 | |||||
if (SV_CURPROC_FLAG(SV_ILP32)) | |||||
return ((struct ifg_req *)(uintptr_t) | |||||
ifgrup->ifgr32.ifgr_ifgru.ifgru_groups); | |||||
#endif | |||||
return (ifgrup->ifgr.ifgr_ifgru.ifgru_groups); | |||||
} | |||||
/* | /* | ||||
* Stores all groups from an interface in memory pointed to by ifgr. | * Stores all groups from an interface in memory pointed to by ifgr. | ||||
*/ | */ | ||||
static int | static int | ||||
if_getgroup(struct ifgroupreq *ifgr, struct ifnet *ifp) | if_getgroup(struct ifgroupreq *ifgr, struct ifnet *ifp) | ||||
{ | { | ||||
int len, error; | int len, error; | ||||
struct ifg_list *ifgl; | struct ifg_list *ifgl; | ||||
struct ifg_req ifgrq, *ifgp; | struct ifg_req ifgrq, *ifgp; | ||||
NET_EPOCH_ASSERT(); | NET_EPOCH_ASSERT(); | ||||
if (ifgr->ifgr_len == 0) { | if (ifgr->ifgr_len == 0) { | ||||
CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) | CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) | ||||
ifgr->ifgr_len += sizeof(struct ifg_req); | ifgr->ifgr_len += sizeof(struct ifg_req); | ||||
return (0); | return (0); | ||||
} | } | ||||
len = ifgr->ifgr_len; | len = ifgr->ifgr_len; | ||||
ifgp = ifgr_groups_get(ifgr); | ifgp = ifgr->ifgr_groups; | ||||
/* XXX: wire */ | /* XXX: wire */ | ||||
CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) { | CK_STAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) { | ||||
if (len < sizeof(ifgrq)) | if (len < sizeof(ifgrq)) | ||||
return (EINVAL); | return (EINVAL); | ||||
bzero(&ifgrq, sizeof ifgrq); | bzero(&ifgrq, sizeof ifgrq); | ||||
strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group, | strlcpy(ifgrq.ifgrq_group, ifgl->ifgl_group->ifg_group, | ||||
sizeof(ifgrq.ifgrq_group)); | sizeof(ifgrq.ifgrq_group)); | ||||
if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req)))) | if ((error = copyout(&ifgrq, ifgp, sizeof(struct ifg_req)))) | ||||
Show All 28 Lines | if_getgroupmembers(struct ifgroupreq *ifgr) | ||||
if (ifgr->ifgr_len == 0) { | if (ifgr->ifgr_len == 0) { | ||||
CK_STAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) | CK_STAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) | ||||
ifgr->ifgr_len += sizeof(ifgrq); | ifgr->ifgr_len += sizeof(ifgrq); | ||||
IFNET_RUNLOCK(); | IFNET_RUNLOCK(); | ||||
return (0); | return (0); | ||||
} | } | ||||
len = ifgr->ifgr_len; | len = ifgr->ifgr_len; | ||||
ifgp = ifgr_groups_get(ifgr); | ifgp = ifgr->ifgr_groups; | ||||
CK_STAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) { | CK_STAILQ_FOREACH(ifgm, &ifg->ifg_members, ifgm_next) { | ||||
if (len < sizeof(ifgrq)) { | if (len < sizeof(ifgrq)) { | ||||
IFNET_RUNLOCK(); | IFNET_RUNLOCK(); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
bzero(&ifgrq, sizeof ifgrq); | bzero(&ifgrq, sizeof ifgrq); | ||||
strlcpy(ifgrq.ifgrq_member, ifgm->ifgm_ifp->if_xname, | strlcpy(ifgrq.ifgrq_member, ifgm->ifgm_ifp->if_xname, | ||||
sizeof(ifgrq.ifgrq_member)); | sizeof(ifgrq.ifgrq_member)); | ||||
▲ Show 20 Lines • Show All 1,110 Lines • ▼ Show 20 Lines | case SIOCSIFLLADDR: | ||||
error = if_setlladdr(ifp, | error = if_setlladdr(ifp, | ||||
ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len); | ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len); | ||||
break; | break; | ||||
case SIOCGHWADDR: | case SIOCGHWADDR: | ||||
error = if_gethwaddr(ifp, ifr); | error = if_gethwaddr(ifp, ifr); | ||||
break; | break; | ||||
case CASE_IOC_IFGROUPREQ(SIOCAIFGROUP): | case SIOCAIFGROUP: | ||||
error = priv_check(td, PRIV_NET_ADDIFGROUP); | error = priv_check(td, PRIV_NET_ADDIFGROUP); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if ((error = if_addgroup(ifp, | error = if_addgroup(ifp, | ||||
kib: Since you change around these lines, you could also introduce your preferred way to write it… | |||||
Done Inline ActionsI almost did, so this prod is enough for me to fix it. Thanks. jhb: I almost did, so this prod is enough for me to fix it. Thanks. | |||||
ifgr_group_get((struct ifgroupreq *)data)))) | ((struct ifgroupreq *)data)->ifgr_group); | ||||
if (error != 0) | |||||
return (error); | return (error); | ||||
break; | break; | ||||
Done Inline ActionsWhy the change in {} is needed? kib: Why the change in {} is needed? | |||||
Done Inline ActionsFor the local 'ifgr' variable. jhb: For the local 'ifgr' variable. | |||||
Done Inline ActionsOk, why is this one-time used variable needed? I mean, you can add ->ifgr_group to the cast expression and for me it is easier to understand. kib: Ok, why is this one-time used variable needed? I mean, you can add ->ifgr_group to the cast… | |||||
Done Inline ActionsAh, this was matching the original code before the addition of ifgr_group_get(). I can make it do it without a local variable though. jhb: Ah, this was matching the original code before the addition of ifgr_group_get(). I can make it… | |||||
case CASE_IOC_IFGROUPREQ(SIOCGIFGROUP): | case SIOCGIFGROUP: | ||||
{ | { | ||||
struct epoch_tracker et; | struct epoch_tracker et; | ||||
NET_EPOCH_ENTER(et); | NET_EPOCH_ENTER(et); | ||||
error = if_getgroup((struct ifgroupreq *)data, ifp); | error = if_getgroup((struct ifgroupreq *)data, ifp); | ||||
NET_EPOCH_EXIT(et); | NET_EPOCH_EXIT(et); | ||||
break; | break; | ||||
} | } | ||||
case CASE_IOC_IFGROUPREQ(SIOCDIFGROUP): | case SIOCDIFGROUP: | ||||
error = priv_check(td, PRIV_NET_DELIFGROUP); | error = priv_check(td, PRIV_NET_DELIFGROUP); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if ((error = if_delgroup(ifp, | error = if_delgroup(ifp, | ||||
Done Inline ActionsSame there. kib: Same there. | |||||
ifgr_group_get((struct ifgroupreq *)data)))) | ((struct ifgroupreq *)data)->ifgr_group); | ||||
if (error != 0) | |||||
return (error); | return (error); | ||||
break; | break; | ||||
default: | default: | ||||
error = ENOIOCTL; | error = ENOIOCTL; | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
Show All 14 Lines | |||||
*/ | */ | ||||
int | int | ||||
ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) | ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) | ||||
{ | { | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
union { | union { | ||||
struct ifconf ifc; | struct ifconf ifc; | ||||
struct ifdrv ifd; | struct ifdrv ifd; | ||||
struct ifgroupreq ifgr; | |||||
struct ifmediareq ifmr; | struct ifmediareq ifmr; | ||||
} thunk; | } thunk; | ||||
caddr_t saved_data; | caddr_t saved_data; | ||||
u_long saved_cmd; | u_long saved_cmd; | ||||
struct ifconf32 *ifc32; | struct ifconf32 *ifc32; | ||||
struct ifdrv32 *ifd32; | struct ifdrv32 *ifd32; | ||||
struct ifgroupreq32 *ifgr32; | |||||
struct ifmediareq32 *ifmr32; | struct ifmediareq32 *ifmr32; | ||||
#endif | #endif | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifreq *ifr; | struct ifreq *ifr; | ||||
int error; | int error; | ||||
int oif_flags; | int oif_flags; | ||||
#ifdef VIMAGE | #ifdef VIMAGE | ||||
bool shutdown; | bool shutdown; | ||||
Show All 26 Lines | case SIOCSDRVSPEC32: | ||||
memcpy(thunk.ifd.ifd_name, ifd32->ifd_name, | memcpy(thunk.ifd.ifd_name, ifd32->ifd_name, | ||||
sizeof(thunk.ifd.ifd_name)); | sizeof(thunk.ifd.ifd_name)); | ||||
thunk.ifd.ifd_cmd = ifd32->ifd_cmd; | thunk.ifd.ifd_cmd = ifd32->ifd_cmd; | ||||
thunk.ifd.ifd_len = ifd32->ifd_len; | thunk.ifd.ifd_len = ifd32->ifd_len; | ||||
thunk.ifd.ifd_data = PTRIN(ifd32->ifd_data); | thunk.ifd.ifd_data = PTRIN(ifd32->ifd_data); | ||||
data = (caddr_t)&thunk.ifd; | data = (caddr_t)&thunk.ifd; | ||||
cmd = _IOC_NEWTYPE(cmd, struct ifdrv); | cmd = _IOC_NEWTYPE(cmd, struct ifdrv); | ||||
break; | break; | ||||
case SIOCAIFGROUP32: | |||||
case SIOCGIFGROUP32: | |||||
case SIOCDIFGROUP32: | |||||
case SIOCGIFGMEMB32: | |||||
ifgr32 = (struct ifgroupreq32 *)data; | |||||
memcpy(thunk.ifgr.ifgr_name, ifgr32->ifgr_name, | |||||
sizeof(thunk.ifgr.ifgr_name)); | |||||
thunk.ifgr.ifgr_len = ifgr32->ifgr_len; | |||||
switch (cmd) { | |||||
case SIOCAIFGROUP32: | |||||
case SIOCDIFGROUP32: | |||||
memcpy(thunk.ifgr.ifgr_group, ifgr32->ifgr_group, | |||||
sizeof(thunk.ifgr.ifgr_group)); | |||||
break; | |||||
case SIOCGIFGROUP32: | |||||
case SIOCGIFGMEMB32: | |||||
thunk.ifgr.ifgr_groups = PTRIN(ifgr32->ifgr_groups); | |||||
break; | |||||
} | |||||
data = (caddr_t)&thunk.ifgr; | |||||
cmd = _IOC_NEWTYPE(cmd, struct ifgroupreq); | |||||
break; | |||||
case SIOCGIFMEDIA32: | case SIOCGIFMEDIA32: | ||||
case SIOCGIFXMEDIA32: | case SIOCGIFXMEDIA32: | ||||
ifmr32 = (struct ifmediareq32 *)data; | ifmr32 = (struct ifmediareq32 *)data; | ||||
memcpy(thunk.ifmr.ifm_name, ifmr32->ifm_name, | memcpy(thunk.ifmr.ifm_name, ifmr32->ifm_name, | ||||
sizeof(thunk.ifmr.ifm_name)); | sizeof(thunk.ifmr.ifm_name)); | ||||
thunk.ifmr.ifm_current = ifmr32->ifm_current; | thunk.ifmr.ifm_current = ifmr32->ifm_current; | ||||
thunk.ifmr.ifm_mask = ifmr32->ifm_mask; | thunk.ifmr.ifm_mask = ifmr32->ifm_mask; | ||||
thunk.ifmr.ifm_status = ifmr32->ifm_status; | thunk.ifmr.ifm_status = ifmr32->ifm_status; | ||||
Show All 39 Lines | if (error == 0) { | ||||
sx_xunlock(&ifnet_detach_sxlock); | sx_xunlock(&ifnet_detach_sxlock); | ||||
} | } | ||||
goto out_noref; | goto out_noref; | ||||
case SIOCIFGCLONERS: | case SIOCIFGCLONERS: | ||||
error = if_clone_list((struct if_clonereq *)data); | error = if_clone_list((struct if_clonereq *)data); | ||||
goto out_noref; | goto out_noref; | ||||
case CASE_IOC_IFGROUPREQ(SIOCGIFGMEMB): | case SIOCGIFGMEMB: | ||||
error = if_getgroupmembers((struct ifgroupreq *)data); | error = if_getgroupmembers((struct ifgroupreq *)data); | ||||
goto out_noref; | goto out_noref; | ||||
#if defined(INET) || defined(INET6) | #if defined(INET) || defined(INET6) | ||||
case SIOCSVH: | case SIOCSVH: | ||||
case SIOCGVH: | case SIOCGVH: | ||||
if (carp_ioctl_p == NULL) | if (carp_ioctl_p == NULL) | ||||
error = EPROTONOSUPPORT; | error = EPROTONOSUPPORT; | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | case SIOCGDRVSPEC32: | ||||
* SIOCGDRVSPEC is IOWR, but nothing actually touches | * SIOCGDRVSPEC is IOWR, but nothing actually touches | ||||
* the struct so just assert that ifd_len (the only | * the struct so just assert that ifd_len (the only | ||||
* field it might make sense to update) hasn't | * field it might make sense to update) hasn't | ||||
* changed. | * changed. | ||||
*/ | */ | ||||
KASSERT(thunk.ifd.ifd_len == ifd32->ifd_len, | KASSERT(thunk.ifd.ifd_len == ifd32->ifd_len, | ||||
("ifd_len was updated %u -> %zu", ifd32->ifd_len, | ("ifd_len was updated %u -> %zu", ifd32->ifd_len, | ||||
thunk.ifd.ifd_len)); | thunk.ifd.ifd_len)); | ||||
break; | |||||
case SIOCGIFGROUP32: | |||||
case SIOCGIFGMEMB32: | |||||
ifgr32->ifgr_len = thunk.ifgr.ifgr_len; | |||||
break; | break; | ||||
case SIOCGIFMEDIA32: | case SIOCGIFMEDIA32: | ||||
case SIOCGIFXMEDIA32: | case SIOCGIFXMEDIA32: | ||||
ifmr32->ifm_current = thunk.ifmr.ifm_current; | ifmr32->ifm_current = thunk.ifmr.ifm_current; | ||||
ifmr32->ifm_mask = thunk.ifmr.ifm_mask; | ifmr32->ifm_mask = thunk.ifmr.ifm_mask; | ||||
ifmr32->ifm_status = thunk.ifmr.ifm_status; | ifmr32->ifm_status = thunk.ifmr.ifm_status; | ||||
ifmr32->ifm_active = thunk.ifmr.ifm_active; | ifmr32->ifm_active = thunk.ifmr.ifm_active; | ||||
ifmr32->ifm_count = thunk.ifmr.ifm_count; | ifmr32->ifm_count = thunk.ifmr.ifm_count; | ||||
▲ Show 20 Lines • Show All 1,498 Lines • Show Last 20 Lines |
Since you change around these lines, you could also introduce your preferred way to write it
I am fine either way.