iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
iwpriv工具通過ioctl動態(tài)獲取相應(yīng)無線網(wǎng)卡驅(qū)動的private_args所有擴(kuò)展參數(shù)
iwpriv是處理下面的wlan_private_args的所有擴(kuò)展命令,iwpriv的實現(xiàn)上,是這樣的,
=>main
=>set_private
=>iw_get_priv_info獲取wireless網(wǎng)卡所能處理的所有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網(wǎng)卡對應(yīng)的private命令還沒有完,還有,這樣iwpriv將會繼續(xù)
//maxpriv默認(rèn)為16,即將以16個為一組,一組一組的從wifi網(wǎng)卡驅(qū)動讀取該網(wǎng)卡所能支持的所有private_args參數(shù)
//newpriv = realloc(priv, maxpriv * sizeof(priv[0]));繼續(xù)申請,繼續(xù)拷貝,知道將wifi網(wǎng)卡自定義的wlan_private_args參數(shù)全部
//傳出到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
//如果有對應(yīng)的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;我們驅(qū)動的最后處理函數(shù)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網(wǎng)卡驅(qū)動的所能支持的所有命令,也就是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網(wǎng)卡驅(qū)動支持如下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"
};
?
總結(jié)
以上是生活随笔為你收集整理的iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在SQL Server中为什么不建议使用
- 下一篇: fbset