Commit 3f3fa534 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

hostap: use ndo_siocdevprivate

hostap has a combination of iwpriv ioctls that do not work at
all, and two SIOCDEVPRIVATE commands that work natively but
lack a compat conversion handler.

For the moment, move them over to the new ndo_siocdevprivate
interface and return an error for compat mode.

Cc: Jouni Malinen <j@w1.fi>
Cc: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3343c49a
...@@ -93,6 +93,7 @@ extern const struct iw_handler_def hostap_iw_handler_def; ...@@ -93,6 +93,7 @@ extern const struct iw_handler_def hostap_iw_handler_def;
extern const struct ethtool_ops prism2_ethtool_ops; extern const struct ethtool_ops prism2_ethtool_ops;
int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
int hostap_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
void __user *data, int cmd);
#endif /* HOSTAP_H */ #endif /* HOSTAP_H */
...@@ -3941,7 +3941,8 @@ const struct iw_handler_def hostap_iw_handler_def = ...@@ -3941,7 +3941,8 @@ const struct iw_handler_def hostap_iw_handler_def =
.get_wireless_stats = hostap_get_wireless_stats, .get_wireless_stats = hostap_get_wireless_stats,
}; };
/* Private ioctls (iwpriv) that have not yet been converted
* into new wireless extensions API */
int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{ {
struct iwreq *wrq = (struct iwreq *) ifr; struct iwreq *wrq = (struct iwreq *) ifr;
...@@ -3953,9 +3954,6 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -3953,9 +3954,6 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
local = iface->local; local = iface->local;
switch (cmd) { switch (cmd) {
/* Private ioctls (iwpriv) that have not yet been converted
* into new wireless extensions API */
case PRISM2_IOCTL_INQUIRE: case PRISM2_IOCTL_INQUIRE:
if (!capable(CAP_NET_ADMIN)) ret = -EPERM; if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
else ret = prism2_ioctl_priv_inquire(dev, (int *) wrq->u.name); else ret = prism2_ioctl_priv_inquire(dev, (int *) wrq->u.name);
...@@ -4009,11 +4007,31 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -4009,11 +4007,31 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
wrq->u.ap_addr.sa_data); wrq->u.ap_addr.sa_data);
break; break;
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
default:
ret = -EOPNOTSUPP;
break;
}
return ret;
}
/* Private ioctls that are not used with iwpriv; /* Private ioctls that are not used with iwpriv;
* in SIOCDEVPRIVATE range */ * in SIOCDEVPRIVATE range */
int hostap_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
void __user *data, int cmd)
{
struct iwreq *wrq = (struct iwreq *)ifr;
struct hostap_interface *iface;
local_info_t *local;
int ret = 0;
iface = netdev_priv(dev);
local = iface->local;
if (in_compat_syscall()) /* not implemented yet */
return -EOPNOTSUPP;
switch (cmd) {
#ifdef PRISM2_DOWNLOAD_SUPPORT #ifdef PRISM2_DOWNLOAD_SUPPORT
case PRISM2_IOCTL_DOWNLOAD: case PRISM2_IOCTL_DOWNLOAD:
if (!capable(CAP_NET_ADMIN)) ret = -EPERM; if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
......
...@@ -797,6 +797,7 @@ static const struct net_device_ops hostap_netdev_ops = { ...@@ -797,6 +797,7 @@ static const struct net_device_ops hostap_netdev_ops = {
.ndo_open = prism2_open, .ndo_open = prism2_open,
.ndo_stop = prism2_close, .ndo_stop = prism2_close,
.ndo_do_ioctl = hostap_ioctl, .ndo_do_ioctl = hostap_ioctl,
.ndo_siocdevprivate = hostap_siocdevprivate,
.ndo_set_mac_address = prism2_set_mac_address, .ndo_set_mac_address = prism2_set_mac_address,
.ndo_set_rx_mode = hostap_set_multicast_list, .ndo_set_rx_mode = hostap_set_multicast_list,
.ndo_tx_timeout = prism2_tx_timeout, .ndo_tx_timeout = prism2_tx_timeout,
...@@ -809,6 +810,7 @@ static const struct net_device_ops hostap_mgmt_netdev_ops = { ...@@ -809,6 +810,7 @@ static const struct net_device_ops hostap_mgmt_netdev_ops = {
.ndo_open = prism2_open, .ndo_open = prism2_open,
.ndo_stop = prism2_close, .ndo_stop = prism2_close,
.ndo_do_ioctl = hostap_ioctl, .ndo_do_ioctl = hostap_ioctl,
.ndo_siocdevprivate = hostap_siocdevprivate,
.ndo_set_mac_address = prism2_set_mac_address, .ndo_set_mac_address = prism2_set_mac_address,
.ndo_set_rx_mode = hostap_set_multicast_list, .ndo_set_rx_mode = hostap_set_multicast_list,
.ndo_tx_timeout = prism2_tx_timeout, .ndo_tx_timeout = prism2_tx_timeout,
...@@ -821,6 +823,7 @@ static const struct net_device_ops hostap_master_ops = { ...@@ -821,6 +823,7 @@ static const struct net_device_ops hostap_master_ops = {
.ndo_open = prism2_open, .ndo_open = prism2_open,
.ndo_stop = prism2_close, .ndo_stop = prism2_close,
.ndo_do_ioctl = hostap_ioctl, .ndo_do_ioctl = hostap_ioctl,
.ndo_siocdevprivate = hostap_siocdevprivate,
.ndo_set_mac_address = prism2_set_mac_address, .ndo_set_mac_address = prism2_set_mac_address,
.ndo_set_rx_mode = hostap_set_multicast_list, .ndo_set_rx_mode = hostap_set_multicast_list,
.ndo_tx_timeout = prism2_tx_timeout, .ndo_tx_timeout = prism2_tx_timeout,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment