###1. 物理网卡与虚拟网络接口
在linux中, 物理上的无线网卡使用 struct wiphy 来表示, 对应 “/sys/class/ieee80211/” 目录,一个无线 网卡可以支持多个虚拟网络接口, 虚拟网络接口使用 struct net_device 来表示, 对应”/sys/class/net/” 目录 (参照iw 中的phy和dev, 分别代表物理网卡和虚拟网络接口)
在ieee80211无线网络的结构中, STA具有不同的类型, 例如 AP, STA, AD-HOC 等, 称为无线网络接口的工作模式, 也被称为无线网络接口的类型
WNIC (Wireless Network Interface Controler) 可以在下述的模式中的一种中工作, 不同的模式决定了无线连接的主要功能, 若无线网络接口能够支持多个虚拟接口, 则无线网卡还可以同时工作在不同的模式
###2. STA
Station infrastructure mode
基本上所有的wifi driver都能支持这种模式, 因此也被称为default模式
在 使用WEXT的tool中(例如 iwconfig, iw), STA 模式也被称为 managed 模式
###3. AP
AccessPoint infrastructure mode
在基础型网络结构中, AP作为网络中的master设备, 所有的STA要通过AP来交换数据
###4. MON
Monitor mode
Monitor mode是一种完全的被动模式,不发送任何帧, 并且所有接收到的帧都会发送到Host CPU, 不经过任何过滤, 通常用于抓取的sniffer log
使用mac80211, 可以为一个无线网络卡设置monitor模式, 作为正常模式(STA)的附加, 即2者共存, 当然, 不是所有的hardware都支持monitor模式, 也不是所有的hardware都支持monitor模式和正常模式共存
使用mac80211, 可以在monitor模式下发送数据包, 常用于数据帧注入,可用于在用户空间实现MLME
###5. IBSS
Idependent Basic Service Set mode , 也被称为 Ad-Hoc mode
Ad-Hoc 模式也被称为 IBBS (Independent Basic Service Set) 模式, 可用于建立一个无需AP的无线网络
###6. WDS
Wireless Distribution System mode
DS (Distribution System) 是给AP提供上行链接, WDS也是实现相同的目的, 只是是以无线的形式
在无线应用领域中, WDS都是帮助无线基站与无线基站之间进行联系通讯的系统
在家庭应用中, WDS的功能是充当无线网络的中继器,通过在无线路由器上开启WDS功能,让其可以延伸扩展无线信号,从而覆盖更广更大的范围
WDS 模式涉及到 4 address
###7. Mesh
Mesh 模式用于在多个设备之间建立智能路由, 实现互相通信
###8. P2P-Client
充当p2p模式中的 client
###9. P2P-Go
充当p2p模式中的group
###10. nl80211中的虚拟网络接口类型
enum nl80211_iftype {
NL80211_IFTYPE_UNSPECIFIED,
NL80211_IFTYPE_ADHOC,
NL80211_IFTYPE_STATION,
NL80211_IFTYPE_AP,
NL80211_IFTYPE_AP_VLAN, //必须绑定到一个NL80211_IFTYPE_AP类型的接口上
NL80211_IFTYPE_WDS,
NL80211_IFTYPE_MONITOR,
NL80211_IFTYPE_MESH_POINT,
NL80211_IFTYPE_P2P_CLIENT,
NL80211_IFTYPE_P2P_GO,
NL80211_IFTYPE_P2P_DEVICE, //这不是一个netdev, 因此必须用NL80211_CMD_START_P2P_DEVICE
//和NL80211_CMD_STOP_P2P_DEVICE来建立和销毁
/* keep last */
NUM_NL80211_IFTYPES,
NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
};
从 NL80211_IFTYPE_ADHOC 到 NL80211_IFTYPE_P2P_DEVICE,和前述的无线网络接口的的类型相对应
###11. wiphy支持的接口类型
wiphy 标识一个物理无线网卡, 被依次命名为 phy0,phy1,……phyn, 使用iw 命令可以查看物理网卡支持的工作模式
# iw phy phy0 info
Wiphy phy0
max # scan SSIDs: 9
max scan IEs length: 255 bytes
Retry short limit: 7
Retry long limit: 4
Coverage class: 0 (up to 0m)
Device supports roaming.
......
Supported interface modes:
* IBSS
* managed
* AP
* P2P-client
* P2P-GO
......
即该物理网卡支持 IBSS, STA, AP, P2P-Client, P2P-Go 这些工作模式
同样, iw 还能够查看一个无线网络接口的工作模式, 例如
# iw dev wlan0 info
Interface wlan0
ifindex 43
wdev 0x700000001
addr 00:0a:f5:0c:33:d8
type managed
wiphy 7
# iw dev p2p0 info
Interface p2p0
ifindex 44
wdev 0x700000002
addr 02:0a:f5:0c:33:d8
ssid DIRECT-0Y-Android_c359
type P2P-client
wiphy 7
# iw dev p2p0 info
Interface p2p0
ifindex 30
wdev 0x2
addr 1e:b7:2c:9e:1e:26
ssid DIRECT-0Y-Android_c359
type P2P-GO
wiphy 0
###12. wiphy支持的接口类型组合
wiphy可以支持多个工作模式同时操作, 即一个物理无线网卡上可以支持多个虚拟网卡,受限于hw, fw, driver的实现, 不同的网卡能够支持的组合有所不同
nl80211中使用如下的数据结构来描述wiphy能够支持的接口类型组合:
struct ieee80211_iface_limit {
u16 max; //该类型接口的最大数目
u16 types; //接口的类型, 如果有多个不同类型的接口有总数限制, 则因该对这些类型做or操作
};
struct ieee80211_iface_combination {
const struct ieee80211_iface_limit *limits; // ieee80211_iface_limit 结构体的元素个数
u32 num_different_channels; // 可以同时工作的channel的数目
u16 max_interfaces; // 允许的接口数目的最大值
u8 n_limits; // limits 中 ieee80211_iface_limit 结构体的数目
bool beacon_int_infra_match; // STA模式和AP模式下的beacon interval是否要匹配
u8 radar_detect_widths; // 雷达探测所支持的chennel宽度的位图
};
相关的信息保存在 wiphy 结构体中
struct wiphy {
......
// 存放 ieee80211_iface_combination 结构体数组, 若wiphy支持多种不同的组合,
// 则需要使用多个 ieee80211_iface_combination , 大部分情况下, 只支持一种组合
const struct ieee80211_iface_combination *iface_combinations;
// iface_combinations 成员中 ieee80211_iface_combination 结构体的个数
int n_iface_combinations;
....
}
例如:
struct ieee80211_iface_limit wlan_hdd_iface_limit[] = {
{
.max = 3,
.types = BIT(NL80211_IFTYPE_STATION),
},
{
.max = 1,
.types = BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP),
},
{
.max = 1,
.types = BIT(NL80211_IFTYPE_P2P_GO) |
BIT(NL80211_IFTYPE_P2P_CLIENT),
},
};
struct ieee80211_iface_combination wlan_hdd_iface_combination = {
.limits = wlan_hdd_iface_limit,
.num_different_channels = 1,
.max_interfaces = 3,
.n_limits = ARRAY_SIZE(wlan_hdd_iface_limit),
.beacon_int_infra_match = false,
};
即该wiphy最大支持
- 3个STA类型的接口
- 1个类型的 AD-HOC 或者 AP 类型的接口
- 1个类型的 P2P-GO 或者 P2P-Client 类型的接口
当然, 该wiphy最大支持3个虚拟网络接口
使用iw tool能够查看wiphy 支持的接口组合
# iw phy phy7 info
Wiphy phy7
......
valid interface combinations:
* #{ managed } <= 3, #{ IBSS, AP } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 1
即最大支持3个 STA 接口, 最大支持1个IBSS接口或者AP接口, 最大支持1个 P2P-Go 接口或者 P2P-client 接口, 并且接口类型的总数最大为3个, 且只能工作在一个channel
###13. 使用iw添加网络接口
在支持多个虚拟网络接口的无线网卡上面, 可以使用 iw 来添加无线网络接口, iw可以用于添加如下类型的网络接口
- monitor
- managed
- wds
- mesh
- ibss
例如:
iw phy phy0 interface add moni0 type monitor
iw phy phy0 interface add wlan10 type managed
// mesh id 为 “mymesh”
iw phy phy0 interface add mesh0 type mp mesh_id mymesh
iw phy phy0 interface add wds0 type wds
删除iw添加的网络接口则需要使用“iw dev xx del”, 例如
iw dev moni0 del