cfg80211 子系统¶
cfg80211 是 Linux 中 802.11 设备的配置 API。它桥接了用户空间和驱动程序,并提供了一些与 802.11 相关的实用功能。所有 Linux 中的现代无线驱动程序都必须直接或间接地通过 mac80211 使用 cfg80211,以便它们通过 nl80211 提供一致的 API。为了向后兼容,cfg80211 还向用户空间提供无线扩展,但完全对驱动程序隐藏它们。
此外,cfg80211 还包含代码,以帮助执行法规频谱使用限制。
设备注册¶
为了使驱动程序使用 cfg80211,它必须向 cfg80211 注册硬件设备。这通过下面描述的许多硬件功能结构来实现。
每个设备的基本结构是“wiphy”,其中的每个实例描述连接到系统的物理无线设备。每个这样的 wiphy 可以具有零个、一个或多个与之关联的虚拟接口,这些虚拟接口需要通过将网络接口的 ieee80211_ptr 指针指向进一步描述接口无线部分的struct wireless_dev
来识别。通常,此结构嵌入在网络接口的私有数据区域中。驱动程序可以选择允许动态创建或销毁虚拟接口,但是如果没有至少一个接口或创建某些接口的能力,无线设备将无用。
每个 wiphy 结构都包含设备功能信息,并且还具有指向驱动程序提供的各种操作的指针。此处的定义和结构详细描述了这些功能。
-
enum ieee80211_channel_flags¶
信道标志
常量
IEEE80211_CHAN_DISABLED
此信道已禁用。
IEEE80211_CHAN_NO_IR
不要启动辐射,这包括发送探测请求或信标。
IEEE80211_CHAN_PSD
为此信道设置功率谱密度(以 dBm 为单位)。
IEEE80211_CHAN_RADAR
在此信道上需要雷达检测。
IEEE80211_CHAN_NO_HT40PLUS
不允许使用此信道上方的扩展信道。
IEEE80211_CHAN_NO_HT40MINUS
不允许使用此信道下方的扩展信道。
IEEE80211_CHAN_NO_OFDM
在此信道上不允许使用 OFDM。
IEEE80211_CHAN_NO_80MHZ
如果驱动程序支持频段上的 80 MHz,则此标志指示 80 MHz 信道不能使用此信道作为控制信道或任何辅助信道。这可能是由于驱动程序或法规带宽限制所致。
IEEE80211_CHAN_NO_160MHZ
如果驱动程序支持频段上的 160 MHz,则此标志指示 160 MHz 信道不能使用此信道作为控制信道或任何辅助信道。这可能是由于驱动程序或法规带宽限制所致。
IEEE80211_CHAN_INDOOR_ONLY
请参阅
NL80211_FREQUENCY_ATTR_INDOOR_ONLY
IEEE80211_CHAN_IR_CONCURRENT
请参阅
NL80211_FREQUENCY_ATTR_IR_CONCURRENT
IEEE80211_CHAN_NO_20MHZ
在此信道上不允许使用 20 MHz 带宽。
IEEE80211_CHAN_NO_10MHZ
在此信道上不允许使用 10 MHz 带宽。
IEEE80211_CHAN_NO_HE
在此信道上不允许使用 HE 操作。
IEEE80211_CHAN_1MHZ
允许在此信道上使用 1 MHz 带宽。
IEEE80211_CHAN_2MHZ
允许在此信道上使用 2 MHz 带宽。
IEEE80211_CHAN_4MHZ
允许在此信道上使用 4 MHz 带宽。
IEEE80211_CHAN_8MHZ
允许在此信道上使用 8 MHz 带宽。
IEEE80211_CHAN_16MHZ
允许在此信道上使用 16 MHz 带宽。
IEEE80211_CHAN_NO_320MHZ
如果驱动程序支持频段上的 320 MHz,则此标志指示 320 MHz 信道不能使用此信道作为控制信道或任何辅助信道。这可能是由于驱动程序或法规带宽限制所致。
IEEE80211_CHAN_NO_EHT
在此信道上不允许使用 EHT 操作。
IEEE80211_CHAN_DFS_CONCURRENT
请参阅
NL80211_RRF_DFS_CONCURRENT
IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT
不允许使用此信道连接 VLP AP 的客户端
IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT
不允许使用此信道连接 AFC AP 的客户端
IEEE80211_CHAN_CAN_MONITOR
即使存在其他(法规)限制(即使它被禁用),此信道也可用于监视模式。
IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP
即使另设置为 NO_IR,也允许使用此信道进行非常低功耗 (VLP) 的 AP 操作。
描述
由法规控制代码设置的信道标志。
-
struct ieee80211_channel¶
信道定义
定义:
struct ieee80211_channel {
enum nl80211_band band;
u32 center_freq;
u16 freq_offset;
u16 hw_value;
u32 flags;
int max_antenna_gain;
int max_power;
int max_reg_power;
bool beacon_found;
u32 orig_flags;
int orig_mag, orig_mpwr;
enum nl80211_dfs_state dfs_state;
unsigned long dfs_state_entered;
unsigned int dfs_cac_ms;
s8 psd;
};
成员
band
此信道所属的频段。
center_freq
中心频率(以 MHz 为单位)
freq_offset
从 center_freq 的偏移量,以 KHz 为单位
hw_value
信道的硬件特定值
flags
来自
enum ieee80211_channel_flags
的信道标志。max_antenna_gain
最大天线增益,以 dBi 为单位
max_power
最大传输功率(以 dBm 为单位)
max_reg_power
最大法规传输功率(以 dBm 为单位)
beacon_found
用于法规代码的辅助工具,用于指示何时在此信道上找到信标。使用 regulatory_hint_found_beacon() 启用此功能,这仅在 5 GHz 频段上有效。
orig_flags
注册时的信道标志,由法规代码使用,以支持具有其他限制的设备
orig_mag
内部使用
orig_mpwr
内部使用
dfs_state
此信道的当前状态。仅当在此信道上需要雷达时才相关。
dfs_state_entered
输入 dfs 状态时的时间戳(节拍)。
dfs_cac_ms
DFS CAC 时间(以毫秒为单位),这对于 DFS 信道有效。
psd
功率谱密度(以 dBm 为单位)
描述
此结构描述用于 cfg80211 的单个信道。
-
enum ieee80211_rate_flags¶
速率标志
常量
IEEE80211_RATE_SHORT_PREAMBLE
硬件可以在此比特率上发送短前导码;仅在 2.4GHz 频段和使用 CCK 速率时相关。
IEEE80211_RATE_MANDATORY_A
当与 802.11a(在 5 GHz 频段上)一起使用时,此比特率是强制性速率;在注册 wiphy 时由核心代码填充。
IEEE80211_RATE_MANDATORY_B
当与 802.11b(在 2.4 GHz 频段上)一起使用时,此比特率是强制性速率;在注册 wiphy 时由核心代码填充。
IEEE80211_RATE_MANDATORY_G
当与 802.11g(在 2.4 GHz 频段上)一起使用时,此比特率是强制性速率;在注册 wiphy 时由核心代码填充。
IEEE80211_RATE_ERP_G
这是 802.11g 模式下的 ERP 速率。
IEEE80211_RATE_SUPPORTS_5MHZ
速率可用于 5 MHz 模式
IEEE80211_RATE_SUPPORTS_10MHZ
速率可用于 10 MHz 模式
描述
速率的硬件/规格标志。这些标志的结构允许对不同的频段/PHY 模式使用相同的比特率结构。
-
struct ieee80211_rate¶
比特率定义
定义:
struct ieee80211_rate {
u32 flags;
u16 bitrate;
u16 hw_value, hw_value_short;
};
成员
flags
来自
enum ieee80211_rate_flags
的特定速率标志比特率
以 100 Kbps 为单位的比特率
hw_value
此速率的驱动程序/硬件值
hw_value_short
使用短前导码时此速率的驱动程序/硬件值
描述
此结构描述了 802.11 PHY 可以使用的比特率。 hw_value 和 hw_value_short 这两个值仅供驱动程序在传递此结构的指针时使用。
-
struct ieee80211_sta_ht_cap¶
STA 的 HT 能力
定义:
struct ieee80211_sta_ht_cap {
u16 cap;
bool ht_supported;
u8 ampdu_factor;
u8 ampdu_density;
struct ieee80211_mcs_info mcs;
};
成员
cap
802.11n 规范中描述的 HT 能力映射
ht_supported
STA 是否支持 HT
ampdu_factor
最大 A-MPDU 长度因子
ampdu_density
最小 A-MPDU 间隔
mcs
支持的 MCS 速率
描述
此结构描述了描述 STA 的 802.11n HT 能力所需的大部分基本参数。
-
struct ieee80211_supported_band¶
频段定义
定义:
struct ieee80211_supported_band {
struct ieee80211_channel *channels;
struct ieee80211_rate *bitrates;
enum nl80211_band band;
int n_channels;
int n_bitrates;
struct ieee80211_sta_ht_cap ht_cap;
struct ieee80211_sta_vht_cap vht_cap;
struct ieee80211_sta_s1g_cap s1g_cap;
struct ieee80211_edmg edmg_cap;
u16 n_iftype_data;
const struct ieee80211_sband_iftype_data __iftd *iftype_data;
};
成员
channels
硬件在此频段中可以使用的信道数组。
bitrates
硬件在此频段中可以使用的比特率数组。必须进行排序以给出有效的“支持速率” IE,即先是 CCK 速率,然后是 OFDM。
band
此结构表示的频段
n_channels
channels 中的信道数量
n_bitrates
bitrates 中的比特率数量
ht_cap
此频段中的 HT 能力
vht_cap
此频段中的 VHT 能力
s1g_cap
此频段中的 S1G 能力(当然仅限 S1B 频段)
edmg_cap
此频段中的 EDMG 能力
n_iftype_data
iftype 数据条目的数量
iftype_data
接口类型数据条目。请注意,此结构中 types_mask 中的位不能重叠(即,在 iftype_data 的所有实例中,每种类型只允许出现一次)。
描述
此结构描述了 wiphy 能够在其中操作的频段。
参数
struct wiphy *wiphy
要获取额外限制的无线设备
描述
某些设备可能在 DT 中指定了额外的限制。对于通常支持更多频段但由于电路板设计(例如,天线或外部功率放大器)而受到限制的芯片组,这可能很有用。
此函数从 DT 读取信息并使用它来修改信道(禁用不可用的信道)。在具有共享信道数据的驱动程序中使用它通常是一个坏主意,因为 DT 限制是特定于设备的。您应确保仅在 wiphy 中的信道被复制且可以修改而不影响其他设备时才调用它。
由于此函数访问设备节点,因此必须在 set_wiphy_dev 之后调用它。它还会修改信道,因此必须首先设置信道。如果使用此帮助程序,请在 wiphy_register()
之前调用它。
-
enum cfg80211_signal_type¶
信号类型
常量
CFG80211_SIGNAL_TYPE_NONE
无信号强度信息可用
CFG80211_SIGNAL_TYPE_MBM
以 mBm 为单位的信号强度 (100*dBm)
CFG80211_SIGNAL_TYPE_UNSPEC
信号强度,从 0 增加到 100
-
enum wiphy_params_flags¶
set_wiphy_params 位域值
常量
WIPHY_PARAM_RETRY_SHORT
wiphy->retry_short 已更改
WIPHY_PARAM_RETRY_LONG
wiphy->retry_long 已更改
WIPHY_PARAM_FRAG_THRESHOLD
wiphy->frag_threshold 已更改
WIPHY_PARAM_RTS_THRESHOLD
wiphy->rts_threshold 已更改
WIPHY_PARAM_COVERAGE_CLASS
覆盖范围类别已更改
WIPHY_PARAM_DYN_ACK
已启用 dynack
WIPHY_PARAM_TXQ_LIMIT
TXQ 数据包限制已更改
WIPHY_PARAM_TXQ_MEMORY_LIMIT
TXQ 内存限制已更改
WIPHY_PARAM_TXQ_QUANTUM
TXQ 调度器量子
-
enum wiphy_flags¶
wiphy 功能标志
常量
WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK
该设备支持更大的 kek 和 kck 密钥
WIPHY_FLAG_SUPPORTS_MLO
这是一个临时标志,用于控制 MLO API,以便在完全具备功能/接口组合/等公告之前,不会在普通驱动程序中访问到这些 API。目前,任何驱动程序都不应设置此标志。
WIPHY_FLAG_SPLIT_SCAN_6GHZ
如果设置为 true,则扫描请求将拆分为两个,第一个用于传统频段,第二个用于 6 GHz。
WIPHY_FLAG_NETNS_OK
如果未设置,则不允许更改此 wiphy 的 netns
WIPHY_FLAG_PS_ON_BY_DEFAULT
如果设置为 true,则默认情况下将启用省电模式 - 此标志将根据内核在
wiphy_new()
上的默认设置而设置,但如果驱动程序有充分理由覆盖默认设置,则可以由驱动程序更改WIPHY_FLAG_4ADDR_AP
即使在 AP 上也支持 4addr 模式(在 VLAN 接口上只有一个站点)。此标志还具有在不支持 AP/VLAN iftype 的设备上支持 4ADDR AP 模式的额外用途。
WIPHY_FLAG_4ADDR_STATION
即使作为站点也支持 4addr 模式
WIPHY_FLAG_CONTROL_PORT_PROTOCOL
此设备支持设置控制端口协议的以太网类型。该设备还遵循 control_port_no_encrypt 标志。
WIPHY_FLAG_IBSS_RSN
该设备支持 IBSS RSN。
WIPHY_FLAG_DISABLE_WEXT
禁用此设备的无线扩展
WIPHY_FLAG_MESH_AUTH
该设备支持通过将身份验证帧路由到用户空间来进行网状网络身份验证。请参阅 NL80211_MESH_SETUP_USERSPACE_AUTH。
WIPHY_FLAG_SUPPORTS_EXT_KCK_32
该设备支持 32 字节 KCK 密钥。
WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY
支持连接到 NSTR 移动 AP MLD 的非主链接。
WIPHY_FLAG_SUPPORTS_FW_ROAM
该设备支持固件中的漫游功能。
WIPHY_FLAG_AP_UAPSD
该设备支持 AP 上的 uapsd。
WIPHY_FLAG_SUPPORTS_TDLS
该设备支持 TDLS (802.11z) 操作。
WIPHY_FLAG_TDLS_EXTERNAL_SETUP
该设备不处理 TDLS (802.11z) 链接的内部设置/发现操作。设置、发现和拆除数据包应通过 NL80211_CMD_TDLS_MGMT 命令发送。如果未设置此标志,则应使用 NL80211_CMD_TDLS_OPER 来请求驱动程序/固件执行 TDLS 操作。
WIPHY_FLAG_HAVE_AP_SME
设备集成了 AP SME
WIPHY_FLAG_REPORTS_OBSS
当 AP 模式下存在虚拟接口时,设备将通过调用 cfg80211_report_obss_beacon() 报告来自其他 BSS 的信标。
WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
当作为 AP 操作时,设备会在硬件中响应探测请求。
WIPHY_FLAG_OFFCHAN_TX
设备支持直接的信道外 TX。
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
设备支持保持信道上的调用。
WIPHY_FLAG_SUPPORTS_5_10_MHZ
设备支持 5 MHz 和 10 MHz 信道。
WIPHY_FLAG_HAS_CHANNEL_SWITCH
设备支持信标模式(AP、IBSS、网状网络等)下的信道切换。
WIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER
该设备可以处理 NL80211_REGDOM_SET_BY_DRIVER 的 reg 通知。
WIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON
如果驱动程序设置此标志以更新信标提示上的信道,则调用 reg_call_notifier()。
-
struct ieee80211_iface_limit¶
对某些接口类型的限制
定义:
struct ieee80211_iface_limit {
u16 max;
u16 types;
};
成员
max
这些类型的接口的最大数量
types
接口类型(位)
-
struct ieee80211_iface_combination¶
可能的接口组合
定义:
struct ieee80211_iface_combination {
const struct ieee80211_iface_limit *limits;
u32 num_different_channels;
u16 max_interfaces;
u8 n_limits;
bool beacon_int_infra_match;
u8 radar_detect_widths;
u8 radar_detect_regions;
u32 beacon_int_min_gcd;
};
成员
limits
给定接口类型的限制
num_different_channels
可以使用最多这么多个不同的信道
max_interfaces
此组中允许的最大接口总数
n_limits
限制的数量
beacon_int_infra_match
在此组合中,基础设施类型和 AP 类型之间的信标间隔必须匹配。这仅在特殊情况下是必需的。
radar_detect_widths
支持雷达检测的信道宽度位图
radar_detect_regions
支持雷达检测的区域位图
beacon_int_min_gcd
此接口组合支持不同的信标间隔。
- = 0
不同接口的所有信标间隔必须相同。
- > 0
此组合的接口的任何信标间隔,以及此组合的信标接口的所有信标间隔的最大公约数,都必须大于或等于此值。
描述
通过此结构,驱动程序可以描述其同时支持哪些接口组合。当在 struct wiphy_radio 中设置时,组合是指当前在该无线电上处于活动状态的接口的组合。
允许 #STA <= 1,#AP <= 1,匹配 BI,信道 = 1,总共 2 个
struct ieee80211_iface_limit limits1[] = { { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, { .max = 1, .types = BIT(NL80211_IFTYPE_AP), }, }; struct ieee80211_iface_combination combination1 = { .limits = limits1, .n_limits = ARRAY_SIZE(limits1), .max_interfaces = 2, .beacon_int_infra_match = true, };
允许 #{AP, P2P-GO} <= 8,信道 = 1,总共 8 个
struct ieee80211_iface_limit limits2[] = { { .max = 8, .types = BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_P2P_GO), }, }; struct ieee80211_iface_combination combination2 = { .limits = limits2, .n_limits = ARRAY_SIZE(limits2), .max_interfaces = 8, .num_different_channels = 1, };
允许 #STA <= 1,#{P2P-client,P2P-GO} <= 3 在两个信道上,总共 4 个。
这允许一个基础设施连接和三个 P2P 连接。
struct ieee80211_iface_limit limits3[] = { { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, { .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT), }, }; struct ieee80211_iface_combination combination3 = { .limits = limits3, .n_limits = ARRAY_SIZE(limits3), .max_interfaces = 4, .num_different_channels = 2, };
示例
-
struct wiphy¶
无线硬件描述
定义:
struct wiphy {
struct mutex mtx;
u8 perm_addr[ETH_ALEN];
u8 addr_mask[ETH_ALEN];
struct mac_address *addresses;
const struct ieee80211_txrx_stypes *mgmt_stypes;
const struct ieee80211_iface_combination *iface_combinations;
int n_iface_combinations;
u16 software_iftypes;
u16 n_addresses;
u16 interface_modes;
u16 max_acl_mac_addrs;
u32 flags, regulatory_flags, features;
u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)];
u32 ap_sme_capa;
enum cfg80211_signal_type signal_type;
int bss_priv_size;
u8 max_scan_ssids;
u8 max_sched_scan_reqs;
u8 max_sched_scan_ssids;
u8 max_match_sets;
u16 max_scan_ie_len;
u16 max_sched_scan_ie_len;
u32 max_sched_scan_plans;
u32 max_sched_scan_plan_interval;
u32 max_sched_scan_plan_iterations;
int n_cipher_suites;
const u32 *cipher_suites;
int n_akm_suites;
const u32 *akm_suites;
const struct wiphy_iftype_akm_suites *iftype_akm_suites;
unsigned int num_iftype_akm_suites;
u8 retry_short;
u8 retry_long;
u32 frag_threshold;
u32 rts_threshold;
u8 coverage_class;
char fw_version[ETHTOOL_FWVERS_LEN];
u32 hw_version;
#ifdef CONFIG_PM;
const struct wiphy_wowlan_support *wowlan;
struct cfg80211_wowlan *wowlan_config;
#endif;
u16 max_remain_on_channel_duration;
u8 max_num_pmkids;
u32 available_antennas_tx;
u32 available_antennas_rx;
u32 probe_resp_offload;
const u8 *extended_capabilities, *extended_capabilities_mask;
u8 extended_capabilities_len;
const struct wiphy_iftype_ext_capab *iftype_ext_capab;
unsigned int num_iftype_ext_capab;
const void *privid;
struct ieee80211_supported_band *bands[NUM_NL80211_BANDS];
void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request);
const struct ieee80211_regdomain __rcu *regd;
struct device dev;
bool registered;
struct dentry *debugfsdir;
const struct ieee80211_ht_cap *ht_capa_mod_mask;
const struct ieee80211_vht_cap *vht_capa_mod_mask;
struct list_head wdev_list;
possible_net_t _net;
#ifdef CONFIG_CFG80211_WEXT;
const struct iw_handler_def *wext;
#endif;
const struct wiphy_coalesce_support *coalesce;
const struct wiphy_vendor_command *vendor_commands;
const struct nl80211_vendor_cmd_info *vendor_events;
int n_vendor_commands, n_vendor_events;
u16 max_ap_assoc_sta;
u8 max_num_csa_counters;
u32 bss_select_support;
u8 nan_supported_bands;
u32 txq_limit;
u32 txq_memory_limit;
u32 txq_quantum;
unsigned long tx_queue_len;
u8 support_mbssid:1, support_only_he_mbssid:1;
const struct cfg80211_pmsr_capabilities *pmsr_capa;
struct {
u64 peer, vif;
u8 max_retry;
} tid_config_support;
u8 max_data_retry_count;
const struct cfg80211_sar_capa *sar_capa;
struct rfkill *rfkill;
u8 mbssid_max_interfaces;
u8 ema_max_profile_periodicity;
u16 max_num_akm_suites;
u16 hw_timestamp_max_peers;
int n_radio;
const struct wiphy_radio *radio;
char priv[] ;
};
成员
mtx
此设备的数据(结构)的互斥锁
perm_addr
此设备的永久 MAC 地址
addr_mask
如果设备通过掩码支持多个 MAC 地址,则将其设置为可变位设置为 1 的掩码,例如,如果最后四位是可变的,则将其设置为 00-00-00-00-00-0f。实际的可变位应由添加的接口确定,与掩码不匹配的接口将被拒绝启动。
addresses
如果设备有多个地址,则将此指针设置为地址列表(每个地址 6 个字节)。默认情况下,第一个地址将用于 perm_addr。在这种情况下,掩码应设置为全零。在这种情况下,假设设备可以处理相同数量的任意 MAC 地址。
mgmt_stypes
可以通过 nl80211 订阅或传输的帧子类型的位掩码,指向按接口类型索引的数组
iface_combinations
有效的接口组合数组,不应列出单一接口类型。
n_iface_combinations
iface_combinations 数组中的条目数。
software_iftypes
软件接口类型的位掩码,这些类型不受任何限制,因为它们纯粹在软件中管理。
n_addresses
addresses 中的地址数。
interface_modes
此 wiphy 有效的接口类型的位掩码,必须由驱动程序设置
max_acl_mac_addrs
设备支持用于 ACL 的最大 MAC 地址数。
flags
wiphy 标志,请参阅
enum wiphy_flags
regulatory_flags
wiphy 监管标志,请参阅
enum ieee80211_regulatory_flags
features
向 nl80211 声明的功能,请参阅
enum nl80211_feature_flags
。ext_features
向 nl80211 声明的扩展功能,请参阅
enum nl80211_ext_feature_index
。ap_sme_capa
AP SME 功能,来自
enum nl80211_ap_sme_features
的标志。signal_type
在
struct cfg80211_bss
中报告的信号类型。bss_priv_size
每个 BSS 结构都分配了私有数据,此变量确定其大小
max_scan_ssids
设备在任何给定扫描中可以扫描的最大 SSID 数
max_sched_scan_reqs
设备可以同时运行的最大计划扫描请求数。
max_sched_scan_ssids
设备在任何给定计划扫描中可以扫描的最大 SSID 数
max_match_sets
设备在执行计划扫描时可以处理的最大匹配集数,如果不支持过滤,则为 0。
max_scan_ie_len
用户控制的 IE 设备在扫描期间添加到传输的探测请求帧的最大长度,不得包括固定 IE(如支持的速率)
max_sched_scan_ie_len
与 max_scan_ie_len 相同,但用于计划扫描
max_sched_scan_plans
设备支持的计划扫描的最大扫描计划数(扫描间隔和迭代次数)。
max_sched_scan_plan_interval
设备支持的单个扫描计划的最大间隔(以秒为单位)。
max_sched_scan_plan_iterations
设备支持的单个扫描计划的最大迭代次数。
n_cipher_suites
支持的密码套件数
cipher_suites
支持的密码套件
n_akm_suites
支持的 AKM 套件数
akm_suites
支持的 AKM 套件。如果未在 iftype_akm_suites 中为特定接口类型声明支持的 AKM,则这些是默认支持的 AKM。
iftype_akm_suites
每个接口类型支持的 akm 套件信息数组。请注意,此结构中的 iftypes_mask 中的位不能重叠(即,在 iftype_akm_suites 的所有实例中只允许每种类型出现一次)。
num_iftype_akm_suites
单独指定支持的 akm 套件的接口类型数。
retry_short
短帧的重试限制 (dot11ShortRetryLimit)
retry_long
长帧的重试限制 (dot11LongRetryLimit)
frag_threshold
分片阈值 (dot11FragmentationThreshold);-1 = 禁用分片,仅使用奇数值 >= 256
rts_threshold
RTS 阈值 (dot11RTSThreshold);-1 = 禁用 RTS/CTS
coverage_class
当前覆盖范围类别
fw_version
用于 ethtool 报告的固件版本
hw_version
用于 ethtool 报告的硬件版本
wowlan
WoWLAN 支持信息
wowlan_config
当前 WoWLAN 配置;由于对其的访问必然是竞争的,因此通常不应使用它,而应使用传递给 suspend() 操作的参数。
max_remain_on_channel_duration
如果已实现,则 remain-on-channel 操作可能请求的最大时间。
max_num_pmkids
设备支持的最大 PMKID 数
available_antennas_tx
可用作 TX 天线配置的天线的位图。除非设置了此项或 available_antennas_rx,否则天线配置命令将被拒绝。
available_antennas_rx
可用作 RX 天线配置的天线的位图。除非设置了此项或 available_antennas_tx,否则天线配置命令将被拒绝。
probe_resp_offload
用于探测响应卸载的支持协议的位图。请参阅
enum nl80211_probe_resp_offload_support_attr
。仅当设置了 wiphy 标志 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD 时才有效。
extended_capabilities
驱动程序支持的扩展功能,用户空间可能支持其他功能;这些是 802.11 扩展功能(“扩展功能元素”),格式与信息元素中的格式相同。有关定义的字段,请参阅 802.11-2012 8.4.2.29。如果未在 iftype_ext_capab 中为特定接口类型指定功能,则这些是要使用的默认扩展功能。
extended_capabilities_mask
有效值的掩码
extended_capabilities_len
扩展功能的长度
iftype_ext_capab
每个接口类型的扩展功能数组
num_iftype_ext_capab
单独指定扩展功能的接口类型数。
privid
驱动程序可以使用的一个指针,用于标识任意 wiphy 是否属于他们,例如在全局通知程序中
bands
有关此设备支持的频段/通道的信息
reg_notifier
驱动程序的监管通知回调,请注意,如果您的驱动程序使用
wiphy_apply_custom_regulatory()
,则 reg_notifier 的请求可以作为 NULL 传递regd
驱动程序的监管域,如果通过
regulatory_hint()
API 请求了监管域。如果驱动程序选择忽略由其他驱动程序导致的未来监管域更改,则驱动程序可以在 reg_notifier() 上使用此项。dev
此 wiphy 的(虚拟)
struct device
。/sys/class/ieee80211/ 中的项指向此项。您需要使用set_wiphy_dev()
(见下文)。registered
防止 ->resume 和 ->suspend sysfs 回调在未注册硬件的情况下执行
debugfsdir
用于此 wiphy 的 debugfs 目录 (ieee80211/<wiphyname>)。它将在 wiphy 重命名时自动重命名
ht_capa_mod_mask
指定可以覆盖哪些 ht_cap 值。如果为 null,则不能覆盖任何值。
vht_capa_mod_mask
指定可以覆盖哪些 VHT 功能。如果为 null,则不能覆盖任何功能。
wdev_list
关联的(虚拟)接口列表;此列表不得由驱动程序修改,但可以使用 RTNL/RCU 保护进行读取。
_net
此 wiphy 当前所在的网络命名空间
wext
无线扩展处理程序
coalesce
数据包合并支持信息
vendor_commands
硬件支持的供应商命令数组
vendor_events
硬件支持的供应商事件数组
n_vendor_commands
供应商命令数
n_vendor_events
供应商事件数
max_ap_assoc_sta
在 AP 模式(包括 P2P GO)下支持的最大关联站点数,或者为 0 以指示未声明此类限制。驱动程序可以声明在某些情况下可以达到的理论限制,但不一定总是能够达到。
max_num_csa_counters
信标和探测响应中支持的 csa_counters 数。如果驱动程序希望限制 csa 计数器的数量,则应设置此值。默认值 (0) 表示无限。
bss_select_support
位掩码,指示驱动程序在 .connect() 回调中支持的 BSS 选择标准。位位置映射到
enum nl80211_bss_select_attr
中定义的属性索引。nan_supported_bands
设备在 NAN 模式下支持的频段,
enum nl80211_band
值的位图。例如,对于 NL80211_BAND_2GHZ,将设置位 0(即 BIT(NL80211_BAND_2GHZ))。txq_limit
内部 TX 队列帧限制的配置
txq_memory_limit
配置内部 TX 队列内存限制
txq_quantum
配置内部 TX 队列调度器量子
tx_queue_len
允许为不使用 wake_tx_queue 的驱动程序设置传输队列长度
support_mbssid
硬件是否可以支持与未传输 AP 的关联
support_only_he_mbssid
如果不是 HE AP,则不解析 MBSSID 元素,以避免兼容性问题。必须设置 support_mbssid,此项才能生效。
pmsr_capa
对等测量功能
tid_config_support
描述设备拥有的每个 TID 配置支持
tid_config_support.peer
驱动程序为每个对等方支持的属性(配置)的位图
tid_config_support.vif
驱动程序为每个 vif 支持的属性(配置)的位图
tid_config_support.max_retry
长/短重试配置支持的最大重试计数
max_data_retry_count
通过
NL80211_TID_CONFIG_ATTR_RETRY_SHORT
和NL80211_TID_CONFIG_ATTR_RETRY_LONG
属性配置的每个 TID 支持的最大重试计数sar_capa
SAR 控制功能
rfkill
指向 rfkill 结构的指针
mbssid_max_interfaces
驱动程序在多个 BSSID 集中支持的最大接口数。驱动程序必须将此字段设置为非零值才能声明 MBSSID 支持。
ema_max_profile_periodicity
驱动程序支持的最大配置文件周期性。将此字段设置为非零值表示驱动程序支持增强的多 BSSID 声明 (EMA AP)。
max_num_akm_suites
允许通过
NL80211_CMD_CONNECT
、NL80211_CMD_ASSOCIATE
和NL80211_CMD_START_AP
配置的最大 AKM 套件数。如果驱动程序未设置,则设置为 NL80211_MAX_NR_AKM_SUITES。如果驱动程序设置,则允许的最小值为 NL80211_MAX_NR_AKM_SUITES,以避免与旧版用户空间出现兼容性问题,允许的最大值为 CFG80211_MAX_NUM_AKM_SUITES。hw_timestamp_max_peers
驱动程序支持同时启用 HW 时间戳的最大对等方数。将此字段设置为非零值表示驱动程序支持 HW 时间戳。值
CFG80211_HW_TIMESTAMP_ALL_PEERS
表示驱动程序支持为所有对等方启用 HW 时间戳(即,无需指定 MAC 地址)。n_radio
无线电数量
radio
属于此 wiphy 的无线电
priv
驱动程序私有数据(根据
wiphy_new()
参数大小调整)
参数
struct wiphy *wiphy
要返回私有指针的 wiphy。
返回值
wiphy 的私有数据。
参数
void *priv
先前由 wiphy_priv 返回的指针。
返回值
priv 的 wiphy。
参数
struct wiphy *wiphy
要绑定设备的 wiphy。
struct device *dev
要将其作为父设备的设备。
参数
struct wiphy *wiphy
要查找设备结构的 wiphy。
返回值
wiphy 的设备。
参数
const struct wiphy *wiphy
要返回其名称的 wiphy。
返回值
wiphy 的名称。
-
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)¶
创建一个新的 wiphy 以与 cfg80211 一起使用。
参数
const struct cfg80211_ops *ops
此设备的配置操作。
int sizeof_priv
要分配的私有区域的大小。
描述
创建一个新的 wiphy 并将给定的操作与之关联。为私有用途分配 sizeof_priv 字节。
返回值
指向新 wiphy 的指针。必须将此指针分配给每个 netdev 的 ieee80211_ptr 才能正常运行。
参数
struct wiphy *wiphy
要注册的 wiphy。
返回值
非负 wiphy 索引或负错误代码。
参数
struct wiphy *wiphy
要注销的 wiphy。
描述
在此调用之后,无法再使用此私有指针发出请求,但该调用可能会休眠以等待正在处理的未完成请求。
参数
struct wiphy *wiphy
要释放的 wiphy。
-
struct wireless_dev¶
无线设备状态。
定义:
struct wireless_dev {
struct wiphy *wiphy;
enum nl80211_iftype iftype;
struct list_head list;
struct net_device *netdev;
u32 identifier;
struct list_head mgmt_registrations;
u8 mgmt_registrations_need_update:1;
bool use_4addr, is_running, registered, registering;
u8 address[ETH_ALEN] ;
struct cfg80211_conn *conn;
struct cfg80211_cached_keys *connect_keys;
enum ieee80211_bss_type conn_bss_type;
u32 conn_owner_nlportid;
struct work_struct disconnect_wk;
u8 disconnect_bssid[ETH_ALEN];
struct list_head event_list;
spinlock_t event_lock;
u8 connected:1;
bool ps;
int ps_timeout;
u32 ap_unexpected_nlportid;
u32 owner_nlportid;
bool nl_owner_dead;
#ifdef CONFIG_CFG80211_WEXT;
struct {
struct cfg80211_ibss_params ibss;
struct cfg80211_connect_params connect;
struct cfg80211_cached_keys *keys;
const u8 *ie;
size_t ie_len;
u8 bssid[ETH_ALEN];
u8 prev_bssid[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN];
s8 default_key, default_mgmt_key;
bool prev_bssid_valid;
} wext;
#endif;
struct wiphy_work cqm_rssi_work;
struct cfg80211_cqm_config __rcu *cqm_config;
struct list_head pmsr_list;
spinlock_t pmsr_lock;
struct work_struct pmsr_free_wk;
unsigned long unprot_beacon_reported;
union {
struct {
u8 connected_addr[ETH_ALEN] ;
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len;
} client;
struct {
int beacon_interval;
struct cfg80211_chan_def preset_chandef;
struct cfg80211_chan_def chandef;
u8 id[IEEE80211_MAX_MESH_ID_LEN];
u8 id_len, id_up_len;
} mesh;
struct {
struct cfg80211_chan_def preset_chandef;
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len;
} ap;
struct {
struct cfg80211_internal_bss *current_bss;
struct cfg80211_chan_def chandef;
int beacon_interval;
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len;
} ibss;
struct {
struct cfg80211_chan_def chandef;
} ocb;
} u;
struct {
u8 addr[ETH_ALEN] ;
union {
struct {
unsigned int beacon_interval;
struct cfg80211_chan_def chandef;
} ap;
struct {
struct cfg80211_internal_bss *current_bss;
} client;
};
bool cac_started;
unsigned long cac_start_time;
unsigned int cac_time_ms;
} links[IEEE80211_MLD_MAX_NUM_LINKS];
u16 valid_links;
u32 radio_mask;
};
成员
wiphy
指向硬件描述的指针。
iftype
接口类型。
list
(私有)用于收集接口。
netdev
(私有)用于引用回 netdev,可能为
NULL
。identifier
(私有)在 nl80211 中用于标识此无线设备的标识符(如果它没有 netdev)。
mgmt_registrations
管理帧的注册列表。
mgmt_registrations_need_update
管理注册已更新,需要将更新传播到驱动程序。
use_4addr
指示在此接口上使用 4addr 模式,必须由驱动程序在 add_interface 上设置(如果支持),然后才能注册 netdev,否则只能由驱动程序只读使用,cfg80211 会在 change_interface 上更新。
is_running
如果这是一个已启动的非 netdev 设备(例如,P2P 设备),则为 true。
registered
此 wdev 是否已在 cfg80211 中注册。
registering
指示我们正在 wiphy 锁下为通知器执行注册。
address
此设备的地址,仅当 netdev 为
NULL
时有效。conn
(私有)cfg80211 软件 SME 连接状态机数据。
connect_keys
(私有)连接建立后要设置的密钥。
conn_bss_type
正在连接/已连接的 BSS 类型。
conn_owner_nlportid
(私有)连接所有者套接字端口 ID。
disconnect_wk
(私有)自动断开连接工作。
disconnect_bssid
(私有)用于自动断开连接的 BSSID。
event_list
(私有)用于内部事件处理的列表。
event_lock
(私有)用于事件列表的锁。
connected
指示是否已连接(STA 模式)。
ps
启用省电模式。
ps_timeout
动态省电超时。
ap_unexpected_nlportid
(私有)已注册以接收意外类 3 帧的应用程序的网络链接端口 ID(AP 模式)。
owner_nlportid
(私有)所有者套接字端口 ID。
nl_owner_dead
(私有)所有者套接字已消失。
wext
(私有)由内部无线扩展兼容性代码使用。
wext.ibss
(私有)wext 处理的 IBSS 数据部分。
wext.connect
(私有)连接处理数据。
wext.keys
(私有)(WEP) 密钥数据。
wext.ie
(私有)用于关联的额外元素。
wext.ie_len
(私有)额外元素的长度。
wext.bssid
(私有)选定的网络 BSSID。
wext.prev_bssid
(私有)用于重新关联的上一个 BSSID。
wext.ssid
(私有)选定的网络 SSID。
wext.default_key
(私有)选定的默认密钥索引。
wext.default_mgmt_key
(私有)选定的默认管理密钥索引。
wext.prev_bssid_valid
(私有)上一个 BSSID 有效性。
cqm_rssi_work
(私有)CQM RSSI 报告工作。
cqm_config
(私有)nl80211 RSSI 监视器状态。
pmsr_list
(私有)对等测量请求。
pmsr_lock
(私有)对等测量请求/结果锁。
pmsr_free_wk
(私有)对等测量清理工作。
unprot_beacon_reported
(私有)上次未受保护的信标报告的时间戳。
u
包含特定于 iftype 的数据的联合。
links
包含每个链路的 addr ap 和 client 的
IEEE80211_MLD_MAX_NUM_LINKS
元素数组。{unnamed_union}
匿名
links.cac_started
如果已启动 DFS 通道可用性检查,则为 true。
links.cac_start_time
输入 dfs 状态时的时间戳(节拍)。
links.cac_time_ms
CAC 时间(以毫秒为单位)。
valid_links
描述 links 的哪些元素有效的位图。
radio_mask
此接口允许在其上操作的无线电的位掩码。
描述
对于网络设备(netdev),此结构必须由驱动程序分配,该驱动程序使用 struct net_device
中的 ieee80211_ptr 字段(这是有意为之,以便它可以与 netdev 一起分配)。然后它不需要注册,因为 netdev 注册将被 cfg80211 拦截以查看新的无线设备,但是,如果驱动程序预先创建任何 netdev(在从 cfg80211 调用的操作中,wiphy 已经被锁定),则必须在注册或注销 netdev 之前锁定 wiphy。
对于非网络设备(non-netdev)用途,它也必须由驱动程序响应需要它的 cfg80211 回调来分配,因为在那种情况下没有 netdev 注册,所以它可能不会在返回它的回调操作之外分配。
-
void *wdev_priv(struct wireless_dev *wdev)¶
从 wireless_dev 返回 wiphy 私有数据
参数
struct wireless_dev *wdev
要返回其 wiphy 私有指针的无线设备
返回值
wdev 的 wiphy 私有数据。
-
int cfg80211_check_combinations(struct wiphy *wiphy, struct iface_combination_params *params)¶
检查接口组合
参数
struct wiphy *wiphy
wiphy
struct iface_combination_params *params
接口组合参数
描述
驱动程序可以调用此函数来检查根据接口组合是否允许接口及其类型的组合。
返回值
如果允许组合则为 0。错误时为非零值。
操作和配置¶
每个无线设备和每个虚拟接口都提供一组配置操作和用户空间调用的其他操作。这些操作中的每一个都描述在操作结构中,并且这些操作使用的参数是单独描述的。
此外,一些操作是异步的,并期望通过驱动程序需要调用的一些函数来获取状态信息。
扫描和 BSS 列表处理及其相关功能在单独的章节中描述。
-
struct vif_params¶
描述虚拟接口参数
定义:
struct vif_params {
u32 flags;
int use_4addr;
u8 macaddr[ETH_ALEN];
const u8 *vht_mumimo_groups;
const u8 *vht_mumimo_follow_addr;
};
成员
flags
监视器接口标志,如果为 0 则保持不变,否则将设置
MONITOR_FLAG_CHANGED
use_4addr
使用 4 地址帧
macaddr
用于此虚拟接口的地址。如果此参数设置为零地址,则驱动程序可以根据需要确定地址。此功能仅由启用
NL80211_FEATURE_MAC_ON_CREATE
标志的驱动程序完全支持。其他驱动程序可能只支持创建带有指定 MAC 的 p2p 设备。vht_mumimo_groups
MU-MIMO 组 ID,用于监视属于该 MU-MIMO 组 ID 的 MU-MIMO 数据包;如果未更改,则为
NULL
vht_mumimo_follow_addr
MU-MIMO 跟随地址,用于监视发送到指定站点的 MU-MIMO 数据包;如果未更改,则为
NULL
-
struct key_params¶
密钥信息
定义:
struct key_params {
const u8 *key;
const u8 *seq;
int key_len;
int seq_len;
u16 vlan_id;
u32 cipher;
enum nl80211_key_mode mode;
};
成员
key
密钥材料
seq
TKIP 和 CCMP 密钥的序列计数器(IV/PN),仅与 get_key() 回调一起使用,必须为小端字节序,长度由 seq_len 给出。
key_len
密钥材料的长度
seq_len
seq 的长度。
vlan_id
VLAN 组密钥的 vlan_id(如果非零)
cipher
密码套件选择器
mode
密钥安装模式(RX_TX、NO_TX 或 SET_TX)
描述
关于密钥的信息
-
enum survey_info_flags¶
调查信息标志
常量
SURVEY_INFO_NOISE_DBM
已填充噪声(以 dBm 为单位)
SURVEY_INFO_IN_USE
通道当前正在使用
SURVEY_INFO_TIME
已填充活动时间(以毫秒为单位)
SURVEY_INFO_TIME_BUSY
已填充繁忙时间
SURVEY_INFO_TIME_EXT_BUSY
已填充扩展通道繁忙时间
SURVEY_INFO_TIME_RX
已填充接收时间
SURVEY_INFO_TIME_TX
已填充发送时间
SURVEY_INFO_TIME_SCAN
已填充扫描时间
SURVEY_INFO_TIME_BSS_RX
已填充本地 BSS 接收时间
描述
驱动程序用于指示在 get_survey() 期间已填充的 struct survey_info
中的哪些信息。
-
struct survey_info¶
通道调查响应
定义:
struct survey_info {
struct ieee80211_channel *channel;
u64 time;
u64 time_busy;
u64 time_ext_busy;
u64 time_rx;
u64 time_tx;
u64 time_scan;
u64 time_bss_rx;
u32 filled;
s8 noise;
};
成员
channel
此调查记录报告的通道,对于报告全局统计信息的单个记录,可能为
NULL
time
无线电打开的时间量(以毫秒为单位)(在通道上)
time_busy
感测到主通道繁忙的时间量
time_ext_busy
感测到扩展通道繁忙的时间量
time_rx
无线电接收数据所花费的时间量
time_tx
无线电发送数据所花费的时间量
time_scan
无线电用于扫描的时间量
time_bss_rx
无线电在本地 BSS 上接收数据所花费的时间量
filled
来自
enum survey_info_flags
的标志的位标志noise
通道噪声(以 dBm 为单位)。此字段和所有以下字段都是可选的
描述
由 dump_survey() 使用,以报告每个通道的调查信息。
此结构稍后可以使用诸如通道占空比等内容进行扩展。
-
struct cfg80211_crypto_settings¶
加密设置
定义:
struct cfg80211_crypto_settings {
u32 wpa_versions;
u32 cipher_group;
int n_ciphers_pairwise;
u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES];
int n_akm_suites;
u32 akm_suites[CFG80211_MAX_NUM_AKM_SUITES];
bool control_port;
__be16 control_port_ethertype;
bool control_port_no_encrypt;
bool control_port_over_nl80211;
bool control_port_no_preauth;
const u8 *psk;
const u8 *sae_pwd;
u8 sae_pwd_len;
enum nl80211_sae_pwe_mechanism sae_pwe;
};
成员
wpa_versions
指示启用了哪些 WPA 版本(如果启用)(来自枚举 nl80211_wpa_versions)
cipher_group
组密钥密码套件(如果未设置则为 0)
n_ciphers_pairwise
AP 支持的单播密码的数量
ciphers_pairwise
单播密钥密码套件
n_akm_suites
AKM 套件的数量
akm_suites
AKM 套件
control_port
用户空间是否控制 IEEE 802.1X 端口,即设置/清除
NL80211_STA_FLAG_AUTHORIZED
。如果为 true,则要求驱动程序假定该端口未经授权,直到用户空间授权为止。否则,默认情况下端口标记为已授权。control_port_ethertype
即使在未经授权的端口上,也应允许通过的控制端口协议
control_port_no_encrypt
如果为 TRUE,则阻止加密控制端口协议帧。
control_port_over_nl80211
如果用户空间希望通过 NL80211 而不是网络接口交换控制端口帧,则为 TRUE。
control_port_no_preauth
禁用 mac80211 的 nl80211 控制端口上的预身份验证接收
psk
PSK(适用于支持 4 向握手卸载的设备)
sae_pwd
用于 SAE 身份验证的密码(适用于支持 SAE 卸载的设备)
sae_pwd_len
SAE 密码的长度(适用于支持 SAE 卸载的设备)
sae_pwe
允许用于 SAE PWE 派生的机制
- NL80211_SAE_PWE_UNSPECIFIED
未指定,用于指示用户空间未指定任何首选项。在这种情况下,驱动程序应遵循其内部策略。
- NL80211_SAE_PWE_HUNT_AND_PECK
仅允许猎取和啄食循环
- NL80211_SAE_PWE_HASH_TO_ELEMENT
仅允许哈希到元素
- NL80211_SAE_PWE_BOTH
允许猎取和啄食循环或哈希到元素
-
struct cfg80211_beacon_data¶
信标数据
定义:
struct cfg80211_beacon_data {
unsigned int link_id;
const u8 *head, *tail;
const u8 *beacon_ies;
const u8 *proberesp_ies;
const u8 *assocresp_ies;
const u8 *probe_resp;
const u8 *lci;
const u8 *civicloc;
struct cfg80211_mbssid_elems *mbssid_ies;
struct cfg80211_rnr_elems *rnr_ies;
s8 ftm_responder;
size_t head_len, tail_len;
size_t beacon_ies_len;
size_t proberesp_ies_len;
size_t assocresp_ies_len;
size_t probe_resp_len;
size_t lci_len;
size_t civicloc_len;
struct cfg80211_he_bss_color he_bss_color;
bool he_bss_color_valid;
};
成员
link_id
发送此信标的 AP MLD 链接的链接 ID
head
信标的头部部分(在 TIM IE 之前),如果未更改,则为
NULL
tail
信标的尾部部分(在 TIM IE 之后),如果未更改,则为
NULL
beacon_ies
要添加到信标帧中的额外信息元素,或者为
NULL
proberesp_ies
要添加到探测响应帧中的额外信息元素,或者为
NULL
assocresp_ies
要添加到(重新)关联响应帧中的额外信息元素,或者为
NULL
probe_resp
探测响应模板(仅限 AP 模式)
lci
测量报告元素内容,从测量令牌(测量类型 8)开始
civicloc
测量报告元素内容,从测量令牌(测量类型 11)开始
mbssid_ies
多个 BSSID 元素
rnr_ies
减少的邻居报告元素
ftm_responder
启用 FTM 响应器功能;-1 表示无更改(也意味着 LCI/civic 位置数据无更改)
head_len
head 的长度
tail_len
tail 的长度
beacon_ies_len
beacon_ies 的长度(以八位字节为单位)
proberesp_ies_len
proberesp_ies 的长度(以八位字节为单位)
assocresp_ies_len
assocresp_ies 的长度(以八位字节为单位)
probe_resp_len
探测响应模板 (probe_resp) 的长度
lci_len
LCI 数据长度
civicloc_len
城市位置数据长度
he_bss_color
BSS 颜色设置
he_bss_color_valid
指示信标数据中是否存在 BSS 颜色属性。
-
struct cfg80211_ap_settings¶
AP 配置
定义:
struct cfg80211_ap_settings {
struct cfg80211_chan_def chandef;
struct cfg80211_beacon_data beacon;
int beacon_interval, dtim_period;
const u8 *ssid;
size_t ssid_len;
enum nl80211_hidden_ssid hidden_ssid;
struct cfg80211_crypto_settings crypto;
bool privacy;
enum nl80211_auth_type auth_type;
int inactivity_timeout;
u8 p2p_ctwindow;
bool p2p_opp_ps;
const struct cfg80211_acl_data *acl;
bool pbss;
struct cfg80211_bitrate_mask beacon_rate;
const struct ieee80211_ht_cap *ht_cap;
const struct ieee80211_vht_cap *vht_cap;
const struct ieee80211_he_cap_elem *he_cap;
const struct ieee80211_he_operation *he_oper;
const struct ieee80211_eht_cap_elem *eht_cap;
const struct ieee80211_eht_operation *eht_oper;
bool ht_required, vht_required, he_required, sae_h2e_required;
bool twt_responder;
u32 flags;
struct ieee80211_he_obss_pd he_obss_pd;
struct cfg80211_fils_discovery fils_discovery;
struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
struct cfg80211_mbssid_config mbssid_config;
};
成员
chandef
定义要使用的信道
beacon
信标数据
beacon_interval
信标间隔
dtim_period
DTIM 周期
ssid
要在 BSS 中使用的 SSID(注意:如果用户空间未提供,则可能为
NULL
)ssid_len
ssid 的长度
hidden_ssid
是否在信标/探测响应帧中隐藏 SSID
crypto
加密设置
privacy
BSS 使用隐私
auth_type
身份验证类型(算法)
inactivity_timeout
确定站点不活动状态的秒数。
p2p_ctwindow
P2P CT 窗口
p2p_opp_ps
P2P 机会性 PS
acl
支持基于 MAC 地址的访问控制的驱动程序使用的 ACL 配置
pbss
如果设置,则作为 PCP 而不是 AP 启动。与 DMG 网络相关。
beacon_rate
用于信标的比特率
ht_cap
HT 功能(如果未启用 HT,则为
NULL
)vht_cap
VHT 功能(如果未启用 VHT,则为
NULL
)he_cap
HE 功能(如果未启用 HE,则为
NULL
)he_oper
HE 操作 IE(如果未启用 HE,则为
NULL
)eht_cap
EHT 功能(如果未启用 EHT,则为
NULL
)eht_oper
EHT 操作 IE(如果未启用 EHT,则为
NULL
)ht_required
站点必须支持 HT
vht_required
站点必须支持 VHT
he_required
站点必须支持 HE
sae_h2e_required
站点必须支持 SAE 中的直接 H2E 技术
twt_responder
启用目标唤醒时间
flags
标志,如
enum nl80211_ap_settings_flags
中定义he_obss_pd
OBSS 数据包检测设置
fils_discovery
FILS 发现传输参数
unsol_bcast_probe_resp
未经请求的广播探测响应参数
mbssid_config
多个 bssid 的 AP 设置
描述
用于配置 AP 接口。
-
struct station_parameters¶
站点参数
定义:
struct station_parameters {
struct net_device *vlan;
u32 sta_flags_mask, sta_flags_set;
u32 sta_modify_mask;
int listen_interval;
u16 aid;
u16 vlan_id;
u16 peer_aid;
u8 plink_action;
u8 plink_state;
u8 uapsd_queues;
u8 max_sp;
enum nl80211_mesh_power_mode local_pm;
u16 capability;
const u8 *ext_capab;
u8 ext_capab_len;
const u8 *supported_channels;
u8 supported_channels_len;
const u8 *supported_oper_classes;
u8 supported_oper_classes_len;
int support_p2p_ps;
u16 airtime_weight;
struct link_station_parameters link_sta_params;
};
成员
vlan
站点应属于的 vlan 接口
sta_flags_mask
已更改的站点标志(
NL80211_STA_FLAG_
... 的 BIT 位掩码)sta_flags_set
站点标志值(
NL80211_STA_FLAG_
... 的 BIT 位掩码)sta_modify_mask
指示哪些参数已更改的位图(对于那些没有自然的“无更改”值的参数),请参阅
enum station_parameters_apply_mask
listen_interval
侦听间隔或 -1 表示无更改
aid
AID 或零表示无更改
vlan_id
站点的 VLAN ID(如果非零)
peer_aid
mesh 对等 AID 或零表示无更改
plink_action
要采取的 plink 操作
plink_state
设置站点的对等链路状态
uapsd_queues
为 uapsd 配置的队列位图。与 QoS 信息字段中的 AC 位图格式相同
max_sp
最大服务周期。与 QoS 信息字段中的 MAX_SP 格式相同(但已向下移位)
local_pm
本地特定于链路的 mesh 省电模式(设置为未知时,无更改)
capability
站点功能
ext_capab
站点的扩展功能
ext_capab_len
扩展功能的数量
supported_channels
IEEE 802.11 格式支持的信道
supported_channels_len
支持的信道数量
supported_oper_classes
IEEE 802.11 格式支持的操作类
supported_oper_classes_len
支持的操作类数量
support_p2p_ps
站点是否支持 P2P PS 机制的信息
airtime_weight
此站点的空口调度权重
link_sta_params
与链路相关的参数。
描述
用于更改和创建新站点。
-
enum rate_info_flags¶
比特率信息标志
常量
RATE_INFO_FLAGS_MCS
mcs 字段填充 HT MCS
RATE_INFO_FLAGS_VHT_MCS
mcs 字段填充 VHT MCS
RATE_INFO_FLAGS_SHORT_GI
400ns 保护间隔
RATE_INFO_FLAGS_DMG
60GHz MCS
RATE_INFO_FLAGS_HE_MCS
HE MCS 信息
RATE_INFO_FLAGS_EDMG
EDMG 模式下的 60GHz MCS
RATE_INFO_FLAGS_EXTENDED_SC_DMG
60GHz 扩展 SC MCS
RATE_INFO_FLAGS_EHT_MCS
EHT MCS 信息
RATE_INFO_FLAGS_S1G_MCS
MCS 字段填充 S1G MCS
描述
驱动程序使用它来指示 802.11n 传输的特定速率传输类型。
-
struct rate_info¶
比特率信息
定义:
struct rate_info {
u16 flags;
u16 legacy;
u8 mcs;
u8 nss;
u8 bw;
u8 he_gi;
u8 he_dcm;
u8 he_ru_alloc;
u8 n_bonded_ch;
u8 eht_gi;
u8 eht_ru_alloc;
};
成员
flags
来自
enum rate_info_flags
的标志位legacy
802.11abg 的比特率为 100kbit/s
mcs
如果结构描述的是 HT/VHT/HE/EHT/S1G 速率,则为 mcs 索引
nss
流的数量(仅限 VHT 和 HE)
bw
带宽(来自
enum rate_info_bw
)he_gi
HE 保护间隔(来自
enum nl80211_he_gi
)he_dcm
HE DCM 值
he_ru_alloc
HE RU 分配(来自
enum nl80211_he_ru_alloc
,仅当 bw 为RATE_INFO_BW_HE_RU
时有效)n_bonded_ch
在 EDMG 的情况下,绑定的信道数(1-4)
eht_gi
EHT 保护间隔(来自
enum nl80211_eht_gi
)eht_ru_alloc
EHT RU 分配(来自
enum nl80211_eht_ru_alloc
,仅当 bw 为RATE_INFO_BW_EHT_RU
时有效)
描述
关于接收或发送比特率的信息
-
struct station_info¶
站点信息
定义:
struct station_info {
u64 filled;
u32 connected_time;
u32 inactive_time;
u64 assoc_at;
u64 rx_bytes;
u64 tx_bytes;
u16 llid;
u16 plid;
u8 plink_state;
s8 signal;
s8 signal_avg;
u8 chains;
s8 chain_signal[IEEE80211_MAX_CHAINS];
s8 chain_signal_avg[IEEE80211_MAX_CHAINS];
struct rate_info txrate;
struct rate_info rxrate;
u32 rx_packets;
u32 tx_packets;
u32 tx_retries;
u32 tx_failed;
u32 rx_dropped_misc;
struct sta_bss_parameters bss_param;
struct nl80211_sta_flag_update sta_flags;
int generation;
const u8 *assoc_req_ies;
size_t assoc_req_ies_len;
u32 beacon_loss_count;
s64 t_offset;
enum nl80211_mesh_power_mode local_pm;
enum nl80211_mesh_power_mode peer_pm;
enum nl80211_mesh_power_mode nonpeer_pm;
u32 expected_throughput;
u64 tx_duration;
u64 rx_duration;
u64 rx_beacon;
u8 rx_beacon_signal_avg;
u8 connected_to_gate;
struct cfg80211_tid_stats *pertid;
s8 ack_signal;
s8 avg_ack_signal;
u16 airtime_weight;
u32 rx_mpdu_count;
u32 fcs_err_count;
u32 airtime_link_metric;
u8 connected_to_as;
bool mlo_params_valid;
u8 assoc_link_id;
u8 mld_addr[ETH_ALEN] ;
const u8 *assoc_resp_ies;
size_t assoc_resp_ies_len;
};
成员
filled
使用
enum nl80211_sta_info
的位标志,以指示此结构中相关的值connected_time
自站点上次连接以来的时间(秒)
inactive_time
自上次站点活动(tx/rx)以来的时间(毫秒)
assoc_at
上次关联的启动时间 (ns)
rx_bytes
从此站点接收的字节数(MPDU 的大小)
tx_bytes
传输到此站点的字节数(MPDU 的大小)
llid
mesh 本地链路 ID
plid
mesh 对等链路 ID
plink_state
mesh 对等链路状态
signal
信号强度,类型取决于 wiphy 的 signal_type。对于 CFG80211_SIGNAL_TYPE_MBM,值以 _dBm_ 表示。
signal_avg
平均信号强度,类型取决于 wiphy 的 signal_type。对于 CFG80211_SIGNAL_TYPE_MBM,值以 _dBm_ 表示。
chains
chain_signal、chain_signal_avg 中填充值的位掩码
chain_signal
以 dBm 为单位的上次接收数据包的每个链的信号强度
chain_signal_avg
以 dBm 为单位的每个链的平均信号强度
txrate
从此站点的当前单播比特率
rxrate
到此站点的当前单播比特率
rx_packets
从此站点接收的数据包(MSDU 和 MMPDU)
tx_packets
传输到此站点的数据包(MSDU 和 MMPDU)
tx_retries
累积重试次数 (MPDU)
tx_failed
失败的传输次数 (MPDU)(超出重试次数,无 ACK)
rx_dropped_misc
由于未指定的原因而被丢弃。
bss_param
当前 BSS 参数
sta_flags
站点标志掩码和值
generation
nl80211 转储的生成编号。此数字应在站点列表每次更改时增加,即当添加或删除站点时,以便用户空间可以判断它是否获得了连贯的快照。
assoc_req_ies
来自(重新)关联请求的 IEs。仅当在 AP 模式下且驱动程序不使用用户空间 MLME/SME 实现时才使用此项。该信息提供给
cfg80211_new_sta()
调用,以将 IEs 通知用户空间。assoc_req_ies_len
assoc_req_ies 缓冲区以八位字节为单位的长度。
beacon_loss_count
信标丢失事件触发的次数。
t_offset
站点相对于此主机的时间偏移。
local_pm
本地 mesh STA 省电模式
peer_pm
对等 mesh STA 省电模式
nonpeer_pm
非对等 mesh STA 省电模式
expected_throughput
预计到该站点的吞吐量(kbps)(包括 802.11 标头)。
tx_duration
到对等方的所有帧的聚合 PPDU 持续时间(微秒)
rx_duration
来自对等方的所有帧的聚合 PPDU 持续时间(微秒)
rx_beacon
从此对等方接收的信标数
rx_beacon_signal_avg
从此对等方接收的信标的平均信号强度(以 dBm 为单位)
connected_to_gate
如果 mesh STA 有通向 mesh 网关的路径,则为 true
pertid
每个 TID 的统计信息,请参阅
struct cfg80211_tid_stats
,对未封装在 QoS-MPDU 中的 MSDU 使用最后一个 (IEEE80211_NUM_TIDS) 索引。请注意,这不使用 filled 位,但如果非 NULL 则使用。ack_signal
最后一个 ACK 帧的信号强度(以 dBm 为单位)。
avg_ack_signal
已发送的 MSDU 的 ACK 数据包的平均 RSSI 值。
airtime_weight
当前空口调度权重
rx_mpdu_count
从此站点接收的 MPDU 数量
fcs_err_count
从此站点接收的 FCS 错误数据包(MPDU)数量。只有在接收到 FCS 错误的数据包的 TA 与对等 MAC 地址匹配时,此计数器才应递增。
airtime_link_metric
Mesh 网络空口链路度量。
connected_to_as
如果 Mesh STA 具有连接到身份验证服务器的路径,则为 true
mlo_params_valid
指示 assoc_link_id 和 mld_addr 字段是否由驱动程序填充。驱动程序仅在
cfg80211_new_sta()
调用(当 AP MLD 的 MLME/SME 卸载到驱动程序时)中使用此项。驱动程序不会在 cfg80211_del_sta_sinfo()、get_station() 和 dump_station() 回调中填充此信息。assoc_link_id
指示 STA 完成(重新)关联的 AP 的 MLO 链路 ID。当 AP 与 MLD 相关联时,为 MLO 和非 MLO STA 连接都填充此信息。
mld_addr
对于 MLO STA 连接,填充站点的 MLD 地址。对于非 MLO STA 连接,填充全零。
assoc_resp_ies
来自(重新)关联响应的 IEs。仅当 AP 模式且驱动程序不使用用户空间 MLME/SME 实现时才使用此项。仅在
cfg80211_new_sta()
调用中提供此信息,以通知用户空间 IEs。驱动程序不会在 cfg80211_del_sta_sinfo()、get_station() 和 dump_station() 回调中填充此信息。用户空间需要此信息来确定已连接站点的已接受和已拒绝的关联链路。assoc_resp_ies_len
assoc_resp_ies 缓冲区的长度(以字节为单位)。
描述
驱动程序为 get_station() 和 dump_station() 填充的站点信息。
-
enum monitor_flags¶
监控标志
常量
MONITOR_FLAG_CHANGED
如果标志已更改,则设置
MONITOR_FLAG_FCSFAIL
传递具有错误 FCS 的帧
MONITOR_FLAG_PLCPFAIL
传递具有错误 PLCP 的帧
MONITOR_FLAG_CONTROL
传递控制帧
MONITOR_FLAG_OTHER_BSS
禁用 BSSID 过滤
MONITOR_FLAG_COOK_FRAMES
在处理后报告帧
MONITOR_FLAG_ACTIVE
活动监控器,在其 MAC 地址上确认帧
MONITOR_FLAG_SKIP_TX
不传递本地发送的帧
描述
监控接口配置标志。请注意,这些必须是根据 nl80211 标志的位。
-
enum mpath_info_flags¶
Mesh 路径信息标志
常量
MPATH_INFO_FRAME_QLEN
frame_qlen 已填充
MPATH_INFO_SN
sn 已填充
MPATH_INFO_METRIC
metric 已填充
MPATH_INFO_EXPTIME
exptime 已填充
MPATH_INFO_DISCOVERY_TIMEOUT
discovery_timeout 已填充
MPATH_INFO_DISCOVERY_RETRIES
discovery_retries 已填充
MPATH_INFO_FLAGS
flags 已填充
MPATH_INFO_HOP_COUNT
hop_count 已填充
MPATH_INFO_PATH_CHANGE
path_change_count 已填充
描述
驱动程序使用它来指示在 get_station() 或 dump_station() 期间已填充的 struct mpath_info
中的信息。
-
struct mpath_info¶
Mesh 路径信息
定义:
struct mpath_info {
u32 filled;
u32 frame_qlen;
u32 sn;
u32 metric;
u32 exptime;
u32 discovery_timeout;
u8 discovery_retries;
u8 flags;
u8 hop_count;
u32 path_change_count;
int generation;
};
成员
filled
来自
enum mpath_info_flags
的标志位域frame_qlen
此目标的排队帧数
sn
目标序列号
metric
此 Mesh 路径的度量(成本)
exptime
从现在起,Mesh 路径的过期时间,以毫秒为单位
discovery_timeout
Mesh 路径发现总超时时间,以毫秒为单位
discovery_retries
Mesh 路径发现重试次数
flags
来自
enum mesh_path_flags
的 Mesh 路径标志hop_count
到目标的跳数
path_change_count
到目标的总路径更改次数
generation
用于 nl80211 转储的生成编号。此数字应在每次 Mesh 路径列表更改时(即,添加或删除站点时)递增,以便用户空间可以判断它是否获得了连续快照。
描述
驱动程序为 get_mpath() 和 dump_mpath() 填充的 Mesh 路径信息。
-
struct bss_parameters¶
BSS 参数
定义:
struct bss_parameters {
int link_id;
int use_cts_prot;
int use_short_preamble;
int use_short_slot_time;
const u8 *basic_rates;
u8 basic_rates_len;
int ap_isolate;
int ht_opmode;
s8 p2p_ctwindow, p2p_opp_ps;
};
成员
link_id
对于非 MLD,链路 ID 或 -1
use_cts_prot
是否使用 CTS 保护(0 = 否,1 = 是,-1 = 不更改)
use_short_preamble
是否允许使用短前导码(0 = 否,1 = 是,-1 = 不更改)
use_short_slot_time
是否允许使用短时隙时间(0 = 否,1 = 是,-1 = 不更改)
basic_rates
IEEE 802.11 格式的基本速率(或 NULL 表示不更改)
basic_rates_len
基本速率的数量
ap_isolate
不转发连接的站点之间的数据包(0 = 否,1 = 是,-1 = 不更改)
ht_opmode
HT 操作模式(u16 = opmode,-1 = 不更改)
p2p_ctwindow
P2P CT 窗口(-1 = 不更改)
p2p_opp_ps
P2P 机会性 PS(-1 = 不更改)
描述
用于更改 BSS 参数(主要用于 AP 模式)。
-
struct ieee80211_txq_params¶
TX 队列参数
定义:
struct ieee80211_txq_params {
enum nl80211_ac ac;
u16 txop;
u16 cwmin;
u16 cwmax;
u8 aifs;
int link_id;
};
成员
ac
AC 标识符
txop
最大突发时间,以 32 微秒为单位,0 表示禁用
cwmin
最小竞争窗口 [范围 1..32767 中形式为 2^n-1 的值]
cwmax
最大竞争窗口 [范围 1..32767 中形式为 2^n-1 的值]
aifs
仲裁帧间间隔 [0..255]
link_id
对于非 MLD,链路 ID 或 -1
-
struct cfg80211_auth_request¶
身份验证请求数据
定义:
struct cfg80211_auth_request {
struct cfg80211_bss *bss;
const u8 *ie;
size_t ie_len;
enum nl80211_auth_type auth_type;
const u8 *key;
u8 key_len;
s8 key_idx;
const u8 *auth_data;
size_t auth_data_len;
s8 link_id;
const u8 *ap_mld_addr;
};
成员
bss
要进行身份验证的 BSS,如果调用方需要保留它,则必须获取对其的引用。
ie
要添加到身份验证帧的额外 IE 或
NULL
ie_len
ie 缓冲区的长度(以字节为单位)
auth_type
身份验证类型(算法)
key
用于共享密钥身份验证的 WEP 密钥
key_len
用于共享密钥身份验证的 WEP 密钥长度
key_idx
用于共享密钥身份验证的 WEP 密钥索引
auth_data
身份验证帧中的字段和元素。这包含身份验证帧主体(非 IE 和 IE 数据),不包括身份验证算法编号,即从身份验证事务序列号字段开始。
auth_data_len
auth_data 缓冲区的长度(以字节为单位)
link_id
如果 >= 0,则表示应将身份验证作为 MLD 完成,接口地址将作为 MLD 地址包含,并且驱动程序将创建必要的链路(具有给定的 link_id)(并给定一个 MLD 地址)
ap_mld_addr
在具有 AP MLD 的身份验证请求的情况下,AP MLD 地址,当 link_id >= 0 时有效
描述
此结构提供完成 IEEE 802.11 身份验证所需的信息。
-
struct cfg80211_assoc_request¶
(重新)关联请求数据
定义:
struct cfg80211_assoc_request {
struct cfg80211_bss *bss;
const u8 *ie, *prev_bssid;
size_t ie_len;
struct cfg80211_crypto_settings crypto;
bool use_mfp;
u32 flags;
struct ieee80211_ht_cap ht_capa;
struct ieee80211_ht_cap ht_capa_mask;
struct ieee80211_vht_cap vht_capa, vht_capa_mask;
const u8 *fils_kek;
size_t fils_kek_len;
const u8 *fils_nonces;
struct ieee80211_s1g_cap s1g_capa, s1g_capa_mask;
struct cfg80211_assoc_link links[IEEE80211_MLD_MAX_NUM_LINKS];
const u8 *ap_mld_addr;
s8 link_id;
};
成员
bss
要关联的 BSS。如果调用成功,则驱动程序会获得一个引用,必须将其返回给 cfg80211_send_rx_assoc() 或 cfg80211_assoc_timeout()。为确保正确的引用计数,必须拒绝在已经关联时发出的新关联请求。这也适用于 links.bss 参数,该参数用于代替此参数(对于 MLO 关联,该参数为
NULL
)。ie
要添加到(重新)关联请求帧的额外 IE 或
NULL
prev_bssid
之前的 BSSID,如果不是
NULL
,则使用重新关联帧。这用于指示请求在 ESS 内重新关联,而不是请求与 ESS 进行初始关联。包含此参数时,将此参数设置为当前关联的 BSSID,即,设置为重新关联请求帧的当前 AP 地址字段中包含的值。ie_len
ie 缓冲区的长度(以字节为单位)
crypto
加密设置
use_mfp
在此关联中使用管理帧保护 (IEEE 802.11w)
flags
请参阅
enum cfg80211_assoc_req_flags
ht_capa
HT 功能覆盖。ht_capa_mask 中设置的值将在 ht_capa 中使用。不支持的值将被忽略。
ht_capa_mask
要使用的 ht_capa 的位。
vht_capa
VHT 功能覆盖
vht_capa_mask
VHT 功能掩码,指示要使用的字段
fils_kek
用于保护(重新)关联请求/响应帧的 FILS KEK,如果未使用 FILS,则为
NULL
。fils_kek_len
fils_kek 的长度(以字节为单位)
fils_nonces
用于保护(重新)关联请求/响应帧的 FILS 随机数(AAD 的一部分),如果未使用 FILS,则为
NULL
。此字段以 16 个字节的 STA 随机数开头,后跟 16 个字节的 AP 随机数。s1g_capa
S1G 功能覆盖
s1g_capa_mask
S1G 功能覆盖掩码
links
MLO 连接的每个链路信息
ap_mld_addr
在 MLO 关联请求的情况下,AP MLD 地址,当 link_id >= 0 时有效
link_id
对于 MLO 连接,>= 0,其中给定了链路,并指示应发送关联请求的链路
描述
此结构提供完成 IEEE 802.11(重新)关联所需的信息。
-
struct cfg80211_deauth_request¶
取消身份验证请求数据
定义:
struct cfg80211_deauth_request {
const u8 *bssid;
const u8 *ie;
size_t ie_len;
u16 reason_code;
bool local_state_change;
};
成员
bssid
要取消身份验证的 BSSID 或 AP MLD 地址
ie
添加到解除认证帧的额外 IE,或者为
NULL
ie_len
ie 缓冲区的长度(以字节为单位)
reason_code
解除认证的原因码
local_state_change
如果设置,则仅更改本地状态,不设置解除认证帧
描述
此结构提供完成 IEEE 802.11 解除认证所需的信息。
-
struct cfg80211_disassoc_request¶
解除关联请求数据
定义:
struct cfg80211_disassoc_request {
const u8 *ap_addr;
const u8 *ie;
size_t ie_len;
u16 reason_code;
bool local_state_change;
};
成员
ap_addr
要解除关联的 BSSID 或 AP MLD 地址
ie
添加到解除关联帧的额外 IE,或者为
NULL
ie_len
ie 缓冲区的长度(以字节为单位)
reason_code
解除关联的原因码
local_state_change
这是一个仅针对本地状态的请求,即不传输解除关联帧。
描述
此结构提供完成 IEEE 802.11 解除关联所需的信息。
-
struct cfg80211_ibss_params¶
IBSS 参数
定义:
struct cfg80211_ibss_params {
const u8 *ssid;
const u8 *bssid;
struct cfg80211_chan_def chandef;
const u8 *ie;
u8 ssid_len, ie_len;
u16 beacon_interval;
u32 basic_rates;
bool channel_fixed;
bool privacy;
bool control_port;
bool control_port_over_nl80211;
bool userspace_handles_dfs;
int mcast_rate[NUM_NL80211_BANDS];
struct ieee80211_ht_cap ht_capa;
struct ieee80211_ht_cap ht_capa_mask;
struct key_params *wep_keys;
int wep_tx_key;
};
成员
ssid
SSID,始终为非空。
bssid
请求的固定 BSSID,可能为
NULL
,如果设置,则不搜索具有不同 BSSID 的 IBSS。chandef
定义在找不到要加入的其他 IBSS 时要使用的信道
ie
要包含在信标中的信息元素
ssid_len
SSID 的长度,始终为非零。
ie_len
该长度
beacon_interval
要使用的信标间隔
basic_rates
创建 IBSS 时要使用的基本速率的位图
channel_fixed
信道应固定——不要在其他信道上搜索要加入的 IBSS。
privacy
这是一个受保护的网络,密钥将在加入后配置
control_port
用户空间是否控制 IEEE 802.1X 端口,即设置/清除
NL80211_STA_FLAG_AUTHORIZED
。 如果为 true,则驱动程序必须假定该端口未授权,直到用户空间授权。 否则,默认情况下将端口标记为已授权。control_port_over_nl80211
如果用户空间希望通过 NL80211 而不是网络接口交换控制端口帧,则为 TRUE。
userspace_handles_dfs
用户空间是否控制 DFS 操作,即在检测到雷达时更改信道。 这是在 DFS 信道上运行所必需的。
mcast_rate
每个频段多播速率索引 + 1(0:禁用)
ht_capa
HT 功能覆盖。ht_capa_mask 中设置的值将在 ht_capa 中使用。不支持的值将被忽略。
ht_capa_mask
要使用的 ht_capa 的位。
wep_keys
静态 WEP 密钥,如果不是 NULL,则指向 CFG80211_MAX_WEP_KEYS WEP 密钥的数组
wep_tx_key
默认 TX 静态 WEP 密钥的密钥索引 (0..3)
描述
此结构定义 join_ibss() 方法的 IBSS 参数。
-
struct cfg80211_connect_params¶
连接参数
定义:
struct cfg80211_connect_params {
struct ieee80211_channel *channel;
struct ieee80211_channel *channel_hint;
const u8 *bssid;
const u8 *bssid_hint;
const u8 *ssid;
size_t ssid_len;
enum nl80211_auth_type auth_type;
const u8 *ie;
size_t ie_len;
bool privacy;
enum nl80211_mfp mfp;
struct cfg80211_crypto_settings crypto;
const u8 *key;
u8 key_len, key_idx;
u32 flags;
int bg_scan_period;
struct ieee80211_ht_cap ht_capa;
struct ieee80211_ht_cap ht_capa_mask;
struct ieee80211_vht_cap vht_capa;
struct ieee80211_vht_cap vht_capa_mask;
bool pbss;
struct cfg80211_bss_selection bss_select;
const u8 *prev_bssid;
const u8 *fils_erp_username;
size_t fils_erp_username_len;
const u8 *fils_erp_realm;
size_t fils_erp_realm_len;
u16 fils_erp_next_seq_num;
const u8 *fils_erp_rrk;
size_t fils_erp_rrk_len;
bool want_1x;
struct ieee80211_edmg edmg;
};
成员
channel
要使用的信道,或者如果未指定则为
NULL
(基于扫描结果自动选择)channel_hint
建议用于初始连接的 BSS 的信道,如果未指定则为
NULL
bssid
AP BSSID,或者如果未指定则为
NULL
(基于扫描结果自动选择)bssid_hint
建议用于初始连接到 BSS 的 AP BSSID,如果未指定则为
NULL
。 与 bssid 参数不同,如果驱动程序知道有更好的 BSS 可用,则允许忽略此 bssid_hint。ssid
SSID
ssid_len
ssid 的长度,以八位字节为单位
auth_type
身份验证类型(算法)
ie
关联请求的 IE
ie_len
assoc_ie 的长度,以八位字节为单位
privacy
指示是否应使用启用隐私的 AP
mfp
指示是否使用管理帧保护
crypto
加密设置
key
用于共享密钥身份验证的 WEP 密钥
key_len
用于共享密钥身份验证的 WEP 密钥长度
key_idx
用于共享密钥身份验证的 WEP 密钥索引
flags
请参阅
enum cfg80211_assoc_req_flags
bg_scan_period
后台扫描周期,以秒为单位;或 -1 表示使用默认值。
ht_capa
HT 功能覆盖。ht_capa_mask 中设置的值将在 ht_capa 中使用。不支持的值将被忽略。
ht_capa_mask
要使用的 ht_capa 的位。
vht_capa
VHT 功能覆盖
vht_capa_mask
要使用的 vht_capa 的位。
pbss
如果设置,则连接到 PCP 而不是 AP。 对 DMG 网络有效。
bss_select
用于 BSS 选择的标准。
prev_bssid
之前的 BSSID,如果不是
NULL
,则使用重新关联帧。这用于指示请求在 ESS 内重新关联,而不是请求与 ESS 进行初始关联。包含此参数时,将此参数设置为当前关联的 BSSID,即,设置为重新关联请求帧的当前 AP 地址字段中包含的值。fils_erp_username
EAP 重认证协议 (ERP) 用户名,NAI 的一部分;或者如果未指定则为
NULL
。 这用于构造 FILS 包装的数据 IE。fils_erp_username_len
fils_erp_username 的长度,以八位字节为单位。
fils_erp_realm
EAP 重认证协议 (ERP) 域,NAI 的一部分;或者如果未指定则为
NULL
。 这指定 ER 服务器的域名,用于构造 FILS 包装的数据 IE。fils_erp_realm_len
fils_erp_realm 的长度,以八位字节为单位。
fils_erp_next_seq_num
FILS ERP 消息中要使用的下一个序列号。 这也用于构造 FILS 包装的数据 IE。
fils_erp_rrk
用于在 FILS 中派生其他密钥的 ERP 重认证根密钥 (rRK),如果未指定则为
NULL
。fils_erp_rrk_len
fils_erp_rrk 的长度,以八位字节为单位。
want_1x
指示用户空间支持并希望使用 4 次握手的 802.1X 驱动程序卸载。
edmg
定义 EDMG 信道。 这可以指定多个信道和绑定选项,供驱动程序根据 BSS 配置进行选择。
描述
此结构提供完成 IEEE 802.11 认证和关联所需的信息。
-
struct cfg80211_pmksa¶
PMK 安全关联
定义:
struct cfg80211_pmksa {
const u8 *bssid;
const u8 *pmkid;
const u8 *pmk;
size_t pmk_len;
const u8 *ssid;
size_t ssid_len;
const u8 *cache_id;
u32 pmk_lifetime;
u8 pmk_reauth_threshold;
};
成员
bssid
AP 的 BSSID(可以为
NULL
)。pmkid
用于引用 PMKSA 的标识符。
pmk
pmkid 标识的 PMKSA 的 PMK。 这由 FILS STA 用于密钥派生。 否则,为
NULL
。pmk_len
pmk 的长度。 pmk 的长度可能因用于生成此密钥的哈希算法而异。
ssid
当使用 FILS 缓存标识符时,指定 PMKSA 在其中有效的 ESS 的 SSID(可以为
NULL
)。ssid_len
ssid 的长度,以八位字节为单位。
cache_id
FILS AP 通告的 2 八位字节缓存标识符,用于标识 PMKSA 的范围。 只有当 ssid_len 为非零时才有效(可以为
NULL
)。pmk_lifetime
PMKSA 的最大生存期(以秒为单位) (dot11RSNAConfigPMKLifetime),如果未指定,则为 0。 过期后,配置的 PMKSA 不得用于 PMKSA 缓存,并且从该 PMK 派生的任何密钥在过期时失效,即,如果用于当前关联的 PMK 过期,则必须断开当前关联。
pmk_reauth_threshold
重新认证的阈值时间(PMK 生存期的百分比,dot11RSNAConfigPMKReauthThreshold),如果未指定,则为 0。 驱动程序应在重新关联到新的 BSS 后在此阈值后触发完全认证,而不是使用此 PMKSA 进行缓存,以便在当前的 PMK 过期之前生成新的 PMK。
描述
此结构传递给 set/del_pmksa() 方法以进行 PMKSA 缓存。
-
struct cfg80211_ops¶
无线配置的后端描述
定义:
struct cfg80211_ops {
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
int (*resume)(struct wiphy *wiphy);
void (*set_wakeup)(struct wiphy *wiphy, bool enabled);
struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,const char *name,unsigned char name_assign_type,enum nl80211_iftype type, struct vif_params *params);
int (*del_virtual_intf)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*change_virtual_intf)(struct wiphy *wiphy,struct net_device *dev,enum nl80211_iftype type, struct vif_params *params);
int (*add_intf_link)(struct wiphy *wiphy,struct wireless_dev *wdev, unsigned int link_id);
void (*del_intf_link)(struct wiphy *wiphy,struct wireless_dev *wdev, unsigned int link_id);
int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,int link_id, u8 key_index, bool pairwise, const u8 *mac_addr, struct key_params *params);
int (*get_key)(struct wiphy *wiphy, struct net_device *netdev,int link_id, u8 key_index, bool pairwise,const u8 *mac_addr, void *cookie, void (*callback)(void *cookie, struct key_params*));
int (*del_key)(struct wiphy *wiphy, struct net_device *netdev,int link_id, u8 key_index, bool pairwise, const u8 *mac_addr);
int (*set_default_key)(struct wiphy *wiphy,struct net_device *netdev, int link_id, u8 key_index, bool unicast, bool multicast);
int (*set_default_mgmt_key)(struct wiphy *wiphy,struct net_device *netdev, int link_id, u8 key_index);
int (*set_default_beacon_key)(struct wiphy *wiphy,struct net_device *netdev,int link_id, u8 key_index);
int (*start_ap)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ap_settings *settings);
int (*change_beacon)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ap_update *info);
int (*stop_ap)(struct wiphy *wiphy, struct net_device *dev, unsigned int link_id);
int (*add_station)(struct wiphy *wiphy, struct net_device *dev,const u8 *mac, struct station_parameters *params);
int (*del_station)(struct wiphy *wiphy, struct net_device *dev, struct station_del_parameters *params);
int (*change_station)(struct wiphy *wiphy, struct net_device *dev,const u8 *mac, struct station_parameters *params);
int (*get_station)(struct wiphy *wiphy, struct net_device *dev, const u8 *mac, struct station_info *sinfo);
int (*dump_station)(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *mac, struct station_info *sinfo);
int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev, const u8 *dst, const u8 *next_hop);
int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev, const u8 *dst);
int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev, const u8 *dst, const u8 *next_hop);
int (*get_mpath)(struct wiphy *wiphy, struct net_device *dev, u8 *dst, u8 *next_hop, struct mpath_info *pinfo);
int (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *next_hop, struct mpath_info *pinfo);
int (*get_mpp)(struct wiphy *wiphy, struct net_device *dev, u8 *dst, u8 *mpp, struct mpath_info *pinfo);
int (*dump_mpp)(struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *mpp, struct mpath_info *pinfo);
int (*get_mesh_config)(struct wiphy *wiphy,struct net_device *dev, struct mesh_config *conf);
int (*update_mesh_config)(struct wiphy *wiphy,struct net_device *dev, u32 mask, const struct mesh_config *nconf);
int (*join_mesh)(struct wiphy *wiphy, struct net_device *dev,const struct mesh_config *conf, const struct mesh_setup *setup);
int (*leave_mesh)(struct wiphy *wiphy, struct net_device *dev);
int (*join_ocb)(struct wiphy *wiphy, struct net_device *dev, struct ocb_setup *setup);
int (*leave_ocb)(struct wiphy *wiphy, struct net_device *dev);
int (*change_bss)(struct wiphy *wiphy, struct net_device *dev, struct bss_parameters *params);
void (*inform_bss)(struct wiphy *wiphy, struct cfg80211_bss *bss, const struct cfg80211_bss_ies *ies, void *data);
int (*set_txq_params)(struct wiphy *wiphy, struct net_device *dev, struct ieee80211_txq_params *params);
int (*libertas_set_mesh_channel)(struct wiphy *wiphy,struct net_device *dev, struct ieee80211_channel *chan);
int (*set_monitor_channel)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_chan_def *chandef);
int (*scan)(struct wiphy *wiphy, struct cfg80211_scan_request *request);
void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*auth)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_auth_request *req);
int (*assoc)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_assoc_request *req);
int (*deauth)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_deauth_request *req);
int (*disassoc)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_disassoc_request *req);
int (*connect)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_connect_params *sme);
int (*update_connect_params)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_connect_params *sme, u32 changed);
int (*disconnect)(struct wiphy *wiphy, struct net_device *dev, u16 reason_code);
int (*join_ibss)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ibss_params *params);
int (*leave_ibss)(struct wiphy *wiphy, struct net_device *dev);
int (*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev, int rate[NUM_NL80211_BANDS]);
int (*set_wiphy_params)(struct wiphy *wiphy, u32 changed);
int (*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, enum nl80211_tx_power_setting type, int mbm);
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, int *dbm);
void (*rfkill_poll)(struct wiphy *wiphy);
#ifdef CONFIG_NL80211_TESTMODE;
int (*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev, void *data, int len);
int (*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb,struct netlink_callback *cb, void *data, int len);
#endif;
int (*set_bitrate_mask)(struct wiphy *wiphy,struct net_device *dev,unsigned int link_id,const u8 *peer, const struct cfg80211_bitrate_mask *mask);
int (*dump_survey)(struct wiphy *wiphy, struct net_device *netdev, int idx, struct survey_info *info);
int (*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev, struct cfg80211_pmksa *pmksa);
int (*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev, struct cfg80211_pmksa *pmksa);
int (*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev);
int (*remain_on_channel)(struct wiphy *wiphy,struct wireless_dev *wdev,struct ieee80211_channel *chan,unsigned int duration, u64 *cookie);
int (*cancel_remain_on_channel)(struct wiphy *wiphy,struct wireless_dev *wdev, u64 cookie);
int (*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,struct cfg80211_mgmt_tx_params *params, u64 *cookie);
int (*mgmt_tx_cancel_wait)(struct wiphy *wiphy,struct wireless_dev *wdev, u64 cookie);
int (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev, bool enabled, int timeout);
int (*set_cqm_rssi_config)(struct wiphy *wiphy,struct net_device *dev, s32 rssi_thold, u32 rssi_hyst);
int (*set_cqm_rssi_range_config)(struct wiphy *wiphy,struct net_device *dev, s32 rssi_low, s32 rssi_high);
int (*set_cqm_txe_config)(struct wiphy *wiphy,struct net_device *dev, u32 rate, u32 pkts, u32 intvl);
void (*update_mgmt_frame_registrations)(struct wiphy *wiphy,struct wireless_dev *wdev, struct mgmt_frame_regs *upd);
int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
int (*sched_scan_start)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_sched_scan_request *request);
int (*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev, u64 reqid);
int (*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_gtk_rekey_data *data);
int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,const u8 *peer, int link_id,u8 action_code, u8 dialog_token, u16 status_code,u32 peer_capability, bool initiator, const u8 *buf, size_t len);
int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev, const u8 *peer, enum nl80211_tdls_operation oper);
int (*probe_client)(struct wiphy *wiphy, struct net_device *dev, const u8 *peer, u64 *cookie);
int (*set_noack_map)(struct wiphy *wiphy,struct net_device *dev, u16 noack_map);
int (*get_channel)(struct wiphy *wiphy,struct wireless_dev *wdev,unsigned int link_id, struct cfg80211_chan_def *chandef);
int (*start_p2p_device)(struct wiphy *wiphy, struct wireless_dev *wdev);
void (*stop_p2p_device)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev, const struct cfg80211_acl_data *params);
int (*start_radar_detection)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_chan_def *chandef, u32 cac_time_ms, int link_id);
void (*end_cac)(struct wiphy *wiphy, struct net_device *dev, unsigned int link_id);
int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_update_ft_ies_params *ftie);
int (*crit_proto_start)(struct wiphy *wiphy,struct wireless_dev *wdev,enum nl80211_crit_proto_id protocol, u16 duration);
void (*crit_proto_stop)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*set_coalesce)(struct wiphy *wiphy, struct cfg80211_coalesce *coalesce);
int (*channel_switch)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_csa_settings *params);
int (*set_qos_map)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_qos_map *qos_map);
int (*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev,unsigned int link_id, struct cfg80211_chan_def *chandef);
int (*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev,u8 tsid, const u8 *peer, u8 user_prio, u16 admitted_time);
int (*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev, u8 tsid, const u8 *peer);
int (*tdls_channel_switch)(struct wiphy *wiphy,struct net_device *dev,const u8 *addr, u8 oper_class, struct cfg80211_chan_def *chandef);
void (*tdls_cancel_channel_switch)(struct wiphy *wiphy,struct net_device *dev, const u8 *addr);
int (*start_nan)(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_nan_conf *conf);
void (*stop_nan)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*add_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_nan_func *nan_func);
void (*del_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev, u64 cookie);
int (*nan_change_conf)(struct wiphy *wiphy,struct wireless_dev *wdev,struct cfg80211_nan_conf *conf, u32 changes);
int (*set_multicast_to_unicast)(struct wiphy *wiphy,struct net_device *dev, const bool enabled);
int (*get_txq_stats)(struct wiphy *wiphy,struct wireless_dev *wdev, struct cfg80211_txq_stats *txqstats);
int (*set_pmk)(struct wiphy *wiphy, struct net_device *dev, const struct cfg80211_pmk_conf *conf);
int (*del_pmk)(struct wiphy *wiphy, struct net_device *dev, const u8 *aa);
int (*external_auth)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_external_auth_params *params);
int (*tx_control_port)(struct wiphy *wiphy,struct net_device *dev,const u8 *buf, size_t len,const u8 *dest, const __be16 proto,const bool noencrypt, int link_id, u64 *cookie);
int (*get_ftm_responder_stats)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_ftm_responder_stats *ftm_stats);
int (*start_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_pmsr_request *request);
void (*abort_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev, struct cfg80211_pmsr_request *request);
int (*update_owe_info)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_update_owe_info *owe_info);
int (*probe_mesh_link)(struct wiphy *wiphy, struct net_device *dev, const u8 *buf, size_t len);
int (*set_tid_config)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_tid_config *tid_conf);
int (*reset_tid_config)(struct wiphy *wiphy, struct net_device *dev, const u8 *peer, u8 tids);
int (*set_sar_specs)(struct wiphy *wiphy, struct cfg80211_sar_specs *sar);
int (*color_change)(struct wiphy *wiphy,struct net_device *dev, struct cfg80211_color_change_settings *params);
int (*set_fils_aad)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_fils_aad *fils_aad);
int (*set_radar_background)(struct wiphy *wiphy, struct cfg80211_chan_def *chandef);
int (*add_link_station)(struct wiphy *wiphy, struct net_device *dev, struct link_station_parameters *params);
int (*mod_link_station)(struct wiphy *wiphy, struct net_device *dev, struct link_station_parameters *params);
int (*del_link_station)(struct wiphy *wiphy, struct net_device *dev, struct link_station_del_parameters *params);
int (*set_hw_timestamp)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_set_hw_timestamp *hwts);
int (*set_ttlm)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ttlm_params *params);
u32 (*get_radio_mask)(struct wiphy *wiphy, struct net_device *dev);
};
成员
suspend
wiphy 设备需要挂起。 变量 wow 将为
NULL
或包含为设备配置的启用的无线唤醒触发器。resume
wiphy 设备需要恢复
set_wakeup
在启用/禁用 WoWLAN 时调用,使用此回调调用 device_set_wakeup_enable() 以启用/禁用设备唤醒。
add_virtual_intf
使用给定名称创建新的虚拟接口,必须设置
struct wireless_dev
的 iftype。 请注意:必须在 wiphy 的网络命名空间中创建新的 netdev! 返回struct wireless_dev
,或 ERR_PTR。 对于 P2P 设备 wdev,驱动程序还必须设置 wdev 中的地址成员。 这还包含能够进行 netdev 更改的 RTNL。del_virtual_intf
删除虚拟接口。 这还包含能够进行 netdev 更改的 RTNL。
change_virtual_intf
更改虚拟接口的类型/配置,保持
struct wireless_dev
的 iftype 更新。 这还包含能够进行 netdev 更改的 RTNL。add_intf_link
向给定接口添加新的 MLO 链接。 请注意,wdev->link[] 数据结构已更新,因此新链接地址可用。
del_intf_link
从给定接口删除 MLO 链接。
add_key
使用给定参数添加密钥。 添加组密钥时,mac_addr 将为
NULL
。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,对于组密钥,link_id 将 >= 0,对于成对密钥,link_id 将为 -1,对于 MLO 成对密钥,mac_addr 将为对等方的 MLD 地址。get_key
获取有关具有给定参数的密钥的信息。 请求组密钥的信息时,mac_addr 将为
NULL
。 传递给 callback 函数的所有指针在函数返回后无需有效。 如果无法检索密钥,此函数应返回错误,如果密钥不存在,则返回 -ENOENT。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,对于组密钥,link_id 将 >= 0,对于成对密钥,link_id 将为 -1,对于 MLO 成对密钥,mac_addr 将为对等方的 MLD 地址。del_key
删除给定 mac_addr(对于组密钥,为
NULL
)和 key_index 的密钥,如果密钥不存在,则返回 -ENOENT。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,对于组密钥,link_id 将 >= 0,对于成对密钥,link_id 将为 -1,对于 MLO 成对密钥,mac_addr 将为对等方的 MLD 地址。set_default_key
在接口上设置默认密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接,link_id 将为 -1。
set_default_mgmt_key
在接口上设置默认管理帧密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接,link_id 将为 -1。
set_default_beacon_key
在接口上设置默认信标帧密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接,link_id 将为 -1。
start_ap
根据参数定义的启动 AP 模式。
change_beacon
更改接入点模式接口的信标参数。当 AP 模式未启动时,应拒绝此调用。
stop_ap
停止作为 AP,包括停止信标广播。
add_station
添加一个新的站点。
del_station
移除一个站点。
change_station
修改给定站点。请注意,cfg80211 中对标志的更改验证不多,特别是 auth/assoc/authorized 标志可能会以无效的组合传递给驱动程序——请确保检查它们,并与现有状态进行对比!驱动程序必须调用 cfg80211_check_station_change() 来验证信息。
get_station
获取由 mac 标识的站点信息。
dump_station
站点回调转储 -- 在索引 idx 处恢复转储。
add_mpath
添加一个固定的网格路径。
del_mpath
删除给定的网格路径。
change_mpath
更改给定的网格路径。
get_mpath
获取给定参数的网格路径。
dump_mpath
网格路径回调转储 -- 在索引 idx 处恢复转储。
get_mpp
获取给定参数的网格代理路径。
dump_mpp
网格代理路径回调转储 -- 在索引 idx 处恢复转储。
get_mesh_config
获取当前的网格配置。
update_mesh_config
更新正在运行的网格上的网格参数。掩码是一个位域,它告诉我们设置哪些参数,以及哪些参数保持不变。
join_mesh
使用指定的参数加入网格网络(在持有 wireless_dev 互斥锁的情况下调用)。
leave_mesh
离开当前的网格网络(在持有 wireless_dev 互斥锁的情况下调用)。
join_ocb
使用指定的参数加入 OCB 网络(在持有 wireless_dev 互斥锁的情况下调用)。
leave_ocb
离开当前的 OCB 网络(在持有 wireless_dev 互斥锁的情况下调用)。
change_bss
修改给定 BSS 的参数。
inform_bss
当被通知有关在报告的数据或帧中发现的每个 BSS 的新 BSS 数据时,由 cfg80211 调用。这是在持有 bss_lock 的情况下从 cfg8011 inform_bss 处理程序内部调用的。data 参数从
struct cfg80211_inform_bss
内部的 drv_data 中传递。BSS 的新 IE 数据被显式传递。set_txq_params
设置 TX 队列参数。
libertas_set_mesh_channel
仅用于 libertas 的向后兼容性,因为它没有实现 join_mesh,并且需要设置通道才能加入网格。
set_monitor_channel
设置设备的监视器模式通道。如果其他接口处于活动状态,则此回调应拒绝该配置。如果没有接口处于活动状态或设备已关闭,则应存储该通道,以便在监视器接口变为活动状态时使用。
scan
请求执行扫描。如果返回零,则将扫描请求提供给驱动程序,并且该请求将有效,直到传递给
cfg80211_scan_done()
。对于扫描结果,调用cfg80211_inform_bss()
;您也可以在 scan/scan_done 括号之外调用此函数。abort_scan
告诉驱动程序中止正在进行的扫描。驱动程序应通过
cfg80211_scan_done()
指示扫描的状态。auth
请求与指定的对等方进行身份验证(在持有 wireless_dev 互斥锁的情况下调用)。
assoc
请求与指定的对等方(重新)关联(在持有 wireless_dev 互斥锁的情况下调用)。
deauth
请求取消与指定的对等方的身份验证(在持有 wireless_dev 互斥锁的情况下调用)。
disassoc
请求与指定的对等方解除关联(在持有 wireless_dev 互斥锁的情况下调用)。
connect
使用指定的参数连接到 ESS。连接后,使用状态代码
WLAN_STATUS_SUCCESS
调用cfg80211_connect_result()
/cfg80211_connect_bss()
。如果连接因某种原因失败,则使用来自 AP 的状态代码或cfg80211_connect_timeout()
(如果没有收到带有状态代码的帧)调用cfg80211_connect_result()
/cfg80211_connect_bss()
。当其他 BSS 与连接参数匹配时,允许驱动程序漫游到 ESS 内的其他 BSS。当驱动程序启动此类漫游时,应验证目标是否与配置的安全参数匹配,并使用重关联请求帧而不是关联请求帧。当连接到 ESS 时,connect 函数还可用于请求驱动程序执行特定的漫游。在这种情况下,prev_bssid 参数设置为当前关联 BSS 的 BSSID,以指示请求重新关联。在驱动程序启动和新的 connect() 调用启动的漫游情况下,漫游的结果通过调用cfg80211_roamed()
指示。(在持有 wireless_dev 互斥锁的情况下调用)。update_connect_params
在连接到 BSS 时更新连接参数。更新的参数可供驱动程序/固件用于后续的 BSS 选择(漫游)决策,以及形成身份验证/(重新)关联请求帧。此调用不请求立即解除与当前 BSS 的关联或重新关联,也就是说,这仅影响后续的(重新)关联。changed 中的位在
enum cfg80211_connect_params_changed
中定义。(在持有 wireless_dev 互斥锁的情况下调用)。disconnect
与 BSS/ESS 断开连接,或者如果连接正在进行中,则停止连接尝试。完成后,如果连接已经建立,则调用
cfg80211_disconnected()
(在持有 wireless_dev 互斥锁的情况下调用),否则调用cfg80211_connect_timeout()
。join_ibss
加入指定的 IBSS(或在必要时创建)。完成后,调用
cfg80211_ibss_joined()
,在由于合并而更改 BSSID 时也调用该函数。(在持有 wireless_dev 互斥锁的情况下调用)。leave_ibss
离开 IBSS。(在持有 wireless_dev 互斥锁的情况下调用)。
set_mcast_rate
设置指定的多播速率(仅当 vif 处于 ADHOC 或 MESH 模式时)。
set_wiphy_params
通知 wiphy 参数已更改;changed 位域(请参阅
enum wiphy_params_flags
)描述了哪些值已更改。实际的参数值在struct wiphy
中可用。如果返回错误,则不应更改任何值。set_tx_power
根据参数设置发射功率,传递的功率以 mBm 为单位,要获得 dBm,请使用 MBM_TO_DBM()。如果为 wiphy 设置了功率,则 wdev 可能为
NULL
,并且除非驱动程序支持每个 vif TX 功率(如 nl80211 功能标志所声明),否则始终为NULL
。get_tx_power
将当前 TX 功率存储到 dbm 变量中;如果成功,则返回 0。
rfkill_poll
轮询 hw rfkill 线,使用 cfg80211 报告函数来调整 rfkill hw 状态。
testmode_cmd
运行测试模式命令;wdev 可能为
NULL
。testmode_dump
实现测试模式转储。该函数可以使用 cb->args[2] 及更高版本,但不应触及 0 和 1。此外,返回除 -ENOBUFS 和 -ENOENT 之外的错误代码将终止转储并返回到用户空间并显示错误,因此请小心。如果从用户空间传递了任何数据,则 data/len 参数将存在并指向
NL80211_ATTR_TESTDATA
中包含的数据。set_bitrate_mask
设置比特率掩码配置。
dump_survey
获取站点调查信息。
set_pmksa
为 BSSID 缓存 PMKID。这对于运行能够生成(重新)关联 RSN IE 的固件的 fullmac 设备最有用。它允许在 WPA2 BSSID 之间更快地漫游。
del_pmksa
删除缓存的 PMKID。
flush_pmksa
刷新所有缓存的 PMKID。
remain_on_channel
请求驱动程序在指定的通道上保持唤醒指定的时间,以完成通道外操作(例如,公共操作帧交换)。当驱动程序在请求的通道上准备就绪时,它必须通过调用
cfg80211_ready_on_channel()
来指示此状态。cancel_remain_on_channel
取消正在进行的 remain-on-channel 操作。这允许在基于持续时间值超时之前终止操作。
mgmt_tx
发送管理帧。
mgmt_tx_cancel_wait
取消从另一通道发送管理帧的等待时间。
set_power_mgmt
配置 WLAN 电源管理。超时值为 -1 允许驱动程序调整动态 ps 超时值。
set_cqm_rssi_config
配置连接质量监视器 RSSI 阈值。配置后,驱动程序应(很快)发送一个事件,指示当前级别高于/低于配置的阈值;当配置更改时(而不是首先禁用时),这可能需要一些注意。
set_cqm_rssi_range_config
在连接质量监视器中配置两个 RSSI 阈值。仅当信号电平被发现超出两个值时才发送事件。如果实现了此方法,则驱动程序应设置
NL80211_EXT_FEATURE_CQM_RSSI_LIST
。如果提供了此方法,则没有必要提供 set_cqm_rssi_config。set_cqm_txe_config
配置连接质量监视器 TX 错误阈值。
update_mgmt_frame_registrations
通知驱动程序管理帧注册已更新。回调函数允许睡眠。
set_antenna
在设备上设置天线配置 (tx_ant, rx_ant)。参数是用于 TX/RX 的允许天线的位图。驱动程序可以通过返回 -EINVAL 来拒绝它们不支持的 TX/RX 掩码组合(另请参阅 nl80211.h 中的 NL80211_ATTR_WIPHY_ANTENNA_TX)。
get_antenna
从设备获取当前天线配置 (tx_ant, rx_ant)。
sched_scan_start
告诉驱动程序启动计划扫描。
sched_scan_stop
告诉驱动程序停止正在进行的具有给定请求 ID 的计划扫描。此调用必须停止计划扫描,并准备好在返回之前启动新的扫描,即,sched_scan_start 可以再次在其后立即调用,并且在这种情况下不应失败。驱动程序不应为请求的停止调用 cfg80211_sched_scan_stopped() (当此方法返回 0 时)。
set_rekey_data
向驱动程序提供 GTK 重新密钥所需的数据。
tdls_mgmt
发送一个 TDLS 管理帧。
tdls_oper
执行高级 TDLS 操作 (例如,TDLS 链接设置)。
probe_client
探测一个关联的客户端,必须返回一个 cookie,该 cookie 将在以后传递给 cfg80211_probe_status()。
set_noack_map
设置 TIDs 的 NoAck 映射。
get_channel
获取虚拟接口的当前工作信道。对于监控接口,除非存在单个当前监控信道,否则应返回
NULL
。start_p2p_device
启动给定的 P2P 设备。
stop_p2p_device
停止给定的 P2P 设备。
set_mac_acl
在 AP 和 P2P GO 模式下设置 MAC 地址控制列表。参数包括 ACL 策略、站点 MAC 地址数组和 MAC 地址的数量。如果驱动程序中已存在列表,则此新列表将替换现有列表。当 MAC 地址条目的数量作为 0 传递时,驱动程序必须清除其 ACL。声明支持基于 MAC 的 ACL 的驱动程序必须实现此回调函数。
start_radar_detection
在驱动程序中启动雷达检测。
end_cac
结束正在运行的 CAC,可能是因为另一个 phy 上相关的 CAC 已完成。
update_ft_ies
向驱动程序提供更新的快速 BSS 转换信息。如果 SME 在驱动程序/固件中,则此信息可用于构建身份验证和重新关联请求帧。
crit_proto_start
指示关键协议需要在给定持续时间(毫秒)内获得更高的链路可靠性。提供该协议是为了让驱动程序可以采取最合适的措施。
crit_proto_stop
指示关键协议不再需要更高的链路可靠性。此操作不会失败。
set_coalesce
设置合并参数。
channel_switch
启动信道切换程序 (使用 CSA)。驱动程序负责验证切换是否可行。由于这本身很棘手,驱动程序可能会决定稍后使用 cfg80211_stop_iface() 断开接口。这并不意味着驱动程序可以接受一切。它应尽力验证请求并尽快拒绝它们。
set_qos_map
向驱动程序设置 QoS 映射信息。
set_ap_chanwidth
为给定接口设置 AP (包括 P2P GO) 模式信道宽度。这用于例如 BSS 生命周期期间动态的 HT 20/40 MHz 信道宽度更改。
add_tx_ts
验证(如果 admitted_time 为 0)或使用给定参数将 TX TS 添加到设备;用户空间已处理操作帧交换,因此这只需修改 TX 路径以考虑 TS。如果承认时间为 0,则只需验证参数以确保可以创建会话;始终为此返回成功是有效的,但这可能会导致低效的行为(与对等方握手,然后在稍后拒绝添加时立即拆除)
del_tx_ts
删除现有的 TX TS。
tdls_channel_switch
开始与 TDLS 对等方进行信道切换。驱动程序负责持续启动信道切换操作并返回基本信道以与 AP 通信。
tdls_cancel_channel_switch
停止与 TDLS 对等方进行信道切换。调用完成时,两个对等方都必须位于基本信道上。
start_nan
启动 NAN 接口。
stop_nan
停止 NAN 接口。
add_nan_func
添加 NAN 功能。失败时返回负值。成功后,nan_func 的所有权将转移给驱动程序,并且它可以在此函数范围之外访问它。当不再需要 nan_func 时,驱动程序应通过调用 cfg80211_free_nan_func() 来释放它。成功后,驱动程序应在提供的 nan_func 中分配一个 instance_id。
del_nan_func
删除 NAN 功能。
nan_change_conf
更改 NAN 配置。更改的参数必须在 changes 中指定 (使用
enum cfg80211_nan_conf_changes
); 必须忽略所有其他参数。set_multicast_to_unicast
配置 BSS 的多播到单播转换。
get_txq_stats
获取接口或 phy 的 TXQ 统计信息。如果 wdev 为
NULL
,则此函数应返回 phy 统计信息,否则返回接口统计信息。set_pmk
配置将用于卸载的 802.1X 四路握手的 PMK。如果未通过 del_pmk 删除,PMK 将保持有效,直到断开连接,之后驱动程序应将其清除。(在持有 wireless_dev 互斥锁的情况下调用)
del_pmk
删除先前为给定身份验证器配置的 PMK。(在持有 wireless_dev 互斥锁的情况下调用)
external_auth
指示来自用户空间的卸载身份验证处理的结果。
tx_control_port
发送一个控制端口帧 (EAPoL)。noencrypt 参数告诉驱动程序不应对帧进行加密。
get_ftm_responder_stats
检索 FTM 响应器统计信息(如果可用)。统计信息应该是累积的,目前没有提供重置的方法。
start_pmsr
开始对等方测量(例如 FTM)。
abort_pmsr
中止对等方测量。
update_owe_info
向驱动程序提供更新的 OWE 信息。实现 SME 但将 OWE 处理卸载到用户空间的驱动程序将通过此接口获取更新的 DH IE。
probe_mesh_link
通过发送数据帧并覆盖 HWMP 路径选择算法来探测直接网状对等方的链路质量。
set_tid_config
TID 特定配置,这可以是特定于对等方或 BSS 的。此回调函数可能会睡眠。
reset_tid_config
重置给定 TID 的对等方的 TID 特定配置。此回调函数可能会睡眠。
set_sar_specs
更新 SAR(TX 功率)设置。
color_change
启动颜色更改。
set_fils_aad
将 FILS AAD 数据设置为 AP 驱动程序,以便驱动程序可以使用这些数据来解密 (重新) 关联请求并加密 (重新) 关联响应帧。
set_radar_background
在某些硬件上配置专用于雷达/CAC 检测的专用异信道链。此链不能用于发送或接收帧,并且它绑定到正在运行的 wdev。后台雷达/CAC 检测可以避免在选定的雷达信道上进行 CAC 检测期间切换到不同信道时的 CAC 停机时间。调用方应将 chandef 指针设置为 NULL,以便禁用后台 CAC/雷达检测。
add_link_station
添加与站点的链接。
mod_link_station
修改站点的链接。
del_link_station
删除站点的链接。
set_hw_timestamp
启用/禁用 TM/FTM 帧的硬件时间戳。
set_ttlm
设置 TID 到链接的映射。
get_radio_mask
获取正在使用的无线电的位掩码。(在持有 wiphy 互斥锁的情况下调用)
描述
此结构由全功能 MAC 卡驱动程序和/或无线堆栈注册,以便处理其接口上的配置请求。
除非另有说明,否则所有回调函数都应在成功时返回 0 或返回负错误代码。
所有操作都在持有 wiphy 互斥锁的情况下调用。此外,可能会持有 RTNL(由于无线扩展),但这不能依赖,除非在下面记录的情况下。请注意,由于排序,RTNL 也不能在任何处理程序中获取。
-
void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)¶
已处理的 MLME 管理帧的通知
参数
struct net_device *dev
网络设备
const u8 *buf
身份验证帧(标头 + 正文)
size_t len
帧数据的长度
描述
每当在站点模式下接收和处理身份验证、取消关联或解除身份验证帧时,都会调用此函数。在被要求通过 cfg80211_ops::auth() 进行身份验证后,驱动程序必须调用此函数或 cfg80211_auth_timeout()
。在被要求通过 cfg80211_ops::assoc() 进行关联后,驱动程序必须调用此函数或 cfg80211_auth_timeout()
。在连接时,驱动程序必须针对接收和处理的取消关联和解除身份验证帧调用此函数。如果该帧因未受保护而无法使用,则驱动程序必须改为调用函数 cfg80211_rx_unprot_mlme_mgmt()。
此函数可能会睡眠。调用方必须持有相应的 wdev 的互斥锁。
-
void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr)¶
身份验证超时的通知
参数
struct net_device *dev
网络设备
const u8 *addr
身份验证超时的设备的 MAC 地址
描述
此函数可能会睡眠。调用方必须持有相应的 wdev 的互斥锁。
-
void cfg80211_rx_assoc_resp(struct net_device *dev, const struct cfg80211_rx_assoc_resp_data *data)¶
处理关联响应的通知
参数
struct net_device *dev
网络设备
const struct cfg80211_rx_assoc_resp_data *data
关联响应数据,
struct cfg80211_rx_assoc_resp_data
描述
在通过 cfg80211_ops::assoc() 请求关联后,驱动程序必须调用此函数或 cfg80211_auth_timeout()
。
此函数可能会睡眠。调用方必须持有相应的 wdev 的互斥锁。
-
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len, bool reconnect)¶
已传输的去认证/取消关联帧的通知
参数
struct net_device *dev
网络设备
const u8 *buf
802.11帧(头部 + 主体)
size_t len
帧数据的长度
bool reconnect
期望立即重新连接(包括 nl80211 属性)
描述
每当在站点模式下处理去认证时,都会调用此函数。这包括接收到的去认证帧和本地生成的帧。此函数可能会休眠。调用者必须持有相应的 wdev 的互斥锁。
-
void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, enum nl80211_key_type key_type, int key_id, const u8 *tsc, gfp_t gfp)¶
Michael MIC 失败(TKIP)的通知
参数
struct net_device *dev
网络设备
const u8 *addr
帧的源 MAC 地址
enum nl80211_key_type key_type
接收到的帧使用的密钥类型
int key_id
密钥标识符 (0..3)。如果缺失,则为 -1。
const u8 *tsc
生成 MIC 失败的帧的 TSC 值(6 个字节)
gfp_t gfp
分配标志
描述
每当本地 MAC 检测到接收到的帧中出现 MIC 失败时,都会调用此函数。这与 MLME-MICHAELMICFAILURE.indication() 原语匹配。
-
void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, struct ieee80211_channel *channel, gfp_t gfp)¶
通知 cfg80211 设备已加入 IBSS
参数
struct net_device *dev
网络设备
const u8 *bssid
已加入的 IBSS 的 BSSID
struct ieee80211_channel *channel
已加入的 IBSS 的通道
gfp_t gfp
分配标志
描述
此函数通知 cfg80211 设备已加入 IBSS 或切换到不同的 BSSID。在可以调用此函数之前,必须已从 IBSS 接收到信标,或者必须已使用本地生成的信标调用了 cfg80211_inform_bss{,_frame} 函数之一——这保证了此 IBSS 始终存在扫描结果。cfg80211 将处理其余部分。
-
struct cfg80211_connect_resp_params¶
连接响应参数
定义:
struct cfg80211_connect_resp_params {
int status;
const u8 *req_ie;
size_t req_ie_len;
const u8 *resp_ie;
size_t resp_ie_len;
struct cfg80211_fils_resp_params fils;
enum nl80211_timeout_reason timeout_reason;
const u8 *ap_mld_addr;
u16 valid_links;
struct {
const u8 *addr;
const u8 *bssid;
struct cfg80211_bss *bss;
u16 status;
} links[IEEE80211_MLD_MAX_NUM_LINKS];
};
成员
状态
状态码,
WLAN_STATUS_SUCCESS
表示成功连接,如果您的设备无法为您提供失败的真实状态码,请使用WLAN_STATUS_UNSPECIFIED_FAILURE
。如果此调用用于报告由于超时(例如,未从 AP 接收到身份验证帧)而不是 AP 明确拒绝而导致的失败,则使用 -1 来指示这是一个失败,但没有状态码。timeout_reason 用于报告该情况下超时的原因。req_ie
关联请求 IE(可能为
NULL
)req_ie_len
关联请求 IE 的长度
resp_ie
关联响应 IE(可能为
NULL
)resp_ie_len
关联响应 IE 的长度
fils
FILS 连接响应参数。
timeout_reason
连接超时的原因。当连接由于超时而不是 AP 的明确拒绝而失败时使用。当超时原因未知时,使用
NL80211_TIMEOUT_UNSPECIFIED
。仅当 status < 0 时才使用此值来指示失败是由于超时而不是 AP 的明确拒绝导致的。在其他情况下(status >= 0)忽略此值。ap_mld_addr
对于 MLO 连接,AP 的 MLD 地址。否则为
NULL
。valid_links
对于 MLO 连接,有效链接 ID 的位掩码。否则为零。
links
对于 MLO 连接,包含使用 valid_links 指示的有效链接的链接信息。对于非 MLO 连接,links[0] 包含已连接的 AP 信息。
links.addr
对于 MLO 连接,STA 链接的 MAC 地址。否则为
NULL
。links.bssid
对于 MLO 连接,AP 链接的 MAC 地址。对于非 MLO 连接,links[0].bssid 指向 AP 的 BSSID(可能为
NULL
)。links.bss
对于 MLO 连接,STA 链接连接到的 bss 的条目。对于非 MLO 连接,links[0].bss 指向 STA 连接到的 bss 的条目。可以通过 cfg80211_get_bss() 获取(可能为
NULL
)。建议从 connect_request 存储 bss 并保持对其的引用,并通过此参数返回,以避免在连接期间 bss 过期时的警告,尤其对于那些实现 connect op 的驱动程序。bssid 和 bss 中只需要指定一个参数。links.status
每个链接的状态代码,要报告给定链接的状态代码不是
WLAN_STATUS_SUCCESS
,它也必须在 valid_links 位图中,并且可能具有 BSS 指针(然后将其释放)
-
void cfg80211_connect_done(struct net_device *dev, struct cfg80211_connect_resp_params *params, gfp_t gfp)¶
通知 cfg80211 连接结果
参数
struct net_device *dev
网络设备
struct cfg80211_connect_resp_params *params
连接响应参数
gfp_t gfp
分配标志
描述
一旦完成 connect() 的连接请求的执行,底层驱动程序应调用它。这类似于 cfg80211_connect_bss()
,但采用连接响应参数的结构指针。应该只调用 cfg80211_connect_bss()
、cfg80211_connect_result()
、cfg80211_connect_timeout()
和 cfg80211_connect_done()
中的一个函数。
-
void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid, struct cfg80211_bss *bss, const u8 *req_ie, size_t req_ie_len, const u8 *resp_ie, size_t resp_ie_len, int status, gfp_t gfp, enum nl80211_timeout_reason timeout_reason)¶
通知 cfg80211 连接结果
参数
struct net_device *dev
网络设备
const u8 *bssid
AP 的 BSSID
struct cfg80211_bss *bss
STA 连接到的 bss 条目,可以通过 cfg80211_get_bss() 获取(可能为
NULL
)。但建议存储来自 connect_request 的 bss 并保持对其的引用,并通过此参数返回,以避免在连接期间 bss 过期时出现警告,特别是对于那些实现 connect 操作的驱动程序。在 bssid 和 bss 中只需要指定一个参数。const u8 *req_ie
关联请求 IE(可能为
NULL
)size_t req_ie_len
关联请求 IE 长度
const u8 *resp_ie
关联响应 IE(可能为
NULL
)size_t resp_ie_len
关联响应 IE 长度
int status
状态码,成功连接为
WLAN_STATUS_SUCCESS
,如果你的设备无法提供失败的真实状态码,请使用WLAN_STATUS_UNSPECIFIED_FAILURE
。如果此调用用于报告由于超时导致的失败(例如,未收到来自 AP 的身份验证帧),而不是 AP 的显式拒绝,则使用 -1 表示这是一个失败,但没有状态码。在这种情况下,timeout_reason 用于报告超时的原因。gfp_t gfp
分配标志
enum nl80211_timeout_reason timeout_reason
连接超时的原因。当连接失败是由于超时而不是 AP 的显式拒绝时使用。当超时原因未知时,使用
NL80211_TIMEOUT_UNSPECIFIED
。此值仅在 status < 0 时使用,以指示失败是由于超时而不是 AP 的显式拒绝。在其他情况下(status >= 0),此值将被忽略。
描述
一旦完成来自 connect() 的连接请求的执行,底层驱动程序应调用此函数。这类似于 cfg80211_connect_result()
,但可以选择标识连接的确切 bss 条目。在 cfg80211_connect_bss()
、cfg80211_connect_result()
、cfg80211_connect_timeout()
和 cfg80211_connect_done()
中,只能调用其中一个函数。
-
void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, const u8 *req_ie, size_t req_ie_len, const u8 *resp_ie, size_t resp_ie_len, u16 status, gfp_t gfp)¶
通知 cfg80211 连接结果
参数
struct net_device *dev
网络设备
const u8 *bssid
AP 的 BSSID
const u8 *req_ie
关联请求 IE(可能为
NULL
)size_t req_ie_len
关联请求 IE 长度
const u8 *resp_ie
关联响应 IE(可能为
NULL
)size_t resp_ie_len
关联响应 IE 长度
u16 status
状态码,成功连接为
WLAN_STATUS_SUCCESS
,如果你的设备无法提供失败的真实状态码,请使用WLAN_STATUS_UNSPECIFIED_FAILURE
。gfp_t gfp
分配标志
描述
一旦完成来自 connect() 的连接请求的执行,底层驱动程序应调用此函数。这类似于 cfg80211_connect_bss()
,它允许指定确切的 bss 条目。在 cfg80211_connect_bss()
、cfg80211_connect_result()
、cfg80211_connect_timeout()
和 cfg80211_connect_done()
中,只能调用其中一个函数。
-
void cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid, const u8 *req_ie, size_t req_ie_len, gfp_t gfp, enum nl80211_timeout_reason timeout_reason)¶
通知 cfg80211 连接超时
参数
struct net_device *dev
网络设备
const u8 *bssid
AP 的 BSSID
const u8 *req_ie
关联请求 IE(可能为
NULL
)size_t req_ie_len
关联请求 IE 长度
gfp_t gfp
分配标志
enum nl80211_timeout_reason timeout_reason
连接超时的原因。
描述
每当 connect() 在没有收到来自 AP 的显式身份验证/关联拒绝的情况下失败时,底层驱动程序都应调用此函数。例如,这可能是由于无法发送身份验证或关联请求帧,或者在等待响应时超时而发生的。在 cfg80211_connect_bss()
、cfg80211_connect_result()
、cfg80211_connect_timeout()
和 cfg80211_connect_done()
中,只能调用其中一个函数。
-
void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info, gfp_t gfp)¶
通知 cfg80211 漫游
参数
struct net_device *dev
网络设备
struct cfg80211_roam_info *info
有关新 BSS 的信息。struct
cfg80211_roam_info
。gfp_t gfp
分配标志
描述
此函数可以被驱动程序调用,传递新 AP 的 BSSID 或传递 bss 条目,以避免 bss 条目超时的竞争。当连接状态下从一个 AP 漫游到另一个 AP 时,底层驱动程序应调用此函数。固件中实现了漫游的驱动程序应传递 bss 条目,以避免 bss 条目超时的竞争,其中新 AP 的 bss 条目在驱动程序中可见,但在由于调度 rdev->event_work 的延迟而在 __cfg80211_roamed() 中访问时超时。如果发生任何故障,引用将在 cfg80211_roamed()
或 __cfg80211_romed() 中释放。否则,将在与当前 bss 断开连接时释放。
-
void cfg80211_disconnected(struct net_device *dev, u16 reason, const u8 *ie, size_t ie_len, bool locally_generated, gfp_t gfp)¶
通知 cfg80211 连接已断开
参数
struct net_device *dev
网络设备
u16 reason
断开连接的原因代码,如果未知,则设置为 0
const u8 *ie
取消身份验证/取消关联帧的信息元素(可能为
NULL
)size_t ie_len
IE 的长度
bool locally_generated
断开连接是本地请求的
gfp_t gfp
分配标志
描述
调用此函数后,驱动程序应进入空闲状态,不再尝试连接任何 AP。
-
void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, struct ieee80211_channel *chan, unsigned int duration, gfp_t gfp)¶
remain_on_channel 开始的通知
参数
struct wireless_dev *wdev
无线设备
u64 cookie
请求 cookie
struct ieee80211_channel *chan
当前频道(来自 remain_on_channel 请求)
unsigned int duration
驱动程序打算在该频道上保持的持续时间(以毫秒为单位)
gfp_t gfp
分配标志
-
void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, struct ieee80211_channel *chan, gfp_t gfp)¶
remain_on_channel 持续时间已过期
参数
struct wireless_dev *wdev
无线设备
u64 cookie
请求 cookie
struct ieee80211_channel *chan
当前频道(来自 remain_on_channel 请求)
gfp_t gfp
分配标志
-
void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, struct station_info *sinfo, gfp_t gfp)¶
通知用户空间有关站点的信息
参数
struct net_device *dev
netdev
const u8 *mac_addr
站点的地址
struct station_info *sinfo
站点信息
gfp_t gfp
分配标志
-
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm, const u8 *buf, size_t len, u32 flags)¶
接收到的、未处理的管理帧的通知
参数
struct wireless_dev *wdev
接收帧的无线设备
int freq
接收帧的频率,单位为 MHz
int sig_dbm
信号强度,单位为 dBm,如果未知则为 0
const u8 *buf
管理帧(标头 + 正文)
size_t len
帧数据的长度
u32 flags
标志,如枚举 nl80211_rxmgmt_flags 中定义
描述
每当收到站点模式接口的操作帧,但在内核中未处理时,都会调用此函数。
返回值
如果用户空间应用程序已注册此帧,则为 true
。对于操作帧,这使其有责任拒绝无法识别的操作帧;否则为 false
,在这种情况下,对于操作帧,驱动程序有责任拒绝该帧。
-
void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, const u8 *buf, size_t len, bool ack, gfp_t gfp)¶
管理帧的 TX 状态的通知
参数
struct wireless_dev *wdev
接收帧的无线设备
u64 cookie
cfg80211_ops::mgmt_tx() 返回的 Cookie
const u8 *buf
管理帧(标头 + 正文)
size_t len
帧数据的长度
bool ack
是否已确认帧
gfp_t gfp
上下文标志
描述
每当请求使用 cfg80211_ops::mgmt_tx() 发送管理帧时,都会调用此函数以报告传输尝试的 TX 状态。
-
void cfg80211_cqm_rssi_notify(struct net_device *dev, enum nl80211_cqm_rssi_threshold_event rssi_event, s32 rssi_level, gfp_t gfp)¶
连接质量监控 rssi 事件
参数
struct net_device *dev
网络设备
enum nl80211_cqm_rssi_threshold_event rssi_event
触发的 RSSI 事件
s32 rssi_level
新的 RSSI 级别值,如果不可用,则为 0
gfp_t gfp
上下文标志
描述
当配置的连接质量监控 rssi 阈值达到事件发生时,会调用此函数。
-
void cfg80211_cqm_pktloss_notify(struct net_device *dev, const u8 *peer, u32 num_packets, gfp_t gfp)¶
通知用户空间有关与对等节点的丢包情况
参数
struct net_device *dev
网络设备
const u8 *peer
对等节点的 MAC 地址
u32 num_packets
丢失了多少个数据包 -- 应该是一个固定的阈值,但可能不应小于 50 个,或者可能是依赖于吞吐量的阈值(以考虑临时干扰)
gfp_t gfp
上下文标志
扫描和 BSS 列表处理¶
扫描过程本身相当简单,但 cfg80211 提供了相当多的辅助功能。要启动扫描,将使用扫描定义调用扫描操作。此扫描定义包含要扫描的信道,以及要发送探测请求的 SSID(如果需要,包括通配符)。被动扫描表示没有要探测的 SSID。此外,扫描请求可能包含应添加到探测请求的额外信息元素。保证这些 IE 格式良好,并且不会超过驱动程序在 wiphy 结构中声明的最大长度。
当扫描找到 BSS 时,需要通知 cfg80211,因为它负责维护 BSS 列表;驱动程序不应自己维护列表。对于此通知,存在各种函数。
由于驱动程序不维护 BSS 列表,因此还有许多函数可用于搜索 BSS 并从 cfg80211 维护的 BSS 结构中获取有关它的信息。BSS 列表也可供用户空间使用。
-
struct cfg80211_ssid¶
SSID 描述
定义:
struct cfg80211_ssid {
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len;
};
成员
ssid
SSID
ssid_len
ssid 的长度
-
struct cfg80211_scan_request¶
扫描请求描述
定义:
struct cfg80211_scan_request {
struct cfg80211_ssid *ssids;
int n_ssids;
u32 n_channels;
const u8 *ie;
size_t ie_len;
u16 duration;
bool duration_mandatory;
u32 flags;
u32 rates[NUM_NL80211_BANDS];
struct wireless_dev *wdev;
u8 mac_addr[ETH_ALEN] ;
u8 mac_addr_mask[ETH_ALEN] ;
u8 bssid[ETH_ALEN] ;
struct wiphy *wiphy;
unsigned long scan_start;
struct cfg80211_scan_info info;
bool notified;
bool no_cck;
bool scan_6ghz;
u32 n_6ghz_params;
struct cfg80211_scan_6ghz_params *scan_6ghz_params;
s8 tsf_report_link_id;
struct ieee80211_channel *channels[] ;
};
成员
ssids
要扫描的 SSID(仅限主动扫描)
n_ssids
SSID 的数量
n_channels
要扫描的信道总数
ie
要添加到探测请求中的可选信息元素,或
NULL
ie_len
ie 的长度(以字节为单位)
duration
在每个信道上侦听的时长,以 TUs 为单位。如果未设置
duration_mandatory
,则这是最大停留时间,实际停留时间可能会更短。duration_mandatory
如果设置,则扫描时长必须与
duration
字段指定的时长相同。flags
来自
enum nl80211_scan_flags
的控制标志rates
每个频段要通告的速率的位图
wdev
要扫描的无线设备
mac_addr
用于随机化的 MAC 地址
mac_addr_mask
用于随机化的 MAC 地址掩码,掩码中为 0 的位应随机化,为 1 的位应取自 mac_addr
bssid
要扫描的 BSSID(最常见的是通配符 BSSID)
wiphy
此扫描对应的 wiphy
scan_start
扫描开始的时间(以 jiffies 为单位)
info
(内部)有关已完成扫描的信息
notified
(内部)扫描请求已通知为完成或中止
no_cck
用于在 2GHz 频段以非 CCK 速率发送探测请求
scan_6ghz
仅与拆分扫描请求相关,如果这是第二个扫描请求,则为 true
n_6ghz_params
6 GHz 参数的数量
scan_6ghz_params
6 GHz 参数
tsf_report_link_id
对于 MLO,指示应该用于 TSF 报告的 BSS 的链路 ID。可以设置为 -1 以表示没有偏好。
channels
要扫描的信道。
-
struct cfg80211_inform_bss¶
BSS 信息数据
定义:
struct cfg80211_inform_bss {
struct ieee80211_channel *chan;
s32 signal;
u64 boottime_ns;
u64 parent_tsf;
u8 parent_bssid[ETH_ALEN] ;
u8 chains;
s8 chain_signal[IEEE80211_MAX_CHAINS];
u8 restrict_use:1, use_for:7;
u8 cannot_use_reasons;
void *drv_data;
};
成员
chan
接收帧的信道
signal
信号强度值,根据 wiphy 的信号类型
boottime_ns
接收到信息的时间戳 (CLOCK_BOOTTIME);应与设备实际接收到帧的时间(而不仅仅是主机,以防它缓存在设备上)相匹配,并且精度约为 10 毫秒。如果帧没有缓冲,则传递
ktime_get_boottime_ns()
的返回值可能是合适的。parent_tsf
帧的时间戳字段的第一个字节开始接收时的时间。该时间是由
parent_bssid
指定的 BSS 的 TSF。parent_bssid
设置
parent_tsf
所依据的 BSS。这设置为请求接收到信标/探测的扫描的 BSS。chains
chain_signal 中填充值的位掩码。
chain_signal
上次接收的 BSS 的每个链的信号强度(以 dBm 为单位)。
restrict_use
限制使用,如果未设置,则假设 use_for 为
NL80211_BSS_USE_FOR_NORMAL
。use_for
此 BSS 的可能用途的位图,请参阅
enum nl80211_bss_use_for
cannot_use_reasons
无法连接的原因(位图),如果设置了 restrict_use 且 use_for 为零(空);可能为 0 表示未指定原因;请参阅
enum nl80211_bss_cannot_use_reasons
drv_data
要传递给 inform_bss 的数据
-
struct cfg80211_bss¶
BSS 描述
定义:
struct cfg80211_bss {
struct ieee80211_channel *channel;
const struct cfg80211_bss_ies __rcu *ies;
const struct cfg80211_bss_ies __rcu *beacon_ies;
const struct cfg80211_bss_ies __rcu *proberesp_ies;
struct cfg80211_bss *hidden_beacon_bss;
struct cfg80211_bss *transmitted_bss;
struct list_head nontrans_list;
s32 signal;
u16 beacon_interval;
u16 capability;
u8 bssid[ETH_ALEN];
u8 chains;
s8 chain_signal[IEEE80211_MAX_CHAINS];
u8 proberesp_ecsa_stuck:1;
u8 bssid_index;
u8 max_bssid_indicator;
u8 use_for;
u8 cannot_use_reasons;
u8 priv[] ;
};
成员
channel
此 BSS 所在的信道
ies
信息元素(请注意,不保证这些元素格式良好!);这是一个指向 beacon_ies 或 proberesp_ies 的指针,具体取决于是否已接收到探测响应帧。它始终为非
NULL
。beacon_ies
来自最后一个信标帧的信息元素(实现说明:如果设置了 hidden_beacon_bss,则此结构不拥有 beacon_ies,但它们只是指向 hidden_beacon_bss 结构中的指针)
proberesp_ies
来自最后一个探测响应帧的信息元素
hidden_beacon_bss
如果此 BSS 结构表示来自在其信标中隐藏 SSID 的 BSS 的探测响应,则此结构指向保存信标数据的 BSS 结构。当然,beacon_ies 仍然有效,并且在这种情况下指向与 hidden_beacon_bss->beacon_ies 相同的数据。
transmitted_bss
指向已传输 BSS 的指针,如果这是一个未传输的 BSS(多 BSSID 支持)
nontrans_list
未传输的 BSS 列表,如果这是一个已传输的 BSS(多 BSSID 支持)
signal
信号强度值(类型取决于 wiphy 的 signal_type)
beacon_interval
来自帧的信标间隔
capability
主机字节顺序的功能字段
bssid
BSS 的 BSSID
chains
chain_signal 中填充值的位掩码。
chain_signal
上次接收的 BSS 的每个链的信号强度(以 dBm 为单位)。
proberesp_ecsa_stuck
ECSA 元素卡在探测响应帧中,无法依赖它具有有效数据
bssid_index
多 BSS 集中的索引
max_bssid_indicator
BSS 集中成员的最大数量
use_for
此 BSS 的可能用途的位图,请参阅
enum nl80211_bss_use_for
cannot_use_reasons
无法连接的原因(位图),如果设置了 restrict_use 且 use_for 为零(空);可能为 0 表示未指定原因;请参阅
enum nl80211_bss_cannot_use_reasons
priv
供驱动程序使用的私有区域,至少有 wiphy->bss_priv_size 个字节
描述
此结构描述了一个 BSS(也可能是一个网状网络),用于扫描结果和类似情况。
-
const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 id)¶
查找具有给定 ID 的 IE
参数
struct cfg80211_bss *bss
要搜索的 bss
u8 id
元素 ID
描述
请注意,返回值是一个受 RCU 保护的指针,因此在调用此函数时必须持有 rcu_read_lock()
。
返回值
如果未找到,则为 NULL
。
-
const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)¶
在数据中查找信息元素
参数
u8 eid
元素 ID
const u8 *ies
由 IEs 组成的数据
int len
数据长度
返回值
如果找不到元素 ID 或元素无效(声称比给定数据长),则为 NULL
,否则指向所请求元素的第一个字节的指针,即包含元素 ID 的字节。
注意
除了必须适应给定的数据外,没有对元素长度进行检查。
-
void cfg80211_scan_done(struct cfg80211_scan_request *request, struct cfg80211_scan_info *info)¶
通知扫描已完成
参数
struct cfg80211_scan_request *request
相应的扫描请求
struct cfg80211_scan_info *info
有关已完成扫描的信息
-
struct cfg80211_bss *cfg80211_inform_bss_frame_data(struct wiphy *wiphy, struct cfg80211_inform_bss *data, struct ieee80211_mgmt *mgmt, size_t len, gfp_t gfp)¶
通知 cfg80211 接收到一个 BSS 帧
参数
struct wiphy *wiphy
报告 BSS 的 wiphy
struct cfg80211_inform_bss *data
BSS 元数据
struct ieee80211_mgmt *mgmt
管理帧(探测响应或信标)
size_t len
管理帧的长度
gfp_t gfp
上下文标志
描述
这会通知 cfg80211 找到 BSS 信息,并且应该更新/添加 BSS。
返回值
一个被引用的结构,必须使用 cfg80211_put_bss() 释放!否则出错时返回 NULL
。
-
struct cfg80211_bss *cfg80211_inform_bss_data(struct wiphy *wiphy, struct cfg80211_inform_bss *data, enum cfg80211_bss_frame_type ftype, const u8 *bssid, u64 tsf, u16 capability, u16 beacon_interval, const u8 *ie, size_t ielen, gfp_t gfp)¶
通知 cfg80211 一个新的 BSS
参数
struct wiphy *wiphy
报告 BSS 的 wiphy
struct cfg80211_inform_bss *data
BSS 元数据
enum cfg80211_bss_frame_type ftype
帧类型(如果已知)
const u8 *bssid
BSS 的 BSSID
u64 tsf
对等设备在信标/探测响应中发送的 TSF(或 0)
u16 capability
对等设备发送的功能字段
u16 beacon_interval
对等设备宣布的信标间隔
const u8 *ie
对等设备发送的其他 IEs
size_t ielen
其他 IEs 的长度
gfp_t gfp
上下文标志
描述
这会通知 cfg80211 找到 BSS 信息,并且应该更新/添加 BSS。
返回值
一个被引用的结构,必须使用 cfg80211_put_bss() 释放!否则出错时返回 NULL
。
-
void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss)¶
从内部数据结构中取消链接 BSS
参数
struct wiphy *wiphy
wiphy
struct cfg80211_bss *bss
要删除的 bss
描述
此函数从内部数据结构中删除给定的 BSS,从而使其不再显示在扫描结果等中。 当您检测到 BSS 消失时,请使用此函数。 通常,BSS 也会超时,因此完全没有必要使用此函数。
实用函数¶
cfg80211 提供了许多有用的实用函数。
-
int ieee80211_channel_to_frequency(int chan, enum nl80211_band band)¶
将频道号转换为频率
参数
int chan
频道号
enum nl80211_band band
频段,由于频道号重叠而必须指定
返回值
对应的频率(以 MHz 为单位),如果转换失败则为 0。
-
int ieee80211_frequency_to_channel(int freq)¶
将频率转换为频道号
参数
int freq
中心频率(以 MHz 为单位)
返回值
对应的频道,如果转换失败则为 0。
-
struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, int freq)¶
从 wiphy 获取指定频率的频道结构
参数
struct wiphy *wiphy
要获取频道的
struct wiphy
int freq
频道的中心频率(以 MHz 为单位)
返回值
来自 **wiphy** 且位于 **freq** 的频道结构。
-
const struct ieee80211_rate *ieee80211_get_response_rate(struct ieee80211_supported_band *sband, u32 basic_rates, int bitrate)¶
获取给定速率的基本速率
参数
struct ieee80211_supported_band *sband
要查找速率的频段
u32 basic_rates
基本速率的位图
int bitrate
要查找基本速率的比特率
返回值
对应于给定比特率的基本速率,即基本速率图中包含的下一个较低的比特率,对于此函数,该比特率以频段的比特率表中的速率索引的位图形式给出。
-
struct ieee80211_radiotap_iterator¶
跟踪遍历当前 radiotap 参数的过程
定义:
struct ieee80211_radiotap_iterator {
struct ieee80211_radiotap_header *_rtheader;
const struct ieee80211_radiotap_vendor_namespaces *_vns;
const struct ieee80211_radiotap_namespace *current_namespace;
unsigned char *_arg, *_next_ns_data;
__le32 *_next_bitmap;
unsigned char *this_arg;
int this_arg_index;
int this_arg_size;
int is_radiotap_ns;
int _max_length;
int _arg_index;
uint32_t _bitmap_shifter;
int _reset_on_ext;
};
成员
_rtheader
指向我们正在遍历的 radiotap 标头的指针
_vns
供应商命名空间定义
current_namespace
指向当前命名空间定义的指针(如果当前命名空间未知,则内部为
NULL
)_arg
下一个参数指针
_next_ns_data
下一个命名空间数据的起始位置
_next_bitmap
指向下一个存在的 u32 的内部指针
this_arg
指向当前 radiotap 参数的指针;在每次调用 ieee80211_radiotap_iterator_next() 之后以及在 ieee80211_radiotap_iterator_init() 之后都有效,此时它将指向实际数据部分的起始位置
this_arg_index
当前参数的索引,在每次成功调用 ieee80211_radiotap_iterator_next() 后有效
this_arg_size
当前参数的长度,方便使用
is_radiotap_ns
指示当前命名空间是否为默认 radiotap 命名空间
_max_length
radiotap 头部在 CPU 字节序中的长度
_arg_index
下一个参数索引
_bitmap_shifter
当前 u32 位图的内部移位器,b0 设置 == 参数存在
_reset_on_ext
内部;当转到下一个位图字时,将参数索引重置为 0
描述
描述 radiotap 解析器的状态。带有下划线前缀的字段不得由解析器的用户使用,只能由解析器内部使用。
参数
const struct sk_buff *skb
帧
描述
给定一个数据指针处带有原始 802.11 头的 skb,此函数返回 802.11 头部长度。
返回值
802.11 头部长度(字节数,不包括加密头部)。如果 sk_buff 中的数据太短而无法包含有效的 802.11 头部,则为 0。
-
unsigned int ieee80211_hdrlen(__le16 fc)¶
从帧控制获取头部长度(字节数)
参数
__le16 fc
小端格式的帧控制字段
返回值
头部长度(字节数)。
数据路径辅助函数¶
除了通用实用程序外,cfg80211 还提供一些函数,可帮助为不在设备上进行 802.11/802.3 转换的设备实现数据路径。
-
int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, enum nl80211_iftype iftype)¶
将 802.11 数据帧转换为 802.3
参数
struct sk_buff *skb
802.11 数据帧
const u8 *addr
设备的 MAC 地址
enum nl80211_iftype iftype
虚拟接口类型
返回值
成功时返回 0。错误时返回非零值。
-
void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, const u8 *addr, enum nl80211_iftype iftype, const unsigned int extra_headroom, const u8 *check_da, const u8 *check_sa, u8 mesh_control)¶
解码 IEEE 802.11n A-MSDU 帧
参数
struct sk_buff *skb
没有头部的输入 A-MSDU 帧。
struct sk_buff_head *list
802.3 帧的输出列表。必须由调用者分配和初始化。
const u8 *addr
设备的 MAC 地址。
enum nl80211_iftype iftype
设备接口类型。
const unsigned int extra_headroom
list 中 SKB 的硬件额外头部空间。
const u8 *check_da
内部以太网头部中要检查的 DA,或 NULL
const u8 *check_sa
内部以太网头部中要检查的 SA,或 NULL
u8 mesh_control
参见 ieee80211_is_valid_amsdu 中的 mesh_hdr
描述
解码 IEEE 802.11 A-MSDU 并将其转换为 802.3 帧的列表。如果解码失败,list 将为空。在传入此处之前,skb 必须完全没有头部;它在此函数中被释放。
-
unsigned int cfg80211_classify8021d(struct sk_buff *skb, struct cfg80211_qos_map *qos_map)¶
确定数据帧的 802.1p/1d 标签
参数
struct sk_buff *skb
数据帧
struct cfg80211_qos_map *qos_map
互操作 QoS 映射,或者如果未使用则为
NULL
返回值
802.1p/1d 标签。
监管执行基础设施¶
TODO
参数
struct wiphy *wiphy
给出提示的无线设备(仅用于报告冲突)
const char *alpha2
驱动程序声称其监管域应处于的 ISO/IEC 3166 alpha2。如果设置了 rd,则此值应为 NULL。请注意,如果将此值设置为 NULL,则仍应将 rd->alpha2 设置为某个接受的 alpha2。
描述
无线驱动程序可以使用此函数,通过提供它知道其监管域应处于的 ISO/IEC 3166 alpha2 国家/地区代码,或通过提供完全构建的监管域,向无线核心提示它认为当前应为的监管域。如果驱动程序提供 ISO/IEC 3166 alpha2,则将查询用户空间,以获取相应国家/地区的监管域结构。
wiphy 必须在此调用之前注册到 cfg80211。对于 cfg80211 驱动程序,这意味着您必须首先使用 wiphy_register()
,对于 mac80211 驱动程序,您必须首先使用 ieee80211_register_hw()
。
驱动程序应检查返回值,可能会收到 -ENOMEM。
返回值
成功时返回 0。否则返回 -ENOMEM。
-
void wiphy_apply_custom_regulatory(struct wiphy *wiphy, const struct ieee80211_regdomain *regd)¶
应用自定义驱动程序监管域
参数
struct wiphy *wiphy
我们要在其上处理监管域的无线设备
const struct ieee80211_regdomain *regd
用于此 wiphy 的自定义监管域
描述
驱动程序有时可能具有不适用于特定国家/地区的自定义监管域。驱动程序可以使用此方法来应用此类自定义监管域。此例程必须在 wiphy 注册之前调用。自定义监管域将完全受信任,因此以前的默认通道设置将被忽略。如果在监管域上找不到通道的规则,则该通道将被禁用。将此用于 wiphy 的驱动程序还应设置 wiphy 标志 REGULATORY_CUSTOM_REG,否则 cfg80211 将为调用此辅助函数的 wiphy 设置该标志。
参数
struct wiphy *wiphy
我们要为其处理此规则的 wiphy
u32 center_freq
我们想要获取监管信息的频率(以 KHz 为单位)
描述
使用此函数获取给定无线设备上特定频率的监管规则。如果设备想要遵循特定的监管域,我们会尊重该域,除非已经接收和处理了国家/地区信息元素 (IE)。
返回值
返回一个有效的指针,或者,当发生错误时,例如找不到规则时,返回值将使用 ERR_PTR()
进行编码。使用 IS_ERR()
进行检查,并使用 PTR_ERR()
获取数值返回值。如果我们确定给定的 center_freq 甚至在 center_freq 的频段中没有频率范围的监管规则,则数值返回值将为 -ERANGE。有关我们当前对频段的定义,请参阅 freq_in_rule_band() - 这纯粹是主观的,目前特定于 802.11。
RFkill 集成¶
cfg80211 中的 RFkill 集成对于驱动程序来说几乎是不可见的,因为 cfg80211 会自动为它知道的每个无线设备注册一个 rfkill 实例。软关闭也会转换为断开连接并关闭所有接口。当所有接口都关闭时,驱动程序应该关闭设备。
但是,设备可能具有硬 RFkill 线,在这种情况下,它们还需要通过 cfg80211 与 rfkill 子系统进行交互。他们可以使用此处记录的一些辅助函数来执行此操作。
参数
struct wiphy *wiphy
wiphy
参数
struct wiphy *wiphy
wiphy
测试模式¶
测试模式是一组实用程序函数,允许驱动程序与特定于驱动程序的工具进行交互,以帮助例如工厂编程。
本章介绍驱动程序如何与它进行交互。有关更多信息,请参阅 nl80211 书籍中有关它的章节。
参数
struct wiphy *wiphy
wiphy
int approxlen
将放入 skb 中的数据的长度的上限
描述
此函数分配并预填充用于回复测试模式命令的 skb。由于它是用于回复,因此在 testmode_cmd 操作之外调用它无效。
返回的 skb 预先填充了 wiphy 索引,并以这样一种方式设置:放入 skb 中的任何数据(使用 skb_put()
、nla_put() 或类似方法)最终都会位于 NL80211_ATTR_TESTDATA
属性中,因此对 skb 所需要做的就是为相应的用户空间工具添加数据,然后用户空间工具可以从 testdata 属性中读取该数据。您不得以任何其他方式修改 skb。
完成后,使用 skb 调用 cfg80211_testmode_reply()
,并将其错误代码作为 testmode_cmd 操作的结果返回。
返回值
分配并预填充的 skb。如果发生任何错误,则为 NULL
。
参数
struct sk_buff *skb
skb 必须使用
cfg80211_testmode_alloc_reply_skb()
分配
描述
由于调用此函数通常是返回 testmode_cmd 之前的最后一件事,因此您应该返回错误代码。请注意,此函数会消耗 skb,而与返回值无关。
返回值
错误代码或成功时为 0。
-
struct sk_buff *cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy, int approxlen, gfp_t gfp)¶
分配测试模式事件
参数
struct wiphy *wiphy
wiphy
int approxlen
将放入 skb 中的数据的长度的上限
gfp_t gfp
分配标志
描述
此函数为测试模式多播组上的事件分配并预填充 skb。
返回的 skb 的设置方式与 cfg80211_testmode_alloc_reply_skb()
的设置方式相同,但已为事件做好准备。与那里一样,您应该简单地向其中添加数据,然后该数据将最终出现在 NL80211_ATTR_TESTDATA
属性中。同样,您不得以任何其他方式修改 skb。
完成 skb 的填充后,使用 skb 调用 cfg80211_testmode_event()
以发送事件。
返回值
分配并预填充的 skb。如果发生任何错误,则为 NULL
。
参数
struct sk_buff *skb
skb 必须使用
cfg80211_testmode_alloc_event_skb()
分配gfp_t gfp
分配标志
描述
此函数发送给定的 skb,该 skb 必须由 cfg80211_testmode_alloc_event_skb()
分配,作为事件。它总是会消耗它。