diff options
Diffstat (limited to 'sys/compat/linuxkpi/common')
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/ieee80211.h | 35 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/nl80211.h | 2 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/include/net/cfg80211.h | 114 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/include/net/mac80211.h | 191 |
4 files changed, 245 insertions, 97 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h b/sys/compat/linuxkpi/common/include/linux/ieee80211.h index 4259018a179a..9c65b4045cbe 100644 --- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h +++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h @@ -132,7 +132,9 @@ enum wlan_ht_cap_sm_ps { #define WLAN_KEY_LEN_WEP40 5 #define WLAN_KEY_LEN_WEP104 13 +#define WLAN_KEY_LEN_TKIP 32 #define WLAN_KEY_LEN_CCMP 16 +#define WLAN_KEY_LEN_GCMP 16 #define WLAN_KEY_LEN_GCMP_256 32 /* 802.11-2020, 9.4.2.55.3, Table 9-185 Subfields of the A-MPDU Parameters field */ @@ -243,6 +245,8 @@ enum ieee80211_ac_numbers { /* XXX net80211 calls these IEEE80211_HTCAP_* */ #define IEEE80211_HT_CAP_LDPC_CODING 0x0001 /* IEEE80211_HTCAP_LDPC */ #define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002 /* IEEE80211_HTCAP_CHWIDTH40 */ +#define IEEE80211_HT_CAP_SM_PS 0x000c /* IEEE80211_HTCAP_SMPS */ +#define IEEE80211_HT_CAP_SM_PS_SHIFT 2 #define IEEE80211_HT_CAP_GRN_FLD 0x0010 /* IEEE80211_HTCAP_GREENFIELD */ #define IEEE80211_HT_CAP_SGI_20 0x0020 /* IEEE80211_HTCAP_SHORTGI20 */ #define IEEE80211_HT_CAP_SGI_40 0x0040 /* IEEE80211_HTCAP_SHORTGI40 */ @@ -251,8 +255,6 @@ enum ieee80211_ac_numbers { #define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 /* IEEE80211_HTCAP_RXSTBC_S */ #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 /* IEEE80211_HTCAP_MAXAMSDU */ #define IEEE80211_HT_CAP_DSSSCCK40 0x1000 /* IEEE80211_HTCAP_DSSSCCK40 */ -#define IEEE80211_HT_CAP_SM_PS 0x000c /* IEEE80211_HTCAP_SMPS */ -#define IEEE80211_HT_CAP_SM_PS_SHIFT 2 #define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000 /* IEEE80211_HTCAP_LSIGTXOPPROT */ #define IEEE80211_HT_MCS_TX_DEFINED 0x0001 @@ -269,13 +271,6 @@ struct ieee80211_mcs_info { uint8_t __reserved[3]; }; -struct vht_mcs { - uint16_t rx_mcs_map; - uint16_t rx_highest; - uint16_t tx_mcs_map; - uint16_t tx_highest; -}; - /* 802.11-2020, 9.4.2.55.1 HT Capabilities element structure */ struct ieee80211_ht_cap { uint16_t cap_info; @@ -286,11 +281,6 @@ struct ieee80211_ht_cap { uint8_t antenna_selection_info; }; -struct ieee80211_vht_cap { - __le32 vht_cap_info; - struct vht_mcs supp_mcs; -}; - #define IEEE80211_HT_MAX_AMPDU_FACTOR 13 enum ieee80211_ht_max_ampdu_len { @@ -447,7 +437,7 @@ enum ieee80211_category { WLAN_CATEGORY_BACK = 3, }; -/* 9.3.3.2 Format of Management frames */ +/* 80211-2020 9.3.3.2 Format of Management frames */ struct ieee80211_mgmt { __le16 frame_control; __le16 duration_id; @@ -480,6 +470,16 @@ struct ieee80211_mgmt { uint8_t category; /* 9.6.8 Public Action details */ union { + /* 9.6.2.5 TPC Report frame format */ + struct { + uint8_t spec_mgmt; + uint8_t dialog_token; + /* uint32_t tpc_rep_elem:: */ + uint8_t tpc_elem_id; + uint8_t tpc_elem_length; + uint8_t tpc_elem_tx_power; + uint8_t tpc_elem_link_margin; + } tpc_report; /* 9.6.8.33 Fine Timing Measurement frame format */ struct { uint8_t dialog_token; @@ -669,9 +669,8 @@ ieee80211_is_data_qos(__le16 fc) { __le16 v; - fc &= htole16(IEEE80211_FC0_SUBTYPE_QOS_DATA | IEEE80211_FC0_TYPE_MASK | - IEEE80211_FC0_VERSION_MASK); - v = htole16(IEEE80211_FC0_QOSDATA); + fc &= htole16(IEEE80211_FC0_SUBTYPE_QOS_DATA | IEEE80211_FC0_TYPE_MASK); + v = htole16(IEEE80211_FC0_SUBTYPE_QOS_DATA | IEEE80211_FC0_TYPE_DATA); return (fc == v); } diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h b/sys/compat/linuxkpi/common/include/linux/nl80211.h index a85abfc10453..c4c46fbd90cb 100644 --- a/sys/compat/linuxkpi/common/include/linux/nl80211.h +++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h @@ -367,6 +367,8 @@ enum nl80211_probe_resp_offload_support { }; #define NL80211_KCK_LEN 16 +#define NL80211_KCK_EXT_LEN 24 #define NL80211_KEK_LEN 16 +#define NL80211_KEK_EXT_LEN 32 #define NL80211_REPLAY_CTR_LEN 8 #endif /* _LINUXKPI_LINUX_NL80211_H */ diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h b/sys/compat/linuxkpi/common/include/net/cfg80211.h index e7301e7b85cb..89b7af916573 100644 --- a/sys/compat/linuxkpi/common/include/net/cfg80211.h +++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h @@ -51,7 +51,7 @@ extern int linuxkpi_debug_80211; #ifndef D80211_IMPROVE #define D80211_IMPROVE 0x2 #endif -#define TODO() if (linuxkpi_debug_80211 & D80211_TODO) \ +#define TODO(...) if (linuxkpi_debug_80211 & D80211_TODO) \ printf("%s:%d: XXX LKPI80211 TODO\n", __func__, __LINE__) #define IMPROVE(...) if (linuxkpi_debug_80211 & D80211_IMPROVE) \ printf("%s:%d: XXX LKPI80211 IMPROVE\n", __func__, __LINE__) @@ -76,6 +76,7 @@ enum cfg80211_rate_info_flags { RATE_INFO_FLAGS_MCS = BIT(1), RATE_INFO_FLAGS_VHT_MCS = BIT(2), RATE_INFO_FLAGS_HE_MCS = BIT(3), + /* Max 8 bits as used in struct rate_info. */ }; extern const uint8_t rfc1042_header[6]; @@ -131,15 +132,14 @@ struct linuxkpi_ieee80211_channel { struct cfg80211_bitrate_mask { /* TODO FIXME */ - /* This is so weird but nothing else works out...*/ struct { - uint64_t legacy; /* XXX? */ + uint32_t legacy; uint8_t ht_mcs[IEEE80211_HT_MCS_MASK_LEN]; - uint16_t vht_mcs[16]; /* XXX? */ - uint16_t he_mcs[16]; /* XXX? */ + uint16_t vht_mcs[8]; + uint16_t he_mcs[8]; enum nl80211_txrate_gi gi; enum nl80211_he_gi he_gi; - uint8_t he_ltf; + uint8_t he_ltf; /* XXX enum? */ } control[NUM_NL80211_BANDS]; }; @@ -154,8 +154,14 @@ enum rate_info_bw { }; struct rate_info { - /* TODO FIXME */ - int bw, flags, he_dcm, he_gi, he_ru_alloc, legacy, mcs, nss; + uint8_t flags; /* enum cfg80211_rate_info_flags */ + uint8_t bw; + uint16_t legacy; + uint8_t mcs; + uint8_t nss; + uint8_t he_dcm; + uint8_t he_gi; + uint8_t he_ru_alloc; }; struct ieee80211_rate { @@ -223,9 +229,9 @@ struct ieee80211_sta_ht_cap { struct ieee80211_sta_vht_cap { /* TODO FIXME */ - bool vht_supported; - uint32_t cap; - struct vht_mcs vht_mcs; + bool vht_supported; + uint32_t cap; + struct ieee80211_vht_mcs_info vht_mcs; }; enum ieee80211_vht_opmode { @@ -514,33 +520,6 @@ struct cfg80211_pmksa { const uint8_t *pmkid; }; -struct cfg80211_wowlan_nd_match { - /* XXX TODO */ - struct cfg80211_ssid ssid; - int n_channels; - uint32_t channels[0]; /* freq! = ieee80211_channel_to_frequency() */ -}; - -struct cfg80211_wowlan_nd_info { - /* XXX TODO */ - int n_matches; - struct cfg80211_wowlan_nd_match *matches[0]; -}; - -enum wiphy_wowlan_support_flags { - WIPHY_WOWLAN_DISCONNECT, - WIPHY_WOWLAN_GTK_REKEY_FAILURE, - WIPHY_WOWLAN_MAGIC_PKT, - WIPHY_WOWLAN_SUPPORTS_GTK_REKEY, - WIPHY_WOWLAN_NET_DETECT, -}; - -struct wiphy_wowlan_support { - /* XXX TODO */ - enum wiphy_wowlan_support_flags flags; - int max_nd_match_sets, max_pkt_offset, n_patterns, pattern_max_len, pattern_min_len; -}; - struct station_del_parameters { /* XXX TODO */ const uint8_t *mac; @@ -847,9 +826,56 @@ struct cfg80211_pkt_pattern { int pkt_offset; }; +struct cfg80211_wowlan_nd_match { + /* XXX TODO */ + struct cfg80211_ssid ssid; + int n_channels; + uint32_t channels[0]; /* freq! = ieee80211_channel_to_frequency() */ +}; + +struct cfg80211_wowlan_nd_info { + /* XXX TODO */ + int n_matches; + struct cfg80211_wowlan_nd_match *matches[0]; +}; + +enum wiphy_wowlan_support_flags { + WIPHY_WOWLAN_DISCONNECT, + WIPHY_WOWLAN_GTK_REKEY_FAILURE, + WIPHY_WOWLAN_MAGIC_PKT, + WIPHY_WOWLAN_SUPPORTS_GTK_REKEY, + WIPHY_WOWLAN_NET_DETECT, +}; + +struct wiphy_wowlan_support { + /* XXX TODO */ + enum wiphy_wowlan_support_flags flags; + int max_nd_match_sets, max_pkt_offset, n_patterns, pattern_max_len, pattern_min_len; +}; + +struct cfg80211_wowlan_wakeup { + /* XXX TODO */ + uint16_t pattern_idx; + bool disconnect; + bool eap_identity_req; + bool four_way_handshake; + bool gtk_rekey_failure; + bool magic_pkt; + bool rfkill_release; + bool tcp_connlost; + bool tcp_nomoretokens; + bool tcp_match; + bool packet_80211; + struct cfg80211_wowlan_nd_info *net_detect; + uint8_t *packet; + uint16_t packet_len; + uint16_t packet_present_len; +}; + struct cfg80211_wowlan { /* XXX TODO */ int disconnect, gtk_rekey_failure, magic_pkt; + int eap_identity_req, four_way_handshake, rfkill_release, tcp, any; int n_patterns; struct cfg80211_sched_scan_request *nd_config; struct cfg80211_pkt_pattern *patterns; @@ -857,7 +883,9 @@ struct cfg80211_wowlan { struct cfg80211_gtk_rekey_data { /* XXX TODO */ - int kck, kek, replay_ctr; + const uint8_t *kck, *kek, *replay_ctr; + uint32_t akm; + uint8_t kck_len, kek_len; }; struct cfg80211_tid_cfg { @@ -966,6 +994,7 @@ struct wiphy { uint32_t flags; struct ieee80211_supported_band *bands[NUM_NL80211_BANDS]; uint8_t perm_addr[ETH_ALEN]; + uint16_t max_scan_ie_len; /* XXX TODO */ const struct cfg80211_pmsr_capabilities *pmsr_capa; @@ -988,7 +1017,7 @@ struct wiphy { int available_antennas_rx, available_antennas_tx; int features, hw_version; - int interface_modes, max_match_sets, max_remain_on_channel_duration, max_scan_ie_len, max_scan_ssids, max_sched_scan_ie_len, max_sched_scan_plan_interval, max_sched_scan_plan_iterations, max_sched_scan_plans, max_sched_scan_reqs, max_sched_scan_ssids; + int interface_modes, max_match_sets, max_remain_on_channel_duration, max_scan_ssids, max_sched_scan_ie_len, max_sched_scan_plan_interval, max_sched_scan_plan_iterations, max_sched_scan_plans, max_sched_scan_reqs, max_sched_scan_ssids; int num_iftype_ext_capab; int max_ap_assoc_sta, probe_resp_offload, software_iftypes; int bss_select_support, max_num_pmkids, retry_long, retry_short, signal_type; @@ -1218,6 +1247,7 @@ cfg80211_chandef_create(struct cfg80211_chan_def *chandef, chandef->center_freq1 = chan->center_freq; break; default: + IMPROVE("Also depends on our manual settings"); if (chan->flags & IEEE80211_CHAN_NO_HT40) chandef->width = NL80211_CHAN_WIDTH_20; else if (chan->flags & IEEE80211_CHAN_NO_80MHZ) @@ -1340,7 +1370,7 @@ freq_reg_info(struct wiphy *wiphy, uint32_t center_freq) static __inline struct cfg80211_bss * cfg80211_get_bss(struct wiphy *wiphy, struct linuxkpi_ieee80211_channel *chan, - uint8_t *bssid, void *p, int x, uint32_t f1, uint32_t f2) + const uint8_t *bssid, void *p, int x, uint32_t f1, uint32_t f2) { TODO(); return (NULL); @@ -1696,4 +1726,6 @@ cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef) #define ieee80211_regdomain linuxkpi_ieee80211_regdomain #endif +#include <net/mac80211.h> + #endif /* _LINUXKPI_NET_CFG80211_H */ diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h b/sys/compat/linuxkpi/common/include/net/mac80211.h index 659101dec689..33379900b625 100644 --- a/sys/compat/linuxkpi/common/include/net/mac80211.h +++ b/sys/compat/linuxkpi/common/include/net/mac80211.h @@ -162,6 +162,8 @@ enum ieee80211_bss_changed { /* Reserved 14-255 */ /* Apparently 11ax defines more. Seen (19,20) mentioned. */ +#define TKIP_PN_TO_IV16(_x) ((uint16_t)(_x & 0xffff)) +#define TKIP_PN_TO_IV32(_x) ((uint32_t)((_x >> 16) & 0xffffffff)) struct ieee80211_sta; @@ -773,6 +775,7 @@ enum ieee80211_iface_iter { /* ieee80211_iterate_active_interfaces*(). */ IEEE80211_IFACE_ITER__ATOMIC = BIT(6), IEEE80211_IFACE_ITER__ACTIVE = BIT(7), + IEEE80211_IFACE_ITER__MTX = BIT(8), }; enum set_key_cmd { @@ -1492,6 +1495,17 @@ ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, } static __inline void +ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw *hw, + enum ieee80211_iface_iter flags, + void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *), + void *arg) +{ + flags |= IEEE80211_IFACE_ITER__ACTIVE; + flags |= IEEE80211_IFACE_ITER__MTX; + linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg); +} + +static __inline void ieee80211_iterate_interfaces(struct ieee80211_hw *hw, enum ieee80211_iface_iter flags, void (*iterfunc)(void *, uint8_t *, struct ieee80211_vif *), @@ -1621,11 +1635,47 @@ ieee80211_tu_to_usec(unsigned long tu) } -static __inline int +static __inline bool ieee80211_action_contains_tpc(struct sk_buff *skb) { - TODO(); - return (0); + struct ieee80211_mgmt *mgmt; + + mgmt = (struct ieee80211_mgmt *)skb->data; + + /* Check that this is a mgmt/action frame? */ + if (!ieee80211_is_action(mgmt->frame_control)) + return (false); + + /* + * This is a bit convoluted but according to docs both actions + * are checked for this. Kind-of makes sense for the only consumer + * (iwlwifi) I am aware off given the txpower fields are at the + * same location so firmware can update the value. + */ + /* 80211-2020 9.6.2 Spectrum Management Action frames */ + /* 80211-2020 9.6.2.5 TPC Report frame format */ + /* 80211-2020 9.6.6 Radio Measurement action details */ + /* 80211-2020 9.6.6.4 Link Measurement Report frame format */ + /* Check that it is Spectrum Management or Radio Measurement? */ + if (mgmt->u.action.category != IEEE80211_ACTION_CAT_SM && + mgmt->u.action.category != IEEE80211_ACTION_CAT_RADIO_MEASUREMENT) + return (false); + + /* Check that it is TPC Report or Link Measurement Report? */ + KASSERT(IEEE80211_ACTION_SM_TPCREP == IEEE80211_ACTION_RADIO_MEASUREMENT_LMREP, + ("%s: SM_TPCREP %d != RADIO_MEASUREMENT_LMREP %d\n", __func__, + IEEE80211_ACTION_SM_TPCREP, IEEE80211_ACTION_RADIO_MEASUREMENT_LMREP)); + if (mgmt->u.action.u.tpc_report.spec_mgmt != IEEE80211_ACTION_SM_TPCREP) + return (false); + + /* 80211-2020 9.4.2.16 TPC Report element */ + /* Check that the ELEMID and length are correct? */ + if (mgmt->u.action.u.tpc_report.tpc_elem_id != IEEE80211_ELEMID_TPCREP || + mgmt->u.action.u.tpc_report.tpc_elem_length != 4) + return (false); + + /* All the right fields in the right place. */ + return (true); } static __inline void @@ -1868,13 +1918,6 @@ ieee80211_sta_uapsd_trigger(struct ieee80211_sta *sta, int ntids) } static __inline void -ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr, - uint8_t tid) -{ - TODO(); -} - -static __inline void ieee80211_tkip_add_iv(u8 *crypto_hdr, struct ieee80211_key_conf *keyconf, uint64_t pn) { @@ -1926,11 +1969,32 @@ ieee80211_sta_eosp(struct ieee80211_sta *sta) TODO(); } +static __inline int +ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid, int x) +{ + TODO("rtw8x"); + return (-EINVAL); +} + +static __inline int +ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid) +{ + TODO("rtw89"); + return (-EINVAL); +} + +static __inline void +ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr, + uint8_t tid) +{ + TODO("iwlwifi"); +} + static __inline void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr, uint8_t tid) { - TODO(); + TODO("iwlwifi/rtw8x/..."); } static __inline void @@ -1948,7 +2012,8 @@ ieee80211_scan_completed(struct ieee80211_hw *hw, } static __inline struct sk_buff * -ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + uint32_t link_id) { TODO(); return (NULL); @@ -2034,20 +2099,6 @@ ieee80211_tx_status_ni(struct ieee80211_hw *hw, struct sk_buff *skb) ieee80211_tx_status(hw, skb); } -static __inline int -ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid, int x) -{ - TODO(); - return (-EINVAL); -} - -static __inline int -ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid) -{ - TODO(); - return (-EINVAL); -} - static __inline void ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) { @@ -2143,13 +2194,6 @@ ieee80211_txq_may_transmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq) return (false); } -static __inline struct ieee80211_txq * -ieee80211_next_txq(struct ieee80211_hw *hw, uint32_t ac) -{ - TODO(); - return (NULL); -} - static __inline void ieee80211_radar_detected(struct ieee80211_hw *hw) { @@ -2165,30 +2209,39 @@ ieee80211_sta_register_airtime(struct ieee80211_sta *sta, static __inline void -ieee80211_return_txq(struct ieee80211_hw *hw, - struct ieee80211_txq *txq, bool _t) +ieee80211_txq_schedule_start(struct ieee80211_hw *hw, uint8_t ac) { TODO(); } static __inline void -ieee80211_txq_schedule_end(struct ieee80211_hw *hw, uint32_t ac) +ieee80211_txq_schedule_end(struct ieee80211_hw *hw, uint8_t ac) { + /* DO_NADA; */ +} + +static __inline struct ieee80211_txq * +ieee80211_next_txq(struct ieee80211_hw *hw, uint8_t ac) +{ + TODO(); + return (NULL); } static __inline void -ieee80211_txq_schedule_start(struct ieee80211_hw *hw, uint32_t ac) +ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq) { TODO(); } static __inline void -ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq) +ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq, + bool withoutpkts) { TODO(); } + static __inline void ieee80211_beacon_set_cntdwn(struct ieee80211_vif *vif, u8 counter) { @@ -2314,6 +2367,68 @@ linuxkpi_ieee80211_send_bar(struct ieee80211_vif *vif, uint8_t *ra, uint16_t tid TODO(); } +static __inline void +ieee80211_resume_disconnect(struct ieee80211_vif *vif) +{ + TODO(); + return; +} + +static __inline int +ieee80211_data_to_8023(struct sk_buff *skb, const uint8_t *addr, + enum nl80211_iftype iftype) +{ + TODO(); + return (-1); +} + +static __inline void +ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *key, + uint32_t iv32, uint16_t *p1k) +{ + TODO(); + return; +} + +static __inline struct ieee80211_key_conf * +ieee80211_gtk_rekey_add(struct ieee80211_vif *vif, + struct ieee80211_key_conf *key) +{ + TODO(); + return (NULL); +} + +static __inline void +ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const uint8_t *bssid, + const uint8_t *replay_ctr, gfp_t gfp) +{ + TODO(); + return; +} + +static __inline void +ieee80211_remove_key(struct ieee80211_key_conf *key) +{ + TODO(); + return; +} + +static __inline void +ieee80211_set_key_rx_seq(struct ieee80211_key_conf *key, int tid, + struct ieee80211_key_seq *seq) +{ + TODO(); + return; +} + +static __inline void +ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif, + struct cfg80211_wowlan_wakeup *wakeup, gfp_t gfp) +{ + TODO(); + return; +} + #define ieee80211_send_bar(_v, _r, _t, _s) \ linuxkpi_ieee80211_send_bar(_v, _r, _t, _s) |