aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mesh.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/mesh.c')
-rw-r--r--net/mac80211/mesh.c14
1 files changed, 2 insertions, 12 deletions
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index bde81031727a..065533a37abe 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -537,15 +537,6 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
537 * it no longer is. 537 * it no longer is.
538 */ 538 */
539 cancel_work_sync(&sdata->u.mesh.work); 539 cancel_work_sync(&sdata->u.mesh.work);
540
541 /*
542 * When we get here, the interface is marked down.
543 * Call synchronize_rcu() to wait for the RX path
544 * should it be using the interface and enqueuing
545 * frames at this very time on another CPU.
546 */
547 rcu_barrier(); /* Wait for RX path and call_rcu()'s */
548 skb_queue_purge(&sdata->u.mesh.skb_queue);
549} 540}
550 541
551static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, 542static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
@@ -650,7 +641,7 @@ static void ieee80211_mesh_work(struct work_struct *work)
650 if (local->scanning) 641 if (local->scanning)
651 return; 642 return;
652 643
653 while ((skb = skb_dequeue(&ifmsh->skb_queue))) 644 while ((skb = skb_dequeue(&sdata->skb_queue)))
654 ieee80211_mesh_rx_queued_mgmt(sdata, skb); 645 ieee80211_mesh_rx_queued_mgmt(sdata, skb);
655 646
656 if (ifmsh->preq_queue_len && 647 if (ifmsh->preq_queue_len &&
@@ -690,7 +681,6 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
690 setup_timer(&ifmsh->housekeeping_timer, 681 setup_timer(&ifmsh->housekeeping_timer,
691 ieee80211_mesh_housekeeping_timer, 682 ieee80211_mesh_housekeeping_timer,
692 (unsigned long) sdata); 683 (unsigned long) sdata);
693 skb_queue_head_init(&sdata->u.mesh.skb_queue);
694 684
695 ifmsh->mshcfg.dot11MeshRetryTimeout = MESH_RET_T; 685 ifmsh->mshcfg.dot11MeshRetryTimeout = MESH_RET_T;
696 ifmsh->mshcfg.dot11MeshConfirmTimeout = MESH_CONF_T; 686 ifmsh->mshcfg.dot11MeshConfirmTimeout = MESH_CONF_T;
@@ -750,7 +740,7 @@ ieee80211_mesh_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
750 case IEEE80211_STYPE_ACTION: 740 case IEEE80211_STYPE_ACTION:
751 case IEEE80211_STYPE_PROBE_RESP: 741 case IEEE80211_STYPE_PROBE_RESP:
752 case IEEE80211_STYPE_BEACON: 742 case IEEE80211_STYPE_BEACON:
753 skb_queue_tail(&ifmsh->skb_queue, skb); 743 skb_queue_tail(&sdata->skb_queue, skb);
754 ieee80211_queue_work(&local->hw, &ifmsh->work); 744 ieee80211_queue_work(&local->hw, &ifmsh->work);
755 return RX_QUEUED; 745 return RX_QUEUED;
756 } 746 }