diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-04-08 16:53:57 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-04-08 16:53:57 +0000 |
commit | e081482c885406513b43ee095e2352fef742e218 (patch) | |
tree | b5ed04ccc02ab83259a1e5e23c415022eb22a78c /openwrt/package | |
parent | 39babcd41e2338d2ff457be60ba01c3a631fce42 (diff) |
add SIOCGIWMODE and SIOCSIWMODE
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@586 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'openwrt/package')
-rw-r--r-- | openwrt/package/openwrt/wlcompat.c | 73 |
1 files changed, 71 insertions, 2 deletions
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 */ |