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

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
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ extern const struct iw_handler_def hostap_iw_handler_def;
extern const struct ethtool_ops prism2_ethtool_ops;

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 */
+24 −6
Original line number Diff line number Diff line
@@ -3941,7 +3941,8 @@ const struct iw_handler_def hostap_iw_handler_def =
	.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)
{
	struct iwreq *wrq = (struct iwreq *) ifr;
@@ -3953,9 +3954,6 @@ int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
	local = iface->local;

	switch (cmd) {
		/* Private ioctls (iwpriv) that have not yet been converted
		 * into new wireless extensions API */

	case PRISM2_IOCTL_INQUIRE:
		if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
		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)
					       wrq->u.ap_addr.sa_data);
		break;
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
	default:
		ret = -EOPNOTSUPP;
		break;
	}

	return ret;
}

/* Private ioctls that are not used with iwpriv;
 * 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
	case PRISM2_IOCTL_DOWNLOAD:
		if (!capable(CAP_NET_ADMIN)) ret = -EPERM;
+3 −0
Original line number Diff line number Diff line
@@ -797,6 +797,7 @@ static const struct net_device_ops hostap_netdev_ops = {
	.ndo_open		= prism2_open,
	.ndo_stop		= prism2_close,
	.ndo_do_ioctl		= hostap_ioctl,
	.ndo_siocdevprivate	= hostap_siocdevprivate,
	.ndo_set_mac_address	= prism2_set_mac_address,
	.ndo_set_rx_mode	= hostap_set_multicast_list,
	.ndo_tx_timeout 	= prism2_tx_timeout,
@@ -809,6 +810,7 @@ static const struct net_device_ops hostap_mgmt_netdev_ops = {
	.ndo_open		= prism2_open,
	.ndo_stop		= prism2_close,
	.ndo_do_ioctl		= hostap_ioctl,
	.ndo_siocdevprivate	= hostap_siocdevprivate,
	.ndo_set_mac_address	= prism2_set_mac_address,
	.ndo_set_rx_mode	= hostap_set_multicast_list,
	.ndo_tx_timeout 	= prism2_tx_timeout,
@@ -821,6 +823,7 @@ static const struct net_device_ops hostap_master_ops = {
	.ndo_open		= prism2_open,
	.ndo_stop		= prism2_close,
	.ndo_do_ioctl		= hostap_ioctl,
	.ndo_siocdevprivate	= hostap_siocdevprivate,
	.ndo_set_mac_address	= prism2_set_mac_address,
	.ndo_set_rx_mode	= hostap_set_multicast_list,
	.ndo_tx_timeout 	= prism2_tx_timeout,