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

允许将此信道用于超低功率 (VLP) 的 AP 操作,即使在其他情况下设置为 NO_IR。

IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY

允许在 20 MHz 信道上进行活动,即使在其他情况下设置为 NO_IR。

描述

法规控制代码设置的信道标志。

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 状态时的时间戳(jiffies)。

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 的特定于速率的标志

bitrate

比特率,单位为 100 Kbps

hw_value

driver/hardware value for this rate

hw_value_short

使用短前导码时,此速率的 driver/硬件值

描述

此结构描述了 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

the band this structure represents

n_channels

channels 中的信道数

n_bitrates

bitrates 中的比特率数

ht_cap

此频段中的 HT 功能

vht_cap

此频段中的 VHT 功能

s1g_cap

此频段中的 S1G 功能(当然仅限 S1B 频段)

edmg_cap

此频段中的 EDMG 功能

n_iftype_data

接口类型数据条目的数量

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,以便在没有完整的功能/接口组合等广告之前,无法在普通驱动程序中访问它们。目前不应有驱动程序设置此标志。

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 上(在 VLAN 接口上具有单个站点),也支持 4addr 模式。此标志还用于在不支持 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、Mesh、...)中的信道切换。

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

此组合中接口部分的任何信标间隔,以及来自此组合的信标接口的所有信标间隔的 GCD 必须大于或等于此值。

描述

使用此结构,驱动程序可以描述它同时支持的哪些接口组合。如果在 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

软件接口类型的位掩码,由于它们纯粹在 SW 中管理,因此不受任何限制。

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

保持在信道上操作可以请求的最大时间(如果已实现)。

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

防止 sysfs 回调 ->resume 和 ->suspend 反对注销硬件

debugfsdir

用于此 wiphy 的 debugfs 目录 (ieee80211/<wiphyname>)。它将在 wiphy 重命名时自动重命名

ht_capa_mod_mask

指定可以覆盖哪些 ht_cap 值。如果为空,则不能覆盖任何值。

vht_capa_mod_mask

指定可以覆盖哪些 VHT 功能。如果为空,则不能覆盖任何功能。

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 返回 priv

参数

struct wiphy *wiphy

要返回其 priv 指针的 wiphy

Return

wiphy 的 priv。

struct wiphy *priv_to_wiphy(void *priv)

返回包含 priv 的 wiphy

参数

void *priv

先前由 wiphy_priv 返回的指针

Return

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 dev 指针

参数

struct wiphy *wiphy

要查找其设备结构的 wiphy

Return

wiphy 的 dev。

const char *wiphy_name(const struct wiphy *wiphy)

获取 wiphy 名称

参数

const struct wiphy *wiphy

要返回其名称的 wiphy

Return

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 字节以供私有使用。

Return

指向新 wiphy 的指针。必须将此指针分配给每个 netdev 的 ieee80211_ptr,才能正常运行。

int wiphy_register(struct wiphy *wiphy)

向 cfg80211 注册 wiphy

参数

struct wiphy *wiphy

要注册的 wiphy。

Return

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

void wiphy_unregister(struct wiphy *wiphy)

从 cfg80211 取消注册 wiphy

参数

struct wiphy *wiphy

要取消注册的 wiphy。

描述

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

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

mgmt 注册已更新,需要将更新传播到驱动程序

use_4addr

指示在此接口上使用 4addr 模式,必须由驱动程序在添加接口时在注册 netdev 之前设置(如果支持),否则驱动程序只能读取它,cfg80211 将在 change_interface 上更新它

is_running

如果这是一个已启动的非 netdev 设备,则为 true,例如 P2P 设备。

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 类帧的应用程序的 netlink 端口 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

包含 IEEE80211_MLD_MAX_NUM_LINKS 个元素的数组,其中包含每个链接的 addr apclient

{unnamed_union}

anonymous

links.cac_started

如果已启动 DFS 通道可用性检查,则为 true

links.cac_start_time

输入 dfs 状态时的时间戳(jiffies)。

links.cac_time_ms

CAC 时间(毫秒)

valid_links

描述 links 的哪些元素有效的位图

radio_mask

允许此接口运行的无线电的位掩码。

描述

对于 netdev,此结构必须由使用 struct net_device 中的 ieee80211_ptr 字段的驱动程序分配(这是有意的,因此它可以与 netdev 一起分配。)然后不需要注册,因为 netdev 注册将被 cfg80211 拦截以查看新的无线设备,但是,如果驱动程序预先创建了任何 netdev(在从 cfg80211 调用的 ops 中,wiphy 已被锁定),则驱动程序必须锁定 wiphy,然后才能注册或取消注册 netdev。

对于非 netdev 用途,它也必须由驱动程序响应于需要它的 cfg80211 回调来分配,因为在这种情况下没有 netdev 注册,因此不能在返回它的回调操作之外分配。

void *wdev_priv(struct wireless_dev *wdev)

从 wireless_dev 返回 wiphy priv

参数

struct wireless_dev *wdev

要返回其 wiphy 的 priv 指针的无线设备

Return

wdev 的 wiphy priv。

int cfg80211_check_combinations(struct wiphy *wiphy, struct iface_combination_params *params)

检查接口组合

参数

struct wiphy *wiphy

wiphy

struct iface_combination_params *params

接口组合参数

描述

驱动程序可以调用此函数来检查根据接口组合是否允许接口及其类型的组合。

Return

如果允许组合,则为 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 groupID,用于监视属于该 MU-MIMO groupID 的 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 版本(如果有)(来自 enum nl80211_wpa_versions)

cipher_group

组密钥密码套件(如果未设置,则为 0)

n_ciphers_pairwise

AP 支持的单播密码的数量

ciphers_pairwise

单播密钥密码套件

n_akm_suites

akm_suites

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 控制端口上的预授权 rx

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/公民位置数据无更改)

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

驱动程序使用的 ACL 配置,该驱动程序支持基于 MAC 地址的访问控制

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;
    bool eml_cap_present;
    u16 eml_cap;
    struct link_station_parameters link_sta_params;
};

成员

vlan

站点所属的 vlan 接口

sta_flags_mask

已更改的站点标志(BIT(NL80211_STA_FLAG_...) 的位掩码)

sta_flags_set

站点标志值(BIT(NL80211_STA_FLAG_...) 的位掩码)

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

此站点的空中调度权重

eml_cap_present

指定 EML 能力字段 (eml_cap) 是否存在/已更新

eml_cap

此站点的 EML 能力

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;
    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;
    u32 beacon_loss_count;
    const u8 *assoc_req_ies;
    size_t assoc_req_ies_len;
    s64 t_offset;
    u16 llid;
    u16 plid;
    u8 plink_state;
    u8 connected_to_gate;
    u8 connected_to_as;
    u32 airtime_link_metric;
    enum nl80211_mesh_power_mode local_pm;
    enum nl80211_mesh_power_mode peer_pm;
    enum nl80211_mesh_power_mode nonpeer_pm;
    u32 expected_throughput;
    u16 airtime_weight;
    s8 ack_signal;
    s8 avg_ack_signal;
    struct cfg80211_tid_stats *pertid;
    u64 tx_duration;
    u64 rx_duration;
    u64 rx_beacon;
    u8 rx_beacon_signal_avg;
    u32 rx_mpdu_count;
    u32 fcs_err_count;
    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 的大小)

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 转储的生成号。每当站点列表发生更改时,此数字应增加,即当添加或删除站点时,以便用户空间可以判断它是否获得了连贯的快照。

beacon_loss_count

信标丢失事件触发的次数。

assoc_req_ies

来自(重新)关联请求的 IE。这仅在 AP 模式下与不使用用户空间 MLME/SME 实现的驱动程序一起使用。该信息提供给 cfg80211_new_sta() 调用,以将 IE 通知用户空间。

assoc_req_ies_len

assoc_req_ies 缓冲区长度(以八位字节为单位)。

t_offset

站点相对于此主机的时差。

llid

Mesh 本地链路 id

plid

Mesh 对等链路 id

plink_state

mesh peer link state

connected_to_gate

如果 Mesh STA 有通往 Mesh 网关的路径,则为 true

connected_to_as

如果 Mesh STA 有通往身份验证服务器的路径,则为 true

airtime_link_metric

Mesh 空中链路度量。

local_pm

本地 Mesh STA 节能模式

peer_pm

对等 Mesh STA 节能模式

nonpeer_pm

非对等 Mesh STA 节能模式

expected_throughput

预期吞吐量(kbps),包括到此站点的 802.11 标头。

airtime_weight

当前空中调度权重

ack_signal

最后一个 ACK 帧的信号强度(以 dBm 为单位)。

avg_ack_signal

已发送的 msdu 的 ack 数据包的平均 rssi 值。

pertid

每个 TID 的统计信息,请参阅 struct cfg80211_tid_stats,对未封装在 QoS-MPDU 中的 MSDU 使用最后一个 (IEEE80211_NUM_TIDS) 索引。请注意,这不使用 filled 位,但如果非 NULL,则使用。

tx_duration

到对等方的所有帧的聚合 PPDU 持续时间(微秒)

rx_duration

来自对等方的所有帧的聚合 PPDU 持续时间(微秒)

rx_beacon

从此对等方接收的信标数

rx_beacon_signal_avg

从此对等方接收的信标的平均信号强度(以 dBm 为单位)

rx_mpdu_count

从此站点接收的 MPDU 数

fcs_err_count

从此站点接收的带有 FCS 错误的 数据包(MPDU)数。仅当接收到带有 FCS 错误的数据包的 TA 与对等 MAC 地址匹配时,才应增加此计数器。

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

指示 AP 的 MLO 链路 ID,站点已完成(重新)关联。当 AP 隶属于 MLD 时,MLO 和非 MLO STA 连接都会填充此信息。

mld_addr

对于 MLO STA 连接,填充了站点的 MLD 地址。对于非 MLO STA 连接,填充为全零。

assoc_resp_ies

来自(重新)关联响应的 IE。这仅在 AP 模式下与不使用用户空间 MLME/SME 实现的驱动程序一起使用。该信息仅提供给 cfg80211_new_sta() 调用,以将 IE 通知用户空间。驱动程序不会在 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

link_id,或 -1 表示非 MLD

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

link_id,或 -1 表示非 MLD

struct cfg80211_auth_request

身份验证请求数据

定义:

struct cfg80211_auth_request {
    struct cfg80211_bss *bss;
    const u8 *ie;
    size_t ie_len;
    const u8 *supported_selectors;
    u8 supported_selectors_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 缓冲区长度(以八位字节为单位)

supported_selectors

应假定站点支持的选择器列表。如果设置为 NULL,则必须假定支持 SAE_H2E。

supported_selectors_len

supported_selectors 的长度(以八位字节为单位)。

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;
    const u8 *supported_selectors;
    u8 supported_selectors_len;
    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;
    u16 ext_mld_capa_ops;
};

成员

bss

要关联的 BSS。如果调用成功,则驱动程序将获得一个引用,该引用必须返回给 cfg80211_send_rx_assoc() 或 cfg80211_assoc_timeout()。为确保正确的引用计数,在已经关联时,必须拒绝新的关联请求。这也适用于 links.bss 参数,该参数用于代替此参数(对于 MLO 关联,它为 NULL)。

ie

要添加到(重新)关联请求帧的额外 IE 或 NULL

prev_bssid

先前的 BSSID,如果不是 NULL,则使用重新关联帧。这用于指示在 ESS 中重新关联的请求,而不是与 ESS 进行初始关联的请求。包含此信息时,它将设置为当前关联的 BSSID,即 Reassociation Request 帧的 Current AP address 字段中包含的值。

ie_len

ie 缓冲区长度(以八位字节为单位)

crypto

加密设置

use_mfp

在此关联中使用管理帧保护 (IEEE 802.11w)

flags

请参阅 enum cfg80211_assoc_req_flags

supported_selectors

IEEE 802.11 格式的支持的 BSS 选择器(或 NULL 表示不更改)。如果为 NULL,则应假定支持 SAE_H2E。

supported_selectors_len

支持的 BSS 选择器的数量

ht_capa

HT 功能覆盖。ht_capa_mask 中设置的值将在 ht_capa 中使用。不支持的值将被忽略。

ht_capa_mask

要使用的 ht_capa 的位。

vht_capa

VHT 功能覆盖

vht_capa_mask

VHT 功能掩码,指示要使用的字段

fils_kek

用于保护(重新)关联请求/响应帧的 FILS KEK 或 NULL(如果未使用 FILS)。

fils_kek_len

fils_kek 的长度(以八位字节为单位)

fils_nonces

FILS 随机数(AAD 的一部分),用于保护(重新)关联请求/响应帧或 NULL(如果未使用 FILS)。此字段以 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,其中给出了链路,并指示应在哪个链路上发送关联请求

ext_mld_capa_ops

用户空间为关联设置的扩展 MLD 功能和操作

描述

此结构提供完成 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

这只是对本地状态的请求,即不传输 Disassociation 帧。

描述

此结构提供完成 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,即 Reassociation Request 帧的 Current AP address 字段中包含的值。

fils_erp_username

NAI 的 EAP 重新身份验证协议 (ERP) 用户名部分,如果未指定,则为 NULL。这用于构造 FILS 包装的数据 IE。

fils_erp_username_len

fils_erp_username 的长度(以八位字节为单位)。

fils_erp_realm

NAI 的 EAP 重新身份验证协议 (ERP) 域部分,如果未指定,则为 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

SSID,用于在使用 FILS 缓存标识符时指定 PMKSA 有效的 ESS(可能为 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。 驱动程序应触发完全身份验证,而不是在此阈值后使用此 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, unsigned int link_id, 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);
    int (*assoc_ml_reconf)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_ml_reconf_req *req);
    int (*set_epcs)(struct wiphy *wiphy, struct net_device *dev, bool val);
};

成员

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 设备 wdevs,驱动程序还必须设置 wdev 中的 address 成员。 这另外还持有 RTNL 以便能够进行 netdev 更改。

del_virtual_intf

移除虚拟接口。 这另外还持有 RTNL 以便能够进行 netdev 更改。

change_virtual_intf

更改虚拟接口的类型/配置,保持 struct wireless_dev 的 iftype 更新。 这另外还持有 RTNL 以便能够进行 netdev 更改。

add_intf_link

向给定接口添加一个新的 MLO 链路。 请注意,wdev->link[] 数据结构已更新,因此新的链路地址可用。

del_intf_link

从给定接口移除 MLO 链路。

add_key

使用给定的参数添加密钥。 添加组密钥时,mac_addr 将为 NULL。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,link_id 对于组密钥将 >= 0,对于配对密钥将为 -1,对于 MLO 配对密钥,mac_addr 将为对等方的 MLD 地址。

get_key

获取有关具有给定参数的密钥的信息。 请求组密钥信息时,mac_addr 将为 NULL。 提供给 callback 函数的所有指针在函数返回后不必有效。 如果无法检索密钥,此函数应返回错误,如果密钥不存在,则返回 -ENOENT。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,link_id 对于组密钥将 >= 0,对于配对密钥将为 -1,对于 MLO 配对密钥,mac_addr 将为对等方的 MLD 地址。

del_key

移除给定的 mac_addr(对于组密钥为 NULL)和 key_index 的密钥,如果密钥不存在,则返回 -ENOENT。 对于非 MLO 连接,link_id 将为 -1。 对于 MLO 连接,link_id 对于组密钥将 >= 0,对于配对密钥将为 -1,对于 MLO 配对密钥,mac_addr 将为对等方的 MLD 地址。

set_default_key

在接口上设置默认密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接将为 -1。

set_default_mgmt_key

在接口上设置默认管理帧密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接将为 -1。

set_default_beacon_key

在接口上设置默认信标帧密钥。 对于 MLO 连接,link_id 将 >= 0,对于非 MLO 连接将为 -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

更新正在运行的网格上的网格参数。 mask 是一个位字段,它告诉我们设置哪些参数,以及保留哪些参数。

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 调用。 这是从 cfg8011 inform_bss 处理程序中在保持 bss_lock 时调用的。 数据参数从 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。 当驱动程序启动此类漫游时,驱动程序应验证目标是否匹配配置的安全参数,并使用重新关联请求帧而不是关联请求帧。 connect 函数还可用于请求驱动程序在连接到 ESS 时执行特定漫游。 在这种情况下,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,并且除非驱动程序支持 per-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 的允许天线的位图。 驱动程序可能会拒绝他们不支持的 TX/RX 掩码组合,方法是返回 -EINVAL(另请参见 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

探测关联的客户端,必须返回稍后传递给 cfg80211_probe_status() 的 cookie。

set_noack_map

设置 TID 的 NoAck Map。

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,可能是因为相关的 CAC 在另一个 phy 上完成。

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。 如果 admitted 时间为 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

配置 PMK 以用于卸载的 802.1X 4 向握手。 如果未通过 del_pmk 删除,则 PMK 将保持有效,直到断开连接,驱动程序应在断开连接时清除它。(在保持 wireless_dev 互斥锁的情况下调用)

del_pmk

删除先前为给定身份验证器配置的 PMK。(在保持 wireless_dev 互斥锁的情况下调用)

external_auth

指示用户空间卸载的身份验证处理结果

tx_control_port

TX 控制端口帧 (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 互斥锁的情况下调用)

assoc_ml_reconf

请求非 AP MLO 连接来执行 ML 重新配置,即,使用 ML 重新配置操作帧添加链路和/或从关联中移除链路。 成功添加的链路将被添加到有效链路集中。 成功移除的链路将从有效链路集中移除。 驱动程序必须通过调用 cfg80211_links_removed() 来指示移除的链路,并通过调用 cfg80211_mlo_reconf_add_done() 来指示添加的链路。 在调用 cfg80211_mlo_reconf_add_done() 时,必须为请求 MLO 重新配置“添加”操作的每个链路提供 bss 指针。

set_epcs

为站点模式启用/禁用 EPCS。

描述

此结构体由 fullmac 卡驱动程序和/或无线堆栈注册,以便处理对其接口的配置请求。

除非另有说明,否则所有回调函数成功时应返回 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 操作的驱动程序。 只需要指定 **bssid** 和 **bss** 中的一个参数。

links.status

每个链接的状态代码,要报告给定链接的非 WLAN_STATUS_SUCCESS 的状态代码,它也必须在 **valid_links** 位图中,并且可能具有 BSS 指针(然后将其释放)

void cfg80211_connect_done(struct net_device *dev, struct cfg80211_connect_resp_params *params, gfp_t gfp)

通知 cfg80211 连接结果

参数

struct net_device *dev

网络设备

struct cfg80211_connect_resp_params *params

连接响应参数

gfp_t gfp

分配标志

描述

一旦执行完 connect() 中的连接请求,底层驱动程序应调用此函数。 这类似于 cfg80211_connect_bss(),但采用连接响应参数的结构指针。 cfg80211_connect_bss()cfg80211_connect_result()cfg80211_connect_timeout()cfg80211_connect_done() 函数中应只调用一个。

void cfg80211_connect_bss(struct net_device *dev, const u8 *bssid, struct cfg80211_bss *bss, const u8 *req_ie, size_t req_ie_len, const u8 *resp_ie, size_t resp_ie_len, int status, gfp_t gfp, enum nl80211_timeout_reason timeout_reason)

通知 cfg80211 连接结果

参数

struct net_device *dev

网络设备

const u8 *bssid

AP 的 BSSID

struct cfg80211_bss *bss

STA 连接到的 bss 的条目,可以通过 cfg80211_get_bss() 获得(可能为 NULL)。 但建议存储来自 connect_request 的 bss 并保持对其的引用,并通过此参数返回,以避免在连接期间 bss 过期时发出警告,特别是对于那些实现 connect 操作的驱动程序。 只需要指定 **bssid** 和 **bss** 中的一个参数。

const u8 *req_ie

关联请求 IE(可能为 NULL

size_t req_ie_len

关联请求 IE 长度

const u8 *resp_ie

关联响应 IE(可能为 NULL

size_t resp_ie_len

关联响应 IE 长度

int status

状态码,连接成功时为 WLAN_STATUS_SUCCESS,如果您的设备无法为您提供失败的实际状态码,请使用 WLAN_STATUS_UNSPECIFIED_FAILURE。 如果此调用用于报告由于超时导致的失败(例如,未从 AP 接收到身份验证帧),而不是 AP 的显式拒绝,则使用 -1 表示这是一个失败,但没有状态码。 在这种情况下,**timeout_reason** 用于报告超时的原因。

gfp_t gfp

分配标志

enum nl80211_timeout_reason timeout_reason

连接超时的原因。 当连接由于超时而不是来自 AP 的显式拒绝而失败时,将使用此方法。 当超时原因未知时,使用 NL80211_TIMEOUT_UNSPECIFIED。 仅当 **status** < 0 以指示失败是由于超时而不是由于 AP 的显式拒绝时,才使用此值。 在其他情况下(**status** >= 0),将忽略此值。

描述

一旦执行完 connect() 中的连接请求,底层驱动程序应调用此函数。 这类似于 cfg80211_connect_result(),但可以选择标识连接的实际 bss 条目。 cfg80211_connect_bss()cfg80211_connect_result()cfg80211_connect_timeout()cfg80211_connect_done() 函数中应只调用一个。

void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, const u8 *req_ie, size_t req_ie_len, const u8 *resp_ie, size_t resp_ie_len, u16 status, gfp_t gfp)

通知 cfg80211 连接结果

参数

struct net_device *dev

网络设备

const u8 *bssid

AP 的 BSSID

const u8 *req_ie

关联请求 IE(可能为 NULL

size_t req_ie_len

关联请求 IE 长度

const u8 *resp_ie

关联响应 IE(可能为 NULL

size_t resp_ie_len

关联响应 IE 长度

u16 status

状态码,连接成功时为 WLAN_STATUS_SUCCESS,如果您的设备无法为您提供失败的实际状态码,请使用 WLAN_STATUS_UNSPECIFIED_FAILURE

gfp_t gfp

分配标志

描述

一旦执行完 connect() 中的连接请求,底层驱动程序应调用此函数。 这类似于 cfg80211_connect_bss(),后者允许指定实际的 bss 条目。 cfg80211_connect_bss()cfg80211_connect_result()cfg80211_connect_timeout()cfg80211_connect_done() 函数中应只调用一个。

void cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid, const u8 *req_ie, size_t req_ie_len, gfp_t gfp, enum nl80211_timeout_reason timeout_reason)

通知 cfg80211 连接超时

参数

struct net_device *dev

网络设备

const u8 *bssid

AP 的 BSSID

const u8 *req_ie

关联请求 IE(可能为 NULL

size_t req_ie_len

关联请求 IE 长度

gfp_t gfp

分配标志

enum nl80211_timeout_reason timeout_reason

连接超时的原因。

描述

每当 connect() 在没有从 AP 接收到显式身份验证/关联拒绝的序列中失败时,底层驱动程序应调用此函数。 例如,由于无法发送身份验证或关联请求帧或在等待响应时超时,可能会发生这种情况。 cfg80211_connect_bss()cfg80211_connect_result()cfg80211_connect_timeout()cfg80211_connect_done() 函数中应只调用一个。

void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info, gfp_t gfp)

通知 cfg80211 漫游

参数

struct net_device *dev

网络设备

struct cfg80211_roam_info *info

有关新 BSS 的信息。struct cfg80211_roam_info

gfp_t gfp

分配标志

描述

可以调用此函数,驱动程序传递新 AP 的 BSSID 或传递 bss 条目,以避免 bss 条目超时的竞争。 底层驱动程序应在连接时从一个 AP 漫游到另一个 AP 时调用此函数。 在固件中实现了漫游的驱动程序应传递 bss 条目,以避免 bss 条目超时中的竞争,在这种情况下,驱动程序中会看到新 AP 的 bss 条目,但由于计划 rdev->event_work 的延迟,在 __cfg80211_roamed() 中访问时会超时。 如果出现任何故障,则引用将在 cfg80211_roamed() 或 __cfg80211_romed() 中释放。 否则,它将在与当前 bss 断开连接时释放。

void cfg80211_disconnected(struct net_device *dev, u16 reason, const u8 *ie, size_t ie_len, bool locally_generated, gfp_t gfp)

通知 cfg80211 连接已断开

参数

struct net_device *dev

网络设备

u16 reason

断开连接的原因代码,如果未知,则设置为 0

const u8 *ie

取消身份验证/取消关联帧的信息元素(可能为 NULL

size_t ie_len

IE 的长度

bool locally_generated

本地请求断开连接

gfp_t gfp

分配标志

描述

调用此函数后,驱动程序应进入空闲状态,并且不再尝试连接到任何 AP。

void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, struct ieee80211_channel *chan, unsigned int duration, gfp_t gfp)

remain_on_channel 启动通知

参数

struct wireless_dev *wdev

无线设备

u64 cookie

请求 Cookie

struct ieee80211_channel *chan

当前信道(来自 remain_on_channel 请求)

unsigned int duration

驱动程序打算在信道上保持的持续时间(以毫秒为单位)

gfp_t gfp

分配标志

void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, struct ieee80211_channel *chan, gfp_t gfp)

remain_on_channel 持续时间已过期

参数

struct wireless_dev *wdev

无线设备

u64 cookie

请求 Cookie

struct ieee80211_channel *chan

当前信道(来自 remain_on_channel 请求)

gfp_t gfp

分配标志

void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, struct station_info *sinfo, gfp_t gfp)

通知用户空间有关站点的信息

参数

struct net_device *dev

netdev

const u8 *mac_addr

站点的地址

struct station_info *sinfo

站点信息

gfp_t gfp

分配标志

bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm, const u8 *buf, size_t len, u32 flags)

接收到的未处理的管理帧通知

参数

struct wireless_dev *wdev

接收帧的无线设备

int freq

接收帧的频率(以 MHz 为单位)

int sig_dbm

信号强度(以 dBm 为单位),如果未知则为 0

const u8 *buf

管理帧(标头 + 正文)

size_t len

帧数据的长度

u32 flags

标志,如 enum nl80211_rxmgmt_flags 中定义

描述

每当收到站点模式接口的操作帧,但未在内核中处理时,都会调用此函数。

Return

如果用户空间应用程序已为此帧注册,则为 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

在每个信道上侦听的时间长度,以 TU 为单位。如果未设置 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

扫描开始的时间(以节拍为单位)

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;
    u64 ts_boottime;
    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 结构表示来自 BSS 的探测响应,该 BSS 在其信标中隐藏了 SSID,则这指向保存信标数据的 BSS 结构。当然,beacon_ies 仍然有效,并且在这种情况下指向与 hidden_beacon_bss->beacon_ies 相同的数据。

transmitted_bss

指向已传输 BSS 的指针,如果这是一个非传输 BSS(多 BSSID 支持)

nontrans_list

如果这是一个已传输 BSS(多 BSSID 支持),则非传输 BSS 列表

signal

信号强度值(类型取决于 wiphy 的 signal_type)

ts_boottime

自启动以来的最后 BSS 更新的时间戳(以纳秒为单位)

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()

Return

NULL 如果未找到。

const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)

在数据中查找信息元素

参数

u8 eid

元素 ID

const u8 *ies

由 IE 组成的数据

int len

数据长度

Return

如果找不到元素 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。

Return

引用的结构,必须使用 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

对等方发送的其他 IE

size_t ielen

其他 IE 的长度

gfp_t gfp

上下文标志

描述

这会通知 cfg80211 找到了 BSS 信息,并且应该更新/添加 BSS。

Return

引用的结构,必须使用 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

由于信道号重叠而需要的频段

Return

相应的频率(以 MHz 为单位),如果转换失败,则为 0。

int ieee80211_frequency_to_channel(int freq)

将频率转换为信道号

参数

int freq

中心频率,以 MHz 为单位

Return

相应的信道,如果转换失败,则为 0。

struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, int freq)

从 wiphy 获取指定频率的信道结构

参数

struct wiphy *wiphy

要获取信道的 struct wiphy

int freq

信道的中心频率(以 MHz 为单位)

Return

来自 wiphyfreq 的信道结构。

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

要查找基本速率的比特率

Return

与给定比特率相对应的基本速率,即基本速率图中包含的下一个较低的比特率,对于此函数,给定为频段比特率表中速率索引的位图。

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

描述

给定一个 skb,其数据指针处有一个原始 802.11 标头,此函数返回 802.11 标头长度。

Return

802.11 标头长度(以字节为单位,不包括加密标头)。或者,如果 sk_buff 中的数据太短,无法包含有效的 802.11 标头,则为 0。

unsigned int ieee80211_hdrlen(__le16 fc)

从帧控制获取标头长度(以字节为单位)

参数

__le16 fc

小端格式的帧控制字段

Return

标头长度(以字节为单位)。

数据路径助手

除了通用实用程序外,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

虚拟接口类型

Return

成功时为 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

Return

802.1p/1d 标签。

法规实施基础设施

待办事项

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。

Return

成功时返回 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,否则我们会尊重该管制域。

Return

一个有效的指针,或者,当发生错误时,例如如果找不到规则,则返回值使用 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 执行的所有操作都是为相应的用户空间工具添加数据,该工具可以从测试数据属性中读取该数据。您不得以任何其他方式修改 skb。

完成后,使用 skb 调用 cfg80211_testmode_reply(),并将它的错误代码作为 testmode_cmd 操作的结果返回。

Return

分配并预填充的 skb。如果发生任何错误,则为 NULL

int cfg80211_testmode_reply(struct sk_buff *skb)

发送回复 skb

参数

struct sk_buff *skb

skb 必须使用 cfg80211_testmode_alloc_reply_skb() 分配

描述

由于调用此函数通常是在从 testmode_cmd 返回之前的最后一件事,因此您应该返回错误代码。请注意,此函数会消耗 skb,而不管返回值如何。

Return

错误代码或成功时返回 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() 以发送事件。

Return

分配并预填充的 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() 分配,作为事件。它总是消耗它。