Changeset 36531


Ignore:
Timestamp:
2013-05-03T11:14:03+02:00 (5 years ago)
Author:
nbd
Message:

mac80211: merge a client mode channel switch handling fix

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-pending_work.patch

    r36530 r36531  
    14791479        if (!local->ops->channel_switch) { 
    14801480                /* call "hw_config" only if doing sw channel switch */ 
    1481 @@ -1054,56 +1013,193 @@ static void ieee80211_chswitch_timer(uns 
     1481@@ -1054,56 +1013,208 @@ static void ieee80211_chswitch_timer(uns 
    14821482        ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); 
    14831483 } 
     
    14881488-                                const struct ieee80211_channel_sw_ie *sw_elem, 
    14891489-                                struct ieee80211_bss *bss, u64 timestamp) 
    1490 +                                u64 timestamp, struct ieee802_11_elems *elems) 
     1490+                                u64 timestamp, struct ieee802_11_elems *elems, 
     1491+                                bool beacon) 
    14911492 { 
    14921493-       struct cfg80211_bss *cbss = 
     
    15101511+       const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; 
    15111512+       const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; 
     1513+       const struct ieee80211_ht_operation *ht_oper; 
    15121514+       int secondary_channel_offset = -1; 
    15131515  
     
    15161518-       if (!ifmgd->associated) 
    15171519+       if (!cbss) 
    1518                 return; 
    1519   
    1520 -       if (sdata->local->scanning) 
     1520+               return; 
     1521+ 
    15211522+       if (local->scanning) 
    15221523                return; 
    15231524  
     1525-       if (sdata->local->scanning) 
     1526+       /* disregard subsequent announcements if we are already processing */ 
     1527+       if (ifmgd->flags & IEEE80211_STA_CSA_RECEIVED) 
     1528                return; 
     1529  
    15241530-       /* Disregard subsequent beacons if we are already running a timer 
    15251531-          processing a CSA */ 
    1526 - 
    1527 +       /* disregard subsequent announcements if we are already processing */ 
    1528         if (ifmgd->flags & IEEE80211_STA_CSA_RECEIVED) 
    1529                 return; 
    1530   
    1531 -       new_ch = ieee80211_get_channel(sdata->local->hw.wiphy, new_freq); 
    1532 -       if (!new_ch || new_ch->flags & IEEE80211_CHAN_DISABLED) { 
    15331532+       sec_chan_offs = elems->sec_chan_offs; 
    15341533+       wide_bw_chansw_ie = elems->wide_bw_chansw_ie; 
     1534+       ht_oper = elems->ht_operation; 
    15351535+ 
    15361536+       if (ifmgd->flags & (IEEE80211_STA_DISABLE_HT | 
     
    15381538+               sec_chan_offs = NULL; 
    15391539+               wide_bw_chansw_ie = NULL; 
    1540 +       } 
    1541 + 
     1540+               /* only used for bandwidth here */ 
     1541+               ht_oper = NULL; 
     1542+       } 
     1543  
     1544-       if (ifmgd->flags & IEEE80211_STA_CSA_RECEIVED) 
    15421545+       if (ifmgd->flags & IEEE80211_STA_DISABLE_VHT) 
    15431546+               wide_bw_chansw_ie = NULL; 
     
    15631566+       } else { 
    15641567+               /* nothing here we understand */ 
    1565 +               return; 
     1568                return; 
    15661569+       } 
    15671570+ 
    15681571+       bss = (void *)cbss->priv; 
    1569 + 
     1572  
     1573-       new_ch = ieee80211_get_channel(sdata->local->hw.wiphy, new_freq); 
     1574-       if (!new_ch || new_ch->flags & IEEE80211_CHAN_DISABLED) { 
    15701575+       new_freq = ieee80211_channel_to_frequency(new_chan_no, new_band); 
    15711576+       new_chan = ieee80211_get_channel(sdata->local->hw.wiphy, new_freq); 
     
    15801585+       } 
    15811586+ 
    1582 +       if (sec_chan_offs) { 
     1587+       if (!beacon && sec_chan_offs) { 
    15831588+               secondary_channel_offset = sec_chan_offs->sec_chan_offs; 
     1589+       } else if (beacon && ht_oper) { 
     1590+               secondary_channel_offset = 
     1591+                       ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET; 
    15841592+       } else if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) { 
    1585 +               /* if HT is enabled and the IE not present, it's still HT */ 
     1593+               /* 
     1594+                * If it's not a beacon, HT is enabled and the IE not present, 
     1595+                * it's 20 MHz, 802.11-2012 8.5.2.6: 
     1596+                *      This element [the Secondary Channel Offset Element] is 
     1597+                *      present when switching to a 40 MHz channel. It may be 
     1598+                *      present when switching to a 20 MHz channel (in which 
     1599+                *      case the secondary channel offset is set to SCN). 
     1600+                */ 
    15861601+               secondary_channel_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE; 
    15871602+       } 
     
    16931708        } 
    16941709        chanctx = container_of(rcu_access_pointer(sdata->vif.chanctx_conf), 
    1695 @@ -1111,40 +1207,39 @@ ieee80211_sta_process_chanswitch(struct  
     1710@@ -1111,40 +1222,39 @@ ieee80211_sta_process_chanswitch(struct  
    16961711        if (chanctx->refcount > 1) { 
    16971712                sdata_info(sdata, 
     
    17481763  
    17491764 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, 
    1750 @@ -2120,7 +2215,6 @@ void ieee80211_beacon_loss(struct ieee80 
     1765@@ -2120,7 +2230,6 @@ void ieee80211_beacon_loss(struct ieee80 
    17511766  
    17521767        trace_api_beacon_loss(sdata); 
     
    17561771        ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); 
    17571772 } 
    1758 @@ -2170,7 +2264,7 @@ static void ieee80211_auth_challenge(str 
     1773@@ -2170,7 +2279,7 @@ static void ieee80211_auth_challenge(str 
    17591774        u32 tx_flags = 0; 
    17601775  
     
    17651780                return; 
    17661781        auth_data->expected_transaction = 4; 
    1767 @@ -2435,7 +2529,7 @@ static bool ieee80211_assoc_success(stru 
     1782@@ -2435,7 +2544,7 @@ static bool ieee80211_assoc_success(stru 
    17681783        } 
    17691784  
     
    17741789        if (!elems.supp_rates) { 
    17751790                sdata_info(sdata, "no SuppRates element in AssocResp\n"); 
    1776 @@ -2604,7 +2698,7 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee 
     1791@@ -2604,7 +2713,7 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee 
    17771792                   capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14)))); 
    17781793  
     
    17831798        if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY && 
    17841799            elems.timeout_int && 
    1785 @@ -2659,6 +2753,8 @@ static void ieee80211_rx_bss_info(struct 
     1800@@ -2659,6 +2768,8 @@ static void ieee80211_rx_bss_info(struct 
    17861801        struct ieee80211_channel *channel; 
    17871802        bool need_ps = false; 
     
    17921807             ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) || 
    17931808            (sdata->u.mgd.assoc_data && 
    1794 @@ -2689,7 +2785,8 @@ static void ieee80211_rx_bss_info(struct 
     1809@@ -2689,7 +2800,8 @@ static void ieee80211_rx_bss_info(struct 
    17951810        if (bss) 
    17961811                ieee80211_rx_bss_put(local, bss); 
     
    18021817  
    18031818        if (need_ps) { 
    1804 @@ -2698,10 +2795,8 @@ static void ieee80211_rx_bss_info(struct 
     1819@@ -2698,10 +2810,9 @@ static void ieee80211_rx_bss_info(struct 
    18051820                mutex_unlock(&local->iflist_mtx); 
    18061821        } 
     
    18101825-               ieee80211_sta_process_chanswitch(sdata, elems->ch_switch_ie, 
    18111826-                                                bss, rx_status->mactime); 
    1812 +       ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, elems); 
    1813 + 
    1814  } 
    1815   
    1816   
    1817 @@ -2726,7 +2821,7 @@ static void ieee80211_rx_mgmt_probe_resp 
     1827+       ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, 
     1828+                                        elems, true); 
     1829+ 
     1830 } 
     1831  
     1832  
     1833@@ -2726,7 +2837,7 @@ static void ieee80211_rx_mgmt_probe_resp 
    18181834                return; 
    18191835  
     
    18241840        ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); 
    18251841  
    1826 @@ -2809,7 +2904,7 @@ ieee80211_rx_mgmt_beacon(struct ieee8021 
     1842@@ -2809,7 +2920,7 @@ ieee80211_rx_mgmt_beacon(struct ieee8021 
    18271843        if (ifmgd->assoc_data && ifmgd->assoc_data->need_beacon && 
    18281844            ether_addr_equal(mgmt->bssid, ifmgd->assoc_data->bss->bssid)) { 
     
    18331849                ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); 
    18341850                ifmgd->assoc_data->have_beacon = true; 
    1835 @@ -2919,7 +3014,7 @@ ieee80211_rx_mgmt_beacon(struct ieee8021 
     1851@@ -2919,7 +3030,7 @@ ieee80211_rx_mgmt_beacon(struct ieee8021 
    18361852  
    18371853        ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4); 
     
    18421858  
    18431859        if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) { 
    1844 @@ -3066,6 +3161,8 @@ void ieee80211_sta_rx_queued_mgmt(struct 
     1860@@ -3066,6 +3177,8 @@ void ieee80211_sta_rx_queued_mgmt(struct 
    18451861        enum rx_mgmt_action rma = RX_MGMT_NONE; 
    18461862        u8 deauth_buf[IEEE80211_DEAUTH_FRAME_LEN]; 
     
    18511867        rx_status = (struct ieee80211_rx_status *) skb->cb; 
    18521868        mgmt = (struct ieee80211_mgmt *) skb->data; 
    1853 @@ -3095,14 +3192,48 @@ void ieee80211_sta_rx_queued_mgmt(struct 
     1869@@ -3095,14 +3208,48 @@ void ieee80211_sta_rx_queued_mgmt(struct 
    18541870                rma = ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, &bss); 
    18551871                break; 
     
    18781894-                       break; 
    18791895+                                                        rx_status->mactime, 
    1880 +                                                        &elems); 
     1896+                                                        &elems, false); 
    18811897+               } else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) { 
    18821898+                       ies_len = skb->len - 
     
    19001916+                       ieee80211_sta_process_chanswitch(sdata, 
    19011917+                                                        rx_status->mactime, 
    1902 +                                                        &elems); 
     1918+                                                        &elems, false); 
    19031919                } 
    19041920+               break; 
Note: See TracChangeset for help on using the changeset viewer.