iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

简介: iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的,=>main=>set_private=>iw_get_priv_info获取wireless网卡所能处理的所有wlan_private_args类型.

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的,
=>main
=>set_private
=>iw_get_priv_info获取wireless网卡所能处理的所有wlan_private_args类型.

dev_ioctl
=>wext_handle_ioctl
=>wireless_process_ioctl
    if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
        return ioctl_standard_call(dev, ifr, cmd,
                     &iw_handler_get_private);
static int ioctl_standard_call(struct net_device *    dev,
             struct ifreq *        ifr,
             unsigned int        cmd,
             iw_handler        handler)
{
    ...
        /* Call the handler */
        ret = handler(dev, &info, &(iwr->u), extra);
            if (user_length < iwr->u.data.length) {
                kfree(extra);
                return -E2BIG;
//通知iwpriv,本wifi网卡对应的private命令还没有完,还有,这样iwpriv将会继续
//maxpriv默认为16,即将以16个为一组,一组一组的从wifi网卡驱动读取该网卡所能支持的所有private_args参数
//newpriv = realloc(priv, maxpriv * sizeof(priv[0]));继续申请,继续拷贝,知道将wifi网卡自定义的wlan_private_args参数全部
//传出到iwpriv为止.
            }
    ...
}
    /* New driver API : try to find the handler */
    handler = get_handler(dev, cmd);//获取

    if (handler) {
        /* Standard and private are not the same */
        if (cmd < SIOCIWFIRSTPRIV)
            return ioctl_standard_call(dev, ifr, cmd, handler);
        else

//如果有对应的handler,那么处理iwpriv的命令,可以我们的iwpriv都是由dev->do_ioctl完成的.
            return ioctl_private_call(dev, ifr, cmd, handler);
    }
    /* Old driver API : call driver ioctl handler */
    if (dev->do_ioctl)
//如果dev->wireless_handlers->standard和dev->wireless_handlers->private[index都不对该cmd作处理,那么由
//dev->do_ioctl = wlan_do_ioctl;我们驱动的最后处理函数wlan_do_ioctl处理.
        return dev->do_ioctl(dev, ifr, cmd);

static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
{
    /* Don't "optimise" the following variable, it will crash */
    unsigned int    index;        /* *MUST* be unsigned */

    /* Check if we have some wireless handlers defined */
    if (dev->wireless_handlers == NULL)
        return NULL;

    /* Try as a standard command */
    index = cmd - SIOCIWFIRST;
    if (index < dev->wireless_handlers->num_standard)
        return dev->wireless_handlers->standard[index];

    /* Try as a private command */
    index = cmd - SIOCIWFIRSTPRIV;//

    if (index < dev->wireless_handlers->num_private)
        return dev->wireless_handlers->private[index];//该private命令的handler.
    /* Not found */
    return NULL;
}

下面wlan_private_args为本wifi网卡驱动的所能支持的所有命令,也就是iwpriv命令所能支持的所有命令

struct iw_handler_def wlan_handler_def = {
  num_standard:sizeof(wlan_handler) / sizeof(iw_handler),
  num_private:sizeof(wlan_private_handler) / sizeof(iw_handler),
  num_private_args:sizeof(wlan_private_args) / sizeof(struct iw_priv_args),
  standard:(iw_handler *) wlan_handler,
  private:(iw_handler *) wlan_private_handler,
  private_args:(struct iw_priv_args *) wlan_private_args,
#if WIRELESS_EXT > 20
  get_wireless_stats:wlan_get_wireless_stats,
#endif
};

以下为示意代码,我们的wifi网卡驱动支持如下iwpriv命令.

static const struct iw_priv_args wlan_private_args[] = {
     "extscan"
     "hostcmd"
     "arpfilter"
     "regrdwr"
     "sdcmd52rw"
     "sdcmd53rw"
     "setgetconf"
     "getcis"
     "scantype"
     "deauth"
     "getNF"
     "getRSSI"
     "bgscan"
     "enable11d"
     "adhocgrate"
     "sdioclock"
     "wmm"
     "uapsdnullgen"
     "setcoalescing"
     "adhocgprot"
     "setpowercons"
     "wmm_qosinfo"
     "lolisteninter"
     "fwwakeupmethod"
     "psnullinterval"
     "bcnmisto"
     "adhocawakepd"
     "moduletype"
     "autodeepsleep"
     "enhanceps"
     "wakeupmt"
     "setrxant"
     "settxant"
     "authalgs"
     "encryptionmode"
     "setregioncode"
     "setlisteninter"
     "setmultipledtim"
     "setbcnavg"
     "setdataavg
     "associate"
     "getregioncode"
     "getlisteninter"
     "getmultipledtim"
     "gettxrate"
     "getbcnavg"
     "getdataavg"
     "getrxant"
     "gettxant"
     "gettsf"
     "wpssession"
     "deepsleep"
     "adhocstop"
     "radioon"
     "radiooff"
     "rmaeskey"
     "crypto_test"
     "reasso-on"
     "reasso-off"
     "wlanidle-on"
     "wlanidle-off"
     "sleepparams"
     "requesttpc"
     "powercap"
     "measreq"
     "bca-ts"
     "scanmode"
     "getadhocstatus"
     "setgenie"
     "getgenie"
     "qstatus"
     "ts_status"
     "setaeskey"
     "getaeskey"
     "version"
     "verext"
     "setwpaie"
     "setband"
     "setadhocch"
     "chanswann"
     "getband"
     "getadhocch"
     "getlog"
     "tpccfg"
     "scanprobes"
     "ledgpio"
     "sleeppd"
     "rateadapt"
     "getSNR"
     "getrate"
     "getrxinfo"
     "atimwindow"
     "bcninterval"
     "sdiopullctrl"
     "scantime"
     "sysclock"
     "txcontrol"
     "hscfg"
     "hssetpara"
     "inactoext"
     "dbgscfg"
     "drvdbg"
     "drvdelaymax"
     "intfctrl"
     "setquietie"
     ""
     "setuserscan"
     "getscantable"
     "setmrvltlv"
     "getassocrsp"
     "addts"
     "delts"
     "qconfig"
     "qstats"
     "txpktstats"
     "getcfptable"
     "mefcfg"
     "getmem"
};

 

目录
相关文章
|
27天前
|
C语言 C++
【C++】string的底层剖析以及模拟实现
【C++】string的底层剖析以及模拟实现
|
10月前
编写一个程序,链接两个字符串字面常量,将结果保存在一个动态分配的char数组中,重写这个程序,连接两个标准string对象
编写一个程序,链接两个字符串字面常量,将结果保存在一个动态分配的char数组中,重写这个程序,连接两个标准string对象
|
10月前
|
存储 C语言
static的作用
static的作用
128 0
|
存储 Python
python中argparse库,在B文件中如何调取A文件中的args参数,直接调用的方式
如果你想在 B 文件中导入 A 文件并直接访问其中的参数,那么需要注意以下两点: 1. 2. 在 A 文件中定义的参数必须是全局变量或者是可被外部访问的类属性或实例属性。否则,在 B 文件中无法直接访问这些参数。 3. 4. 如果 A 文件中定义了和 B 文件中相同名称的参数,那么在导入 A 文件之后,B 文件中的同名参数将被覆盖,导致访问到的值可能不是预期的值。
254 0
是否可以从一个static方法内部发出对非static方法的调用?
这里其实问的是静态方法和非静态方法的区别: 静态方法和非静态方法的区别可以总结如下:
653 0
|
算法 编译器 数据库
【CPP】string 类的模拟实现(下)
【CPP】string 类的模拟实现(下)
【CPP】string 类的模拟实现(下)
|
存储 编译器 C++
【CPP】string 类的模拟实现(上)
【CPP】string 类的模拟实现(上)
【CPP】string 类的模拟实现(上)
|
存储 程序员 编译器
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
126 0
|
网络协议 C# C++
关于 C#调用c库,将C#的byte[]传入C库的方法和将C库的char*向上传入C#的回调函数byte[] 的方法
关于 C#调用c库,将C#的byte[]传入C库的方法和将C库的char*向上传入C#的回调函数byte[] 的方法
关于 C#调用c库,将C#的byte[]传入C库的方法和将C库的char*向上传入C#的回调函数byte[] 的方法

热门文章

最新文章