<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    iwpriv工具通過ioctl動態獲取相應無線網卡驅動的private_args所有擴展參數

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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"
    };

     

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全