Now the logic is obvious - if skb not handled by pkt type and not handled by frame control it is handled by vif type and then released Signed-off-by: Alex Briskin <br.shurik@xxxxxxxxx> --- net/mac80211/iface.c | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 41c3bd0..76e8c6a 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -1324,6 +1324,27 @@ static bool ieee80211_is_handled_by_frame_control(struct sk_buff *skb, return true; } +static void ieee80211_handle_by_vif_type(struct sk_buff *skb, + struct ieee80211_sub_if_data *sdata) +{ + switch (sdata->vif.type) { + case NL80211_IFTYPE_STATION: + ieee80211_sta_rx_queued_mgmt(sdata, skb); + break; + case NL80211_IFTYPE_ADHOC: + ieee80211_ibss_rx_queued_mgmt(sdata, skb); + break; + case NL80211_IFTYPE_MESH_POINT: + if (!ieee80211_vif_is_mesh(&sdata->vif)) + break; + ieee80211_mesh_rx_queued_mgmt(sdata, skb); + break; + default: + WARN(1, "frame for unexpected interface type"); + break; + } +} + static void ieee80211_iface_work(struct work_struct *work) { struct ieee80211_sub_if_data *sdata = @@ -1343,28 +1364,11 @@ static void ieee80211_iface_work(struct work_struct *work) /* first process frames */ while ((skb = skb_dequeue(&sdata->skb_queue))) { - if (ieee80211_is_skb_handled_by_pkt_type(skb, sdata)) { - goto free_skb; - } else if (ieee80211_is_handled_by_frame_control(skb, sdata)) { - goto free_skb; - } else switch (sdata->vif.type) { - case NL80211_IFTYPE_STATION: - ieee80211_sta_rx_queued_mgmt(sdata, skb); - break; - case NL80211_IFTYPE_ADHOC: - ieee80211_ibss_rx_queued_mgmt(sdata, skb); - break; - case NL80211_IFTYPE_MESH_POINT: - if (!ieee80211_vif_is_mesh(&sdata->vif)) - break; - ieee80211_mesh_rx_queued_mgmt(sdata, skb); - break; - default: - WARN(1, "frame for unexpected interface type"); - break; + if (!ieee80211_is_skb_handled_by_pkt_type(skb, sdata) && + !ieee80211_is_handled_by_frame_control(skb, sdata)) { + ieee80211_handle_by_vif_type(skb, sdata); } -free_skb: kfree_skb(skb); } -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html