Search Linux Wireless

Re: [PATCH v2] mac80211: support radiotap vendor namespace RX data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/22/2012 09:40 AM, Wojciech Dubowik wrote:
On 11/22/2012 09:41 AM, Johannes Berg wrote:
On Thu, 2012-11-22 at 09:34 +0100, Johannes Berg wrote:
On Thu, 2012-11-22 at 09:22 +0100, Wojciech Dubowik wrote:
Shouldn't all functions between ieee80211_rx
and remove_monitor_info map header with
(struct ieee80211_hdr *)(skb->data + status->vendor_radiotap_len) ?

Otherwise function like should_drop_frame uses header mapped over
potential vendor data.
Huh, yes, how did I miss that. It only applies to should_drop_frame()
though, or do you see any other place?
So I think this is sufficient?
I guess so. I will test it today.
Wojtek
I have tested with ath9k vendor data and it doesn't seem to drop frames. I will post my patch as RFC
once I clean it up a bit. Just for reference.

Wojtek

johannes

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index ec15a49..ec87902 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -62,13 +62,16 @@ static struct sk_buff *remove_monitor_info(struct ieee80211_local *local, static inline int should_drop_frame(struct sk_buff *skb, int present_fcs_len)
  {
      struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
-    struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+    struct ieee80211_hdr *hdr;
+
+    hdr = (void *)(skb->data + status->vendor_radiotap_len);
        if (status->flag & (RX_FLAG_FAILED_FCS_CRC |
                  RX_FLAG_FAILED_PLCP_CRC |
                  RX_FLAG_AMPDU_IS_ZEROLEN))
          return 1;
-    if (unlikely(skb->len < 16 + present_fcs_len))
+    if (unlikely(skb->len < 16 + present_fcs_len +
+                status->vendor_radiotap_len))
          return 1;
      if (ieee80211_is_ctl(hdr->frame_control) &&
          !ieee80211_is_pspoll(hdr->frame_control) &&
@@ -341,8 +344,8 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
      if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
          present_fcs_len = FCS_LEN;
  -    /* make sure hdr->frame_control is on the linear part */
-    if (!pskb_may_pull(origskb, 2)) {
+ /* ensure hdr->frame_control and vendor radiotap data are in skb head */
+    if (!pskb_may_pull(origskb, 2 + status->vendor_radiotap_len)) {
          dev_kfree_skb(origskb);
          return NULL;
      }



--
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

--
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


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux