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_valuehw_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 能够在其中操作的频段。

void wiphy_read_of_freq_limits(struct wiphy *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 中设置时,组合是指当前在该无线电上处于活动状态的接口的组合。

  1. 允许 #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,
    };
    
  2. 允许 #{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,
    };
    
  3. 允许 #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_SHORTNL80211_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_CONNECTNL80211_CMD_ASSOCIATENL80211_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() 参数大小调整)

void *wiphy_priv(struct wiphy *wiphy)

从 wiphy 返回私有数据。

参数

struct wiphy *wiphy

要返回私有指针的 wiphy。

返回值

wiphy 的私有数据。

struct wiphy *priv_to_wiphy(void *priv)

返回包含私有数据的 wiphy。

参数

void *priv

先前由 wiphy_priv 返回的指针。

返回值

priv 的 wiphy。

void set_wiphy_dev(struct wiphy *wiphy, struct device *dev)

为 wiphy 设置设备指针。

参数

struct wiphy *wiphy

要绑定设备的 wiphy。

struct device *dev

要将其作为父设备的设备。

struct device *wiphy_dev(struct wiphy *wiphy)

获取 wiphy 设备指针。

参数

struct wiphy *wiphy

要查找设备结构的 wiphy。

返回值

wiphy 的设备。

const char *wiphy_name(const struct 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 才能正常运行。

int wiphy_register(struct wiphy *wiphy)

向 cfg80211 注册 wiphy。

参数

struct wiphy *wiphy

要注册的 wiphy。

返回值

非负 wiphy 索引或负错误代码。

void wiphy_unregister(struct wiphy *wiphy)

从 cfg80211 注销 wiphy。

参数

struct wiphy *wiphy

要注销的 wiphy。

描述

在此调用之后,无法再使用此私有指针发出请求,但该调用可能会休眠以等待正在处理的未完成请求。

void wiphy_free(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

此设备的地址,仅当 netdevNULL 时有效。

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 apclientIEEE80211_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_signalchain_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_idmld_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 的驱动程序。bssidbss 中只需要指定一个参数。

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 操作的驱动程序。在 bssidbss 中只需要指定一个参数。

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_forNL80211_BSS_USE_FOR_NORMAL

use_for

此 BSS 的可能用途的位图,请参阅 enum nl80211_bss_use_for

cannot_use_reasons

无法连接的原因(位图),如果设置了 restrict_useuse_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_useuse_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

从内部数据结构中取消链接 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 解析器的状态。带有下划线前缀的字段不得由解析器的用户使用,只能由解析器内部使用。

unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb)

从数据获取头部长度

参数

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

int regulatory_hint(struct wiphy *wiphy, const char *alpha2)

驱动程序向无线核心提示监管域

参数

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 设置该标志。

const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy, u32 center_freq)

获取给定频率的监管信息

参数

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 子系统进行交互。他们可以使用此处记录的一些辅助函数来执行此操作。

void wiphy_rfkill_start_polling(struct wiphy *wiphy)

开始轮询 rfkill

参数

struct wiphy *wiphy

wiphy

void wiphy_rfkill_stop_polling(struct wiphy *wiphy)

停止轮询 rfkill

参数

struct wiphy *wiphy

wiphy

测试模式

测试模式是一组实用程序函数,允许驱动程序与特定于驱动程序的工具进行交互,以帮助例如工厂编程。

本章介绍驱动程序如何与它进行交互。有关更多信息,请参阅 nl80211 书籍中有关它的章节。

struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy, int approxlen)

分配测试模式回复

参数

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

int cfg80211_testmode_reply(struct sk_buff *skb)

发送回复 skb

参数

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

void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)

发送事件

参数

struct sk_buff *skb

skb 必须使用 cfg80211_testmode_alloc_event_skb() 分配

gfp_t gfp

分配标志

描述

此函数发送给定的 skb,该 skb 必须由 cfg80211_testmode_alloc_event_skb() 分配,作为事件。它总是会消耗它。