mwifiex: delete peer station's RA list upon deauthentication
authorAvinash Patil <patila@marvell.com>
Fri, 5 Dec 2014 17:53:40 +0000 (23:23 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 5 Dec 2014 19:15:25 +0000 (14:15 -0500)
This patch adds support to delete peer station's RA lists
upon station deautheticate event on AP interface. Patch also
decrements TX pending count upon removing packets from RA list.

Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/uap_event.c
drivers/net/wireless/mwifiex/wmm.c

index bdba37b7015d05802bb5683edd65e458995f06fd..e66993cb5daf185f32c9053ce30577678cd861a6 100644 (file)
@@ -975,6 +975,8 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
 int mwifiex_process_sta_event(struct mwifiex_private *);
 int mwifiex_process_uap_event(struct mwifiex_private *);
 void mwifiex_delete_all_station_list(struct mwifiex_private *priv);
+void mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv,
+                                 const u8 *ra_addr);
 void *mwifiex_process_sta_txpd(struct mwifiex_private *, struct sk_buff *skb);
 void *mwifiex_process_uap_txpd(struct mwifiex_private *, struct sk_buff *skb);
 int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta);
index 38390cb85a901bc6823e583df46a51834f6b9edc..c54a537e31fbd2daa33da36e4d08a665778cf8be 100644 (file)
@@ -110,6 +110,7 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv)
                        mwifiex_11n_del_rx_reorder_tbl_by_ta(priv, deauth_mac);
                        mwifiex_del_tx_ba_stream_tbl_by_ra(priv, deauth_mac);
                }
+               mwifiex_wmm_del_peer_ra_list(priv, deauth_mac);
                mwifiex_del_sta_entry(priv, deauth_mac);
                break;
        case EVENT_UAP_BSS_IDLE:
index dc1f2adfafc2b3e17bf21ffcc4f3bcf2f0e3da7a..0dafcb0d7eb1397b7bef48cbc9545c6a34515e78 100644 (file)
@@ -610,6 +610,32 @@ mwifiex_wmm_get_queue_raptr(struct mwifiex_private *priv, u8 tid,
        return mwifiex_wmm_get_ralist_node(priv, tid, ra_addr);
 }
 
+/*
+ * This function deletes RA list nodes for given mac for all TIDs.
+ * Function also decrements TX pending count accordingly.
+ */
+void
+mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv, const u8 *ra_addr)
+{
+       struct mwifiex_ra_list_tbl *ra_list;
+       unsigned long flags;
+       int i;
+
+       spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
+
+       for (i = 0; i < MAX_NUM_TID; ++i) {
+               ra_list = mwifiex_wmm_get_ralist_node(priv, i, ra_addr);
+
+               if (!ra_list)
+                       continue;
+               mwifiex_wmm_del_pkts_in_ralist_node(priv, ra_list);
+               atomic_sub(ra_list->total_pkt_count, &priv->wmm.tx_pkts_queued);
+               list_del(&ra_list->list);
+               kfree(ra_list);
+       }
+       spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
+}
+
 /*
  * This function checks if a particular RA list node exists in a given TID
  * table index.