Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/iwlwifi/mld/link.h
48287 views
1
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2
/*
3
* Copyright (C) 2024-2025 Intel Corporation
4
*/
5
#ifndef __iwl_mld_link_h__
6
#define __iwl_mld_link_h__
7
8
#include <net/mac80211.h>
9
10
#include "mld.h"
11
#include "sta.h"
12
13
/**
14
* struct iwl_probe_resp_data - data for NoA/CSA updates
15
* @rcu_head: used for freeing the data on update
16
* @notif: notification data
17
* @noa_len: length of NoA attribute, calculated from the notification
18
*/
19
struct iwl_probe_resp_data {
20
struct rcu_head rcu_head;
21
struct iwl_probe_resp_data_notif notif;
22
int noa_len;
23
};
24
25
/**
26
* struct iwl_mld_link - link configuration parameters
27
*
28
* @rcu_head: RCU head for freeing this data.
29
* @fw_id: the fw id of the link.
30
* @active: if the link is active or not.
31
* @queue_params: QoS data from mac80211. This is updated with a call to
32
* drv_conf_tx per each AC, and then notified once with BSS_CHANGED_QOS.
33
* So we store it here and then send one link cmd for all the ACs.
34
* @chan_ctx: pointer to the channel context assigned to the link. If a link
35
* has an assigned channel context it means that it is active.
36
* @he_ru_2mhz_block: 26-tone RU OFDMA transmissions should be blocked.
37
* @igtk: fw can only have one IGTK at a time, whereas mac80211 can have two.
38
* This tracks the one IGTK that currently exists in FW.
39
* @bcast_sta: station used for broadcast packets. Used in AP, GO and IBSS.
40
* @mcast_sta: station used for multicast packets. Used in AP, GO and IBSS.
41
* @mon_sta: station used for TX injection in monitor interface.
42
* @average_beacon_energy: average beacon energy for beacons received during
43
* client connections
44
* @ap_early_keys: The firmware cannot install keys before bcast/mcast STAs,
45
* but higher layers work differently, so we store the keys here for
46
* later installation.
47
* @silent_deactivation: next deactivation needs to be silent.
48
* @probe_resp_data: data from FW notification to store NOA related data to be
49
* inserted into probe response.
50
*/
51
struct iwl_mld_link {
52
struct rcu_head rcu_head;
53
54
/* Add here fields that need clean up on restart */
55
struct_group(zeroed_on_hw_restart,
56
u8 fw_id;
57
bool active;
58
struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
59
struct ieee80211_chanctx_conf __rcu *chan_ctx;
60
bool he_ru_2mhz_block;
61
struct ieee80211_key_conf *igtk;
62
);
63
/* And here fields that survive a fw restart */
64
struct iwl_mld_int_sta bcast_sta;
65
struct iwl_mld_int_sta mcast_sta;
66
struct iwl_mld_int_sta mon_sta;
67
68
/* we can only have 2 GTK + 2 IGTK + 2 BIGTK active at a time */
69
struct ieee80211_key_conf *ap_early_keys[6];
70
u32 average_beacon_energy;
71
bool silent_deactivation;
72
struct iwl_probe_resp_data __rcu *probe_resp_data;
73
};
74
75
/* Cleanup function for struct iwl_mld_link, will be called in restart */
76
static inline void
77
iwl_mld_cleanup_link(struct iwl_mld *mld, struct iwl_mld_link *link)
78
{
79
struct iwl_probe_resp_data *probe_data;
80
81
probe_data = wiphy_dereference(mld->wiphy, link->probe_resp_data);
82
RCU_INIT_POINTER(link->probe_resp_data, NULL);
83
if (probe_data)
84
kfree_rcu(probe_data, rcu_head);
85
86
CLEANUP_STRUCT(link);
87
if (link->bcast_sta.sta_id != IWL_INVALID_STA)
88
iwl_mld_free_internal_sta(mld, &link->bcast_sta);
89
if (link->mcast_sta.sta_id != IWL_INVALID_STA)
90
iwl_mld_free_internal_sta(mld, &link->mcast_sta);
91
if (link->mon_sta.sta_id != IWL_INVALID_STA)
92
iwl_mld_free_internal_sta(mld, &link->mon_sta);
93
}
94
95
/* Convert a percentage from [0,100] to [0,255] */
96
#define NORMALIZE_PERCENT_TO_255(percentage) ((percentage) * 256 / 100)
97
98
int iwl_mld_add_link(struct iwl_mld *mld,
99
struct ieee80211_bss_conf *bss_conf);
100
void iwl_mld_remove_link(struct iwl_mld *mld,
101
struct ieee80211_bss_conf *bss_conf);
102
int iwl_mld_activate_link(struct iwl_mld *mld,
103
struct ieee80211_bss_conf *link);
104
void iwl_mld_deactivate_link(struct iwl_mld *mld,
105
struct ieee80211_bss_conf *link);
106
int iwl_mld_change_link_in_fw(struct iwl_mld *mld,
107
struct ieee80211_bss_conf *link, u32 changes);
108
void iwl_mld_handle_missed_beacon_notif(struct iwl_mld *mld,
109
struct iwl_rx_packet *pkt);
110
bool iwl_mld_cancel_missed_beacon_notif(struct iwl_mld *mld,
111
struct iwl_rx_packet *pkt,
112
u32 removed_link_id);
113
int iwl_mld_link_set_associated(struct iwl_mld *mld, struct ieee80211_vif *vif,
114
struct ieee80211_bss_conf *link);
115
116
unsigned int iwl_mld_get_link_grade(struct iwl_mld *mld,
117
struct ieee80211_bss_conf *link_conf);
118
119
unsigned int iwl_mld_get_chan_load(struct iwl_mld *mld,
120
struct ieee80211_bss_conf *link_conf);
121
122
int iwl_mld_get_chan_load_by_others(struct iwl_mld *mld,
123
struct ieee80211_bss_conf *link_conf,
124
bool expect_active_link);
125
126
void iwl_mld_handle_beacon_filter_notif(struct iwl_mld *mld,
127
struct iwl_rx_packet *pkt);
128
129
#endif /* __iwl_mld_link_h__ */
130
131