mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-12 16:58:53 +00:00
[WEXT]: Cleanup early ioctl call path.
This patch makes the code in wireless_process_ioctl somewhat more readable. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4b1e255384
commit
dd8ceabcd1
@ -1035,53 +1035,31 @@ static int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd)
|
|||||||
/* A bunch of special cases, then the generic case...
|
/* A bunch of special cases, then the generic case...
|
||||||
* Note that 'cmd' is already filtered in dev_ioctl() with
|
* Note that 'cmd' is already filtered in dev_ioctl() with
|
||||||
* (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */
|
* (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */
|
||||||
switch (cmd) {
|
if (cmd == SIOCGIWSTATS)
|
||||||
case SIOCGIWSTATS:
|
return ioctl_standard_call(dev, ifr, cmd,
|
||||||
/* Get Wireless Stats */
|
|
||||||
return ioctl_standard_call(dev,
|
|
||||||
ifr,
|
|
||||||
cmd,
|
|
||||||
&iw_handler_get_iwstats);
|
&iw_handler_get_iwstats);
|
||||||
|
|
||||||
case SIOCGIWPRIV:
|
if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
|
||||||
/* Check if we have some wireless handlers defined */
|
return ioctl_standard_call(dev, ifr, cmd,
|
||||||
if (dev->wireless_handlers != NULL) {
|
&iw_handler_get_private);
|
||||||
/* We export to user space the definition of
|
|
||||||
* the private handler ourselves */
|
/* Basic check */
|
||||||
return ioctl_standard_call(dev,
|
if (!netif_device_present(dev))
|
||||||
ifr,
|
return -ENODEV;
|
||||||
cmd,
|
|
||||||
&iw_handler_get_private);
|
/* New driver API : try to find the handler */
|
||||||
}
|
handler = get_handler(dev, cmd);
|
||||||
// ## Fall-through for old API ##
|
if (handler) {
|
||||||
default:
|
/* Standard and private are not the same */
|
||||||
/* Generic IOCTL */
|
if (cmd < SIOCIWFIRSTPRIV)
|
||||||
/* Basic check */
|
return ioctl_standard_call(dev, ifr, cmd, handler);
|
||||||
if (!netif_device_present(dev))
|
else
|
||||||
return -ENODEV;
|
return ioctl_private_call(dev, ifr, cmd, handler);
|
||||||
/* New driver API : try to find the handler */
|
|
||||||
handler = get_handler(dev, cmd);
|
|
||||||
if (handler != NULL) {
|
|
||||||
/* Standard and private are not the same */
|
|
||||||
if (cmd < SIOCIWFIRSTPRIV)
|
|
||||||
return ioctl_standard_call(dev,
|
|
||||||
ifr,
|
|
||||||
cmd,
|
|
||||||
handler);
|
|
||||||
else
|
|
||||||
return ioctl_private_call(dev,
|
|
||||||
ifr,
|
|
||||||
cmd,
|
|
||||||
handler);
|
|
||||||
}
|
|
||||||
/* Old driver API : call driver ioctl handler */
|
|
||||||
if (dev->do_ioctl) {
|
|
||||||
return dev->do_ioctl(dev, ifr, cmd);
|
|
||||||
}
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
}
|
||||||
/* Not reached */
|
/* Old driver API : call driver ioctl handler */
|
||||||
return -EINVAL;
|
if (dev->do_ioctl)
|
||||||
|
return dev->do_ioctl(dev, ifr, cmd);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* entry point from dev ioctl */
|
/* entry point from dev ioctl */
|
||||||
@ -1093,9 +1071,10 @@ int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd,
|
|||||||
/* If command is `set a parameter', or
|
/* If command is `set a parameter', or
|
||||||
* `get the encoding parameters', check if
|
* `get the encoding parameters', check if
|
||||||
* the user has the right to do it */
|
* the user has the right to do it */
|
||||||
if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
|
if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
|
||||||
if (!capable(CAP_NET_ADMIN))
|
&& !capable(CAP_NET_ADMIN))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
dev_load(ifr->ifr_name);
|
dev_load(ifr->ifr_name);
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
ret = wireless_process_ioctl(ifr, cmd);
|
ret = wireless_process_ioctl(ifr, cmd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user