From: nbd Date: Fri, 8 Apr 2005 16:53:57 +0000 (+0000) Subject: add SIOCGIWMODE and SIOCSIWMODE X-Git-Url: http://git.rohieb.name/openwrt.git/commitdiff_plain/e081482c885406513b43ee095e2352fef742e218?ds=sidebyside add SIOCGIWMODE and SIOCSIWMODE git-svn-id: svn://svn.openwrt.org/openwrt/trunk@586 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- diff --git a/openwrt/package/openwrt/wlcompat.c b/openwrt/package/openwrt/wlcompat.c index 52af95a9a..ebed8c365 100644 --- a/openwrt/package/openwrt/wlcompat.c +++ b/openwrt/package/openwrt/wlcompat.c @@ -201,6 +201,75 @@ static int wlcompat_ioctl(struct net_device *dev, return wlcompat_ioctl_getiwrange(dev, extra); break; } + case SIOCSIWMODE: + { + int ap = -1, infra = -1, passive = -1; + + switch (wrqu->mode) { + case IW_MODE_MONITOR: + passive = 1; + break; + case IW_MODE_ADHOC: + passive = 0; + infra = 0; + ap = 0; + break; + case IW_MODE_MASTER: + passive = 0; + infra = 1; + ap = 1; + break; + case IW_MODE_INFRA: + passive = 0; + infra = 1; + ap = 0; + break; + default: + return -EINVAL; + } + + if (passive >= 0) { + if (wl_ioctl(dev, WLC_SET_PASSIVE, &passive, sizeof(passive)) < 0) + return -EINVAL; + if (wl_ioctl(dev, WLC_SET_MONITOR, &passive, sizeof(passive)) < 0) + return -EINVAL; + } + if (ap >= 0) + if (wl_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap)) < 0) + return -EINVAL; + if (infra >= 0) + if (wl_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(infra)) < 0) + return -EINVAL; + + break; + + } + case SIOCGIWMODE: + { + int ap, infra, passive; + + if (wl_ioctl(dev, WLC_GET_AP, &ap, sizeof(ap)) < 0) + return -EINVAL; + + if (wl_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra)) < 0) + return -EINVAL; + + if (wl_ioctl(dev, WLC_GET_PASSIVE, &passive, sizeof(passive)) < 0) + return -EINVAL; + + if (passive) { + wrqu->mode = IW_MODE_MONITOR; + } else if (!infra) { + wrqu->mode = IW_MODE_ADHOC; + } else { + if (ap) { + wrqu->mode = IW_MODE_MASTER; + } else { + wrqu->mode = IW_MODE_INFRA; + } + } + break; + } default: { return -EINVAL; @@ -217,8 +286,8 @@ static const iw_handler wlcompat_handler[] = { NULL, /* SIOCGIWNWID */ wlcompat_ioctl, /* SIOCSIWFREQ */ wlcompat_ioctl, /* SIOCGIWFREQ */ - NULL, /* SIOCSIWMODE */ - NULL, /* SIOCGIWMODE */ + wlcompat_ioctl, /* SIOCSIWMODE */ + wlcompat_ioctl, /* SIOCGIWMODE */ NULL, /* SIOCSIWSENS */ NULL, /* SIOCGIWSENS */ NULL, /* SIOCSIWRANGE */