diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-04-08 17:15:40 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-04-08 17:15:40 +0000 |
commit | 280ca161ab5c8c973f5672a897cbb6347430c38d (patch) | |
tree | 2076d142112a7779e964948fca40b6d394e3a5a0 | |
parent | e081482c885406513b43ee095e2352fef742e218 (diff) |
add repeater mode for IWMODE
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@587 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | openwrt/package/openwrt/wlcompat.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/openwrt/package/openwrt/wlcompat.c b/openwrt/package/openwrt/wlcompat.c index ebed8c365..53cedd8ba 100644 --- a/openwrt/package/openwrt/wlcompat.c +++ b/openwrt/package/openwrt/wlcompat.c @@ -203,37 +203,39 @@ static int wlcompat_ioctl(struct net_device *dev, } case SIOCSIWMODE: { - int ap = -1, infra = -1, passive = -1; + int ap = -1, infra = -1, passive = 0, wet = 0; 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; + case IW_MODE_REPEAT: + infra = 1; + ap = 0; + wet = 1; + 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 (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 (wl_ioctl(dev, WLC_SET_WET, &wet, sizeof(wet)) < 0) + return -EINVAL; if (ap >= 0) if (wl_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap)) < 0) return -EINVAL; @@ -246,16 +248,16 @@ static int wlcompat_ioctl(struct net_device *dev, } case SIOCGIWMODE: { - int ap, infra, passive; + int ap, infra, wet, 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 (wl_ioctl(dev, WLC_GET_WET, &wet, sizeof(wet)) < 0) + return -EINVAL; if (passive) { wrqu->mode = IW_MODE_MONITOR; @@ -265,7 +267,11 @@ static int wlcompat_ioctl(struct net_device *dev, if (ap) { wrqu->mode = IW_MODE_MASTER; } else { - wrqu->mode = IW_MODE_INFRA; + if (wet) { + wrqu->mode = IW_MODE_REPEAT; + } else { + wrqu->mode = IW_MODE_INFRA; + } } } break; |