|
@@ -329,7 +329,7 @@ mwifiex_parse_mgmt_packet(struct mwifiex_private *priv, u8 *payload, u16 len,
|
|
|
struct rxpd *rx_pd)
|
|
|
{
|
|
|
u16 stype;
|
|
|
- u8 category, action_code;
|
|
|
+ u8 category, action_code, *addr2;
|
|
|
struct ieee80211_hdr *ieee_hdr = (void *)payload;
|
|
|
|
|
|
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,
|
|
|
switch (stype) {
|
|
|
case IEEE80211_STYPE_ACTION:
|
|
|
category = *(payload + sizeof(struct ieee80211_hdr));
|
|
|
- action_code = *(payload + sizeof(struct ieee80211_hdr) + 1);
|
|
|
- if (category == WLAN_CATEGORY_PUBLIC &&
|
|
|
- action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES) {
|
|
|
+ switch (category) {
|
|
|
+ case WLAN_CATEGORY_PUBLIC:
|
|
|
+ action_code = *(payload + sizeof(struct ieee80211_hdr)
|
|
|
+ + 1);
|
|
|
+ if (action_code == WLAN_PUB_ACTION_TDLS_DISCOVER_RES) {
|
|
|
+ addr2 = ieee_hdr->addr2;
|
|
|
+ mwifiex_dbg(priv->adapter, INFO,
|
|
|
+ "TDLS discovery response %pM nf=%d, snr=%d\n",
|
|
|
+ addr2, rx_pd->nf, rx_pd->snr);
|
|
|
+ mwifiex_auto_tdls_update_peer_signal(priv,
|
|
|
+ addr2,
|
|
|
+ rx_pd->snr,
|
|
|
+ rx_pd->nf);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case WLAN_CATEGORY_BACK:
|
|
|
+ /*we dont indicate BACK action frames to cfg80211*/
|
|
|
+ mwifiex_dbg(priv->adapter, INFO,
|
|
|
+ "drop BACK action frames");
|
|
|
+ return -1;
|
|
|
+ default:
|
|
|
mwifiex_dbg(priv->adapter, INFO,
|
|
|
- "TDLS discovery response %pM nf=%d, snr=%d\n",
|
|
|
- ieee_hdr->addr2, rx_pd->nf, rx_pd->snr);
|
|
|
- mwifiex_auto_tdls_update_peer_signal(priv,
|
|
|
- ieee_hdr->addr2,
|
|
|
- rx_pd->snr,
|
|
|
- rx_pd->nf);
|
|
|
+ "unknown public action frame category %d\n",
|
|
|
+ category);
|
|
|
}
|
|
|
- break;
|
|
|
default:
|
|
|
mwifiex_dbg(priv->adapter, INFO,
|
|
|
- "unknown mgmt frame subtype %#x\n", stype);
|
|
|
+ "unknown mgmt frame subtype %#x\n", stype);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -387,8 +401,9 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
|
|
|
|
|
|
ieee_hdr = (void *)skb->data;
|
|
|
if (ieee80211_is_mgmt(ieee_hdr->frame_control)) {
|
|
|
- mwifiex_parse_mgmt_packet(priv, (u8 *)ieee_hdr,
|
|
|
- pkt_len, rx_pd);
|
|
|
+ if (mwifiex_parse_mgmt_packet(priv, (u8 *)ieee_hdr,
|
|
|
+ pkt_len, rx_pd))
|
|
|
+ return -1;
|
|
|
}
|
|
|
/* Remove address4 */
|
|
|
memmove(skb->data + sizeof(struct ieee80211_hdr_3addr),
|