From 023228e711306be8462e3a4d87a0096a1d16d553 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 2 Aug 2005 21:08:26 +0000 Subject: [PATCH] add a way of forcing a custom bssid in ad-hoc mode so other nodes will use it SVN-Revision: 1575 --- openwrt/package/openwrt/include/wlcompat.h | 36 --------- .../target/linux/package/wlcompat/wlcompat.c | 77 +++++++++++++++++-- 2 files changed, 72 insertions(+), 41 deletions(-) delete mode 100644 openwrt/package/openwrt/include/wlcompat.h diff --git a/openwrt/package/openwrt/include/wlcompat.h b/openwrt/package/openwrt/include/wlcompat.h deleted file mode 100644 index a4fc13439d..0000000000 --- a/openwrt/package/openwrt/include/wlcompat.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * wlcompat.h - * - * Copyright (C) 2005 Felix Fietkau - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Id$ - */ -#include - -#ifndef WLCOMPAT_H -#define WLCOMPAT_H - -#define WLCOMPAT_SET_MONITOR SIOCIWFIRSTPRIV + 0 -#define WLCOMPAT_GET_MONITOR SIOCIWFIRSTPRIV + 1 -#define WLCOMPAT_SET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 2 -#define WLCOMPAT_GET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 3 -#define WLCOMPAT_SET_ANTDIV SIOCIWFIRSTPRIV + 4 -#define WLCOMPAT_GET_ANTDIV SIOCIWFIRSTPRIV + 5 -#define WLCOMPAT_SET_TXANT SIOCIWFIRSTPRIV + 6 -#define WLCOMPAT_GET_TXANT SIOCIWFIRSTPRIV + 7 - -#endif diff --git a/openwrt/target/linux/package/wlcompat/wlcompat.c b/openwrt/target/linux/package/wlcompat/wlcompat.c index 037d9ce0f8..aaccc7bceb 100644 --- a/openwrt/target/linux/package/wlcompat/wlcompat.c +++ b/openwrt/target/linux/package/wlcompat/wlcompat.c @@ -2,7 +2,7 @@ * wlcompat.c * * Copyright (C) 2005 Mike Baker, - * Felix Fietkau + * Felix Fietkau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,9 +31,9 @@ #include #include -#include static struct net_device *dev; +static unsigned short bss_force; char buf[WLC_IOCTL_MAXLEN]; /* The frequency of each channel in MHz */ @@ -341,20 +341,53 @@ static int wlcompat_ioctl(struct net_device *dev, case SIOCSIWAP: { int ap = 0; - + int infra = 0; + rw_reg_t reg; + + memset(®, 0, sizeof(reg)); + if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) return -EINVAL; if (wl_ioctl(dev, WLC_GET_AP, &ap, sizeof(ap)) < 0) return -EINVAL; - - if (wl_ioctl(dev, (ap ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0) + + if (wl_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra)) < 0) + return -EINVAL; + + if (!infra) { + wl_ioctl(dev, WLC_SET_BSSID, wrqu->ap_addr.sa_data, 6); + + reg.size = 4; + reg.byteoff = 0x184; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + + reg.val &= 0x0000ffff; + reg.val |= bss_force << 16; + wl_ioctl(dev, WLC_W_REG, ®, sizeof(reg)); + } + + if (wl_ioctl(dev, ((ap || !infra) ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0) return -EINVAL; break; } case SIOCGIWAP: { +#ifdef DEBUG + rw_reg_t reg; + memset(®, 0, sizeof(reg)); + + reg.size = 4; + reg.byteoff = 0x184; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + printk("bss time = 0x%08x", reg.val); + + reg.byteoff = 0x180; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + printk("%08x\n", reg.val); +#endif + wrqu->ap_addr.sa_family = ARPHRD_ETHER; if (wl_ioctl(dev,WLC_GET_BSSID,wrqu->ap_addr.sa_data,6) < 0) return -EINVAL; @@ -661,6 +694,19 @@ static const iw_handler wlcompat_handler[] = { wlcompat_ioctl, /* SIOCGIWENCODE */ }; + +#define WLCOMPAT_SET_MONITOR SIOCIWFIRSTPRIV + 0 +#define WLCOMPAT_GET_MONITOR SIOCIWFIRSTPRIV + 1 +#define WLCOMPAT_SET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 2 +#define WLCOMPAT_GET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 3 +#define WLCOMPAT_SET_ANTDIV SIOCIWFIRSTPRIV + 4 +#define WLCOMPAT_GET_ANTDIV SIOCIWFIRSTPRIV + 5 +#define WLCOMPAT_SET_TXANT SIOCIWFIRSTPRIV + 6 +#define WLCOMPAT_GET_TXANT SIOCIWFIRSTPRIV + 7 +#define WLCOMPAT_SET_BSS_FORCE SIOCIWFIRSTPRIV + 8 +#define WLCOMPAT_GET_BSS_FORCE SIOCIWFIRSTPRIV + 9 + + static int wlcompat_private_ioctl(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, @@ -738,6 +784,16 @@ static int wlcompat_private_ioctl(struct net_device *dev, break; } + case WLCOMPAT_SET_BSS_FORCE: + { + bss_force = (unsigned short) *value; + break; + } + case WLCOMPAT_GET_BSS_FORCE: + { + *extra = (int) bss_force; + break; + } default: { return -EINVAL; @@ -789,6 +845,16 @@ static const struct iw_priv_args wlcompat_private_args[] = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_txant" }, + { WLCOMPAT_SET_BSS_FORCE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "set_bss_force" + }, + { WLCOMPAT_GET_BSS_FORCE, + 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_bss_force" + }, }; static const iw_handler wlcompat_private[] = @@ -861,6 +927,7 @@ static int __init wlcompat_init() { int found = 0, i; char *devname = "eth0"; + bss_force = 0; while (!found && (dev = dev_get_by_name(devname))) { if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC)) -- 2.30.2