From b9cb3d1ffb90e252be1aea19ca850a0573567a8b Mon Sep 17 00:00:00 2001 From: nbd Date: Fri, 8 Apr 2005 17:15:40 +0000 Subject: add repeater mode for IWMODE git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@587 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/openwrt/wlcompat.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'package') 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; -- cgit v1.2.3