diff options
-rw-r--r-- | package/openwrt/include/wlcompat.h | 32 | ||||
-rw-r--r-- | package/openwrt/wlcompat.c | 99 |
2 files changed, 82 insertions, 49 deletions
diff --git a/package/openwrt/include/wlcompat.h b/package/openwrt/include/wlcompat.h new file mode 100644 index 000000000..e7ead4520 --- /dev/null +++ b/package/openwrt/include/wlcompat.h @@ -0,0 +1,32 @@ +/* + * wlcompat.h + * + * Copyright (C) 2005 Felix Fietkau <nbd@vd-s.ath.cx> + * + * 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 <linux/wireless.h> + +#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 + +#endif diff --git a/package/openwrt/wlcompat.c b/package/openwrt/wlcompat.c index 3c163fd18..1719a67a7 100644 --- a/package/openwrt/wlcompat.c +++ b/package/openwrt/wlcompat.c @@ -31,6 +31,7 @@ #include <net/iw_handler.h> #include <wlioctl.h> +#include <wlcompat.h> static struct net_device *dev; char buf[WLC_IOCTL_MAXLEN]; @@ -549,35 +550,6 @@ static const iw_handler wlcompat_handler[] = { wlcompat_ioctl, /* SIOCGIWENCODE */ }; -#define PRIV_SET_MONITOR SIOCIWFIRSTPRIV + 0 -#define PRIV_GET_MONITOR SIOCIWFIRSTPRIV + 1 -#define PRIV_SET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 2 -#define PRIV_GET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 3 - -static const struct iw_priv_args wlcompat_private_args[] = -{ - { PRIV_SET_MONITOR, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_monitor" - }, - { PRIV_GET_MONITOR, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_monitor" - }, - { PRIV_SET_TXPWR_LIMIT, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_txpwr_force" - }, - { PRIV_GET_TXPWR_LIMIT, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_txpwr_force" - } -}; - static int wlcompat_private_ioctl(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, @@ -586,21 +558,21 @@ static int wlcompat_private_ioctl(struct net_device *dev, int *value = (int *) wrqu->name; switch (info->cmd) { - case PRIV_SET_MONITOR: + case WLCOMPAT_SET_MONITOR: { if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0) return -EINVAL; break; } - case PRIV_GET_MONITOR: + case WLCOMPAT_GET_MONITOR: { if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0) return -EINVAL; break; } - case PRIV_SET_TXPWR_LIMIT: + case WLCOMPAT_SET_TXPWR_LIMIT: { int val; @@ -618,7 +590,7 @@ static int wlcompat_private_ioctl(struct net_device *dev, break; } - case PRIV_GET_TXPWR_LIMIT: + case WLCOMPAT_GET_TXPWR_LIMIT: { if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0) return -EINVAL; @@ -636,29 +608,49 @@ static int wlcompat_private_ioctl(struct net_device *dev, return 0; } +static const struct iw_priv_args wlcompat_private_args[] = +{ + { WLCOMPAT_SET_MONITOR, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "set_monitor" + }, + { WLCOMPAT_GET_MONITOR, + 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_monitor" + }, + { WLCOMPAT_SET_TXPWR_LIMIT, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "set_txpwr_force" + }, + { WLCOMPAT_GET_TXPWR_LIMIT, + 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_txpwr_force" + } +}; -static const iw_handler wlcompat_private[] = +static const iw_handler wlcompat_private[] = { wlcompat_private_ioctl, - wlcompat_private_ioctl, - wlcompat_private_ioctl, - wlcompat_private_ioctl + NULL }; -static const struct iw_handler_def wlcompat_handler_def = +static const struct iw_handler_def wlcompat_handler_def = { .standard = (iw_handler *) wlcompat_handler, .num_standard = sizeof(wlcompat_handler)/sizeof(iw_handler), .private = wlcompat_private, - .num_private = sizeof(wlcompat_private)/sizeof(iw_handler), - .private_args = wlcompat_private_args, - .num_private_args = sizeof(wlcompat_private_args)/sizeof(struct iw_priv_args), + .num_private = 1, + .private_args = wlcompat_private_args, + .num_private_args = sizeof(wlcompat_private_args) / sizeof(wlcompat_private_args[0]) }; #ifdef DEBUG -static int (*old_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); void print_buffer(int len, unsigned char *buf) { int x; if (buf != NULL) { @@ -673,10 +665,23 @@ void print_buffer(int len, unsigned char *buf) { printk("\n"); } +#endif +static int (*old_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { int ret = 0; + struct iwreq *iwr = (struct iwreq *) ifr; + struct iw_request_info info; + +#ifdef DEBUG printk("dev: %s ioctl: 0x%04x\n",dev->name,cmd); - if (cmd==SIOCDEVPRIVATE) { +#endif + + if (cmd >= SIOCIWFIRSTPRIV) { + info.cmd = cmd; + info.flags = 0; + ret = wlcompat_private_ioctl(dev, &info, &(iwr->u), (char *) &(iwr->u)); +#ifdef DEBUG + } else if (cmd==SIOCDEVPRIVATE) { wl_ioctl_t *ioc = (wl_ioctl_t *)ifr->ifr_data; unsigned char *buf = ioc->buf; printk(" cmd: %d buf: 0x%08x len: %d\n",ioc->cmd,&(ioc->buf),ioc->len); @@ -686,12 +691,12 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { printk(" recv: ->"); print_buffer(ioc->len, buf); printk(" ret: %d\n", ret); +#endif } else { ret = old_ioctl(dev,ifr,cmd); } return ret; } -#endif static int __init wlcompat_init() { @@ -699,7 +704,7 @@ static int __init wlcompat_init() char *devname = "eth0"; while (!found && (dev = dev_get_by_name(devname))) { - if ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC) + if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC)) found = 1; devname[3]++; } @@ -710,10 +715,8 @@ static int __init wlcompat_init() } -#ifdef DEBUG old_ioctl = dev->do_ioctl; dev->do_ioctl = new_ioctl; -#endif dev->wireless_handlers = (struct iw_handler_def *)&wlcompat_handler_def; return 0; } @@ -721,9 +724,7 @@ static int __init wlcompat_init() static void __exit wlcompat_exit() { dev->wireless_handlers = NULL; -#ifdef DEBUG dev->do_ioctl = old_ioctl; -#endif return; } |