diff options
Diffstat (limited to 'net/mac80211/mesh.c')
-rw-r--r-- | net/mac80211/mesh.c | 14 |
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 | ||
551 | static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | 542 | static 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 | } |