Merge tag 'vfio-v5.11-rc1' of git://github.com/awilliam/linux-vfio
[linux-2.6-microblaze.git] / net / mac80211 / mesh.c
index ce5825d..97095b7 100644 (file)
@@ -667,6 +667,35 @@ void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
        }
 }
 
+static void
+ieee80211_mesh_update_bss_params(struct ieee80211_sub_if_data *sdata,
+                                u8 *ie, u8 ie_len)
+{
+       struct ieee80211_supported_band *sband;
+       const u8 *cap;
+       const struct ieee80211_he_operation *he_oper = NULL;
+
+       sband = ieee80211_get_sband(sdata);
+       if (!sband)
+               return;
+
+       if (!ieee80211_get_he_iftype_cap(sband, NL80211_IFTYPE_MESH_POINT) ||
+           sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
+           sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
+           sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
+               return;
+
+       sdata->vif.bss_conf.he_support = true;
+
+       cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION, ie, ie_len);
+       if (cap && cap[1] >= ieee80211_he_oper_size(&cap[3]))
+               he_oper = (void *)(cap + 3);
+
+       if (he_oper)
+               sdata->vif.bss_conf.he_oper.params =
+                       __le32_to_cpu(he_oper->he_oper_params);
+}
+
 /**
  * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
  * @hdr:       802.11 frame header
@@ -943,6 +972,7 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
 
        bcn->tail_len = skb->len;
        memcpy(bcn->tail, skb->data, bcn->tail_len);
+       ieee80211_mesh_update_bss_params(sdata, bcn->tail, bcn->tail_len);
        bcn->meshconf = (struct ieee80211_meshconf_ie *)
                                        (bcn->tail + ifmsh->meshconf_offset);