Changeset 882


Ignore:
Timestamp:
2005-05-13T21:01:32+02:00 (13 years ago)
Author:
nbd
Message:

replace device in wlcompat(non-debug), add wlcompat.h and refuse to load wlcompat.o if a wireless extension already exists

Location:
trunk/openwrt/package/openwrt
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/openwrt/wlcompat.c

    r809 r882  
    3232#include <net/iw_handler.h> 
    3333#include <wlioctl.h> 
     34#include <wlcompat.h> 
    3435 
    3536static struct net_device *dev; 
     
    550551}; 
    551552 
    552 #define PRIV_SET_MONITOR                SIOCIWFIRSTPRIV + 0 
    553 #define PRIV_GET_MONITOR                SIOCIWFIRSTPRIV + 1 
    554 #define PRIV_SET_TXPWR_LIMIT            SIOCIWFIRSTPRIV + 2 
    555 #define PRIV_GET_TXPWR_LIMIT            SIOCIWFIRSTPRIV + 3 
    556  
    557 static const struct iw_priv_args        wlcompat_private_args[] =  
    558 { 
    559         {       PRIV_SET_MONITOR,  
     553static int wlcompat_private_ioctl(struct net_device *dev, 
     554                         struct iw_request_info *info, 
     555                         union iwreq_data *wrqu, 
     556                         char *extra) 
     557{ 
     558        int *value = (int *) wrqu->name; 
     559 
     560        switch (info->cmd) { 
     561                case WLCOMPAT_SET_MONITOR: 
     562                { 
     563                        if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0) 
     564                                return -EINVAL; 
     565 
     566                        break; 
     567                } 
     568                case WLCOMPAT_GET_MONITOR: 
     569                { 
     570                        if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0) 
     571                                return -EINVAL; 
     572 
     573                        break; 
     574                } 
     575                case WLCOMPAT_SET_TXPWR_LIMIT: 
     576                { 
     577                        int val; 
     578                         
     579 
     580                        if (wl_get_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
     581                                return -EINVAL; 
     582                         
     583                        if (*extra > 0) 
     584                                val |= WL_TXPWR_OVERRIDE; 
     585                        else 
     586                                val &= ~WL_TXPWR_OVERRIDE; 
     587                         
     588                        if (wl_set_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
     589                                return -EINVAL; 
     590                         
     591                        break; 
     592                } 
     593                case WLCOMPAT_GET_TXPWR_LIMIT: 
     594                { 
     595                        if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0) 
     596                                return -EINVAL; 
     597 
     598                        *value = ((*value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE ? 1 : 0); 
     599 
     600                        break; 
     601                } 
     602                default: 
     603                { 
     604                        return -EINVAL; 
     605                } 
     606                         
     607        } 
     608        return 0; 
     609} 
     610 
     611static const struct iw_priv_args wlcompat_private_args[] =  
     612{ 
     613        {       WLCOMPAT_SET_MONITOR,  
    560614                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
    561615                0, 
    562616                "set_monitor" 
    563617        }, 
    564         {       PRIV_GET_MONITOR,  
     618        {       WLCOMPAT_GET_MONITOR,  
    565619                0, 
    566620                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
    567621                "get_monitor" 
    568622        }, 
    569         {       PRIV_SET_TXPWR_LIMIT,  
     623        {       WLCOMPAT_SET_TXPWR_LIMIT,  
    570624                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
    571625                0, 
    572626                "set_txpwr_force" 
    573627        }, 
    574         {       PRIV_GET_TXPWR_LIMIT,  
     628        {       WLCOMPAT_GET_TXPWR_LIMIT,  
    575629                0, 
    576630                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
     
    579633}; 
    580634 
    581 static int wlcompat_private_ioctl(struct net_device *dev, 
    582                          struct iw_request_info *info, 
    583                          union iwreq_data *wrqu, 
    584                          char *extra) 
    585 { 
    586         int *value = (int *) wrqu->name; 
    587  
    588         switch (info->cmd) { 
    589                 case PRIV_SET_MONITOR: 
    590                 { 
    591                         if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0) 
    592                                 return -EINVAL; 
    593  
    594                         break; 
    595                 } 
    596                 case PRIV_GET_MONITOR: 
    597                 { 
    598                         if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0) 
    599                                 return -EINVAL; 
    600  
    601                         break; 
    602                 } 
    603                 case PRIV_SET_TXPWR_LIMIT: 
    604                 { 
    605                         int val; 
    606                          
    607  
    608                         if (wl_get_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
    609                                 return -EINVAL; 
    610                          
    611                         if (*extra > 0) 
    612                                 val |= WL_TXPWR_OVERRIDE; 
    613                         else 
    614                                 val &= ~WL_TXPWR_OVERRIDE; 
    615                          
    616                         if (wl_set_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
    617                                 return -EINVAL; 
    618                          
    619                         break; 
    620                 } 
    621                 case PRIV_GET_TXPWR_LIMIT: 
    622                 { 
    623                         if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0) 
    624                                 return -EINVAL; 
    625  
    626                         *value = ((*value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE ? 1 : 0); 
    627  
    628                         break; 
    629                 } 
    630                 default: 
    631                 { 
    632                         return -EINVAL; 
    633                 } 
    634                          
    635         } 
    636         return 0; 
    637 } 
    638  
    639  
    640 static const iw_handler wlcompat_private[] =  
     635static const iw_handler wlcompat_private[] = 
    641636{ 
    642637        wlcompat_private_ioctl, 
    643         wlcompat_private_ioctl, 
    644         wlcompat_private_ioctl, 
    645         wlcompat_private_ioctl 
     638        NULL 
    646639}; 
    647640 
    648641 
    649 static const struct iw_handler_def      wlcompat_handler_def = 
     642static const struct iw_handler_def wlcompat_handler_def = 
    650643{ 
    651644        .standard       = (iw_handler *) wlcompat_handler, 
    652645        .num_standard   = sizeof(wlcompat_handler)/sizeof(iw_handler), 
    653646        .private        = wlcompat_private, 
    654         .num_private    = sizeof(wlcompat_private)/sizeof(iw_handler), 
    655         .private_args   = wlcompat_private_args,  
    656         .num_private_args = sizeof(wlcompat_private_args)/sizeof(struct iw_priv_args), 
     647        .num_private    = 1, 
     648        .private_args   = wlcompat_private_args, 
     649        .num_private_args = sizeof(wlcompat_private_args) / sizeof(wlcompat_private_args[0]) 
    657650}; 
    658651 
    659652 
    660653#ifdef DEBUG 
    661 static int (*old_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); 
    662654void print_buffer(int len, unsigned char *buf) { 
    663655        int x; 
     
    674666 
    675667} 
     668#endif 
     669static int (*old_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); 
    676670static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { 
    677671        int ret = 0; 
     672        struct iwreq *iwr = (struct iwreq *) ifr; 
     673        struct iw_request_info info; 
     674         
     675#ifdef DEBUG 
    678676        printk("dev: %s ioctl: 0x%04x\n",dev->name,cmd); 
    679         if (cmd==SIOCDEVPRIVATE) { 
     677#endif 
     678 
     679        if (cmd >= SIOCIWFIRSTPRIV) { 
     680                info.cmd = cmd; 
     681                info.flags = 0; 
     682                ret = wlcompat_private_ioctl(dev, &info, &(iwr->u), (char *) &(iwr->u)); 
     683#ifdef DEBUG 
     684        } else if (cmd==SIOCDEVPRIVATE) { 
    680685                wl_ioctl_t *ioc = (wl_ioctl_t *)ifr->ifr_data; 
    681686                unsigned char *buf = ioc->buf; 
     
    687692                print_buffer(ioc->len, buf); 
    688693                printk("   ret: %d\n", ret); 
     694#endif 
    689695        } else { 
    690696                ret = old_ioctl(dev,ifr,cmd); 
     
    692698        return ret; 
    693699} 
    694 #endif 
    695700 
    696701static int __init wlcompat_init() 
     
    700705         
    701706        while (!found && (dev = dev_get_by_name(devname))) { 
    702                 if ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC) 
     707                if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC)) 
    703708                        found = 1; 
    704709                devname[3]++; 
     
    711716                 
    712717 
    713 #ifdef DEBUG 
    714718        old_ioctl = dev->do_ioctl; 
    715719        dev->do_ioctl = new_ioctl; 
    716 #endif 
    717720        dev->wireless_handlers = (struct iw_handler_def *)&wlcompat_handler_def; 
    718721        return 0; 
     
    722725{ 
    723726        dev->wireless_handlers = NULL; 
    724 #ifdef DEBUG 
    725727        dev->do_ioctl = old_ioctl; 
    726 #endif 
    727728        return; 
    728729} 
Note: See TracChangeset for help on using the changeset viewer.