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 | b9cb3d1ffb90e252be1aea19ca850a0573567a8b (patch) | |
tree | dbb49740fd5f9ce6054c766fd85397960871be07 /package/openwrt | |
parent | e2e9c79b6e8b207283671bc554095082786262b4 (diff) |
add repeater mode for IWMODE
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@587 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/openwrt')
-rw-r--r-- | package/openwrt/wlcompat.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/package/openwrt/wlcompat.c b/package/openwrt/wlcompat.c index ebed8c365..53cedd8ba 100644 --- a/package/openwrt/wlcompat.c +++ b/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; |