Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca1e8bb8 authored by David S. Miller's avatar David S. Miller Committed by David S. Miller
Browse files

wext: Parameterize the standard/private handlers.



The WEXT standard and private handlers to use are now
arguments to wireless_process_ioctl().

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 67dd7608
Loading
Loading
Loading
Loading
+16 −8
Original line number Original line Diff line number Diff line
@@ -1015,11 +1015,17 @@ static int ioctl_private_call(struct net_device *dev, struct ifreq *ifr,
}
}


/* ---------------------------------------------------------------- */
/* ---------------------------------------------------------------- */
typedef int (*wext_ioctl_func)(struct net_device *, struct ifreq *,
			       unsigned int, iw_handler);

/*
/*
 * Main IOCTl dispatcher.
 * Main IOCTl dispatcher.
 * Check the type of IOCTL and call the appropriate wrapper...
 * Check the type of IOCTL and call the appropriate wrapper...
 */
 */
static int wireless_process_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd)
static int wireless_process_ioctl(struct net *net, struct ifreq *ifr,
				  unsigned int cmd,
				  wext_ioctl_func standard,
				  wext_ioctl_func private)
{
{
	struct net_device *dev;
	struct net_device *dev;
	iw_handler	handler;
	iw_handler	handler;
@@ -1035,11 +1041,11 @@ static int wireless_process_ioctl(struct net *net, struct ifreq *ifr, unsigned i
	 * 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) */
	if (cmd == SIOCGIWSTATS)
	if (cmd == SIOCGIWSTATS)
		return ioctl_standard_call(dev, ifr, cmd,
		return standard(dev, ifr, cmd,
				&iw_handler_get_iwstats);
				&iw_handler_get_iwstats);


	if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
	if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
		return ioctl_standard_call(dev, ifr, cmd,
		return standard(dev, ifr, cmd,
				&iw_handler_get_private);
				&iw_handler_get_private);


	/* Basic check */
	/* Basic check */
@@ -1051,9 +1057,9 @@ static int wireless_process_ioctl(struct net *net, struct ifreq *ifr, unsigned i
	if (handler) {
	if (handler) {
		/* Standard and private are not the same */
		/* Standard and private are not the same */
		if (cmd < SIOCIWFIRSTPRIV)
		if (cmd < SIOCIWFIRSTPRIV)
			return ioctl_standard_call(dev, ifr, cmd, handler);
			return standard(dev, ifr, cmd, handler);
		else
		else
			return ioctl_private_call(dev, ifr, cmd, handler);
			return private(dev, ifr, cmd, handler);
	}
	}
	/* Old driver API : call driver ioctl handler */
	/* Old driver API : call driver ioctl handler */
	if (dev->do_ioctl)
	if (dev->do_ioctl)
@@ -1084,7 +1090,9 @@ int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd,


	dev_load(net, ifr->ifr_name);
	dev_load(net, ifr->ifr_name);
	rtnl_lock();
	rtnl_lock();
	ret = wireless_process_ioctl(net, ifr, cmd);
	ret = wireless_process_ioctl(net, ifr, cmd,
				     ioctl_standard_call,
				     ioctl_private_call);
	rtnl_unlock();
	rtnl_unlock();
	if (IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct iwreq)))
	if (IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct iwreq)))
		return -EFAULT;
		return -EFAULT;