aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mesh.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-06-10 04:21:30 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-14 15:38:17 -0400
commit35f20c14a103ca2c7062999e934a513b83d84de6 (patch)
tree780e5dd272b685d7b82fdd849b886553d203c430 /net/mac80211/mesh.c
parent2a419056c15478d2df3f3e9d4fa64e34eb1faa7d (diff)
mac80211: use common skb queue
IBSS, managed and mesh modes all have an skb queue, and in the future we want to also use it in other modes, so make them all use a common skb queue already. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
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 }