wlanconfig

~ # 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简介

wlanconfig是madwifi无线网卡驱动中方便用户对VAP进行控制的工具。

madwifi无线网卡驱动可以基于一块物理无线网卡实现多AP或者AP/Station共存,每个Station实例或者AP实例都可以称作一个VAP,但是由于这些VAP共用了一块物理网卡,所以必须工作在同一个channel上,并且使用相同的物理层参数。用户可以通过wlanconfig工具来创建、销毁以及控制VAP。

wlanconfig命令使用

wlanconfig工具的命令使用十分简单,只有以下三种

 

1

2

3

 

wlanconfig athX create [nounit] wlandev wifiY wlanmode [sta|adhoc|ap|monitor|wds|ahdemo] [bssid | -bssid] [nosbeacon]

wlanconfig athX destroy

wlanconfig athX list [active|ap|caps|chan|freq|keys|scan|sta|wme]

第一条命令用来创建VAP,athX是VAP名称,可以是一个设备名全称(例如ath0),也可以只是一个前缀(例如ath),后者在未使用nounit选项时内核会自动将前缀补全成一个完整设备名,否则直接使用该字符串作为VAP名。wifiX是真实的物理网卡名,通过iwconfig可以看到,bssid选项是指使用一个与wifiX不同的mac地址来创建athX,-bssid选项表示使用一个与wifiX相同的mac地址来创建athX,最后的nosbeacon选项是在已有AP存在时建立STA时需要加上的。
VAP模式可以是以下几种模式中的一种:

 

1

2

3

4

5

6

 

ahdemo Create the station in ad-hoc demo (aka pseudo IBSS) mode.

adhoc Create the station in ad-hoc mode.

ap Create the VAP in AP mode.

monitor Create the station in monitor mode.

sta Create the VAP in station mode.

wds Create the station in WDS mode.

下面用几个实例来说明create命令的使用
使用以下命令可以创建一个名为athN的station(N位网络接口中未使用的athX中的最小X)

 

1

 

wlanconfig ath create wlandev wifi0 wlanmode sta

使用以下命令可以创建一个名为ath0的AP

 

1

 

wlanconfig ath0 create wlandev wifi0 wlanmode ap

使用以下命令可以创建AP+station共存

 

1

2

 

wlanconfig ath0 create wlandev wifi0 wlanmode ap

wlanconfig ath1 create wlandev wifi0 wlanmode sta nosbeacon

使用以下命令创建一个WDS网桥

 

1

2

3

4

5

6

7

8

9

10

11

 

wlanconfig ath0 create wlandev wifi0 wlanmode ap

wlanconfig ath1 create wlandev wifi0 wlanmode wds

iwconfig ath0 essid "madwifi" channel 1

iwpriv ath1 wds_add <mac of the peer wds ap>

iwpriv ath1 wds 1

ifconfig ath1 up

ifconfig ath0 up

brctl addbr br0

brctl addif br0 ath1

brctl addif br0 ath0

ifconfig br0 up

第二条命令用来销毁VAP,必须使用设备全名。

第三条命令用来显示VAP的一些相关信息,注意如果参数和VAP类型不符合,是不会显示任何结果的。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

sta or no parameters.

Show information on associated stations.

scan or ap

List all visible stations.

chan or freq

List all channels and frequencies.

active

List all available channels and frequencies.

keys

List all of the keys associated with the VAP

caps

List the capabilities of the given VAP.

wme

List WME (Wireless multimedia extensions, aka WMM) parameters.

wlanconfig源码简析

wlanconfig工具的源码只有1000行左右,基本就是配置参数然后调用ioctl。
以下先给出wlanconfig中可能用到的IOCTL宏,定义在ieee80211_ioctl.h中:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

 

#define IEEE80211_IOCTL_GETKEY (SIOCDEVPRIVATE+3)

#define IEEE80211_IOCTL_GETWPAIE (SIOCDEVPRIVATE+4)

#define IEEE80211_IOCTL_STA_STATS (SIOCDEVPRIVATE+5)

#define IEEE80211_IOCTL_STA_INFO (SIOCDEVPRIVATE+6)

#define SIOC80211IFCREATE (SIOCDEVPRIVATE+7)

#define SIOC80211IFDESTROY (SIOCDEVPRIVATE+8)

#define IEEE80211_IOCTL_SCAN_RESULTS (SIOCDEVPRIVATE+9)

#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0)

#define IEEE80211_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1)

#define IEEE80211_IOCTL_SETMODE (SIOCIWFIRSTPRIV+2)

#define IEEE80211_IOCTL_GETMODE (SIOCIWFIRSTPRIV+3)

#define IEEE80211_IOCTL_SETWMMPARAMS (SIOCIWFIRSTPRIV+4)

#define IEEE80211_IOCTL_GETWMMPARAMS (SIOCIWFIRSTPRIV+5)

#define IEEE80211_IOCTL_SETCHANLIST (SIOCIWFIRSTPRIV+6)

#define IEEE80211_IOCTL_GETCHANLIST (SIOCIWFIRSTPRIV+7)

#define IEEE80211_IOCTL_CHANSWITCH (SIOCIWFIRSTPRIV+8)

#define IEEE80211_IOCTL_GET_APPIEBUF (SIOCIWFIRSTPRIV+9)

#define IEEE80211_IOCTL_SET_APPIEBUF (SIOCIWFIRSTPRIV+10)

#define IEEE80211_IOCTL_FILTERFRAME (SIOCIWFIRSTPRIV+12)

#define (SIOCIWFIRSTPRIV+13)

#define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+14)

#define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+15)

#define IEEE80211_IOCTL_SETMLME (SIOCIWFIRSTPRIV+16)

#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+18)

#define IEEE80211_IOCTL_DELKEY (SIOCIWFIRSTPRIV+20)

#define IEEE80211_IOCTL_ADDMAC (SIOCIWFIRSTPRIV+22)

#define IEEE80211_IOCTL_DELMAC (SIOCIWFIRSTPRIV+24)

#define IEEE80211_IOCTL_WDSADDMAC (SIOCIWFIRSTPRIV+26)

#define IEEE80211_IOCTL_WDSDELMAC (SIOCIWFIRSTPRIV+28)

#define IEEE80211_IOCTL_KICKMAC (SIOCIWFIRSTPRIV+30)

对于SIOCDEVPRIVATESIOCDEVPRIVATE+15之间的宏,内核会调用dev->do_ioctl函数,而do_ioctl是由驱动来实现的,在madwifi中,如果调用设备是物理设备,则dev->do_ioctl = ath_ioctl,而如果调用设备是VAP,则dev->do_ioctl = ieee80211_ioctl

对于SIOCIWFIRSTPRIVSIOCIWFIRSTPRIV+31之间的宏,madwifi在ieee80211_priv_handlers数组中定义了每个宏对应的处理函数,这里就不深入去说了。

根据以上这些,我们基本上可以根据一个在wlanconfig中出现的ioctl操作,找到它在madwifi驱动中的处理函数了。

create

首先看create操作,create操作主要填充了两个结构体:struct ifreq reqstruct ieee80211_clone_params cpifreqifr_nameifr_data两部分组成,其中ifr_name存的是物理设备的名字,比如wifi0,而ifr_data中放的就是结构体cp,该结构体定义在ieee80211_ioctl.h中,如下:

 

1

2

3

4

5

6

7

 

struct ieee80211_clone_params {

char icp_name[IFNAMSIZ]; /* device name */

u_int16_t icp_opmode; /* operating mode */

u_int16_t icp_flags; /* see below */

#define IEEE80211_CLONE_BSSID 0x0001 /* allocate unique mac/bssid */

#define IEEE80211_NO_STABEACONS 0x0002 /* Do not setup the station beacon timers */

};

icp_name是VAP名,如果未设定nounit选项并且最后一位不是数字,会先打开/proc/net/dev文件,找到一个最小的可用数字构成VAP名,icp_opmode和icp_flags分别是VAP模式和输入选项标志。

最后程序调用ioctl(s, SIOC80211IFCREATE, ifr)创建VAP,这里顺便简单提一下创建VAP的过程。

对于宏SIOC80211IFCREATE,驱动会进入ath_ioctl函数,我们可以在该函数中找到创建VAP的代码。

 

1

2

3

 

case SIOC80211IFCREATE:

error = ieee80211_ioctl_create_vap(ic, ifr, dev);

break;

ath_ioctl中调用了ieee80211_ioctl_create_vap函数,该函数对参数进行解析并最终调用ic->ic_vap_create函数来创建VAP。在该函数中可以看到,ifr_name被设置为最终建立的VAP名后返回,wlanconfig程序调用完ioctl之后将使用ifr_name打印VAP名。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

 

int

ieee80211_ioctl_create_vap(struct ieee80211com *ic, struct ifreq *ifr, struct net_device *mdev)

{

struct ieee80211_clone_params cp;

struct ieee80211vap *vap;

char name[IFNAMSIZ];

int unit;

if (!capable(CAP_NET_ADMIN))

return -EPERM;

if (copy_from_user(&cp, ifr->ifr_data, sizeof(cp)))

return -EFAULT;

unit = ieee80211_new_wlanunit();

if (unit == -1)

return -EIO; /* XXX */

strncpy(name, cp.icp_name, sizeof(name));

vap = ic->ic_vap_create(ic, name, unit, cp.icp_opmode, cp.icp_flags, mdev);

if (vap == NULL) {

ieee80211_delete_wlanunit(unit);

return -EIO;

}

/* return final device name */

strncpy(ifr->ifr_name, vap->iv_dev->name, IFNAMSIZ);

return 0;

}

destroy

destroy操作几乎就是直接调用了ioctl(s, SIOC80211IFDESTROY, &ifr)函数,但它调用的并不是ath_ioctl函数,因为create操作中的ifr_name的是wifiX,也就是真实物理设备,而destroy操作中的ifr_name是athX,是VAP设备,也就是说destroy的具体过程在ieee80211_ioctl函数中。
ieee80211_ioctl.c中停用并删除VAP的代码如下

 

1

2

3

4

5

6

 

case SIOC80211IFDESTROY:

if (!capable(CAP_NET_ADMIN))

return -EPERM;

ieee80211_stop(vap->iv_dev); /* force state before cleanup */

vap->iv_ic->ic_vap_delete(vap);

return 0;

list

首先看list sta,该操作最终调用了ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr),这里的ioctl传的是iwreq结构体,其实它和ifreq结构体是一样的,只是在ifi_data部分进行了细化,定义在wireless_copy.h中:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

 

struct iwreq

{

union

{

char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */

} ifr_ifrn;

/* Data part (defined just above) */

union iwreq_data u;

};

union iwreq_data

{

/* Config - generic */

char name[IFNAMSIZ];

/* Name : used to verify the presence of wireless extensions.

* Name of the protocol/provider... */

struct iw_point essid; /* Extended network name */

struct iw_param nwid; /* network id (or domain - the cell) */

struct iw_freq freq; /* frequency or channel :

* 0-1000 = channel

* > 1000 = frequency in Hz */

struct iw_param sens; /* signal level threshold */

struct iw_param bitrate; /* default bit rate */

struct iw_param txpower; /* default transmit power */

struct iw_param rts; /* RTS threshold threshold */

struct iw_param frag; /* Fragmentation threshold */

__u32 mode; /* Operation mode */

struct iw_param retry; /* Retry limits & lifetime */

struct iw_point encoding; /* Encoding stuff : tokens */

struct iw_param power; /* PM duration/timeout */

struct iw_quality qual; /* Quality part of statistics */

struct sockaddr ap_addr; /* Access point address */

struct sockaddr addr; /* Destination address (hw/mac) */

struct iw_param param; /* Other small parameters */

struct iw_point data; /* Other large parameters */

};

对于宏IEEE80211_IOCTL_STA_INFO的处理,可以在ieee80211_ioctl函数中可以找到

 

1

2

 

case IEEE80211_IOCTL_STA_INFO:

return ieee80211_ioctl_getstainfo(dev, (struct iwreq *) ifr);

具体获得站点信息的过程可以去看ieee80211_ioctl_getstainfo函数,该函数将站点信息填充在ifr->u.data中后返回给ioctl调用。

以下几个list操作不再详细介绍,只给出对应的IOCTL宏,对应的处理函数可以根据一开始说的方法以在madwifi驱动中找到

 

1

2

3

4

5

 

scan or ap IEEE80211_IOCTL_SCAN_RESULTS

chan or freq IEEE80211_IOCTL_GETCHANINFO

active IEEE80211_IOCTL_GETCHANINFO + IEEE80211_IOCTL_GETCHANLIST

wme IEEE80211_IOCTL_GETWMMPARAMS

caps IEEE80211_IOCTL_GETPARAM

最后剩下的list keys操作实际上是调用了iwlist athX key命令

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值