From 3e83f7fca3d6f5da4536c41dfe0fb8f1d578e9d6 Mon Sep 17 00:00:00 2001 From: Mattias Nissler Date: Tue, 27 Nov 2007 21:50:26 +0100 Subject: [PATCH] --- yaml --- r: 79036 b: refs/heads/master c: 61af43c56bef2cfcb8f1d9aab4e766e0f7bdd893 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/rt2x00/rt2x00.h | 7 +++++++ trunk/drivers/net/wireless/rt2x00/rt2x00dev.c | 19 ++++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index ac76207830ee..32ced1a221f8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d28c2561fb09dcc0b47ae0ba12083cf0d988495f +refs/heads/master: 61af43c56bef2cfcb8f1d9aab4e766e0f7bdd893 diff --git a/trunk/drivers/net/wireless/rt2x00/rt2x00.h b/trunk/drivers/net/wireless/rt2x00/rt2x00.h index 103a122bc9c3..218068bf0ef8 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2x00.h +++ b/trunk/drivers/net/wireless/rt2x00/rt2x00.h @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -149,6 +150,12 @@ static inline int is_probe_resp(u16 fc) ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP)); } +static inline int is_beacon(u16 fc) +{ + return (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) && + ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON)); +} + /* * Chipset identification * The chipset on the device is composed of a RT and RF chip. diff --git a/trunk/drivers/net/wireless/rt2x00/rt2x00dev.c b/trunk/drivers/net/wireless/rt2x00/rt2x00dev.c index bd7b73824d0f..a771a092434b 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/trunk/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -526,11 +526,14 @@ void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb, struct rxdata_entry_desc *desc) { struct rt2x00_dev *rt2x00dev = entry->ring->rt2x00dev; + struct interface *intf = &rt2x00dev->interface; struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status; struct ieee80211_hw_mode *mode; struct ieee80211_rate *rate; + struct ieee80211_hdr *hdr; unsigned int i; int val = 0; + u16 fc; /* * Update RX statistics. @@ -555,7 +558,21 @@ void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb, } } - rt2x00lib_update_link_stats(&rt2x00dev->link, desc->rssi); + /* + * Only update link status if this is a beacon frame carrying our + * bssid. + */ + hdr = (struct ieee80211_hdr *) skb->data; + if (skb->len >= sizeof(struct ieee80211_hdr *)) { + fc = le16_to_cpu(hdr->frame_control); + if ((intf->type == IEEE80211_IF_TYPE_STA + || intf->type == IEEE80211_IF_TYPE_IBSS) + && is_beacon(fc) + && compare_ether_addr(hdr->addr3, intf->bssid) == 0) + rt2x00lib_update_link_stats(&rt2x00dev->link, + desc->rssi); + } + rt2x00dev->link.qual.rx_success++; rx_status->rate = val;