aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/util.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-06-23 04:03:18 -0400
committerDavid S. Miller <davem@davemloft.net>2015-06-23 04:03:18 -0400
commitfa433354f042105fc7a299253f904bb48dae0950 (patch)
tree7dc747d4f994713699a37080b0774f8315a1e1ef /drivers/net/wireless/mwifiex/util.c
parent10ea5165e44ec8467e393a84ecfbf5732605d504 (diff)
parent40b503c76481aecf811a29a14a80c13b429b5e14 (diff)
Merge tag 'wireless-drivers-next-for-davem-2015-06-18' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== Major changes: mwifiex: * enhancements for AP mode: support verbose information in station dump command and also information about AP link. * enable power save by default brcmfmac: * fix module reload issue for PCIe * improving msgbuf protocol for PCIe devices * rework .get_station() cfg80211 callback operation * determine interface combinations upon device feature support ath9k: * ath9k_htc: add support of channel switch wil6210: * add modparam for bcast ring size * support hidden SSID * add per-MCS Rx stats ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/mwifiex/util.c')
-rw-r--r--drivers/net/wireless/mwifiex/util.c56
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 */
417int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb) 432int 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;