~ # wlanconfig
usage: wlanconfig athX create wlandev wifiX
wlanmode [sta|adhoc|ap|monitor|p2pgo|p2pcli|p2pdev] [bssid | -bssid] [nosbeacon]
usage: wlanconfig athX destroy
usage: wlanconfig athX nawds mode (0-4)
usage: wlanconfig athX nawds defcaps CAPS
usage: wlanconfig athX nawds override (0-1)
usage: wlanconfig athX nawds add-repeater MAC (0-1)
usage: wlanconfig athX nawds del-repeater MAC
usage: wlanconfig athX nawds list
usage: wlanconfig athX wds add-addr MAC_NODE MAC (1-2)
创建VAP接口
AP模式
wlanconfig athN create wlandev wifiN wlanmode ap
wlanconfig ath0 create wlandev wifi0 wlanmode ap
Station模式
wlanconfig athN create wlandev wifiN wlanmode sta nosbeacon
Ad Hoc模式
wlanconfig athN create wlandev wifiN wlanmode adhoc
Monitor模式
wlanconfig monN create wlandev wifiN wlanmode mon
删除VAP接口
wlanconfig athN destroy
查看支持的信道
~ # wlanconfig ath0 list chan
Channel 1 : 2412 Mhz 11ng C CU Channel 64 : 5320 *~ Mhz 11na C CL
Channel 2 : 2417 Mhz 11ng C CU Channel 100 : 5500 *~ Mhz 11na C CU
Channel 3 : 2422 Mhz 11ng C CU Channel 104 : 5520 *~ Mhz 11na C CL
Channel 4 : 2427 Mhz 11ng C CU Channel 108 : 5540 *~ Mhz 11na C CU
Channel 5 : 2432 Mhz 11ng C CU CL Channel 112 : 5560 *~ Mhz 11na C CL
Channel 6 : 2437 Mhz 11ng C CU CL Channel 116 : 5580 *~ Mhz 11na C CU
Channel 7 : 2442 Mhz 11ng C CU CL Channel 120 : 5600 *~ Mhz 11na C CL
Channel 8 : 2447 Mhz 11ng C CL Channel 124 : 5620 *~ Mhz 11na C CU
Channel 9 : 2452 Mhz 11ng C CL Channel 128 : 5640 *~ Mhz 11na C CL
Channel 10 : 2457 Mhz 11ng C CL Channel 132 : 5660 *~ Mhz 11na C CU
Channel 11 : 2462 Mhz 11ng C CL Channel 136 : 5680 *~ Mhz 11na C CL
Channel 36 : 5180 Mhz 11na C CU Channel 140 : 5700 *~ Mhz 11na C
Channel 40 : 5200 Mhz 11na C CL Channel 149 : 5745 Mhz 11na C CU
Channel 44 : 5220 Mhz 11na C CU Channel 153 : 5765 Mhz 11na C CL
Channel 48 : 5240 Mhz 11na C CL Channel 157 : 5785 Mhz 11na C CU
Channel 52 : 5260 *~ Mhz 11na C CU Channel 161 : 5805 Mhz 11na C CL
Channel 56 : 5280 *~ Mhz 11na C CL Channel 165 : 5825 Mhz 11na C
Channel 60 : 5300 *~ Mhz 11na C CU
~ # wlanconfig ath0 list scan
~ # wlanconfig ath0 list sta
~ # wlanconfig ath0 list uista
wlanconfig是madwifi无线网卡驱动中方便用户对VAP进行控制的工具。
madwifi无线网卡驱动可以基于一块物理无线网卡实现多AP或者AP/Station共存,每个Station实例或者AP实例都可以称作一个VAP,但是由于这些VAP共用了一块物理网卡,所以必须工作在同一个channel上,并且使用相同的物理层参数。用户可以通过wlanconfig工具来创建、销毁以及控制VAP。
wlanconfig工具的命令使用十分简单,只有以下三种
|
|
第一条命令用来创建VAP,athX是VAP名称,可以是一个设备名全称(例如ath0),也可以只是一个前缀(例如ath),后者在未使用nounit选项时内核会自动将前缀补全成一个完整设备名,否则直接使用该字符串作为VAP名。wifiX是真实的物理网卡名,通过iwconfig可以看到,bssid选项是指使用一个与wifiX不同的mac地址来创建athX,-bssid选项表示使用一个与wifiX相同的mac地址来创建athX,最后的nosbeacon选项是在已有AP存在时建立STA时需要加上的。
VAP模式可以是以下几种模式中的一种:
|
|
下面用几个实例来说明create命令的使用
使用以下命令可以创建一个名为athN的station(N位网络接口中未使用的athX中的最小X)
|
|
使用以下命令可以创建一个名为ath0的AP
|
|
使用以下命令可以创建AP+station共存
|
|
使用以下命令创建一个WDS网桥
|
|
第二条命令用来销毁VAP,必须使用设备全名。
第三条命令用来显示VAP的一些相关信息,注意如果参数和VAP类型不符合,是不会显示任何结果的。
|
|
wlanconfig工具的源码只有1000行左右,基本就是配置参数然后调用ioctl。
以下先给出wlanconfig中可能用到的IOCTL宏,定义在ieee80211_ioctl.h
中:
|
|
对于SIOCDEVPRIVATE
到SIOCDEVPRIVATE+15
之间的宏,内核会调用dev->do_ioctl函数,而do_ioctl
是由驱动来实现的,在madwifi中,如果调用设备是物理设备,则dev->do_ioctl = ath_ioctl
,而如果调用设备是VAP,则dev->do_ioctl = ieee80211_ioctl
。
对于SIOCIWFIRSTPRIV
到SIOCIWFIRSTPRIV+31
之间的宏,madwifi在ieee80211_priv_handlers
数组中定义了每个宏对应的处理函数,这里就不深入去说了。
根据以上这些,我们基本上可以根据一个在wlanconfig中出现的ioctl操作,找到它在madwifi驱动中的处理函数了。
首先看create操作,create操作主要填充了两个结构体:struct ifreq req
和struct ieee80211_clone_params cp
,ifreq
由ifr_name
和ifr_data
两部分组成,其中ifr_name
存的是物理设备的名字,比如wifi0
,而ifr_data
中放的就是结构体cp,该结构体定义在ieee80211_ioctl.h中,如下:
|
|
icp_name是VAP名,如果未设定nounit选项并且最后一位不是数字,会先打开/proc/net/dev
文件,找到一个最小的可用数字构成VAP名,icp_opmode和icp_flags分别是VAP模式和输入选项标志。
最后程序调用ioctl(s, SIOC80211IFCREATE, ifr)
创建VAP,这里顺便简单提一下创建VAP的过程。
对于宏SIOC80211IFCREATE
,驱动会进入ath_ioctl
函数,我们可以在该函数中找到创建VAP的代码。
|
|
在ath_ioctl
中调用了ieee80211_ioctl_create_vap
函数,该函数对参数进行解析并最终调用ic->ic_vap_create
函数来创建VAP。在该函数中可以看到,ifr_name
被设置为最终建立的VAP名后返回,wlanconfig程序调用完ioctl之后将使用ifr_name
打印VAP名。
|
|
destroy操作几乎就是直接调用了ioctl(s, SIOC80211IFDESTROY, &ifr)
函数,但它调用的并不是ath_ioctl
函数,因为create操作中的ifr_name的是wifiX,也就是真实物理设备,而destroy操作中的ifr_name是athX,是VAP设备,也就是说destroy的具体过程在ieee80211_ioctl
函数中。
在ieee80211_ioctl.c
中停用并删除VAP的代码如下
|
|
首先看list sta,该操作最终调用了ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr)
,这里的ioctl传的是iwreq
结构体,其实它和ifreq
结构体是一样的,只是在ifi_data部分进行了细化,定义在wireless_copy.h
中:
|
|
对于宏IEEE80211_IOCTL_STA_INFO
的处理,可以在ieee80211_ioctl
函数中可以找到
|
|
具体获得站点信息的过程可以去看ieee80211_ioctl_getstainfo
函数,该函数将站点信息填充在ifr->u.data中后返回给ioctl调用。
以下几个list操作不再详细介绍,只给出对应的IOCTL宏,对应的处理函数可以根据一开始说的方法以在madwifi驱动中找到
|
|
最后剩下的list keys操作实际上是调用了iwlist athX key
命令