wireless: restrict to 32 legacy rates
[platform/kernel/linux-rpi.git] / net / mac80211 / mesh_plink.c
index 929ba54..a8bbdec 100644 (file)
@@ -93,7 +93,7 @@ static inline void mesh_plink_fsm_restart(struct sta_info *sta)
  *       on it in the lifecycle management section!
  */
 static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
-                                        u8 *hw_addr, u64 rates)
+                                        u8 *hw_addr, u32 rates)
 {
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
@@ -107,6 +107,7 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
 
        sta->flags = WLAN_STA_AUTHORIZED;
        sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
+       rate_control_rate_init(sta);
 
        return sta;
 }
@@ -217,11 +218,11 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
                memcpy(pos, &reason, 2);
        }
 
-       ieee80211_tx_skb(sdata, skb, 0);
+       ieee80211_tx_skb(sdata, skb, 1);
        return 0;
 }
 
-void mesh_neighbour_update(u8 *hw_addr, u64 rates, struct ieee80211_sub_if_data *sdata,
+void mesh_neighbour_update(u8 *hw_addr, u32 rates, struct ieee80211_sub_if_data *sdata,
                           bool peer_accepting_plinks)
 {
        struct ieee80211_local *local = sdata->local;
@@ -360,36 +361,6 @@ void mesh_plink_block(struct sta_info *sta)
        spin_unlock_bh(&sta->lock);
 }
 
-int mesh_plink_close(struct sta_info *sta)
-{
-       struct ieee80211_sub_if_data *sdata = sta->sdata;
-       __le16 llid, plid, reason;
-
-       mpl_dbg("Mesh plink: closing link with %pM\n", sta->sta.addr);
-       spin_lock_bh(&sta->lock);
-       sta->reason = cpu_to_le16(MESH_LINK_CANCELLED);
-       reason = sta->reason;
-
-       if (sta->plink_state == PLINK_LISTEN ||
-           sta->plink_state == PLINK_BLOCKED) {
-               mesh_plink_fsm_restart(sta);
-               spin_unlock_bh(&sta->lock);
-               return 0;
-       } else if (sta->plink_state == PLINK_ESTAB) {
-               __mesh_plink_deactivate(sta);
-               /* The timer should not be running */
-               mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
-       } else if (!mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata)))
-               sta->ignore_plink_timer = true;
-
-       sta->plink_state = PLINK_HOLDING;
-       llid = sta->llid;
-       plid = sta->plid;
-       spin_unlock_bh(&sta->lock);
-       mesh_plink_frame_tx(sta->sdata, PLINK_CLOSE, sta->sta.addr, llid,
-                           plid, reason);
-       return 0;
-}
 
 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_mgmt *mgmt,
                         size_t len, struct ieee80211_rx_status *rx_status)
@@ -476,7 +447,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
                spin_lock_bh(&sta->lock);
        } else if (!sta) {
                /* ftype == PLINK_OPEN */
-               u64 rates;
+               u32 rates;
                if (!mesh_plink_free_count(sdata)) {
                        mpl_dbg("Mesh plink error: no more free plinks\n");
                        rcu_read_unlock();