|
@@ -52,11 +52,14 @@ static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee,
|
|
netif_rx(skb);
|
|
netif_rx(skb);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/* Called only as a tasklet (software IRQ) */
|
|
/* Called only as a tasklet (software IRQ) */
|
|
-static struct ieee80211_frag_entry *
|
|
|
|
-ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
|
|
|
|
- unsigned int frag, u8 *src, u8 *dst)
|
|
|
|
|
|
+static struct ieee80211_frag_entry *ieee80211_frag_cache_find(struct
|
|
|
|
+ ieee80211_device
|
|
|
|
+ *ieee,
|
|
|
|
+ unsigned int seq,
|
|
|
|
+ unsigned int frag,
|
|
|
|
+ u8 * src,
|
|
|
|
+ u8 * dst)
|
|
{
|
|
{
|
|
struct ieee80211_frag_entry *entry;
|
|
struct ieee80211_frag_entry *entry;
|
|
int i;
|
|
int i;
|
|
@@ -65,10 +68,9 @@ ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
|
|
entry = &ieee->frag_cache[i];
|
|
entry = &ieee->frag_cache[i];
|
|
if (entry->skb != NULL &&
|
|
if (entry->skb != NULL &&
|
|
time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
|
|
time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
|
|
- IEEE80211_DEBUG_FRAG(
|
|
|
|
- "expiring fragment cache entry "
|
|
|
|
- "seq=%u last_frag=%u\n",
|
|
|
|
- entry->seq, entry->last_frag);
|
|
|
|
|
|
+ IEEE80211_DEBUG_FRAG("expiring fragment cache entry "
|
|
|
|
+ "seq=%u last_frag=%u\n",
|
|
|
|
+ entry->seq, entry->last_frag);
|
|
dev_kfree_skb_any(entry->skb);
|
|
dev_kfree_skb_any(entry->skb);
|
|
entry->skb = NULL;
|
|
entry->skb = NULL;
|
|
}
|
|
}
|
|
@@ -84,9 +86,8 @@ ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
|
|
}
|
|
}
|
|
|
|
|
|
/* Called only as a tasklet (software IRQ) */
|
|
/* Called only as a tasklet (software IRQ) */
|
|
-static struct sk_buff *
|
|
|
|
-ieee80211_frag_cache_get(struct ieee80211_device *ieee,
|
|
|
|
- struct ieee80211_hdr *hdr)
|
|
|
|
|
|
+static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee,
|
|
|
|
+ struct ieee80211_hdr *hdr)
|
|
{
|
|
{
|
|
struct sk_buff *skb = NULL;
|
|
struct sk_buff *skb = NULL;
|
|
u16 sc;
|
|
u16 sc;
|
|
@@ -101,9 +102,9 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
|
|
/* Reserve enough space to fit maximum frame length */
|
|
/* Reserve enough space to fit maximum frame length */
|
|
skb = dev_alloc_skb(ieee->dev->mtu +
|
|
skb = dev_alloc_skb(ieee->dev->mtu +
|
|
sizeof(struct ieee80211_hdr) +
|
|
sizeof(struct ieee80211_hdr) +
|
|
- 8 /* LLC */ +
|
|
|
|
- 2 /* alignment */ +
|
|
|
|
- 8 /* WEP */ + ETH_ALEN /* WDS */);
|
|
|
|
|
|
+ 8 /* LLC */ +
|
|
|
|
+ 2 /* alignment */ +
|
|
|
|
+ 8 /* WEP */ + ETH_ALEN /* WDS */ );
|
|
if (skb == NULL)
|
|
if (skb == NULL)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
@@ -135,7 +136,6 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
|
|
return skb;
|
|
return skb;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/* Called only as a tasklet (software IRQ) */
|
|
/* Called only as a tasklet (software IRQ) */
|
|
static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
|
|
static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
|
|
struct ieee80211_hdr *hdr)
|
|
struct ieee80211_hdr *hdr)
|
|
@@ -151,9 +151,8 @@ static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
|
|
hdr->addr1);
|
|
hdr->addr1);
|
|
|
|
|
|
if (entry == NULL) {
|
|
if (entry == NULL) {
|
|
- IEEE80211_DEBUG_FRAG(
|
|
|
|
- "could not invalidate fragment cache "
|
|
|
|
- "entry (seq=%u)\n", seq);
|
|
|
|
|
|
+ IEEE80211_DEBUG_FRAG("could not invalidate fragment cache "
|
|
|
|
+ "entry (seq=%u)\n", seq);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -161,7 +160,6 @@ static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
/* ieee80211_rx_frame_mgtmt
|
|
/* ieee80211_rx_frame_mgtmt
|
|
*
|
|
*
|
|
@@ -201,7 +199,7 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ieee->iw_mode == IW_MODE_MASTER) {
|
|
|
|
|
|
+ if (ieee->iw_mode == IW_MODE_MASTER) {
|
|
if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
|
|
if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
|
|
printk(KERN_DEBUG "%s: unknown management frame "
|
|
printk(KERN_DEBUG "%s: unknown management frame "
|
|
"(type=0x%02x, stype=0x%02x) dropped\n",
|
|
"(type=0x%02x, stype=0x%02x) dropped\n",
|
|
@@ -219,14 +217,13 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-
|
|
|
|
/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
|
|
/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
|
|
/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
|
|
/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
|
|
-static unsigned char rfc1042_header[] =
|
|
|
|
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
|
|
|
|
|
|
+static unsigned char rfc1042_header[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
|
|
|
|
+
|
|
/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
|
|
/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
|
|
static unsigned char bridge_tunnel_header[] =
|
|
static unsigned char bridge_tunnel_header[] =
|
|
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
|
|
|
|
|
|
+ { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
|
|
/* No encapsulation header if EtherType < 0x600 (=length) */
|
|
/* No encapsulation header if EtherType < 0x600 (=length) */
|
|
|
|
|
|
/* Called by ieee80211_rx_frame_decrypt */
|
|
/* Called by ieee80211_rx_frame_decrypt */
|
|
@@ -241,7 +238,7 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
|
|
if (skb->len < 24)
|
|
if (skb->len < 24)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
fc = le16_to_cpu(hdr->frame_ctl);
|
|
fc = le16_to_cpu(hdr->frame_ctl);
|
|
|
|
|
|
/* check that the frame is unicast frame to us */
|
|
/* check that the frame is unicast frame to us */
|
|
@@ -271,7 +268,7 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
|
|
|
|
|
|
/* Called only as a tasklet (software IRQ), by ieee80211_rx */
|
|
/* Called only as a tasklet (software IRQ), by ieee80211_rx */
|
|
static inline int
|
|
static inline int
|
|
-ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
|
|
|
|
|
|
+ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
struct ieee80211_crypt_data *crypt)
|
|
struct ieee80211_crypt_data *crypt)
|
|
{
|
|
{
|
|
struct ieee80211_hdr *hdr;
|
|
struct ieee80211_hdr *hdr;
|
|
@@ -280,12 +277,11 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
|
|
if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
|
|
if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
|
|
hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
|
|
|
|
|
|
#ifdef CONFIG_IEEE80211_CRYPT_TKIP
|
|
#ifdef CONFIG_IEEE80211_CRYPT_TKIP
|
|
- if (ieee->tkip_countermeasures &&
|
|
|
|
- strcmp(crypt->ops->name, "TKIP") == 0) {
|
|
|
|
|
|
+ if (ieee->tkip_countermeasures && strcmp(crypt->ops->name, "TKIP") == 0) {
|
|
if (net_ratelimit()) {
|
|
if (net_ratelimit()) {
|
|
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
|
|
printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
|
|
"received packet from " MAC_FMT "\n",
|
|
"received packet from " MAC_FMT "\n",
|
|
@@ -299,9 +295,8 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
|
|
res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
|
|
res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
|
|
atomic_dec(&crypt->refcnt);
|
|
atomic_dec(&crypt->refcnt);
|
|
if (res < 0) {
|
|
if (res < 0) {
|
|
- IEEE80211_DEBUG_DROP(
|
|
|
|
- "decryption failed (SA=" MAC_FMT
|
|
|
|
- ") res=%d\n", MAC_ARG(hdr->addr2), res);
|
|
|
|
|
|
+ IEEE80211_DEBUG_DROP("decryption failed (SA=" MAC_FMT
|
|
|
|
+ ") res=%d\n", MAC_ARG(hdr->addr2), res);
|
|
if (res == -2)
|
|
if (res == -2)
|
|
IEEE80211_DEBUG_DROP("Decryption failed ICV "
|
|
IEEE80211_DEBUG_DROP("Decryption failed ICV "
|
|
"mismatch (key %d)\n",
|
|
"mismatch (key %d)\n",
|
|
@@ -313,11 +308,11 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/* Called only as a tasklet (software IRQ), by ieee80211_rx */
|
|
/* Called only as a tasklet (software IRQ), by ieee80211_rx */
|
|
static inline int
|
|
static inline int
|
|
-ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb,
|
|
|
|
- int keyidx, struct ieee80211_crypt_data *crypt)
|
|
|
|
|
|
+ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device *ieee,
|
|
|
|
+ struct sk_buff *skb, int keyidx,
|
|
|
|
+ struct ieee80211_crypt_data *crypt)
|
|
{
|
|
{
|
|
struct ieee80211_hdr *hdr;
|
|
struct ieee80211_hdr *hdr;
|
|
int res, hdrlen;
|
|
int res, hdrlen;
|
|
@@ -325,7 +320,7 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s
|
|
if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
|
|
if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
|
|
hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
|
|
|
|
|
|
atomic_inc(&crypt->refcnt);
|
|
atomic_inc(&crypt->refcnt);
|
|
@@ -341,7 +336,6 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/* All received frames are sent to this function. @skb contains the frame in
|
|
/* All received frames are sent to this function. @skb contains the frame in
|
|
* IEEE 802.11 format, i.e., in the format it was sent over air.
|
|
* IEEE 802.11 format, i.e., in the format it was sent over air.
|
|
* This function is called only as a tasklet (software IRQ). */
|
|
* This function is called only as a tasklet (software IRQ). */
|
|
@@ -373,8 +367,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
stats = &ieee->stats;
|
|
stats = &ieee->stats;
|
|
|
|
|
|
if (skb->len < 10) {
|
|
if (skb->len < 10) {
|
|
- printk(KERN_INFO "%s: SKB length < 10\n",
|
|
|
|
- dev->name);
|
|
|
|
|
|
+ printk(KERN_INFO "%s: SKB length < 10\n", dev->name);
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -399,8 +392,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
/* Update spy records */
|
|
/* Update spy records */
|
|
wireless_spy_update(dev, hdr->addr2, &wstats);
|
|
wireless_spy_update(dev, hdr->addr2, &wstats);
|
|
}
|
|
}
|
|
-#endif /* IW_WIRELESS_SPY */
|
|
|
|
-#endif /* WIRELESS_EXT > 15 */
|
|
|
|
|
|
+#endif /* IW_WIRELESS_SPY */
|
|
|
|
+#endif /* WIRELESS_EXT > 15 */
|
|
hostap_update_rx_stats(local->ap, hdr, rx_stats);
|
|
hostap_update_rx_stats(local->ap, hdr, rx_stats);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -429,8 +422,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
* stations that do not support WEP key mapping). */
|
|
* stations that do not support WEP key mapping). */
|
|
|
|
|
|
if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
|
|
if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
|
|
- (void) hostap_handle_sta_crypto(local, hdr, &crypt,
|
|
|
|
- &sta);
|
|
|
|
|
|
+ (void)hostap_handle_sta_crypto(local, hdr, &crypt,
|
|
|
|
+ &sta);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* allow NULL decrypt to indicate an station specific override
|
|
/* allow NULL decrypt to indicate an station specific override
|
|
@@ -451,13 +444,11 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
if (type != WLAN_FC_TYPE_DATA) {
|
|
if (type != WLAN_FC_TYPE_DATA) {
|
|
if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH &&
|
|
if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH &&
|
|
fc & IEEE80211_FCTL_PROTECTED && ieee->host_decrypt &&
|
|
fc & IEEE80211_FCTL_PROTECTED && ieee->host_decrypt &&
|
|
- (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0)
|
|
|
|
- {
|
|
|
|
|
|
+ (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) {
|
|
printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth "
|
|
printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth "
|
|
"from " MAC_FMT "\n", dev->name,
|
|
"from " MAC_FMT "\n", dev->name,
|
|
MAC_ARG(hdr->addr2));
|
|
MAC_ARG(hdr->addr2));
|
|
@@ -507,9 +498,9 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
}
|
|
}
|
|
|
|
|
|
if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
|
|
if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
|
|
- (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS &&
|
|
|
|
- ieee->stadev &&
|
|
|
|
- memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
|
|
|
|
|
|
+ (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
|
|
|
|
+ IEEE80211_FCTL_FROMDS && ieee->stadev
|
|
|
|
+ && memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
|
|
/* Frame from BSSID of the AP for which we are a client */
|
|
/* Frame from BSSID of the AP for which we are a client */
|
|
skb->dev = dev = ieee->stadev;
|
|
skb->dev = dev = ieee->stadev;
|
|
stats = hostap_get_stats(dev);
|
|
stats = hostap_get_stats(dev);
|
|
@@ -521,8 +512,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
|
|
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
if ((ieee->iw_mode == IW_MODE_MASTER ||
|
|
if ((ieee->iw_mode == IW_MODE_MASTER ||
|
|
- ieee->iw_mode == IW_MODE_REPEAT) &&
|
|
|
|
- !from_assoc_ap) {
|
|
|
|
|
|
+ ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) {
|
|
switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
|
|
switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
|
|
wds != NULL)) {
|
|
wds != NULL)) {
|
|
case AP_RX_CONTINUE_NOT_AUTHORIZED:
|
|
case AP_RX_CONTINUE_NOT_AUTHORIZED:
|
|
@@ -546,11 +536,10 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
stype != IEEE80211_STYPE_DATA_CFPOLL &&
|
|
stype != IEEE80211_STYPE_DATA_CFPOLL &&
|
|
stype != IEEE80211_STYPE_DATA_CFACKPOLL) {
|
|
stype != IEEE80211_STYPE_DATA_CFACKPOLL) {
|
|
if (stype != IEEE80211_STYPE_NULLFUNC)
|
|
if (stype != IEEE80211_STYPE_NULLFUNC)
|
|
- IEEE80211_DEBUG_DROP(
|
|
|
|
- "RX: dropped data frame "
|
|
|
|
- "with no data (type=0x%02x, "
|
|
|
|
- "subtype=0x%02x, len=%d)\n",
|
|
|
|
- type, stype, skb->len);
|
|
|
|
|
|
+ IEEE80211_DEBUG_DROP("RX: dropped data frame "
|
|
|
|
+ "with no data (type=0x%02x, "
|
|
|
|
+ "subtype=0x%02x, len=%d)\n",
|
|
|
|
+ type, stype, skb->len);
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -560,7 +549,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
(keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
|
|
(keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
|
|
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
|
|
|
/* skb: hdr + (possibly fragmented) plaintext payload */
|
|
/* skb: hdr + (possibly fragmented) plaintext payload */
|
|
// PR: FIXME: hostap has additional conditions in the "if" below:
|
|
// PR: FIXME: hostap has additional conditions in the "if" below:
|
|
@@ -614,7 +603,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
/* this was the last fragment and the frame will be
|
|
/* this was the last fragment and the frame will be
|
|
* delivered, so remove skb from fragment cache */
|
|
* delivered, so remove skb from fragment cache */
|
|
skb = frag_skb;
|
|
skb = frag_skb;
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
ieee80211_frag_cache_invalidate(ieee, hdr);
|
|
ieee80211_frag_cache_invalidate(ieee, hdr);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -624,28 +613,26 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
|
|
ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
|
|
|
|
- hdr = (struct ieee80211_hdr *) skb->data;
|
|
|
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) {
|
|
if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) {
|
|
- if (/*ieee->ieee802_1x &&*/
|
|
|
|
- ieee80211_is_eapol_frame(ieee, skb)) {
|
|
|
|
|
|
+ if ( /*ieee->ieee802_1x && */
|
|
|
|
+ ieee80211_is_eapol_frame(ieee, skb)) {
|
|
/* pass unencrypted EAPOL frames even if encryption is
|
|
/* pass unencrypted EAPOL frames even if encryption is
|
|
* configured */
|
|
* configured */
|
|
} else {
|
|
} else {
|
|
- IEEE80211_DEBUG_DROP(
|
|
|
|
- "encryption configured, but RX "
|
|
|
|
- "frame not encrypted (SA=" MAC_FMT ")\n",
|
|
|
|
- MAC_ARG(hdr->addr2));
|
|
|
|
|
|
+ IEEE80211_DEBUG_DROP("encryption configured, but RX "
|
|
|
|
+ "frame not encrypted (SA=" MAC_FMT
|
|
|
|
+ ")\n", MAC_ARG(hdr->addr2));
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep &&
|
|
if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep &&
|
|
!ieee80211_is_eapol_frame(ieee, skb)) {
|
|
!ieee80211_is_eapol_frame(ieee, skb)) {
|
|
- IEEE80211_DEBUG_DROP(
|
|
|
|
- "dropped unencrypted RX data "
|
|
|
|
- "frame from " MAC_FMT
|
|
|
|
- " (drop_unencrypted=1)\n",
|
|
|
|
- MAC_ARG(hdr->addr2));
|
|
|
|
|
|
+ IEEE80211_DEBUG_DROP("dropped unencrypted RX data "
|
|
|
|
+ "frame from " MAC_FMT
|
|
|
|
+ " (drop_unencrypted=1)\n",
|
|
|
|
+ MAC_ARG(hdr->addr2));
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -673,8 +660,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
} else if (!frame_authorized) {
|
|
} else if (!frame_authorized) {
|
|
printk(KERN_DEBUG "%s: dropped frame from "
|
|
printk(KERN_DEBUG "%s: dropped frame from "
|
|
"unauthorized port (IEEE 802.1X): "
|
|
"unauthorized port (IEEE 802.1X): "
|
|
- "ethertype=0x%04x\n",
|
|
|
|
- dev->name, ethertype);
|
|
|
|
|
|
+ "ethertype=0x%04x\n", dev->name, ethertype);
|
|
goto rx_dropped;
|
|
goto rx_dropped;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -702,8 +688,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
|
|
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
|
|
if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
|
|
- IEEE80211_FCTL_TODS) &&
|
|
|
|
- skb->len >= ETH_HLEN + ETH_ALEN) {
|
|
|
|
|
|
+ IEEE80211_FCTL_TODS) && skb->len >= ETH_HLEN + ETH_ALEN) {
|
|
/* Non-standard frame: get addr4 from its bogus location after
|
|
/* Non-standard frame: get addr4 from its bogus location after
|
|
* the payload */
|
|
* the payload */
|
|
memcpy(skb->data + ETH_ALEN,
|
|
memcpy(skb->data + ETH_ALEN,
|
|
@@ -716,8 +701,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
stats->rx_bytes += skb->len;
|
|
stats->rx_bytes += skb->len;
|
|
|
|
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
- if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
|
|
|
|
- ieee->ap->bridge_packets) {
|
|
|
|
|
|
+ if (ieee->iw_mode == IW_MODE_MASTER && !wds && ieee->ap->bridge_packets) {
|
|
if (dst[0] & 0x01) {
|
|
if (dst[0] & 0x01) {
|
|
/* copy multicast frame both to the higher layers and
|
|
/* copy multicast frame both to the higher layers and
|
|
* to the wireless media */
|
|
* to the wireless media */
|
|
@@ -743,25 +727,24 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|
skb2->dev = dev;
|
|
skb2->dev = dev;
|
|
dev_queue_xmit(skb2);
|
|
dev_queue_xmit(skb2);
|
|
}
|
|
}
|
|
-
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
if (skb) {
|
|
if (skb) {
|
|
skb->protocol = eth_type_trans(skb, dev);
|
|
skb->protocol = eth_type_trans(skb, dev);
|
|
memset(skb->cb, 0, sizeof(skb->cb));
|
|
memset(skb->cb, 0, sizeof(skb->cb));
|
|
skb->dev = dev;
|
|
skb->dev = dev;
|
|
- skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
|
|
|
|
|
|
+ skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
|
|
netif_rx(skb);
|
|
netif_rx(skb);
|
|
}
|
|
}
|
|
|
|
|
|
- rx_exit:
|
|
|
|
|
|
+ rx_exit:
|
|
#ifdef NOT_YET
|
|
#ifdef NOT_YET
|
|
if (sta)
|
|
if (sta)
|
|
hostap_handle_sta_release(sta);
|
|
hostap_handle_sta_release(sta);
|
|
#endif
|
|
#endif
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
- rx_dropped:
|
|
|
|
|
|
+ rx_dropped:
|
|
stats->rx_dropped++;
|
|
stats->rx_dropped++;
|
|
|
|
|
|
/* Returning 0 indicates to caller that we have not handled the SKB--
|
|
/* Returning 0 indicates to caller that we have not handled the SKB--
|
|
@@ -785,22 +768,21 @@ static inline int ieee80211_is_ofdm_rate(u8 rate)
|
|
case IEEE80211_OFDM_RATE_54MB:
|
|
case IEEE80211_OFDM_RATE_54MB:
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
- return 0;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-static inline int ieee80211_network_init(
|
|
|
|
- struct ieee80211_device *ieee,
|
|
|
|
- struct ieee80211_probe_response *beacon,
|
|
|
|
- struct ieee80211_network *network,
|
|
|
|
- struct ieee80211_rx_stats *stats)
|
|
|
|
|
|
+static inline int ieee80211_network_init(struct ieee80211_device *ieee,
|
|
|
|
+ struct ieee80211_probe_response
|
|
|
|
+ *beacon,
|
|
|
|
+ struct ieee80211_network *network,
|
|
|
|
+ struct ieee80211_rx_stats *stats)
|
|
{
|
|
{
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
char rates_str[64];
|
|
char rates_str[64];
|
|
char *p;
|
|
char *p;
|
|
#endif
|
|
#endif
|
|
struct ieee80211_info_element *info_element;
|
|
struct ieee80211_info_element *info_element;
|
|
- u16 left;
|
|
|
|
|
|
+ u16 left;
|
|
u8 i;
|
|
u8 i;
|
|
|
|
|
|
/* Pull out fixed field data */
|
|
/* Pull out fixed field data */
|
|
@@ -810,7 +792,7 @@ static inline int ieee80211_network_init(
|
|
network->time_stamp[0] = beacon->time_stamp[0];
|
|
network->time_stamp[0] = beacon->time_stamp[0];
|
|
network->time_stamp[1] = beacon->time_stamp[1];
|
|
network->time_stamp[1] = beacon->time_stamp[1];
|
|
network->beacon_interval = beacon->beacon_interval;
|
|
network->beacon_interval = beacon->beacon_interval;
|
|
- /* Where to pull this? beacon->listen_interval;*/
|
|
|
|
|
|
+ /* Where to pull this? beacon->listen_interval; */
|
|
network->listen_interval = 0x0A;
|
|
network->listen_interval = 0x0A;
|
|
network->rates_len = network->rates_ex_len = 0;
|
|
network->rates_len = network->rates_ex_len = 0;
|
|
network->last_associate = 0;
|
|
network->last_associate = 0;
|
|
@@ -824,18 +806,20 @@ static inline int ieee80211_network_init(
|
|
} else
|
|
} else
|
|
network->flags |= NETWORK_HAS_CCK;
|
|
network->flags |= NETWORK_HAS_CCK;
|
|
|
|
|
|
- network->wpa_ie_len = 0;
|
|
|
|
- network->rsn_ie_len = 0;
|
|
|
|
|
|
+ network->wpa_ie_len = 0;
|
|
|
|
+ network->rsn_ie_len = 0;
|
|
|
|
|
|
- info_element = &beacon->info_element;
|
|
|
|
|
|
+ info_element = &beacon->info_element;
|
|
left = stats->len - ((void *)info_element - (void *)beacon);
|
|
left = stats->len - ((void *)info_element - (void *)beacon);
|
|
while (left >= sizeof(struct ieee80211_info_element_hdr)) {
|
|
while (left >= sizeof(struct ieee80211_info_element_hdr)) {
|
|
- if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) {
|
|
|
|
- IEEE80211_DEBUG_SCAN("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n",
|
|
|
|
- info_element->len + sizeof(struct ieee80211_info_element),
|
|
|
|
- left);
|
|
|
|
|
|
+ if (sizeof(struct ieee80211_info_element_hdr) +
|
|
|
|
+ info_element->len > left) {
|
|
|
|
+ IEEE80211_DEBUG_SCAN
|
|
|
|
+ ("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n",
|
|
|
|
+ info_element->len +
|
|
|
|
+ sizeof(struct ieee80211_info_element), left);
|
|
return 1;
|
|
return 1;
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
switch (info_element->id) {
|
|
switch (info_element->id) {
|
|
case MFIE_TYPE_SSID:
|
|
case MFIE_TYPE_SSID:
|
|
@@ -846,10 +830,11 @@ static inline int ieee80211_network_init(
|
|
}
|
|
}
|
|
|
|
|
|
network->ssid_len = min(info_element->len,
|
|
network->ssid_len = min(info_element->len,
|
|
- (u8)IW_ESSID_MAX_SIZE);
|
|
|
|
- memcpy(network->ssid, info_element->data, network->ssid_len);
|
|
|
|
- if (network->ssid_len < IW_ESSID_MAX_SIZE)
|
|
|
|
- memset(network->ssid + network->ssid_len, 0,
|
|
|
|
|
|
+ (u8) IW_ESSID_MAX_SIZE);
|
|
|
|
+ memcpy(network->ssid, info_element->data,
|
|
|
|
+ network->ssid_len);
|
|
|
|
+ if (network->ssid_len < IW_ESSID_MAX_SIZE)
|
|
|
|
+ memset(network->ssid + network->ssid_len, 0,
|
|
IW_ESSID_MAX_SIZE - network->ssid_len);
|
|
IW_ESSID_MAX_SIZE - network->ssid_len);
|
|
|
|
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n",
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n",
|
|
@@ -860,18 +845,23 @@ static inline int ieee80211_network_init(
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
p = rates_str;
|
|
p = rates_str;
|
|
#endif
|
|
#endif
|
|
- network->rates_len = min(info_element->len, MAX_RATES_LENGTH);
|
|
|
|
|
|
+ network->rates_len =
|
|
|
|
+ min(info_element->len, MAX_RATES_LENGTH);
|
|
for (i = 0; i < network->rates_len; i++) {
|
|
for (i = 0; i < network->rates_len; i++) {
|
|
network->rates[i] = info_element->data[i];
|
|
network->rates[i] = info_element->data[i];
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
- p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]);
|
|
|
|
|
|
+ p += snprintf(p,
|
|
|
|
+ sizeof(rates_str) - (p -
|
|
|
|
+ rates_str),
|
|
|
|
+ "%02X ", network->rates[i]);
|
|
#endif
|
|
#endif
|
|
- if (ieee80211_is_ofdm_rate(info_element->data[i])) {
|
|
|
|
|
|
+ if (ieee80211_is_ofdm_rate
|
|
|
|
+ (info_element->data[i])) {
|
|
network->flags |= NETWORK_HAS_OFDM;
|
|
network->flags |= NETWORK_HAS_OFDM;
|
|
if (info_element->data[i] &
|
|
if (info_element->data[i] &
|
|
IEEE80211_BASIC_RATE_MASK)
|
|
IEEE80211_BASIC_RATE_MASK)
|
|
network->flags &=
|
|
network->flags &=
|
|
- ~NETWORK_HAS_CCK;
|
|
|
|
|
|
+ ~NETWORK_HAS_CCK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -883,18 +873,23 @@ static inline int ieee80211_network_init(
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
p = rates_str;
|
|
p = rates_str;
|
|
#endif
|
|
#endif
|
|
- network->rates_ex_len = min(info_element->len, MAX_RATES_EX_LENGTH);
|
|
|
|
|
|
+ network->rates_ex_len =
|
|
|
|
+ min(info_element->len, MAX_RATES_EX_LENGTH);
|
|
for (i = 0; i < network->rates_ex_len; i++) {
|
|
for (i = 0; i < network->rates_ex_len; i++) {
|
|
network->rates_ex[i] = info_element->data[i];
|
|
network->rates_ex[i] = info_element->data[i];
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
- p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]);
|
|
|
|
|
|
+ p += snprintf(p,
|
|
|
|
+ sizeof(rates_str) - (p -
|
|
|
|
+ rates_str),
|
|
|
|
+ "%02X ", network->rates[i]);
|
|
#endif
|
|
#endif
|
|
- if (ieee80211_is_ofdm_rate(info_element->data[i])) {
|
|
|
|
|
|
+ if (ieee80211_is_ofdm_rate
|
|
|
|
+ (info_element->data[i])) {
|
|
network->flags |= NETWORK_HAS_OFDM;
|
|
network->flags |= NETWORK_HAS_OFDM;
|
|
if (info_element->data[i] &
|
|
if (info_element->data[i] &
|
|
IEEE80211_BASIC_RATE_MASK)
|
|
IEEE80211_BASIC_RATE_MASK)
|
|
network->flags &=
|
|
network->flags &=
|
|
- ~NETWORK_HAS_CCK;
|
|
|
|
|
|
+ ~NETWORK_HAS_CCK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -903,14 +898,14 @@ static inline int ieee80211_network_init(
|
|
break;
|
|
break;
|
|
|
|
|
|
case MFIE_TYPE_DS_SET:
|
|
case MFIE_TYPE_DS_SET:
|
|
- IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n",
|
|
|
|
|
|
+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n",
|
|
info_element->data[0]);
|
|
info_element->data[0]);
|
|
if (stats->freq == IEEE80211_24GHZ_BAND)
|
|
if (stats->freq == IEEE80211_24GHZ_BAND)
|
|
network->channel = info_element->data[0];
|
|
network->channel = info_element->data[0];
|
|
break;
|
|
break;
|
|
|
|
|
|
- case MFIE_TYPE_FH_SET:
|
|
|
|
- IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n");
|
|
|
|
|
|
+ case MFIE_TYPE_FH_SET:
|
|
|
|
+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n");
|
|
break;
|
|
break;
|
|
|
|
|
|
case MFIE_TYPE_CF_SET:
|
|
case MFIE_TYPE_CF_SET:
|
|
@@ -932,13 +927,13 @@ static inline int ieee80211_network_init(
|
|
case MFIE_TYPE_GENERIC:
|
|
case MFIE_TYPE_GENERIC:
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n",
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n",
|
|
info_element->len);
|
|
info_element->len);
|
|
- if (info_element->len >= 4 &&
|
|
|
|
|
|
+ if (info_element->len >= 4 &&
|
|
info_element->data[0] == 0x00 &&
|
|
info_element->data[0] == 0x00 &&
|
|
info_element->data[1] == 0x50 &&
|
|
info_element->data[1] == 0x50 &&
|
|
info_element->data[2] == 0xf2 &&
|
|
info_element->data[2] == 0xf2 &&
|
|
info_element->data[3] == 0x01) {
|
|
info_element->data[3] == 0x01) {
|
|
network->wpa_ie_len = min(info_element->len + 2,
|
|
network->wpa_ie_len = min(info_element->len + 2,
|
|
- MAX_WPA_IE_LEN);
|
|
|
|
|
|
+ MAX_WPA_IE_LEN);
|
|
memcpy(network->wpa_ie, info_element,
|
|
memcpy(network->wpa_ie, info_element,
|
|
network->wpa_ie_len);
|
|
network->wpa_ie_len);
|
|
}
|
|
}
|
|
@@ -948,7 +943,7 @@ static inline int ieee80211_network_init(
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n",
|
|
IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n",
|
|
info_element->len);
|
|
info_element->len);
|
|
network->rsn_ie_len = min(info_element->len + 2,
|
|
network->rsn_ie_len = min(info_element->len + 2,
|
|
- MAX_WPA_IE_LEN);
|
|
|
|
|
|
+ MAX_WPA_IE_LEN);
|
|
memcpy(network->rsn_ie, info_element,
|
|
memcpy(network->rsn_ie, info_element,
|
|
network->rsn_ie_len);
|
|
network->rsn_ie_len);
|
|
break;
|
|
break;
|
|
@@ -956,14 +951,14 @@ static inline int ieee80211_network_init(
|
|
default:
|
|
default:
|
|
IEEE80211_DEBUG_SCAN("unsupported IE %d\n",
|
|
IEEE80211_DEBUG_SCAN("unsupported IE %d\n",
|
|
info_element->id);
|
|
info_element->id);
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
left -= sizeof(struct ieee80211_info_element_hdr) +
|
|
left -= sizeof(struct ieee80211_info_element_hdr) +
|
|
- info_element->len;
|
|
|
|
|
|
+ info_element->len;
|
|
info_element = (struct ieee80211_info_element *)
|
|
info_element = (struct ieee80211_info_element *)
|
|
- &info_element->data[info_element->len];
|
|
|
|
- }
|
|
|
|
|
|
+ &info_element->data[info_element->len];
|
|
|
|
+ }
|
|
|
|
|
|
network->mode = 0;
|
|
network->mode = 0;
|
|
if (stats->freq == IEEE80211_52GHZ_BAND)
|
|
if (stats->freq == IEEE80211_52GHZ_BAND)
|
|
@@ -1032,10 +1027,13 @@ static inline void update_network(struct ieee80211_network *dst,
|
|
/* dst->last_associate is not overwritten */
|
|
/* dst->last_associate is not overwritten */
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void ieee80211_process_probe_response(
|
|
|
|
- struct ieee80211_device *ieee,
|
|
|
|
- struct ieee80211_probe_response *beacon,
|
|
|
|
- struct ieee80211_rx_stats *stats)
|
|
|
|
|
|
+static inline void ieee80211_process_probe_response(struct ieee80211_device
|
|
|
|
+ *ieee,
|
|
|
|
+ struct
|
|
|
|
+ ieee80211_probe_response
|
|
|
|
+ *beacon,
|
|
|
|
+ struct ieee80211_rx_stats
|
|
|
|
+ *stats)
|
|
{
|
|
{
|
|
struct ieee80211_network network;
|
|
struct ieee80211_network network;
|
|
struct ieee80211_network *target;
|
|
struct ieee80211_network *target;
|
|
@@ -1045,33 +1043,35 @@ static inline void ieee80211_process_probe_response(
|
|
#endif
|
|
#endif
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
- IEEE80211_DEBUG_SCAN(
|
|
|
|
- "'%s' (" MAC_FMT "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
|
|
|
|
- escape_essid(info_element->data, info_element->len),
|
|
|
|
- MAC_ARG(beacon->header.addr3),
|
|
|
|
- (beacon->capability & (1<<0xf)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0xe)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0xd)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0xc)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0xb)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0xa)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x9)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x8)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x7)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x6)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x5)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x4)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x3)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x2)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x1)) ? '1' : '0',
|
|
|
|
- (beacon->capability & (1<<0x0)) ? '1' : '0');
|
|
|
|
|
|
+ IEEE80211_DEBUG_SCAN("'%s' (" MAC_FMT
|
|
|
|
+ "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
|
|
|
|
+ escape_essid(info_element->data,
|
|
|
|
+ info_element->len),
|
|
|
|
+ MAC_ARG(beacon->header.addr3),
|
|
|
|
+ (beacon->capability & (1 << 0xf)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0xe)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0xd)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0xc)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0xb)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0xa)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x9)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x8)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x7)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x6)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x5)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x4)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x3)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x2)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x1)) ? '1' : '0',
|
|
|
|
+ (beacon->capability & (1 << 0x0)) ? '1' : '0');
|
|
|
|
|
|
if (ieee80211_network_init(ieee, beacon, &network, stats)) {
|
|
if (ieee80211_network_init(ieee, beacon, &network, stats)) {
|
|
IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n",
|
|
IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n",
|
|
escape_essid(info_element->data,
|
|
escape_essid(info_element->data,
|
|
info_element->len),
|
|
info_element->len),
|
|
MAC_ARG(beacon->header.addr3),
|
|
MAC_ARG(beacon->header.addr3),
|
|
- WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
|
|
|
|
|
|
+ WLAN_FC_GET_STYPE(beacon->header.
|
|
|
|
+ frame_ctl) ==
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
"PROBE RESPONSE" : "BEACON");
|
|
"PROBE RESPONSE" : "BEACON");
|
|
return;
|
|
return;
|
|
@@ -1117,13 +1117,13 @@ static inline void ieee80211_process_probe_response(
|
|
list_del(ieee->network_free_list.next);
|
|
list_del(ieee->network_free_list.next);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
#ifdef CONFIG_IEEE80211_DEBUG
|
|
IEEE80211_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n",
|
|
IEEE80211_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n",
|
|
escape_essid(network.ssid,
|
|
escape_essid(network.ssid,
|
|
network.ssid_len),
|
|
network.ssid_len),
|
|
MAC_ARG(network.bssid),
|
|
MAC_ARG(network.bssid),
|
|
- WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
|
|
|
|
|
|
+ WLAN_FC_GET_STYPE(beacon->header.
|
|
|
|
+ frame_ctl) ==
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
"PROBE RESPONSE" : "BEACON");
|
|
"PROBE RESPONSE" : "BEACON");
|
|
#endif
|
|
#endif
|
|
@@ -1134,7 +1134,8 @@ static inline void ieee80211_process_probe_response(
|
|
escape_essid(target->ssid,
|
|
escape_essid(target->ssid,
|
|
target->ssid_len),
|
|
target->ssid_len),
|
|
MAC_ARG(target->bssid),
|
|
MAC_ARG(target->bssid),
|
|
- WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
|
|
|
|
|
|
+ WLAN_FC_GET_STYPE(beacon->header.
|
|
|
|
+ frame_ctl) ==
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
IEEE80211_STYPE_PROBE_RESP ?
|
|
"PROBE RESPONSE" : "BEACON");
|
|
"PROBE RESPONSE" : "BEACON");
|
|
update_network(target, &network);
|
|
update_network(target, &network);
|
|
@@ -1162,16 +1163,20 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
|
|
IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
|
|
IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
|
|
WLAN_FC_GET_STYPE(header->frame_ctl));
|
|
WLAN_FC_GET_STYPE(header->frame_ctl));
|
|
IEEE80211_DEBUG_SCAN("Probe response\n");
|
|
IEEE80211_DEBUG_SCAN("Probe response\n");
|
|
- ieee80211_process_probe_response(
|
|
|
|
- ieee, (struct ieee80211_probe_response *)header, stats);
|
|
|
|
|
|
+ ieee80211_process_probe_response(ieee,
|
|
|
|
+ (struct
|
|
|
|
+ ieee80211_probe_response *)
|
|
|
|
+ header, stats);
|
|
break;
|
|
break;
|
|
|
|
|
|
case IEEE80211_STYPE_BEACON:
|
|
case IEEE80211_STYPE_BEACON:
|
|
IEEE80211_DEBUG_MGMT("received BEACON (%d)\n",
|
|
IEEE80211_DEBUG_MGMT("received BEACON (%d)\n",
|
|
WLAN_FC_GET_STYPE(header->frame_ctl));
|
|
WLAN_FC_GET_STYPE(header->frame_ctl));
|
|
IEEE80211_DEBUG_SCAN("Beacon\n");
|
|
IEEE80211_DEBUG_SCAN("Beacon\n");
|
|
- ieee80211_process_probe_response(
|
|
|
|
- ieee, (struct ieee80211_probe_response *)header, stats);
|
|
|
|
|
|
+ ieee80211_process_probe_response(ieee,
|
|
|
|
+ (struct
|
|
|
|
+ ieee80211_probe_response *)
|
|
|
|
+ header, stats);
|
|
break;
|
|
break;
|
|
|
|
|
|
default:
|
|
default:
|
|
@@ -1184,6 +1189,5 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
EXPORT_SYMBOL(ieee80211_rx_mgt);
|
|
EXPORT_SYMBOL(ieee80211_rx_mgt);
|
|
EXPORT_SYMBOL(ieee80211_rx);
|
|
EXPORT_SYMBOL(ieee80211_rx);
|