diff options
| author | Yogesh Ashok Powar <yogeshp@marvell.com> | 2011-05-13 14:22:31 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2011-05-16 14:10:50 -0400 |
| commit | 8b3becadc82de3b87a5c196239db3fef6caa9c82 (patch) | |
| tree | d71a3c7e29d30c92c4b677257c289ca63b4e65f3 | |
| parent | 57cf8043a64b56a10b9f194572548a3dfb62e596 (diff) | |
cfg80211: make stripping of 802.11 header optional from AMSDU
Currently the devices that have already stripped IEEE 802.11
header from the AMSDU SKB can not use ieee80211_amsdu_to_8023s
routine. This patch enhances ieee80211_amsdu_to_8023s() API by
changing mandatory removing of IEEE 802.11 header from AMSDU
to optional.
Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/iwmc3200wifi/rx.c | 3 | ||||
| -rw-r--r-- | include/net/cfg80211.h | 4 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 2 | ||||
| -rw-r--r-- | net/wireless/util.c | 21 |
4 files changed, 19 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwmc3200wifi/rx.c b/drivers/net/wireless/iwmc3200wifi/rx.c index 9a57cf6a488f..5665a1a9b99e 100644 --- a/drivers/net/wireless/iwmc3200wifi/rx.c +++ b/drivers/net/wireless/iwmc3200wifi/rx.c | |||
| @@ -1576,7 +1576,8 @@ static void iwm_rx_process_amsdu(struct iwm_priv *iwm, struct sk_buff *skb) | |||
| 1576 | IWM_HEXDUMP(iwm, DBG, RX, "A-MSDU: ", skb->data, skb->len); | 1576 | IWM_HEXDUMP(iwm, DBG, RX, "A-MSDU: ", skb->data, skb->len); |
| 1577 | 1577 | ||
| 1578 | __skb_queue_head_init(&list); | 1578 | __skb_queue_head_init(&list); |
| 1579 | ieee80211_amsdu_to_8023s(skb, &list, ndev->dev_addr, wdev->iftype, 0); | 1579 | ieee80211_amsdu_to_8023s(skb, &list, ndev->dev_addr, wdev->iftype, 0, |
| 1580 | true); | ||
| 1580 | 1581 | ||
| 1581 | while ((frame = __skb_dequeue(&list))) { | 1582 | while ((frame = __skb_dequeue(&list))) { |
| 1582 | ndev->stats.rx_packets++; | 1583 | ndev->stats.rx_packets++; |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 0a2d795d35de..bfd6557946be 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -2237,10 +2237,12 @@ int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr, | |||
| 2237 | * @addr: The device MAC address. | 2237 | * @addr: The device MAC address. |
| 2238 | * @iftype: The device interface type. | 2238 | * @iftype: The device interface type. |
| 2239 | * @extra_headroom: The hardware extra headroom for SKBs in the @list. | 2239 | * @extra_headroom: The hardware extra headroom for SKBs in the @list. |
| 2240 | * @has_80211_header: Set it true if SKB is with IEEE 802.11 header. | ||
| 2240 | */ | 2241 | */ |
| 2241 | void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, | 2242 | void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, |
| 2242 | const u8 *addr, enum nl80211_iftype iftype, | 2243 | const u8 *addr, enum nl80211_iftype iftype, |
| 2243 | const unsigned int extra_headroom); | 2244 | const unsigned int extra_headroom, |
| 2245 | bool has_80211_header); | ||
| 2244 | 2246 | ||
| 2245 | /** | 2247 | /** |
| 2246 | * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame | 2248 | * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 3a9515cb7ce1..78c72a41d864 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -1783,7 +1783,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) | |||
| 1783 | 1783 | ||
| 1784 | ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, | 1784 | ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, |
| 1785 | rx->sdata->vif.type, | 1785 | rx->sdata->vif.type, |
| 1786 | rx->local->hw.extra_tx_headroom); | 1786 | rx->local->hw.extra_tx_headroom, true); |
| 1787 | 1787 | ||
| 1788 | while (!skb_queue_empty(&frame_list)) { | 1788 | while (!skb_queue_empty(&frame_list)) { |
| 1789 | rx->skb = __skb_dequeue(&frame_list); | 1789 | rx->skb = __skb_dequeue(&frame_list); |
diff --git a/net/wireless/util.c b/net/wireless/util.c index 95e4e254da0a..f0536d44d43c 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
| @@ -544,7 +544,8 @@ EXPORT_SYMBOL(ieee80211_data_from_8023); | |||
| 544 | 544 | ||
| 545 | void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, | 545 | void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, |
| 546 | const u8 *addr, enum nl80211_iftype iftype, | 546 | const u8 *addr, enum nl80211_iftype iftype, |
| 547 | const unsigned int extra_headroom) | 547 | const unsigned int extra_headroom, |
| 548 | bool has_80211_header) | ||
| 548 | { | 549 | { |
| 549 | struct sk_buff *frame = NULL; | 550 | struct sk_buff *frame = NULL; |
| 550 | u16 ethertype; | 551 | u16 ethertype; |
| @@ -553,14 +554,18 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, | |||
| 553 | int remaining, err; | 554 | int remaining, err; |
| 554 | u8 dst[ETH_ALEN], src[ETH_ALEN]; | 555 | u8 dst[ETH_ALEN], src[ETH_ALEN]; |
| 555 | 556 | ||
| 556 | err = ieee80211_data_to_8023(skb, addr, iftype); | 557 | if (has_80211_header) { |
| 557 | if (err) | 558 | err = ieee80211_data_to_8023(skb, addr, iftype); |
| 558 | goto out; | 559 | if (err) |
| 560 | goto out; | ||
| 559 | 561 | ||
| 560 | /* skip the wrapping header */ | 562 | /* skip the wrapping header */ |
| 561 | eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr)); | 563 | eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr)); |
| 562 | if (!eth) | 564 | if (!eth) |
| 563 | goto out; | 565 | goto out; |
| 566 | } else { | ||
| 567 | eth = (struct ethhdr *) skb->data; | ||
| 568 | } | ||
| 564 | 569 | ||
| 565 | while (skb != frame) { | 570 | while (skb != frame) { |
| 566 | u8 padding; | 571 | u8 padding; |
