天天看點

iwpriv工具通過ioctl動态擷取相應無線網卡驅動的private_args所有擴充參數

<code>iwpriv工具通過ioctl動态擷取相應無線網卡驅動的private_args所有擴充參數 iwpriv是處理下面的wlan_private_args的所有擴充指令,iwpriv的實作上,是這樣的, =&gt;main =&gt;set_private =&gt;iw_get_priv_info擷取wireless網卡所能處理的所有wlan_private_args類型. dev_ioctl =&gt;wext_handle_ioctl =&gt;wireless_process_ioctl     if (cmd == SIOCGIWPRIV &amp;&amp; dev-&gt;wireless_handlers)         return ioctl_standard_call(dev, ifr, cmd,                      &amp;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, &amp;info, &amp;(iwr-&gt;u), extra);             if (user_length &lt; iwr-&gt;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 &lt; SIOCIWFIRSTPRIV)             return ioctl_standard_call(dev, ifr, cmd, handler);         else</code>

<code>//如果有對應的handler,那麼處理iwpriv的指令,可以我們的iwpriv都是由dev-&gt;do_ioctl完成的.             return ioctl_private_call(dev, ifr, cmd, handler);     }     /* Old driver API : call driver ioctl handler */     if (dev-&gt;do_ioctl) //如果dev-&gt;wireless_handlers-&gt;standard和dev-&gt;wireless_handlers-&gt;private[index都不對該cmd作處理,那麼由 //dev-&gt;do_ioctl = wlan_do_ioctl;我們驅動的最後處理函數wlan_do_ioctl處理.         return dev-&gt;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-&gt;wireless_handlers == NULL)         return NULL;     /* Try as a standard command */     index = cmd - SIOCIWFIRST;     if (index &lt; dev-&gt;wireless_handlers-&gt;num_standard)         return dev-&gt;wireless_handlers-&gt;standard[index];     /* Try as a private command */     index = cmd - SIOCIWFIRSTPRIV;//     if (index &lt; dev-&gt;wireless_handlers-&gt;num_private)         return dev-&gt;wireless_handlers-&gt;private[index];//該private指令的handler.     /* Not found */     return NULL; }</code>

<code>下面wlan_private_args為本wifi網卡驅動的所能支援的所有指令,也就是iwpriv指令所能支援的所有指令</code>

<code>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 &gt; 20   get_wireless_stats:wlan_get_wireless_stats, #endif };</code>

<code>以下為示意代碼,我們的wifi網卡驅動支援如下iwpriv指令.</code>

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"

};

<code></code>

繼續閱讀