Hi, Apologies for the late review. I've applied patch 1, but not this one yet: > #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_2 0x10 > #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_3 0x18 > #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK 0x18 > +#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_SHIFT 3 this will not be needed, > -static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid, > +static void ieee80211_add_addbaext(struct ieee80211_sub_if_data *sdata, > + struct sk_buff *skb, > + const struct ieee80211_addba_ext_ie *req) > +{ > + struct ieee80211_supported_band *sband; > + struct ieee80211_addba_ext_ie *resp; > + const struct ieee80211_sta_he_cap *he_cap; > + u8 frag_level, cap_frag_level; > + u8 *pos; > + > + sband = ieee80211_get_sband(sdata); > + he_cap = ieee80211_get_he_iftype_cap(sband, sdata->vif.type); > + if (!he_cap) > + return; > + > + pos = skb_put_zero(skb, 2 + sizeof(struct ieee80211_addba_ext_ie)); > + *pos++ = WLAN_EID_ADDBA_EXT; > + *pos++ = sizeof(struct ieee80211_addba_ext_ie); > + resp = (struct ieee80211_addba_ext_ie *)pos; > + resp->data = req->data & IEEE80211_ADDBA_EXT_NO_FRAG; > + > + frag_level = (req->data & IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK) >> > + IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT; > + cap_frag_level = (he_cap->he_cap_elem.mac_cap_info[0] & > + IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK) >> > + IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_SHIFT; if you use u32_get_bits() from bitfield.h here for these two assignments, which is nicer anyway. > + if (frag_level > cap_frag_level) > + frag_level = cap_frag_level; > + resp->data |= (frag_level << IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT) & > + IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK; and probably that could also be u8_encode_bits()? > - skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom); > + skb = dev_alloc_skb(sizeof(*mgmt) + > + (addbaext ? 2 + sizeof(struct ieee80211_addba_ext_ie) : 0) + > + local->hw.extra_tx_headroom); not much point in the if (ternary operator) for ... 3 bytes? :-) johannes