<code>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</code>
<code>//如果有對應的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; }</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 > 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>