Skip to content

Commit

Permalink
[PATCH] ieee80211: Make ieee80211_rx_any usable
Browse files Browse the repository at this point in the history
ieee80211_rx_any is new to 2.6.18-rc1, even though it appears this function
was never completed:

http://lists.sipsolutions.net/pipermail/softmac-dev/2006-February/000103.html

This patch changes ieee80211_rx_any to always claim the skb, which avoids
further driver complexity and the possibility of leaking management frames.
It also exports the function so that people can actually use it.

Signed-off-by: Daniel Drake <dsd@gentoo.org>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Daniel Drake authored and John W. Linville committed Jul 27, 2006
1 parent d7712ac commit f2060f0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 10 deletions.
2 changes: 2 additions & 0 deletions include/net/ieee80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,8 @@ extern int ieee80211_tx_frame(struct ieee80211_device *ieee,
int total_len, int encrypt_mpdu);

/* ieee80211_rx.c */
extern void ieee80211_rx_any(struct ieee80211_device *ieee,
struct sk_buff *skb, struct ieee80211_rx_stats *stats);
extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
struct ieee80211_rx_stats *rx_stats);
/* make sure to set stats->len */
Expand Down
38 changes: 28 additions & 10 deletions net/ieee80211/ieee80211_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -779,33 +779,44 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
return 0;
}

/* Filter out unrelated packets, call ieee80211_rx[_mgt] */
int ieee80211_rx_any(struct ieee80211_device *ieee,
/* Filter out unrelated packets, call ieee80211_rx[_mgt]
* This function takes over the skb, it should not be used again after calling
* this function. */
void ieee80211_rx_any(struct ieee80211_device *ieee,
struct sk_buff *skb, struct ieee80211_rx_stats *stats)
{
struct ieee80211_hdr_4addr *hdr;
int is_packet_for_us;
u16 fc;

if (ieee->iw_mode == IW_MODE_MONITOR)
return ieee80211_rx(ieee, skb, stats) ? 0 : -EINVAL;
if (ieee->iw_mode == IW_MODE_MONITOR) {
if (!ieee80211_rx(ieee, skb, stats))
dev_kfree_skb_irq(skb);
return;
}

if (skb->len < sizeof(struct ieee80211_hdr))
goto drop_free;

hdr = (struct ieee80211_hdr_4addr *)skb->data;
fc = le16_to_cpu(hdr->frame_ctl);

if ((fc & IEEE80211_FCTL_VERS) != 0)
return -EINVAL;
goto drop_free;

switch (fc & IEEE80211_FCTL_FTYPE) {
case IEEE80211_FTYPE_MGMT:
if (skb->len < sizeof(struct ieee80211_hdr_3addr))
goto drop_free;
ieee80211_rx_mgt(ieee, hdr, stats);
return 0;
dev_kfree_skb_irq(skb);
return;
case IEEE80211_FTYPE_DATA:
break;
case IEEE80211_FTYPE_CTL:
return 0;
return;
default:
return -EINVAL;
return;
}

is_packet_for_us = 0;
Expand Down Expand Up @@ -849,8 +860,14 @@ int ieee80211_rx_any(struct ieee80211_device *ieee,
}

if (is_packet_for_us)
return (ieee80211_rx(ieee, skb, stats) ? 0 : -EINVAL);
return 0;
if (!ieee80211_rx(ieee, skb, stats))
dev_kfree_skb_irq(skb);
return;

drop_free:
dev_kfree_skb_irq(skb);
ieee->stats.rx_dropped++;
return;
}

#define MGMT_FRAME_FIXED_PART_LENGTH 0x24
Expand Down Expand Up @@ -1730,5 +1747,6 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
}
}

EXPORT_SYMBOL_GPL(ieee80211_rx_any);
EXPORT_SYMBOL(ieee80211_rx_mgt);
EXPORT_SYMBOL(ieee80211_rx);

0 comments on commit f2060f0

Please sign in to comment.