Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if.c
Show First 20 Lines • Show All 2,397 Lines • ▼ Show 20 Lines | |||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) | if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) | ||||
ifrup->ifr32.ifr_ifru.ifru_buffer.length = len; | ifrup->ifr32.ifr_ifru.ifru_buffer.length = len; | ||||
else | else | ||||
#endif | #endif | ||||
ifrup->ifr.ifr_ifru.ifru_buffer.length = len; | ifrup->ifr.ifr_ifru.ifru_buffer.length = len; | ||||
} | } | ||||
void * | |||||
ifr_data_get_ptr(void *ifrp) | |||||
{ | |||||
union ifreq_union *ifrup; | |||||
ifrup = ifrp; | |||||
#ifdef COMPAT_FREEBSD32 | |||||
if (SV_CURPROC_FLAG(SV_ILP32)) | |||||
return ((void *)(uintptr_t) | |||||
ifrup->ifr32.ifr_ifru.ifru_data); | |||||
#endif | |||||
return (ifrup->ifr.ifr_ifru.ifru_data); | |||||
} | |||||
/* | /* | ||||
* Hardware specific interface ioctls. | * Hardware specific interface ioctls. | ||||
*/ | */ | ||||
static int | static int | ||||
ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) | ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) | ||||
{ | { | ||||
struct ifreq *ifr; | struct ifreq *ifr; | ||||
int error = 0, do_ifup = 0; | int error = 0, do_ifup = 0; | ||||
▲ Show 20 Lines • Show All 165 Lines • ▼ Show 20 Lines | case SIOCSIFMAC: | ||||
error = mac_ifnet_ioctl_set(td->td_ucred, ifr, ifp); | error = mac_ifnet_ioctl_set(td->td_ucred, ifr, ifp); | ||||
break; | break; | ||||
#endif | #endif | ||||
case SIOCSIFNAME: | case SIOCSIFNAME: | ||||
error = priv_check(td, PRIV_NET_SETIFNAME); | error = priv_check(td, PRIV_NET_SETIFNAME); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL); | error = copyinstr(ifr_data_get_ptr(ifr), new_name, IFNAMSIZ, | ||||
NULL); | |||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
if (new_name[0] == '\0') | if (new_name[0] == '\0') | ||||
return (EINVAL); | return (EINVAL); | ||||
if (new_name[IFNAMSIZ-1] != '\0') { | if (new_name[IFNAMSIZ-1] != '\0') { | ||||
new_name[IFNAMSIZ-1] = '\0'; | new_name[IFNAMSIZ-1] = '\0'; | ||||
if (strlen(new_name) == IFNAMSIZ-1) | if (strlen(new_name) == IFNAMSIZ-1) | ||||
return (EINVAL); | return (EINVAL); | ||||
▲ Show 20 Lines • Show All 294 Lines • ▼ Show 20 Lines | case SIOCSIFRVNET: | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
return (error); | return (error); | ||||
#endif | #endif | ||||
case SIOCIFCREATE: | case SIOCIFCREATE: | ||||
case SIOCIFCREATE2: | case SIOCIFCREATE2: | ||||
error = priv_check(td, PRIV_NET_IFCREATE); | error = priv_check(td, PRIV_NET_IFCREATE); | ||||
if (error == 0) | if (error == 0) | ||||
error = if_clone_create(ifr->ifr_name, | error = if_clone_create(ifr->ifr_name, | ||||
sizeof(ifr->ifr_name), | sizeof(ifr->ifr_name), cmd == SIOCIFCREATE2 ? | ||||
cmd == SIOCIFCREATE2 ? ifr->ifr_data : NULL); | ifr_data_get_ptr(ifr) : NULL); | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
return (error); | return (error); | ||||
case SIOCIFDESTROY: | case SIOCIFDESTROY: | ||||
error = priv_check(td, PRIV_NET_IFDESTROY); | error = priv_check(td, PRIV_NET_IFDESTROY); | ||||
if (error == 0) | if (error == 0) | ||||
error = if_clone_destroy(ifr->ifr_name); | error = if_clone_destroy(ifr->ifr_name); | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
return (error); | return (error); | ||||
▲ Show 20 Lines • Show All 1,428 Lines • Show Last 20 Lines |