mac80211: parse wide bandwidth channel switch IE with workaround
[cascardo/linux.git] / net / mac80211 / spectmgmt.c
index 2ddc661..97f4c9d 100644 (file)
@@ -129,42 +129,31 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
        }
 
        if (wide_bw_chansw_ie) {
-               new_vht_chandef.chan = new_chan;
-               new_vht_chandef.center_freq1 =
-                       ieee80211_channel_to_frequency(
+               struct ieee80211_vht_operation vht_oper = {
+                       .chan_width =
+                               wide_bw_chansw_ie->new_channel_width,
+                       .center_freq_seg1_idx =
                                wide_bw_chansw_ie->new_center_freq_seg0,
-                               new_band);
-
-               switch (wide_bw_chansw_ie->new_channel_width) {
-               default:
-                       /* hmmm, ignore VHT and use HT if present */
-               case IEEE80211_VHT_CHANWIDTH_USE_HT:
+                       .center_freq_seg2_idx =
+                               wide_bw_chansw_ie->new_center_freq_seg1,
+                       /* .basic_mcs_set doesn't matter */
+               };
+
+               /* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
+                * to the previously parsed chandef
+                */
+               new_vht_chandef = csa_ie->chandef;
+
+               /* ignore if parsing fails */
+               if (!ieee80211_chandef_vht_oper(&vht_oper, &new_vht_chandef))
                        new_vht_chandef.chan = NULL;
-                       break;
-               case IEEE80211_VHT_CHANWIDTH_80MHZ:
-                       new_vht_chandef.width = NL80211_CHAN_WIDTH_80;
-                       break;
-               case IEEE80211_VHT_CHANWIDTH_160MHZ:
-                       new_vht_chandef.width = NL80211_CHAN_WIDTH_160;
-                       break;
-               case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
-                       /* field is otherwise reserved */
-                       new_vht_chandef.center_freq2 =
-                               ieee80211_channel_to_frequency(
-                                       wide_bw_chansw_ie->new_center_freq_seg1,
-                                       new_band);
-                       new_vht_chandef.width = NL80211_CHAN_WIDTH_80P80;
-                       break;
-               }
+
                if (sta_flags & IEEE80211_STA_DISABLE_80P80MHZ &&
                    new_vht_chandef.width == NL80211_CHAN_WIDTH_80P80)
                        ieee80211_chandef_downgrade(&new_vht_chandef);
                if (sta_flags & IEEE80211_STA_DISABLE_160MHZ &&
                    new_vht_chandef.width == NL80211_CHAN_WIDTH_160)
                        ieee80211_chandef_downgrade(&new_vht_chandef);
-               if (sta_flags & IEEE80211_STA_DISABLE_40MHZ &&
-                   new_vht_chandef.width > NL80211_CHAN_WIDTH_20)
-                       ieee80211_chandef_downgrade(&new_vht_chandef);
        }
 
        /* if VHT data is there validate & use it */