Skip to content

Commit 2dbaf75

Browse files
Stone Piaolinvjw
authored andcommitted
mwifiex: report received management frames to cfg80211
Process the management frames received from firmware and report them to cfg80211. Signed-off-by: Stone Piao <[email protected]> Signed-off-by: Kiran Divekar <[email protected]> Signed-off-by: Kevin Gan <[email protected]> Signed-off-by: Bing Zhao <[email protected]> Signed-off-by: John W. Linville <[email protected]>
1 parent 3cec687 commit 2dbaf75

File tree

6 files changed

+58
-0
lines changed

6 files changed

+58
-0
lines changed

drivers/net/wireless/mwifiex/fw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
9494
};
9595

9696
#define CAL_SNR(RSSI, NF) ((s16)((s16)(RSSI)-(s16)(NF)))
97+
#define CAL_RSSI(SNR, NF) ((s16)((s16)(SNR)+(s16)(NF)))
9798

9899
#define UAP_BSS_PARAMS_I 0
99100
#define UAP_CUSTOM_IE_I 1

drivers/net/wireless/mwifiex/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ static int mwifiex_init_priv(struct mwifiex_private *priv)
214214
priv->wps_ie = NULL;
215215
priv->wps_ie_len = 0;
216216
priv->ap_11n_enabled = 0;
217+
priv->mgmt_rx_freq = 2437;
217218

218219
priv->scan_block = false;
219220

drivers/net/wireless/mwifiex/main.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ struct mwifiex_private {
497497
struct timer_list scan_delay_timer;
498498
u8 ap_11n_enabled;
499499
u32 mgmt_frame_mask;
500+
u32 mgmt_rx_freq;
500501
};
501502

502503
enum mwifiex_ba_status {
@@ -741,6 +742,9 @@ int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
741742

742743
int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb);
743744

745+
int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
746+
struct sk_buff *skb);
747+
744748
int mwifiex_process_event(struct mwifiex_adapter *adapter);
745749

746750
int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,

drivers/net/wireless/mwifiex/sta_rx.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
174174
dev_err(adapter->dev, "Rx of A-MSDU failed");
175175
}
176176
return 0;
177+
} else if (rx_pkt_type == PKT_TYPE_MGMT) {
178+
ret = mwifiex_process_mgmt_packet(adapter, skb);
179+
if (ret)
180+
dev_err(adapter->dev, "Rx of mgmt packet failed");
181+
dev_kfree_skb_any(skb);
182+
return ret;
177183
}
178184

179185
/*

drivers/net/wireless/mwifiex/uap_txrx.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter,
217217
}
218218

219219
return 0;
220+
} else if (rx_pkt_type == PKT_TYPE_MGMT) {
221+
ret = mwifiex_process_mgmt_packet(adapter, skb);
222+
if (ret)
223+
dev_err(adapter->dev, "Rx of mgmt packet failed");
224+
dev_kfree_skb_any(skb);
225+
return ret;
220226
}
221227

222228
memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN);

drivers/net/wireless/mwifiex/util.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,46 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,
141141
return 0;
142142
}
143143

144+
/*
145+
* This function processes the received management packet and send it
146+
* to the kernel.
147+
*/
148+
int
149+
mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
150+
struct sk_buff *skb)
151+
{
152+
struct rxpd *rx_pd;
153+
struct mwifiex_private *priv;
154+
u16 pkt_len;
155+
156+
if (!skb)
157+
return -1;
158+
159+
rx_pd = (struct rxpd *)skb->data;
160+
priv = mwifiex_get_priv_by_id(adapter, rx_pd->bss_num, rx_pd->bss_type);
161+
if (!priv)
162+
return -1;
163+
164+
skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset));
165+
skb_pull(skb, sizeof(pkt_len));
166+
167+
pkt_len = le16_to_cpu(rx_pd->rx_pkt_length);
168+
169+
/* Remove address4 */
170+
memmove(skb->data + sizeof(struct ieee80211_hdr_3addr),
171+
skb->data + sizeof(struct ieee80211_hdr),
172+
pkt_len - sizeof(struct ieee80211_hdr));
173+
174+
pkt_len -= ETH_ALEN + sizeof(pkt_len);
175+
rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
176+
177+
cfg80211_rx_mgmt(priv->wdev, priv->mgmt_rx_freq,
178+
CAL_RSSI(rx_pd->snr, rx_pd->nf),
179+
skb->data, pkt_len, GFP_ATOMIC);
180+
181+
return 0;
182+
}
183+
144184
/*
145185
* This function processes the received packet before sending it to the
146186
* kernel.

0 commit comments

Comments
 (0)