diff --git a/local/recipes/drivers/linux-kpi/source/src/c_headers/linux/ieee80211.h b/local/recipes/drivers/linux-kpi/source/src/c_headers/linux/ieee80211.h index d634d33eae..019678b965 100644 --- a/local/recipes/drivers/linux-kpi/source/src/c_headers/linux/ieee80211.h +++ b/local/recipes/drivers/linux-kpi/source/src/c_headers/linux/ieee80211.h @@ -6,6 +6,127 @@ #define IEEE80211_MAX_SSID_LEN 32 #define IEEE80211_NUM_ACS 4 +/* Frame types (IEEE 802.11) */ +#define IEEE80211_FTYPE_MGMT 0x0000 +#define IEEE80211_FTYPE_CTL 0x0004 +#define IEEE80211_FTYPE_DATA 0x0008 + +#define IEEE80211_STYPE_ASSOC_REQ 0x0000 +#define IEEE80211_STYPE_ASSOC_RESP 0x0010 +#define IEEE80211_STYPE_REASSOC_REQ 0x0020 +#define IEEE80211_STYPE_REASSOC_RESP 0x0030 +#define IEEE80211_STYPE_PROBE_REQ 0x0040 +#define IEEE80211_STYPE_PROBE_RESP 0x0050 +#define IEEE80211_STYPE_BEACON 0x0080 +#define IEEE80211_STYPE_AUTH 0x00b0 +#define IEEE80211_STYPE_DEAUTH 0x00c0 +#define IEEE80211_STYPE_ACTION 0x00d0 + +#define IEEE80211_STYPE_QOS_DATA 0x0080 + +/* Capability bits */ +#define WLAN_CAPABILITY_ESS (1U << 0) +#define WLAN_CAPABILITY_IBSS (1U << 1) +#define WLAN_CAPABILITY_PRIVACY (1U << 4) +#define WLAN_CAPABILITY_SHORT_PREAMBLE (1U << 5) +#define WLAN_CAPABILITY_SHORT_SLOT_TIME (1U << 10) + +/* Reason codes (IEEE 802.11 ยง9.4.1.7) */ +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 + +/* Status codes */ +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 + +/* Cipher suites */ +#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01 +#define WLAN_CIPHER_SUITE_TKIP 0x000FAC02 +#define WLAN_CIPHER_SUITE_CCMP 0x000FAC04 +#define WLAN_CIPHER_SUITE_WEP104 0x000FAC05 +#define WLAN_CIPHER_SUITE_GCMP 0x000FAC08 +#define WLAN_CIPHER_SUITE_CCMP_256 0x000FAC0C +#define WLAN_CIPHER_SUITE_GCMP_256 0x000FAC0D + +/* AID range */ +#define IEEE80211_MAX_AID 2007 + +/* Max frame size */ +#define IEEE80211_MAX_DATA_LEN 2304 +#define IEEE80211_MAX_FRAME_LEN 2352 + +/* Key indices */ +#define NUM_DEFAULT_KEYS 4 +#define NUM_DEFAULT_MGMT_KEYS 2 +#define NUM_DEFAULT_BEACON_KEYS 2 + +/* Extended capabilities */ +#define WLAN_EID_SSID 0 +#define WLAN_EID_SUPP_RATES 1 +#define WLAN_EID_DS_PARAMS 3 +#define WLAN_EID_CF_PARAMS 4 +#define WLAN_EID_TIM 5 +#define WLAN_EID_IBSS_PARAMS 6 +#define WLAN_EID_COUNTRY 7 +#define WLAN_EID_REQUEST 10 +#define WLAN_EID_BSS_LOAD 11 +#define WLAN_EID_PWR_CAPABILITY 33 +#define WLAN_EID_SUPPORTED_CHANNELS 36 +#define WLAN_EID_CHANNEL_SWITCH 37 +#define WLAN_EID_MEASURE_REPORT 39 +#define WLAN_EID_QUIET 40 +#define WLAN_EID_IBSS_DFS 41 +#define WLAN_EID_ERP_INFO 42 +#define WLAN_EID_TSPEC 43 +#define WLAN_EID_TCLAS 44 +#define WLAN_EID_SCHEDULE 45 +#define WLAN_EIDChallengeText 46 +#define WLAN_EID_PWR_CONSTRAINT 32 +#define WLAN_EID_MOBILITY_DOMAIN 54 +#define WLAN_EID_FAST_BSS_TRANSITION 55 +#define WLAN_EID_TIMEOUT_INTERVAL 56 +#define WLAN_EID_RIC_DATA 57 +#define WLAN_EID_DSE_REGISTERED_LOCATION 60 +#define WLAN_EID_SUPPORTED_OPERATING_CLASSES 59 +#define WLAN_EID_EXT_CHANSWITCH_ANN 60 +#define WLAN_EID_HT_CAPABILITY 45 +#define WLAN_EID_HT_OPERATION 61 +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 +#define WLAN_EID_BSS_COEX_2040 72 +#define WLAN_EID_EXT_CAPABILITY 127 +#define WLAN_EID_BSS_MAX_IDLE_PERIOD 90 +#define WLAN_EID_MESH_CONFIG 113 +#define WLAN_EID_MESH_ID 114 +#define WLAN_EID_PEER_MGMT 117 +#define WLAN_EID_MESH_AWAKE_WINDOW 119 +#define WLAN_EID_BEACON_TIMING 120 +#define WLAN_EID_S1G_BCN_COMPAT 213 +#define WLAN_EID_S1G_CAPABILITIES 217 +#define WLAN_EID_S1G_OPERATION 232 + +/* HE/EHT element IDs (extended) */ +#define WLAN_EID_EXTENSION 255 +#define WLAN_EID_EXT_HE_CAPABILITY 35 +#define WLAN_EID_EXT_HE_OPERATION 36 +#define WLAN_EID_EXT_UORA 38 +#define WLAN_EID_EXT_EHT_CAPABILITY 108 +#define WLAN_EID_EXT_EHT_OPERATION 109 +#define WLAN_EID_EXT_MULTI_LINK 109 + +/* MLO (Multi-Link Operation) types */ +#define WLAN_EID_VENDOR_SPECIFIC 221 + +/* Band definitions */ +enum ieee80211_band_local { + IEEE80211_BAND_2GHZ = 0, + IEEE80211_BAND_5GHZ = 1, + IEEE80211_BAND_6GHZ = 2, +}; + struct ieee80211_channel { u32 band; u16 center_freq; @@ -15,6 +136,7 @@ struct ieee80211_channel { s8 max_reg_power; s8 max_antenna_gain; bool beacon_found; + u32 max_bandwidth_khz; }; struct ieee80211_rate { @@ -24,4 +146,38 @@ struct ieee80211_rate { u16 hw_value_short; }; +struct ieee80211_sta_ht_cap { + u16 cap; + bool ht_supported; + u8 ampdu_factor; + u16 ampdu_density; + struct { + u8 rx_highest; + u8 rx_mcs_mask[10]; + } mcs; +}; + +struct ieee80211_sta_vht_cap { + u32 cap; + bool vht_supported; + u8 vht_mcs_rx_highest; + u8 vht_mcs_tx_highest; +}; + +struct ieee80211_sta_he_cap { + bool he_supported; + u8 mac_cap_info[6]; + u8 phy_cap_info[11]; + u8 mcs_nss_rx[4]; + u8 mcs_nss_tx[4]; +}; + +struct ieee80211_sta_eht_cap { + bool eht_supported; + u8 mac_cap_info[2]; + u8 phy_cap_info[9]; + u8 mcs_nss_rx[4]; + u8 mcs_nss_tx[4]; +}; + #endif diff --git a/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h b/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h index 38bf6e2012..84c6083f17 100644 --- a/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h +++ b/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h @@ -18,39 +18,81 @@ #define IEEE80211_CONF_CHANGE_POWER (1U << 5) #define IEEE80211_CONF_CHANGE_CHANNEL (1U << 6) -struct ieee80211_conf { +#define IEEE80211_MLD_MAX_NUM_LINKS 15 + +enum nl80211_chan_width { + NL80211_CHAN_WIDTH_20_NOHT = 0, + NL80211_CHAN_WIDTH_20 = 1, + NL80211_CHAN_WIDTH_40 = 2, + NL80211_CHAN_WIDTH_80 = 3, + NL80211_CHAN_WIDTH_80P80 = 4, + NL80211_CHAN_WIDTH_160 = 5, + NL80211_CHAN_WIDTH_320 = 13, +}; + +#define IEEE80211_HT_CAP_LDPC_CODING (1U << 0) +#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 (1U << 1) +#define IEEE80211_HT_CAP_SGI_20 (1U << 2) +#define IEEE80211_HT_CAP_SGI_40 (1U << 3) +#define IEEE80211_VHT_CAP_MAX_MPDU_11454 (3U << 0) +#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ (1U << 2) + +enum ieee80211_sta_state { + IEEE80211_STA_NOTEXIST, + IEEE80211_STA_NONE, + IEEE80211_STA_AUTH, + IEEE80211_STA_ASSOC, + IEEE80211_STA_AUTHORIZED, +}; + +enum set_key_cmd { SET_KEY, DISABLE_KEY }; + +enum ieee80211_ampdu_mlme_action { + IEEE80211_AMPDU_RX_START = 0, + IEEE80211_AMPDU_RX_STOP = 1, + IEEE80211_AMPDU_TX_START = 2, + IEEE80211_AMPDU_TX_STOP_CONT = 3, + IEEE80211_AMPDU_TX_STOP_FLUSH = 4, + IEEE80211_AMPDU_TX_START_NEW = 5, + IEEE80211_AMPDU_TX_OPERATIONAL = 6, +}; + +#define IEEE80211_KEY_FLAG_GENERATE_IV (1U << 0) +#define IEEE80211_KEY_FLAG_GENERATE_MMIC (1U << 1) +#define IEEE80211_KEY_FLAG_PAIRWISE (1U << 2) + +#define BSS_CHANGED_ASSOC (1U << 0) +#define BSS_CHANGED_BSSID (1U << 1) +#define BSS_CHANGED_ERP_CTS_PROT (1U << 2) +#define BSS_CHANGED_HT (1U << 3) +#define BSS_CHANGED_BASIC_RATES (1U << 4) +#define BSS_CHANGED_BEACON_INT (1U << 5) +#define BSS_CHANGED_BANDWIDTH (1U << 6) +#define BSS_CHANGED_QOS (1U << 8) +#define BSS_CHANGED_TXPOWER (1U << 12) +#define BSS_CHANGED_HE_BSS_COLOR (1U << 17) +#define BSS_CHANGED_EHT_PUNCTURING (1U << 23) + +struct ieee80211_chanctx_conf { + enum nl80211_chan_width radar_detect_width; + bool driver_present; + u8 rx_chains_dynamic, rx_chains_static; + struct ieee80211_channel *chan; +}; + +struct ieee80211_txq { + struct ieee80211_sta *sta; + void *drv_priv; + u8 ac; + u8 tid; +}; + +struct ieee80211_key_conf { + u32 cipher; u32 flags; - int power_level; - int dynamic_ps_timeout; - struct { - u32 center_freq; - u16 band; - struct ieee80211_channel *channel; - } chandef; - u32 listen_interval; -}; - -struct ieee80211_hw { - struct wiphy *wiphy; - const struct ieee80211_ops *ops; - void *priv; - int registered; - u32 extra_tx_headroom; - u16 queues; - struct ieee80211_conf conf; -}; - -struct ieee80211_vif { - u8 addr[6]; - void *drv_priv; - u32 type; - bool cfg_assoc; -}; - -struct ieee80211_sta { - u8 addr[6]; - void *drv_priv; - u16 aid; + u8 keyidx; + u8 keylen; + u8 key[32]; }; struct ieee80211_bss_conf { @@ -64,70 +106,176 @@ struct ieee80211_bss_conf { u32 center_freq; u16 band; struct ieee80211_channel *channel; + enum nl80211_chan_width width; } chandef; + bool he_support; + bool eht_support; + u8 he_bss_color; + u8 link_id; + struct ieee80211_chanctx_conf *chanctx; +}; + +struct ieee80211_link { + struct ieee80211_bss_conf conf; + u8 link_id; + bool active; + u8 addr[6]; +}; + +struct ieee80211_link_sta { + u8 addr[6]; + void *drv_priv; + bool he_capa_present; + bool eht_capa_present; + u32 ht_cap; + u32 vht_cap; +}; + +struct ieee80211_sta { + u8 addr[6]; + u8 mld_addr[6]; + void *drv_priv; + u16 aid; + bool wme; + bool mfp; + bool tdls; + bool is_mld; + u16 valid_links; + struct ieee80211_link_sta deflink; + struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS + 1]; +}; + +struct ieee80211_vif { + u8 addr[6]; + void *drv_priv; + u32 type; + bool cfg_assoc; + bool is_mld; + u16 valid_links; + struct ieee80211_link deflink; + struct ieee80211_link *link[IEEE80211_MLD_MAX_NUM_LINKS + 1]; + struct ieee80211_bss_conf bss_conf; }; struct ieee80211_rx_status { + u64 mactime; u16 freq; u32 band; s8 signal; s8 noise; u8 rate_idx; + u8 link_id; u32 flag; u8 antenna; u32 rx_flags; + u32 encoding; + u8 nss; + u8 bw; }; -enum ieee80211_sta_state { - IEEE80211_STA_NOTEXIST, - IEEE80211_STA_NONE, - IEEE80211_STA_AUTH, - IEEE80211_STA_ASSOC, - IEEE80211_STA_AUTHORIZED, +struct ieee80211_conf { + u32 flags; + int power_level; + int dynamic_ps_timeout; + struct { + u32 center_freq; + u16 band; + struct ieee80211_channel *channel; + enum nl80211_chan_width width; + } chandef; + u32 listen_interval; }; -enum set_key_cmd { - SET_KEY, - DISABLE_KEY, +struct ieee80211_hw { + struct wiphy *wiphy; + const struct ieee80211_ops *ops; + void *priv; + int registered; + u32 extra_tx_headroom; + u16 queues; + u8 max_rx_aggregation_subframes; + u8 max_tx_aggregation_subframes; + struct ieee80211_conf conf; +}; + +struct ieee80211_tx_rate { + u8 idx; + u8 count; + u8 flags; +}; + +struct ieee80211_tx_info { + u32 flags; + u32 band; + struct ieee80211_tx_rate rates[4]; + u8 antenna; + u8 ack_signal; + bool is_data; }; struct ieee80211_ops { - void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); + void (*tx)(struct ieee80211_hw *hw, struct ieee80211_txq *txq); + void (*wake_tx_queue)(struct ieee80211_hw *hw, struct ieee80211_txq *txq); int (*start)(struct ieee80211_hw *hw); void (*stop)(struct ieee80211_hw *hw); int (*add_interface)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); + int (*change_interface)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u32 new_type, bool p2p); void (*remove_interface)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); int (*config)(struct ieee80211_hw *hw, u32 changed); void (*bss_info_changed)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_bss_conf *info, u32 changed); + struct ieee80211_bss_conf *info, u64 changed); + void (*vif_cfg_changed)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u64 changed); + void (*link_info_changed)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_bss_conf *link_conf, u64 changed); int (*sta_state)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, enum ieee80211_sta_state old_state, enum ieee80211_sta_state new_state); + void (*sta_pre_rcu_remove)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_sta *sta); int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd, struct ieee80211_vif *vif, struct ieee80211_sta *sta, - struct key_params *key); + struct ieee80211_key_conf *key); int (*ampdu_action)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_sta *sta, u16 action, u16 tid, u16 ssn); + struct ieee80211_sta *sta, enum ieee80211_ampdu_mlme_action action, + struct ieee80211_txq *txq); + bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *hw, struct sk_buff *head, struct sk_buff *skb); void (*sw_scan_start)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, const u8 *mac_addr); void (*sw_scan_complete)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); - u64 (*prepare_multicast)(struct ieee80211_hw *hw, void *mc_list); - void (*configure_filter)(struct ieee80211_hw *hw, u32 changed_flags, - u32 *total_flags, u64 multicast); + int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct cfg80211_scan_request *req); + void (*cancel_hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); int (*sched_scan_start)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *req); void (*sched_scan_stop)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); + void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u32 queues, bool drop); + void (*flush_sta)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta); + void (*configure_filter)(struct ieee80211_hw *hw, u32 changed_flags, u32 *total_flags, u64 multicast); + u64 (*prepare_multicast)(struct ieee80211_hw *hw, void *mc_list); + int (*conf_tx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u32 link_id, u8 ac, void *params); + int (*get_antenna)(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); + int (*set_antenna)(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant); + int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value); + void (*sta_statistics)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, void *sinfo); + void (*link_sta_rc_update)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_link_sta *link_sta); + void (*mgd_prepare_tx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *info); + void (*mgd_complete_tx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *info); + void (*sync_rx_queues)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); + void (*reconfig_complete)(struct ieee80211_hw *hw, u32 flags); + void (*restart_complete)(struct ieee80211_hw *hw); + int (*add_chanctx)(struct ieee80211_hw *hw, struct ieee80211_chanctx_conf *ctx); + void (*remove_chanctx)(struct ieee80211_hw *hw, struct ieee80211_chanctx_conf *ctx); + void (*change_chanctx)(struct ieee80211_hw *hw, struct ieee80211_chanctx_conf *ctx, u32 changed); + int (*assign_vif_chanctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_chanctx_conf *ctx); + void (*unassign_vif_chanctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_chanctx_conf *ctx); + void (*switch_vif_chanctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_chanctx_conf **old, struct ieee80211_chanctx_conf **nw, u32 n); + int (*start_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_bss_conf *link_conf); + void (*stop_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_bss_conf *link_conf); + bool (*tx_last_beacon)(struct ieee80211_hw *hw); }; -#define BSS_CHANGED_ASSOC (1U << 0) -#define BSS_CHANGED_BSSID (1U << 1) -#define BSS_CHANGED_ERP_CTS_PROT (1U << 2) -#define BSS_CHANGED_HT (1U << 3) -#define BSS_CHANGED_BASIC_RATES (1U << 4) -#define BSS_CHANGED_BEACON_INT (1U << 5) -#define BSS_CHANGED_BANDWIDTH (1U << 6) +#define IEEE80211_RECONFIG_TYPE_TIMER 0 +#define IEEE80211_RECONFIG_TYPE_ARP_FILTER 1 -extern struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len, - const void *ops, - const char *requested_name); +extern struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len, const void *ops, const char *requested_name); extern void ieee80211_free_hw(struct ieee80211_hw *hw); extern int ieee80211_register_hw(struct ieee80211_hw *hw); extern void ieee80211_unregister_hw(struct ieee80211_hw *hw); @@ -136,11 +284,16 @@ extern void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted); extern void ieee80211_connection_loss(struct ieee80211_vif *vif); extern int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid, u16 timeout); extern int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid); -extern int ieee80211_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_sta *sta, u32 old_state, u32 new_state); +extern int ieee80211_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, u32 old_state, u32 new_state); extern struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_hw *hw, const u8 *addr); extern void ieee80211_beacon_loss(struct ieee80211_vif *vif); extern void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb); extern size_t ieee80211_rx_drain(struct ieee80211_hw *hw); +extern void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb); +extern void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); +extern void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue); +extern struct ieee80211_tx_info *IEEE80211_SKB_CB(struct sk_buff *skb); + +#define ieee80211_alloc_hw(priv, ops) ieee80211_alloc_hw_nm(priv, ops, KBUILD_MODNAME) #endif diff --git a/local/recipes/drivers/linux-kpi/source/src/rust_impl/mac80211.rs b/local/recipes/drivers/linux-kpi/source/src/rust_impl/mac80211.rs index 42723a6c81..5b77e3021a 100644 --- a/local/recipes/drivers/linux-kpi/source/src/rust_impl/mac80211.rs +++ b/local/recipes/drivers/linux-kpi/source/src/rust_impl/mac80211.rs @@ -42,59 +42,35 @@ pub type RxCallback = unsafe extern "C" fn(*mut Ieee80211Hw, *mut SkBuff); #[repr(C)] pub struct Ieee80211Ops { - pub tx: Option, - pub wake_tx_queue: Option, + pub tx: Option, pub start: Option i32>, pub stop: Option, pub add_interface: Option i32>, - pub change_interface: Option i32>, pub remove_interface: Option, pub config: Option i32>, pub bss_info_changed: - Option, - pub vif_cfg_changed: Option, - pub link_info_changed: Option, + Option, pub sta_state: - Option i32>, - pub sta_pre_rcu_remove: Option, + Option i32>, pub set_key: Option< - extern "C" fn(*mut Ieee80211Hw, i32, *mut Ieee80211Vif, *mut Ieee80211Sta, *mut c_void) -> i32, + extern "C" fn( + *mut Ieee80211Hw, + *mut Ieee80211Vif, + i32, + *mut Ieee80211Sta, + *mut KeyParams, + ) -> i32, >, pub ampdu_action: Option< - extern "C" fn(*mut Ieee80211Hw, *mut Ieee80211Vif, *mut Ieee80211Sta, u32, *mut c_void) -> i32, + extern "C" fn(*mut Ieee80211Hw, *mut Ieee80211Vif, *mut Ieee80211Sta, u16, u16, u16) -> i32, >, - pub can_aggregate_in_amsdu: Option bool>, pub sw_scan_start: Option, pub sw_scan_complete: Option, - pub hw_scan: Option i32>, - pub cancel_hw_scan: Option, + pub prepare_multicast: Option u64>, + pub configure_filter: Option, pub sched_scan_start: Option i32>, pub sched_scan_stop: Option, - pub flush: Option, - pub flush_sta: Option, - pub configure_filter: Option, - pub prepare_multicast: Option u64>, - pub conf_tx: Option i32>, - pub get_antenna: Option i32>, - pub set_antenna: Option i32>, - pub set_rts_threshold: Option i32>, - pub sta_statistics: Option, - pub link_sta_rc_update: Option, - pub mgd_prepare_tx: Option, - pub mgd_complete_tx: Option, - pub sync_rx_queues: Option, - pub reconfig_complete: Option, - pub restart_complete: Option, - pub add_chanctx: Option i32>, - pub remove_chanctx: Option, - pub change_chanctx: Option, - pub assign_vif_chanctx: Option i32>, - pub unassign_vif_chanctx: Option, - pub switch_vif_chanctx: Option, - pub start_ap: Option i32>, - pub stop_ap: Option, - pub tx_last_beacon: Option bool>, } #[repr(C)] @@ -115,22 +91,14 @@ pub struct Ieee80211Vif { pub drv_priv: *mut c_void, pub type_: u32, pub cfg_assoc: bool, - pub is_mld: bool, - pub valid_links: u16, } #[repr(C)] #[derive(Debug)] pub struct Ieee80211Sta { pub addr: [u8; 6], - pub mld_addr: [u8; 6], pub drv_priv: *mut c_void, pub aid: u16, - pub wme: bool, - pub mfp: bool, - pub tdls: bool, - pub is_mld: bool, - pub valid_links: u16, } #[repr(C)] @@ -138,13 +106,6 @@ pub struct Ieee80211BssConf { pub assoc: bool, pub aid: u16, pub beacon_int: u16, - pub bssid: [u8; 6], - pub basic_rates: u32, - pub bandwidth: u8, - pub he_support: bool, - pub eht_support: bool, - pub he_bss_color: u8, - pub link_id: u8, } pub const BSS_CHANGED_ASSOC: u32 = 1; @@ -728,7 +689,7 @@ pub extern "C" fn ieee80211_sta_state( } match unsafe { (*ops).sta_state } { - Some(callback) => callback(hw, vif, sta, _old_state, new_state), + Some(callback) => callback(hw, vif, sta, new_state), None => 0, } } @@ -783,7 +744,6 @@ mod tests { _hw: *mut Ieee80211Hw, _vif: *mut Ieee80211Vif, _sta: *mut Ieee80211Sta, - _old: u32, state: u32, ) -> i32 { STA_CALLBACKS.store(state as i32, Ordering::Release); @@ -824,8 +784,6 @@ mod tests { drv_priv: ptr::null_mut(), type_: 0, cfg_assoc: true, - is_mld: false, - valid_links: 0, }; ieee80211_connection_loss(&mut vif); assert!(!vif.cfg_assoc); @@ -857,51 +815,21 @@ mod tests { fn ieee80211_sta_registry_and_ba_sessions_work() { let ops = Ieee80211Ops { tx: None, - wake_tx_queue: None, start: None, stop: None, add_interface: None, - change_interface: None, remove_interface: None, config: None, bss_info_changed: None, - vif_cfg_changed: None, - link_info_changed: None, sta_state: Some(test_sta_state), - sta_pre_rcu_remove: None, set_key: None, ampdu_action: None, - can_aggregate_in_amsdu: None, sw_scan_start: None, sw_scan_complete: None, - hw_scan: None, - cancel_hw_scan: None, + prepare_multicast: None, + configure_filter: None, sched_scan_start: None, sched_scan_stop: None, - flush: None, - flush_sta: None, - configure_filter: None, - prepare_multicast: None, - conf_tx: None, - get_antenna: None, - set_antenna: None, - set_rts_threshold: None, - sta_statistics: None, - link_sta_rc_update: None, - mgd_prepare_tx: None, - mgd_complete_tx: None, - sync_rx_queues: None, - reconfig_complete: None, - restart_complete: None, - add_chanctx: None, - remove_chanctx: None, - change_chanctx: None, - assign_vif_chanctx: None, - unassign_vif_chanctx: None, - switch_vif_chanctx: None, - start_ap: None, - stop_ap: None, - tx_last_beacon: None, }; let hw = ieee80211_alloc_hw_nm( 0, @@ -916,19 +844,11 @@ mod tests { drv_priv: ptr::null_mut(), type_: 0, cfg_assoc: false, - is_mld: false, - valid_links: 0, }; let mut sta = Ieee80211Sta { addr: [1, 2, 3, 4, 5, 6], - mld_addr: [1, 2, 3, 4, 5, 6], drv_priv: ptr::null_mut(), aid: 1, - wme: false, - mfp: false, - tdls: false, - is_mld: false, - valid_links: 0, }; STA_CALLBACKS.store(0, Ordering::Release); diff --git a/local/recipes/drivers/redbear-iwlwifi/source/build.rs b/local/recipes/drivers/redbear-iwlwifi/source/build.rs index 0d985c697b..93c24b5236 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/build.rs +++ b/local/recipes/drivers/redbear-iwlwifi/source/build.rs @@ -6,6 +6,7 @@ fn main() { cc::Build::new() .file("src/linux_port.c") .file("src/linux_mvm.c") + .file("src/linux_mld.c") .include(linux_kpi_headers) .warnings(true) .compile("redbear_iwlwifi_linux_port"); diff --git a/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c b/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c index 457a8e63ff..e1039c9a23 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c +++ b/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c @@ -9,6 +9,7 @@ #include "../../../linux-kpi/source/src/c_headers/linux/jiffies.h" #include "../../../linux-kpi/source/src/c_headers/linux/kernel.h" #include "linux_mvm.h" +#include "linux_mld.h" #include "../../../linux-kpi/source/src/c_headers/linux/list.h" #include "../../../linux-kpi/source/src/c_headers/linux/mutex.h" #include "../../../linux-kpi/source/src/c_headers/linux/netdevice.h" @@ -267,6 +268,8 @@ struct iwl_trans_pcie { /* Device family info */ int device_family; + int opmode; + struct rb_iwl_mld mld_state; const char *fw_name; const char *pnvm_name; @@ -340,20 +343,20 @@ static u32 iwl_pcie_isr(int irq, void *dev_id); static void iwl_pcie_tasklet(unsigned long data); static void rb_iwlwifi_release_irqs(struct iwl_trans_pcie *trans); static void iwl_pcie_tasklet(unsigned long data); -static void iwl_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb); +static void iwl_ops_tx(struct ieee80211_hw *hw, struct ieee80211_txq *txq); static int iwl_ops_start(struct ieee80211_hw *hw); static void iwl_ops_stop(struct ieee80211_hw *hw); static int iwl_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif); static void iwl_ops_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif); static int iwl_ops_config(struct ieee80211_hw *hw, u32 changed); static void iwl_ops_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_bss_conf *info, u32 changed); + struct ieee80211_bss_conf *info, u64 changed); static int iwl_ops_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, enum ieee80211_sta_state old_state, enum ieee80211_sta_state new_state); static int iwl_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, struct ieee80211_vif *vif, struct ieee80211_sta *sta, - struct key_params *key); + struct ieee80211_key_conf *key); static void iwl_ops_sw_scan_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif, const u8 *mac_addr); static void iwl_ops_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif); static int iwl_ops_sched_scan_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *req); @@ -1053,6 +1056,9 @@ static int rb_iwlwifi_probe_transport(struct iwl_trans_pcie *trans, unsigned int } trans->device_family = rb_iwlwifi_family_from_device(trans->pci_dev, bz_family); + trans->opmode = rb_iwl_opmode_for_family(trans->device_family == RB_IWL_DEVICE_FAMILY_BZ); + if (trans->opmode == RB_IWL_OPMODE_MLD) + rb_iwl_mld_init(&trans->mld_state); access_req = trans->device_family == RB_IWL_DEVICE_FAMILY_BZ ? IWL_CSR_GP_CNTRL_REG_FLAG_BZ_MAC_ACCESS_REQ : IWL_CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ; @@ -1527,6 +1533,12 @@ static void iwl_pcie_rx_handle(struct iwl_trans_pcie *trans) rb_iwl_mvm_extract_signal(buf->addr, buf->size, desc_fmt, &mvm_info); if (mvm_info.signal != 0) { rx_status.signal = mvm_info.signal; + + if (trans->opmode == RB_IWL_OPMODE_MLD) { + struct rb_iwl_mld_rx_mpdu_info mpdu; + if (rb_iwl_mld_parse_rx_mpdu(buf->addr, buf->size, &mpdu) == 0) + trans->mld_state.rx_frames++; + } rx_status.rate_idx = rb_iwl_mvm_rs_select(&trans->rs_state, mvm_info.signal); } else { rx_status.signal = -42; @@ -1821,7 +1833,18 @@ static int rb_iwlwifi_choose_txq(struct iwl_trans_pcie *trans) return -1; } -static void iwl_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb) +static void iwl_ops_tx(struct ieee80211_hw *hw, struct ieee80211_txq *txq) +{ + struct iwl_trans_pcie *trans = iwl_hw_to_trans(hw); + if (!trans || !txq) + return; + /* MLD/MLD txq-based TX path. For now, the actual TX still goes through + * the existing per-queue skb path when frames arrive via mac80211. + * This callback is invoked by mac80211's wake_tx_queue, which the + * iwl_mld_hw_ops table registers. */ +} + +static void iwl_ops_tx_skb(struct ieee80211_hw *hw, struct sk_buff *skb) { struct iwl_trans_pcie *trans = iwl_hw_to_trans(hw); int txq; @@ -1920,7 +1943,7 @@ static int iwl_ops_config(struct ieee80211_hw *hw, u32 changed) } static void iwl_ops_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_bss_conf *info, u32 changed) + struct ieee80211_bss_conf *info, u64 changed) { struct iwl_trans_pcie *trans = iwl_hw_to_trans(hw); (void)vif; @@ -1990,30 +2013,29 @@ static int iwl_ops_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, static int iwl_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, struct ieee80211_vif *vif, struct ieee80211_sta *sta, - struct key_params *key) + struct ieee80211_key_conf *key) { struct iwl_trans_pcie *trans = iwl_hw_to_trans(hw); (void)vif; (void)sta; if (!trans || !key) return -EINVAL; - if (key->key_idx >= 4) + if (key->keyidx >= 4) return -ENOSPC; if (cmd == SET_KEY) { - trans->keys[key->key_idx].cipher = key->cipher; - trans->keys[key->key_idx].key_len = (u8)min_t(u32, key->key_len, 32U); - if (key->key) - memcpy(trans->keys[key->key_idx].key, - key->key, - trans->keys[key->key_idx].key_len); - trans->keys[key->key_idx].key_idx = key->key_idx; - trans->keys[key->key_idx].valid = 1; + trans->keys[key->keyidx].cipher = key->cipher; + trans->keys[key->keyidx].key_len = (u8)min_t(u32, key->keylen, 32U); + memcpy(trans->keys[key->keyidx].key, + key->key, + trans->keys[key->keyidx].key_len); + trans->keys[key->keyidx].key_idx = key->keyidx; + trans->keys[key->keyidx].valid = 1; rb_iwlwifi_copy_name(trans->last_security, sizeof(trans->last_security), key->cipher ? "wpa2-psk" : "open"); } else { - memset(&trans->keys[key->key_idx], 0, sizeof(trans->keys[key->key_idx])); + memset(&trans->keys[key->keyidx], 0, sizeof(trans->keys[key->keyidx])); trans->last_security[0] = '\0'; } @@ -2170,6 +2192,9 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } pci_set_master(pdev); trans->device_family = rb_iwlwifi_family_from_device(pdev, 0); + trans->opmode = rb_iwl_opmode_for_family(trans->device_family == RB_IWL_DEVICE_FAMILY_BZ); + if (trans->opmode == RB_IWL_OPMODE_MLD) + rb_iwl_mld_init(&trans->mld_state); pdev->driver_data = trans; return 0; } @@ -2215,8 +2240,10 @@ static void rb_iwlwifi_status_line(struct iwl_trans_pcie *trans, char *out, unsi { rb_iwlwifi_format_out( out, out_len, - "linux_kpi_status=ok family=%s prepared=%d probed=%d init=%d active=%d fw_running=%d mac80211=%d irq=%d vectors=%d msix=%d tx_queues=%d rx_in_use=%u scan_results=%u connected=%d ssid=%s", + "linux_kpi_status=ok family=%s opmode=%s mld_rx=%u prepared=%d probed=%d init=%d active=%d fw_running=%d mac80211=%d irq=%d vectors=%d msix=%d tx_queues=%d rx_in_use=%u scan_results=%u connected=%d ssid=%s", rb_iwlwifi_family_name(trans->device_family), + rb_iwl_opmode_name(trans->opmode), + trans->opmode == RB_IWL_OPMODE_MLD ? rb_iwl_mld_rx_frames(&trans->mld_state) : 0, trans->prepared, trans->transport_probed, trans->transport_inited, @@ -2633,37 +2660,3 @@ int rb_iwlwifi_register_mac80211(struct pci_dev *dev, char *out, unsigned long o mutex_unlock(&rb_iwlwifi_transport_lock); return rc; } - -int rb_iwlwifi_send_hcmd(struct pci_dev *dev, unsigned int wide_id, - const void *payload, int len) -{ - struct iwl_trans_pcie *trans; - struct { - struct rb_iwl_cmd_hdr hdr; - u8 data[256]; - } cmd_buf; - int rc; - - if (!dev || !payload || len <= 0 || len > 256) - return -EINVAL; - - mutex_lock(&rb_iwlwifi_transport_lock); - rc = rb_iwlwifi_require_transport(dev, &trans); - if (rc) - goto out; - rc = rb_iwlwifi_full_init_locked(trans, 0, 0, NULL, NULL); - if (rc) - goto out; - - memset(&cmd_buf, 0, sizeof(cmd_buf)); - cmd_buf.hdr.id = wide_id; - cmd_buf.hdr.len = (u32)(sizeof(struct rb_iwl_cmd_hdr) + (unsigned int)len); - cmd_buf.hdr.cookie = (u32)atomic_add_return(1, &rb_iwlwifi_cmd_cookie); - memcpy(cmd_buf.data, payload, (size_t)len); - - rc = iwl_pcie_send_cmd(trans, &cmd_buf, (int)cmd_buf.hdr.len); - -out: - mutex_unlock(&rb_iwlwifi_transport_lock); - return rc; -}