diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/util.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/util.c | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c index 370323a47ecb..790e61953abf 100644 --- a/drivers/net/wireless/mwifiex/util.c +++ b/drivers/net/wireless/mwifiex/util.c | |||
@@ -329,7 +329,7 @@ mwifiex_parse_mgmt_packet(struct mwifiex_private *priv, u8 *payload, u16 len, | |||
329 | struct rxpd *rx_pd) | 329 | struct rxpd *rx_pd) |
330 | { | 330 | { |
331 | u16 stype; | 331 | u16 stype; |
332 | u8 category, action_code; | 332 | u8 category, action_code, *addr2; |
333 | struct ieee80211_hdr *ieee_hdr = (void *)payload; | 333 | struct ieee80211_hdr *ieee_hdr = (void *)payload; |
334 | 334 | ||
335 | stype = (le16_to_cpu(ieee_hdr->frame_control) & IEEE80211_FCTL_STYPE); | 335 | stype = (le16_to_cpu(ieee_hdr->frame_control) & IEEE80211_FCTL_STYPE); |
@@ -337,21 +337,35 @@ mwifiex_parse_mgmt_packet(struct mwifiex_private *priv, u8 *payload, u16 len, | |||
337 | switch (stype) { | 337 | switch (stype) { |
338 | case IEEE80211_STYPE_ACTION: | 338 | case IEEE80211_STYPE_ACTION: |
339 | category = *(payload + sizeof(struct ieee80211_hdr)); | 339 | category = *(payload + sizeof(struct ieee80211_hdr)); |
340 | action_code = *(payload + sizeof(struct ieee80211_hdr) + 1); | 340 | switch (category) { |
341 | if (category == WLAN_CATEGORY_PUBLIC && | 341 | case WLAN_CATEGORY_PUBLIC: |
342 | action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES) { | 342 | action_code = *(payload + sizeof(struct ieee80211_hdr) |
343 | + 1); | ||
344 | if (action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES) { | ||
345 | addr2 = ieee_hdr->addr2; | ||
346 | mwifiex_dbg(priv->adapter, INFO, | ||
347 | "TDLS discovery response %pM nf=%d, snr=%d\n", | ||
348 | addr2, rx_pd->nf, rx_pd->snr); | ||
349 | mwifiex_auto_tdls_update_peer_signal(priv, | ||
350 | addr2, | ||
351 | rx_pd->snr, | ||
352 | rx_pd->nf); | ||
353 | } | ||
354 | break; | ||
355 | case WLAN_CATEGORY_BACK: | ||
356 | /*we dont indicate BACK action frames to cfg80211*/ | ||
357 | mwifiex_dbg(priv->adapter, INFO, | ||
358 | "drop BACK action frames"); | ||
359 | return -1; | ||
360 | default: | ||
343 | mwifiex_dbg(priv->adapter, INFO, | 361 | mwifiex_dbg(priv->adapter, INFO, |
344 | "TDLS discovery response %pM nf=%d, snr=%d\n", | 362 | "unknown public action frame category %d\n", |
345 | ieee_hdr->addr2, rx_pd->nf, rx_pd->snr); | 363 | category); |
346 | mwifiex_auto_tdls_update_peer_signal(priv, | ||
347 | ieee_hdr->addr2, | ||
348 | rx_pd->snr, | ||
349 | rx_pd->nf); | ||
350 | } | 364 | } |
351 | break; | ||
352 | default: | 365 | default: |
353 | mwifiex_dbg(priv->adapter, INFO, | 366 | mwifiex_dbg(priv->adapter, INFO, |
354 | "unknown mgmt frame subtype %#x\n", stype); | 367 | "unknown mgmt frame subtype %#x\n", stype); |
368 | return 0; | ||
355 | } | 369 | } |
356 | 370 | ||
357 | return 0; | 371 | return 0; |
@@ -387,8 +401,9 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv, | |||
387 | 401 | ||
388 | ieee_hdr = (void *)skb->data; | 402 | ieee_hdr = (void *)skb->data; |
389 | if (ieee80211_is_mgmt(ieee_hdr->frame_control)) { | 403 | if (ieee80211_is_mgmt(ieee_hdr->frame_control)) { |
390 | mwifiex_parse_mgmt_packet(priv, (u8 *)ieee_hdr, | 404 | if (mwifiex_parse_mgmt_packet(priv, (u8 *)ieee_hdr, |
391 | pkt_len, rx_pd); | 405 | pkt_len, rx_pd)) |
406 | return -1; | ||
392 | } | 407 | } |
393 | /* Remove address4 */ | 408 | /* Remove address4 */ |
394 | memmove(skb->data + sizeof(struct ieee80211_hdr_3addr), | 409 | memmove(skb->data + sizeof(struct ieee80211_hdr_3addr), |
@@ -416,12 +431,25 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv, | |||
416 | */ | 431 | */ |
417 | int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb) | 432 | int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb) |
418 | { | 433 | { |
434 | struct mwifiex_sta_node *src_node; | ||
435 | struct ethhdr *p_ethhdr; | ||
436 | |||
419 | if (!skb) | 437 | if (!skb) |
420 | return -1; | 438 | return -1; |
421 | 439 | ||
422 | priv->stats.rx_bytes += skb->len; | 440 | priv->stats.rx_bytes += skb->len; |
423 | priv->stats.rx_packets++; | 441 | priv->stats.rx_packets++; |
424 | 442 | ||
443 | if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) { | ||
444 | p_ethhdr = (void *)skb->data; | ||
445 | src_node = mwifiex_get_sta_entry(priv, p_ethhdr->h_source); | ||
446 | if (src_node) { | ||
447 | src_node->stats.last_rx = jiffies; | ||
448 | src_node->stats.rx_bytes += skb->len; | ||
449 | src_node->stats.rx_packets++; | ||
450 | } | ||
451 | } | ||
452 | |||
425 | skb->dev = priv->netdev; | 453 | skb->dev = priv->netdev; |
426 | skb->protocol = eth_type_trans(skb, priv->netdev); | 454 | skb->protocol = eth_type_trans(skb, priv->netdev); |
427 | skb->ip_summed = CHECKSUM_NONE; | 455 | skb->ip_summed = CHECKSUM_NONE; |