[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
1 changed files with 26 additions and 47 deletions
|
@ -1035,53 +1035,31 @@ static int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd)
|
|||
/* A bunch of special cases, then the generic case...
|
||||
* Note that 'cmd' is already filtered in dev_ioctl() with
|
||||
* (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */
|
||||
switch (cmd) {
|
||||
case SIOCGIWSTATS:
|
||||
/* Get Wireless Stats */
|
||||
return ioctl_standard_call(dev,
|
||||
ifr,
|
||||
cmd,
|
||||
if (cmd == SIOCGIWSTATS)
|
||||
return ioctl_standard_call(dev, ifr, cmd,
|
||||
&iw_handler_get_iwstats);
|
||||
|
||||
case SIOCGIWPRIV:
|
||||
/* Check if we have some wireless handlers defined */
|
||||
if (dev->wireless_handlers != NULL) {
|
||||
/* We export to user space the definition of
|
||||
* the private handler ourselves */
|
||||
return ioctl_standard_call(dev,
|
||||
ifr,
|
||||
cmd,
|
||||
&iw_handler_get_private);
|
||||
}
|
||||
// ## Fall-through for old API ##
|
||||
default:
|
||||
/* Generic IOCTL */
|
||||
/* Basic check */
|
||||
if (!netif_device_present(dev))
|
||||
return -ENODEV;
|
||||
/* 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;
|
||||
if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
|
||||
return ioctl_standard_call(dev, ifr, cmd,
|
||||
&iw_handler_get_private);
|
||||
|
||||
/* Basic check */
|
||||
if (!netif_device_present(dev))
|
||||
return -ENODEV;
|
||||
|
||||
/* New driver API : try to find the handler */
|
||||
handler = get_handler(dev, cmd);
|
||||
if (handler) {
|
||||
/* 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);
|
||||
}
|
||||
/* Not reached */
|
||||
return -EINVAL;
|
||||
/* Old driver API : call driver ioctl handler */
|
||||
if (dev->do_ioctl)
|
||||
return dev->do_ioctl(dev, ifr, cmd);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* 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
|
||||
* `get the encoding parameters', check if
|
||||
* the user has the right to do it */
|
||||
if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
|
||||
&& !capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
dev_load(ifr->ifr_name);
|
||||
rtnl_lock();
|
||||
ret = wireless_process_ioctl(ifr, cmd);
|
||||
|
|
Loading…
Reference in a new issue