iwpriv工具通過ioctl動態獲取相應無線網卡驅動的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"
};
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成