Changeset 670


Ignore:
Timestamp:
2005-04-18T09:47:40+02:00 (13 years ago)
Author:
nbd
Message:

add wlcompat private calls for monitor mode and txpower override

File:
1 edited

Legend:

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

    r637 r670  
    4343#define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) 
    4444 
     45static int wlcompat_private_ioctl(struct net_device *dev, 
     46                         struct iw_request_info *info, 
     47                         union iwreq_data *wrqu, 
     48                         char *extra); 
     49 
    4550static int wl_ioctl(struct net_device *dev, int cmd, void *buf, int len) 
    4651{ 
     
    6065} 
    6166 
     67static int wl_set_val(struct net_device *dev, char *var, void *val, int len) 
     68{ 
     69        char buf[128]; 
     70        int buf_len; 
     71 
     72        /* check for overflow */ 
     73        if ((buf_len = strlen(var)) + 1 + len > sizeof(buf)) 
     74                return -1; 
     75         
     76        strcpy(buf, var); 
     77        buf_len += 1; 
     78 
     79        /* append int value onto the end of the name string */ 
     80        memcpy(&buf[buf_len], val, len); 
     81        buf_len += len; 
     82 
     83        return wl_ioctl(dev, WLC_SET_VAR, buf, buf_len); 
     84} 
     85 
     86static int wl_get_val(struct net_device *dev, char *var, void *val, int len) 
     87{ 
     88        char buf[128]; 
     89        int ret; 
     90 
     91        /* check for overflow */ 
     92        if (strlen(var) + 1 > sizeof(buf) || len > sizeof(buf)) 
     93                return -1; 
     94         
     95        strcpy(buf, var); 
     96        if ((ret = wl_ioctl(dev, WLC_GET_VAR, buf, sizeof(buf)))) 
     97                return ret; 
     98 
     99        memcpy(val, buf, len); 
     100        return 0; 
     101} 
     102 
     103 
    62104static int wlcompat_ioctl_getiwrange(struct net_device *dev, 
    63105                                    char *extra) 
     
    318360                case SIOCGIWTXPOW: 
    319361                { 
    320                         wrqu->txpower.value = 0; 
    321                         if (wl_ioctl(dev,WLC_GET_TXPWR, &(wrqu->txpower.value), sizeof(int)) < 0) 
    322                                 return -EINVAL; 
     362                        if (wl_get_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0) 
     363                                return -EINVAL; 
     364                         
     365                        wrqu->txpower.value &= ~WL_TXPWR_OVERRIDE; 
     366                                 
    323367                        wrqu->txpower.fixed = 0; 
    324368                        wrqu->txpower.disabled = 0; 
     
    328372                case SIOCSIWTXPOW: 
    329373                { 
     374                        int override; 
     375                         
     376                        if (wl_get_val(dev, "qtxpower", &override, sizeof(int)) < 0) 
     377                                return -EINVAL; 
     378                         
     379                        wrqu->txpower.value |= override & WL_TXPWR_OVERRIDE; 
     380                         
    330381                        if (wrqu->txpower.flags != IW_TXPOW_MWATT) 
    331382                                return -EINVAL; 
    332383 
    333                         if (wl_ioctl(dev, WLC_SET_TXPWR, &wrqu->txpower.value, sizeof(int)) < 0) 
     384                        if (wl_set_val(dev, "qtxpower", &wrqu->txpower.value, sizeof(int)) < 0) 
    334385                                return -EINVAL; 
    335386                } 
     
    432483                default: 
    433484                { 
     485                        if (info->cmd >= SIOCIWFIRSTPRIV) 
     486                                return wlcompat_private_ioctl(dev, info, wrqu, extra); 
     487 
    434488                        return -EINVAL; 
    435489                } 
     
    486540}; 
    487541 
     542#define PRIV_SET_MONITOR                SIOCIWFIRSTPRIV + 0 
     543#define PRIV_GET_MONITOR                SIOCIWFIRSTPRIV + 1 
     544#define PRIV_SET_TXPWR_LIMIT            SIOCIWFIRSTPRIV + 2 
     545#define PRIV_GET_TXPWR_LIMIT            SIOCIWFIRSTPRIV + 3 
     546 
     547static const struct iw_priv_args        wlcompat_private_args[] =  
     548{ 
     549        {       PRIV_SET_MONITOR,  
     550                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
     551                0, 
     552                "set_monitor" 
     553        }, 
     554        {       PRIV_GET_MONITOR,  
     555                0, 
     556                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
     557                "get_monitor" 
     558        }, 
     559        {       PRIV_SET_TXPWR_LIMIT,  
     560                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
     561                0, 
     562                "set_txpwr_limit" 
     563        }, 
     564        {       PRIV_GET_TXPWR_LIMIT,  
     565                0, 
     566                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 
     567                "get_txpwr_limit" 
     568        } 
     569}; 
     570 
     571static int wlcompat_private_ioctl(struct net_device *dev, 
     572                         struct iw_request_info *info, 
     573                         union iwreq_data *wrqu, 
     574                         char *extra) 
     575{ 
     576        int *value = (int *) wrqu->name; 
     577 
     578        switch (info->cmd) { 
     579                case PRIV_SET_MONITOR: 
     580                { 
     581                        if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0) 
     582                                return -EINVAL; 
     583 
     584                        break; 
     585                } 
     586                case PRIV_GET_MONITOR: 
     587                { 
     588                        if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0) 
     589                                return -EINVAL; 
     590 
     591                        break; 
     592                } 
     593                case PRIV_SET_TXPWR_LIMIT: 
     594                { 
     595                        int val; 
     596                         
     597 
     598                        if (wl_get_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
     599                                return -EINVAL; 
     600                         
     601                        if (*extra > 0) 
     602                                val |= WL_TXPWR_OVERRIDE; 
     603                        else 
     604                                val &= ~WL_TXPWR_OVERRIDE; 
     605                         
     606                        if (wl_set_val(dev, "qtxpower", &val, sizeof(int)) < 0) 
     607                                return -EINVAL; 
     608                         
     609                        break; 
     610                } 
     611                case PRIV_GET_TXPWR_LIMIT: 
     612                { 
     613                        if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0) 
     614                                return -EINVAL; 
     615 
     616                        *value = ((*value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE ? 1 : 0); 
     617 
     618                        break; 
     619                } 
     620                default: 
     621                { 
     622                        return -EINVAL; 
     623                } 
     624                         
     625        } 
     626        return 0; 
     627} 
     628 
     629 
     630static const iw_handler wlcompat_private[] =  
     631{ 
     632        wlcompat_private_ioctl, 
     633        wlcompat_private_ioctl, 
     634        wlcompat_private_ioctl, 
     635        wlcompat_private_ioctl 
     636}; 
     637 
     638 
    488639static const struct iw_handler_def      wlcompat_handler_def = 
    489640{ 
    490641        .standard       = (iw_handler *) wlcompat_handler, 
    491642        .num_standard   = sizeof(wlcompat_handler)/sizeof(iw_handler), 
    492         .private        = NULL, 
    493         .num_private    = 0, 
    494         .private_args   = NULL,  
    495         .num_private_args = 0, 
     643        .private        = wlcompat_private, 
     644        .num_private    = sizeof(wlcompat_private)/sizeof(iw_handler), 
     645        .private_args   = wlcompat_private_args,  
     646        .num_private_args = sizeof(wlcompat_private_args)/sizeof(struct iw_priv_args), 
    496647}; 
     648 
    497649 
    498650#ifdef DEBUG 
Note: See TracChangeset for help on using the changeset viewer.