1 /*****************************************************************************
3 * Copyright (c) 2012 - 2019 Samsung Electronics Co., Ltd. All rights reserved
5 ****************************************************************************/
6 #include <linux/etherdevice.h>
7 #include <linux/time.h>
18 #include "nl80211_vendor.h"
21 #include "scsc_wifilogger_rings.h"
24 #ifdef CONFIG_SCSC_LOG_COLLECTION
25 #include <scsc/scsc_log_collector.h>
28 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
29 #include "porting_imx.h"
31 struct ieee80211_channel
*slsi_find_scan_channel(struct slsi_dev
*sdev
, struct ieee80211_mgmt
*mgmt
, size_t mgmt_len
, u16 freq
)
33 int ielen
= mgmt_len
- (mgmt
->u
.beacon
.variable
- (u8
*)mgmt
);
34 const u8
*scan_ds
= cfg80211_find_ie(WLAN_EID_DS_PARAMS
, mgmt
->u
.beacon
.variable
, ielen
);
35 const u8
*scan_ht
= cfg80211_find_ie(WLAN_EID_HT_OPERATION
, mgmt
->u
.beacon
.variable
, ielen
);
38 /* Use the DS or HT channel where possible as the Offchannel results mean the RX freq is not reliable */
45 enum nl80211_band band
= NL80211_BAND_2GHZ
;
48 band
= NL80211_BAND_5GHZ
;
49 freq
= (u16
)ieee80211_channel_to_frequency(chan
, band
);
54 return ieee80211_get_channel(sdev
->wiphy
, freq
);
57 static struct ieee80211_mgmt
*slsi_rx_scan_update_ssid(struct slsi_dev
*sdev
, struct net_device
*dev
,
58 struct ieee80211_mgmt
*mgmt
, size_t mgmt_len
, size_t *new_len
,
61 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
69 if (!SLSI_IS_VIF_INDEX_WLAN(ndev_vif
))
72 /* update beacon, not probe response as probe response will always have actual ssid.*/
73 if (!ieee80211_is_beacon(mgmt
->frame_control
))
76 ssid
= cfg80211_find_ie(WLAN_EID_SSID
, mgmt
->u
.beacon
.variable
,
77 mgmt_len
- (mgmt
->u
.beacon
.variable
- (u8
*)mgmt
));
79 SLSI_WARN(sdev
, "beacon with NO SSID IE\n");
82 /* update beacon only if hidden ssid. So, Skip if not hidden ssid*/
83 if ((ssid
[1] > 0) && (ssid
[2] != '\0'))
86 band
= (freq
/ 1000) == 2 ? SLSI_FREQ_BAND_2GHZ
: SLSI_FREQ_BAND_5GHZ
;
88 /* check we have a known ssid for a bss */
89 for (i
= 0; i
< SLSI_SCAN_SSID_MAP_MAX
; i
++) {
90 if (SLSI_ETHER_EQUAL(sdev
->ssid_map
[i
].bssid
, mgmt
->bssid
) && (sdev
->ssid_map
[i
].band
== band
)) {
91 new_mgmt
= kmalloc(mgmt_len
+ 34, GFP_KERNEL
);
93 SLSI_ERR_NODEV("malloc failed(len:%ld)\n", mgmt_len
+ 34);
97 /* copy frame till ssid element */
98 memcpy(new_mgmt
, mgmt
, ssid
- (u8
*)mgmt
);
99 offset
= ssid
- (u8
*)mgmt
;
100 /* copy bss ssid into new frame */
101 new_mgmt
[offset
++] = WLAN_EID_SSID
;
102 new_mgmt
[offset
++] = sdev
->ssid_map
[i
].ssid_len
;
103 memcpy(new_mgmt
+ offset
, sdev
->ssid_map
[i
].ssid
, sdev
->ssid_map
[i
].ssid_len
);
104 offset
+= sdev
->ssid_map
[i
].ssid_len
;
105 /* copy rest of the frame following ssid */
106 mgmt_pos
= ssid
+ ssid
[1] + 2;
107 memcpy(new_mgmt
+ offset
, mgmt_pos
, mgmt_len
- (mgmt_pos
- (u8
*)mgmt
));
108 offset
+= mgmt_len
- (mgmt_pos
- (u8
*)mgmt
);
111 return (struct ieee80211_mgmt
*)new_mgmt
;
117 void slsi_rx_scan_pass_to_cfg80211(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
119 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
120 size_t mgmt_len
= fapi_get_mgmtlen(skb
);
121 s32 signal
= fapi_get_s16(skb
, u
.mlme_scan_ind
.rssi
) * 100;
122 u16 freq
= SLSI_FREQ_FW_TO_HOST(fapi_get_u16(skb
, u
.mlme_scan_ind
.channel_frequency
));
123 struct ieee80211_channel
*channel
= slsi_find_scan_channel(sdev
, mgmt
, mgmt_len
, freq
);
124 struct timespec uptime
;
126 get_monotonic_boottime(&uptime
);
127 SLSI_UNUSED_PARAMETER(dev
);
129 /* update timestamp with device uptime in micro sec */
130 mgmt
->u
.beacon
.timestamp
= (uptime
.tv_sec
* 1000000) + (uptime
.tv_nsec
/ 1000);
133 struct cfg80211_bss
*bss
;
134 struct ieee80211_mgmt
*mgmt_new
;
135 size_t mgmt_new_len
= 0;
137 mgmt_new
= slsi_rx_scan_update_ssid(sdev
, dev
, mgmt
, mgmt_len
, &mgmt_new_len
, freq
);
139 bss
= cfg80211_inform_bss_frame(sdev
->wiphy
, channel
, mgmt_new
, mgmt_new_len
, signal
, GFP_KERNEL
);
141 bss
= cfg80211_inform_bss_frame(sdev
->wiphy
, channel
, mgmt
, mgmt_len
, signal
, GFP_KERNEL
);
143 slsi_cfg80211_put_bss(sdev
->wiphy
, bss
);
146 SLSI_NET_DBG1(dev
, SLSI_MLME
, "No Channel info found for freq:%d\n", freq
);
152 static int slsi_add_to_scan_list(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
,
153 struct sk_buff
*skb
, const u8
*scan_ssid
, u16 scan_id
)
155 struct slsi_scan_result
*head
;
156 struct slsi_scan_result
*scan_result
, *current_result
, *prev
= NULL
;
157 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
158 bool found
= 0, skb_stored
= 0;
159 int current_rssi
, current_band
;
161 SLSI_MUTEX_LOCK(ndev_vif
->scan_result_mutex
);
162 head
= ndev_vif
->scan
[scan_id
].scan_results
;
164 current_rssi
= fapi_get_s16(skb
, u
.mlme_scan_ind
.rssi
);
165 current_band
= (fapi_get_s16(skb
,
166 u
.mlme_scan_ind
.channel_frequency
) /
167 2000) == 2 ? SLSI_FREQ_BAND_2GHZ
: SLSI_FREQ_BAND_5GHZ
;
169 while (scan_result
) {
170 if (SLSI_ETHER_EQUAL(scan_result
->bssid
, mgmt
->bssid
) && (scan_result
->band
== current_band
)) {
171 /*entry exists for bssid*/
172 if (!scan_result
->probe_resp
&& ieee80211_is_probe_resp(mgmt
->frame_control
)) {
173 scan_result
->probe_resp
= skb
;
175 } else if (!scan_result
->beacon
&& ieee80211_is_beacon(mgmt
->frame_control
)) {
176 scan_result
->beacon
= skb
;
178 if (!scan_ssid
|| !scan_ssid
[1] || scan_ssid
[2] == '\0')
179 scan_result
->hidden
= 1;
182 /* Use the best RSSI value from all beacons/probe resp for a bssid. If no improvment
183 * in RSSI and beacon and probe response exist, ignore this result
185 if (current_rssi
< scan_result
->rssi
) {
188 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
192 scan_result
->rssi
= current_rssi
;
194 if (ieee80211_is_beacon(mgmt
->frame_control
)) {
195 slsi_kfree_skb(scan_result
->beacon
);
196 scan_result
->beacon
= skb
;
198 slsi_kfree_skb(scan_result
->probe_resp
);
199 scan_result
->probe_resp
= skb
;
203 /*No change in position if rssi is still less than prev node*/
204 if (!prev
|| (prev
->rssi
> current_rssi
)) {
205 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
209 /*remove and re-insert*/
211 prev
->next
= scan_result
->next
;
212 scan_result
->next
= NULL
;
213 current_result
= scan_result
;
219 scan_result
= scan_result
->next
;
224 current_result
= kzalloc(sizeof(*current_result
), GFP_KERNEL
);
225 if (!current_result
) {
226 SLSI_ERR(sdev
, "Failed to allocate node for scan result\n");
227 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
230 SLSI_ETHER_COPY(current_result
->bssid
, mgmt
->bssid
);
232 current_result
->rssi
= current_rssi
;
233 current_result
->band
= current_band
;
234 if (ieee80211_is_beacon(mgmt
->frame_control
)) {
235 current_result
->beacon
= skb
;
236 if (!scan_ssid
|| !scan_ssid
[1] || scan_ssid
[2] == '\0')
237 current_result
->hidden
= 1;
239 current_result
->probe_resp
= skb
;
241 current_result
->next
= NULL
;
243 if (!head
) { /*first node*/
244 ndev_vif
->scan
[scan_id
].scan_results
= current_result
;
245 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
252 /* insert based on rssi in descending order*/
253 while (scan_result
) {
254 if (current_result
->rssi
> scan_result
->rssi
) {
255 current_result
->next
= scan_result
;
257 prev
->next
= current_result
;
259 ndev_vif
->scan
[scan_id
].scan_results
= current_result
;
263 scan_result
= scan_result
->next
;
266 /*insert at the end*/
267 prev
->next
= current_result
;
268 current_result
->next
= NULL
;
271 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
275 static int slsi_add_to_p2p_scan_list(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
,
276 struct sk_buff
*skb
, u16 scan_id
)
278 struct slsi_scan_result
*current_result
;
279 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
280 struct slsi_scan
*scan
;
283 current_result
= kzalloc(sizeof(*current_result
), GFP_KERNEL
);
284 if (!current_result
) {
285 SLSI_ERR(sdev
, "Failed to allocate node for scan result\n");
288 SLSI_ETHER_COPY(current_result
->bssid
, mgmt
->bssid
);
290 SLSI_MUTEX_LOCK(ndev_vif
->scan_result_mutex
);
291 scan
= &ndev_vif
->scan
[scan_id
];
292 if (ieee80211_is_beacon(mgmt
->frame_control
))
293 current_result
->beacon
= skb
;
295 current_result
->probe_resp
= skb
;
297 if (!scan
->scan_results
) {
298 scan
->scan_results
= current_result
;
299 current_result
->next
= NULL
;
301 current_result
->next
= scan
->scan_results
;
302 scan
->scan_results
= current_result
;
304 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
309 void slsi_rx_scan_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
311 u16 scan_id
= fapi_get_u16(skb
, u
.mlme_scan_ind
.scan_id
);
312 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
313 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
314 size_t mgmt_len
= fapi_get_mgmtlen(skb
);
315 size_t ie_len
= mgmt_len
- offsetof(struct ieee80211_mgmt
, u
.probe_resp
.variable
);
316 const u8
*scan_ssid
= NULL
;
318 #ifdef CONFIG_SCSC_WLAN_GSCAN_ENABLE
319 if (slsi_is_gscan_id(scan_id
)) {
320 SLSI_NET_DBG3(dev
, SLSI_GSCAN
, "scan_id:%#x bssid:%pM\n", scan_id
, fapi_get_mgmt(skb
)->bssid
);
321 SLSI_MUTEX_LOCK(ndev_vif
->scan_mutex
);
322 slsi_gscan_handle_scan_result(sdev
, dev
, skb
, scan_id
, false);
323 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_mutex
);
328 scan_ssid
= cfg80211_find_ie(WLAN_EID_SSID
, mgmt
->u
.probe_resp
.variable
, ie_len
);
330 if (sdev
->p2p_certif
&& (ndev_vif
->iftype
== NL80211_IFTYPE_P2P_CLIENT
) && (scan_id
== (ndev_vif
->ifnum
<< 8 | SLSI_SCAN_HW_ID
))) {
331 /* When supplicant receives a peer GO probe response with selected registrar set and group capability as 0,
332 * which is invalid, it is unable to store persistent network block. Hence such probe response is getting ignored here.
333 * This is mainly for an inter-op with Realtek P2P GO in P2P certification
335 if (scan_ssid
&& scan_ssid
[1] > 7) {
336 const u8
*p2p_ie
= NULL
;
338 p2p_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
, mgmt
->u
.probe_resp
.variable
, ie_len
);
339 #define P2P_GROUP_CAPAB_PERSISTENT_GROUP BIT(1)
340 if (p2p_ie
&& !(p2p_ie
[10] & P2P_GROUP_CAPAB_PERSISTENT_GROUP
)) {
341 SLSI_NET_INFO(dev
, "Ignoring a peer GO probe response with group_capab as 0\n");
348 scan_id
= (scan_id
& 0xFF);
350 if (WARN_ON(scan_id
>= SLSI_SCAN_MAX
)) {
355 /* Blocking scans already taken scan mutex.
356 * So scan mutex only incase of non blocking scans.
358 if (!ndev_vif
->scan
[scan_id
].is_blocking_scan
)
359 SLSI_MUTEX_LOCK(ndev_vif
->scan_mutex
);
361 if (fapi_get_vif(skb
) != 0 && fapi_get_u16(skb
, u
.mlme_scan_ind
.scan_id
) == 0) {
362 /* Connect/Roaming scan data : Save for processing later */
363 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Connect/Roaming scan indication received, bssid:%pM\n", fapi_get_mgmt(skb
)->bssid
);
364 slsi_kfree_skb(ndev_vif
->sta
.mlme_scan_ind_skb
);
365 ndev_vif
->sta
.mlme_scan_ind_skb
= skb
;
366 } else if (ndev_vif
->scan
[scan_id
].scan_req
|| ndev_vif
->scan
[scan_id
].sched_req
||
367 ndev_vif
->scan
[scan_id
].acs_request
||
368 ndev_vif
->scan
[SLSI_SCAN_HW_ID
].is_blocking_scan
) {
369 slsi_roam_channel_cache_add(sdev
, dev
, skb
);
370 if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif
))
371 slsi_add_to_scan_list(sdev
, ndev_vif
, skb
, scan_ssid
, scan_id
);
373 slsi_add_to_p2p_scan_list(sdev
, ndev_vif
, skb
, scan_id
);
376 if (!ndev_vif
->scan
[scan_id
].is_blocking_scan
)
377 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_mutex
);
380 #ifdef CONFIG_SLSI_WLAN_STA_FWD_BEACON
381 void slsi_rx_beacon_reporting_event_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
383 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
384 u16 reason_code
= fapi_get_u16(skb
, u
.mlme_beacon_reporting_event_ind
.abort_reason
) -
385 SLSI_FORWARD_BEACON_ABORT_REASON_OFFSET
;
388 if (!ndev_vif
->is_wips_running
) {
389 SLSI_ERR(sdev
, "WIPS is not running. Ignore beacon_reporting_event_ind(%u)\n", reason_code
);
393 ndev_vif
->is_wips_running
= false;
395 if (reason_code
>= SLSI_FORWARD_BEACON_ABORT_REASON_UNSPECIFIED
&&
396 reason_code
<= SLSI_FORWARD_BEACON_ABORT_REASON_SUSPENDED
) {
397 SLSI_INFO(sdev
, "received abort_event from FW with reason(%u)\n", reason_code
);
399 SLSI_ERR(sdev
, "received abort_event unsupporting reason(%u)\n", reason_code
);
402 ret
= slsi_send_forward_beacon_abort_vendor_event(sdev
, reason_code
);
404 SLSI_ERR(sdev
, "Failed to send forward_beacon_abort_event(err=%d)\n", ret
);
407 void slsi_handle_wips_beacon(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
,
408 struct ieee80211_mgmt
*mgmt
, int mgmt_len
)
410 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
411 size_t ie_len
= mgmt_len
- offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
412 const u8
*ssid_ie
= NULL
;
413 const u8
*scan_ssid
= NULL
;
414 const u8
*scan_bssid
= NULL
;
418 struct timespec sys_time
;
421 u8 channel
= (u8
)(ndev_vif
->chan
->hw_value
);
423 get_monotonic_boottime(&sys_time
);
424 scan_bssid
= fapi_get_mgmt(skb
)->bssid
;
426 ssid_ie
= cfg80211_find_ie(WLAN_EID_SSID
, mgmt
->u
.beacon
.variable
, ie_len
);
427 ssid_len
= ssid_ie
[1];
428 scan_ssid
= &ssid_ie
[2];
429 beacon_int
= mgmt
->u
.beacon
.beacon_int
;
430 timestamp
= mgmt
->u
.beacon
.timestamp
;
432 SLSI_NET_DBG2(dev
, SLSI_RX
,
433 "forward_beacon from bssid:%pM beacon_int:%u timestamp:%llu system_time:%llu\n",
434 fapi_get_mgmt(skb
)->bssid
, beacon_int
, timestamp
,
435 (u64
)TIMESPEC_TO_US(sys_time
));
437 ret
= slsi_send_forward_beacon_vendor_event(sdev
, scan_ssid
, ssid_len
, scan_bssid
,
438 channel
, beacon_int
, timestamp
,
439 (u64
)TIMESPEC_TO_US(sys_time
));
441 SLSI_ERR(sdev
, "Failed to forward beacon_event\n");
445 static void slsi_scan_update_ssid_map(struct slsi_dev
*sdev
, struct net_device
*dev
, u16 scan_id
)
447 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
448 struct ieee80211_mgmt
*mgmt
;
449 const u8
*ssid_ie
= NULL
, *connected_ssid
= NULL
;
450 int i
, found
= 0, is_connected
= 0;
451 struct slsi_scan_result
*scan_result
= NULL
;
454 WARN_ON(!SLSI_MUTEX_IS_LOCKED(ndev_vif
->vif_mutex
));
455 WARN_ON(!SLSI_MUTEX_IS_LOCKED(ndev_vif
->scan_result_mutex
));
457 if (ndev_vif
->activated
&& ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
&& ndev_vif
->sta
.sta_bss
) {
458 band
= (ndev_vif
->sta
.sta_bss
->channel
->center_freq
/
459 1000) == 2 ? SLSI_FREQ_BAND_2GHZ
: SLSI_FREQ_BAND_5GHZ
;
461 connected_ssid
= cfg80211_find_ie(WLAN_EID_SSID
, ndev_vif
->sta
.sta_bss
->ies
->data
, ndev_vif
->sta
.sta_bss
->ies
->len
);
464 /* sanitize map: [remove any old entries] */
465 for (i
= 0; i
< SLSI_SCAN_SSID_MAP_MAX
; i
++) {
467 if (!sdev
->ssid_map
[i
].ssid_len
)
470 /* We are connected to this hidden AP. So no need to check if this AP is present in scan results */
471 if (is_connected
&& SLSI_ETHER_EQUAL(ndev_vif
->sta
.sta_bss
->bssid
, sdev
->ssid_map
[i
].bssid
) &&
472 (sdev
->ssid_map
[i
].band
== band
))
475 /* If this entry AP is found to be non-hidden, remove entry. */
476 scan_result
= ndev_vif
->scan
[scan_id
].scan_results
;
477 while (scan_result
) {
478 if (SLSI_ETHER_EQUAL(sdev
->ssid_map
[i
].bssid
, scan_result
->bssid
) &&
479 (sdev
->ssid_map
[i
].band
== scan_result
->band
)) {
480 /* AP is no more hidden. OR AP is hidden but did not
481 * receive probe resp. Go for expiry.
483 if (!scan_result
->hidden
|| (scan_result
->hidden
&& !scan_result
->probe_resp
))
484 sdev
->ssid_map
[i
].age
= SLSI_SCAN_SSID_MAP_EXPIRY_AGE
;
489 scan_result
= scan_result
->next
;
493 sdev
->ssid_map
[i
].age
++;
494 if (sdev
->ssid_map
[i
].age
> SLSI_SCAN_SSID_MAP_EXPIRY_AGE
) {
495 sdev
->ssid_map
[i
].ssid_len
= 0;
496 sdev
->ssid_map
[i
].age
= 0;
501 scan_result
= ndev_vif
->scan
[scan_id
].scan_results
;
502 /* update/add hidden bss with known ssid */
503 while (scan_result
) {
506 if (scan_result
->hidden
) {
507 if (is_connected
&& SLSI_ETHER_EQUAL(ndev_vif
->sta
.sta_bss
->bssid
, scan_result
->bssid
) &&
508 (scan_result
->band
== band
)) {
509 ssid_ie
= connected_ssid
;
510 } else if (scan_result
->probe_resp
) {
511 mgmt
= fapi_get_mgmt(scan_result
->probe_resp
);
512 ssid_ie
= cfg80211_find_ie(WLAN_EID_SSID
, mgmt
->u
.beacon
.variable
, fapi_get_mgmtlen(scan_result
->probe_resp
) - (mgmt
->u
.beacon
.variable
- (u8
*)mgmt
));
517 scan_result
= scan_result
->next
;
522 /* if this bss is in map, update map */
523 for (i
= 0; i
< SLSI_SCAN_SSID_MAP_MAX
; i
++) {
524 if (!sdev
->ssid_map
[i
].ssid_len
)
526 if (SLSI_ETHER_EQUAL(scan_result
->bssid
, sdev
->ssid_map
[i
].bssid
) &&
527 (scan_result
->band
== sdev
->ssid_map
[i
].band
)) {
528 sdev
->ssid_map
[i
].ssid_len
= ssid_ie
[1];
529 memcpy(sdev
->ssid_map
[i
].ssid
, &ssid_ie
[2], ssid_ie
[1]);
535 /* add a new entry in map */
536 for (i
= 0; i
< SLSI_SCAN_SSID_MAP_MAX
; i
++) {
537 if (sdev
->ssid_map
[i
].ssid_len
)
539 SLSI_ETHER_COPY(sdev
->ssid_map
[i
].bssid
, scan_result
->bssid
);
540 sdev
->ssid_map
[i
].age
= 0;
541 sdev
->ssid_map
[i
].ssid_len
= ssid_ie
[1];
542 sdev
->ssid_map
[i
].band
= scan_result
->band
;
543 memcpy(sdev
->ssid_map
[i
].ssid
, &ssid_ie
[2], ssid_ie
[1]);
547 scan_result
= scan_result
->next
;
551 void slsi_scan_complete(struct slsi_dev
*sdev
, struct net_device
*dev
, u16 scan_id
, bool aborted
)
553 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
554 struct sk_buff
*scan
;
556 int *result_count
= NULL
, max_count
= 0;
557 struct cfg80211_scan_info info
= {.aborted
= aborted
};
558 int scan_results_count
= 0;
559 int more_than_max_count
= 0;
561 if (WARN_ON(scan_id
>= SLSI_SCAN_MAX
))
564 if (scan_id
== SLSI_SCAN_HW_ID
&& !ndev_vif
->scan
[scan_id
].scan_req
)
567 if (WARN_ON(scan_id
== SLSI_SCAN_SCHED_ID
&& !ndev_vif
->scan
[scan_id
].sched_req
))
570 SLSI_MUTEX_LOCK(ndev_vif
->scan_result_mutex
);
571 if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif
)) {
572 slsi_scan_update_ssid_map(sdev
, dev
, scan_id
);
573 result_count
= &count
;
574 max_count
= slsi_dev_get_scan_result_count();
576 scan
= slsi_dequeue_cached_scan_result(&ndev_vif
->scan
[scan_id
], result_count
);
578 scan_results_count
++;
579 /* skb freed inside slsi_rx_scan_pass_to_cfg80211 */
580 slsi_rx_scan_pass_to_cfg80211(sdev
, dev
, scan
);
582 if ((SLSI_IS_VIF_INDEX_WLAN(ndev_vif
)) && (*result_count
>= max_count
)) {
583 more_than_max_count
= 1;
584 slsi_purge_scan_results_locked(ndev_vif
, scan_id
);
587 scan
= slsi_dequeue_cached_scan_result(&ndev_vif
->scan
[scan_id
], result_count
);
589 SLSI_INFO(sdev
, "Scan count:%d APs\n", scan_results_count
);
590 SLSI_NET_DBG3(dev
, SLSI_MLME
, "interface:%d, scan_id:%d,%s\n", ndev_vif
->ifnum
, scan_id
,
591 more_than_max_count
? "Scan results overflow" : "");
592 slsi_roam_channel_cache_prune(dev
, SLSI_ROAMING_CHANNEL_CACHE_TIMEOUT
);
594 if (scan_id
== SLSI_SCAN_HW_ID
) {
595 if (SLSI_IS_VIF_INDEX_P2P(ndev_vif
) && (!SLSI_IS_P2P_GROUP_STATE(sdev
))) {
596 /* Check for unsync vif as it could be present during the cycle of social channel scan and listen */
597 if (ndev_vif
->activated
)
598 SLSI_P2P_STATE_CHANGE(sdev
, P2P_IDLE_VIF_ACTIVE
);
600 SLSI_P2P_STATE_CHANGE(sdev
, P2P_IDLE_NO_VIF
);
602 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0))
603 cfg80211_scan_done(ndev_vif
->scan
[scan_id
].scan_req
, &info
);
605 cfg80211_scan_done(ndev_vif
->scan
[scan_id
].scan_req
, aborted
);
608 ndev_vif
->scan
[scan_id
].scan_req
= NULL
;
609 ndev_vif
->scan
[scan_id
].requeue_timeout_work
= false;
612 if (scan_id
== SLSI_SCAN_SCHED_ID
&& scan_results_count
> 0)
613 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
614 cfg80211_sched_scan_results(sdev
->wiphy
, ndev_vif
->scan
[scan_id
].sched_req
->reqid
);
616 cfg80211_sched_scan_results(sdev
->wiphy
);
618 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
621 int slsi_set_2g_auto_channel(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
,
622 struct slsi_acs_selected_channels
*acs_selected_channels
,
623 struct slsi_acs_chan_info
*ch_info
)
625 int i
= 0, j
= 0, avg_load
, total_num_ap
, total_rssi
, adjacent_rssi
;
626 bool all_bss_load
= true, none_bss_load
= true;
627 int min_avg_chan_utilization
= INT_MAX
, min_adjacent_rssi
= INT_MAX
;
628 int ch_idx_min_load
= 0, ch_idx_min_rssi
= 0;
629 int min_avg_chan_utilization_20
= INT_MAX
, min_adjacent_rssi_20
= INT_MAX
;
630 int ch_idx_min_load_20
= 0, ch_idx_min_rssi_20
= 0;
632 /* BEGIN IKSAMP-8520 limit 2.4G ACS channels to 11 */
633 // int ch_list_len = MAX_24G_CHANNELS;
634 int ch_list_len
= 11;
635 /* END IKSAMP-8520 */
637 acs_selected_channels
->ch_width
= ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->ch_width
;
638 acs_selected_channels
->hw_mode
= ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
;
640 SLSI_DBG3(sdev
, SLSI_MLME
, "ch_lis_len:%d\n", ch_list_len
);
641 for (i
= 0; i
< ch_list_len
; i
++) {
642 if (!ch_info
[i
].chan
)
644 adjacent_rssi
= 0; /* Assuming ch_list is in sorted order. */
645 for (j
= -2; j
<= 2; j
++)
646 if (i
+ j
>= 0 && i
+ j
< ch_list_len
)
647 adjacent_rssi
+= ch_info
[i
+ j
].rssi_factor
;
648 ch_info
[i
].adj_rssi_factor
= adjacent_rssi
;
649 if (ch_info
[i
].num_bss_load_ap
!= 0) {
650 ch_info
[i
].avg_chan_utilization
= ch_info
[i
].total_chan_utilization
/
651 ch_info
[i
].num_bss_load_ap
;
652 if (ch_info
[i
].avg_chan_utilization
< min_avg_chan_utilization_20
) {
653 min_avg_chan_utilization_20
= ch_info
[i
].avg_chan_utilization
;
654 ch_idx_min_load_20
= i
;
655 } else if (ch_info
[i
].avg_chan_utilization
== min_avg_chan_utilization_20
&&
656 ch_info
[i
].num_ap
< ch_info
[ch_idx_min_load_20
].num_ap
) {
657 ch_idx_min_load_20
= i
;
659 none_bss_load
= false;
661 SLSI_DBG3(sdev
, SLSI_MLME
, "BSS load IE not found\n");
662 all_bss_load
= false;
664 if (adjacent_rssi
< min_adjacent_rssi_20
) {
665 min_adjacent_rssi_20
= adjacent_rssi
;
666 ch_idx_min_rssi_20
= i
;
667 } else if (adjacent_rssi
== min_adjacent_rssi_20
&&
668 ch_info
[i
].num_ap
< ch_info
[ch_idx_min_rssi_20
].num_ap
) {
669 ch_idx_min_rssi_20
= i
;
671 SLSI_DBG3(sdev
, SLSI_MLME
, "min rssi:%d min_rssi_idx:%d\n", min_adjacent_rssi_20
, ch_idx_min_rssi_20
);
672 SLSI_DBG3(sdev
, SLSI_MLME
, "num_ap:%d,chan:%d,total_util:%d,avg_util:%d,rssi_fac:%d,adj_rssi_fac:%d,"
673 "bss_ap:%d\n", ch_info
[i
].num_ap
, ch_info
[i
].chan
, ch_info
[i
].total_chan_utilization
,
674 ch_info
[i
].avg_chan_utilization
, ch_info
[i
].rssi_factor
, ch_info
[i
].adj_rssi_factor
,
675 ch_info
[i
].num_bss_load_ap
);
678 if (acs_selected_channels
->ch_width
== 40) {
679 for (i
= 0; i
< ch_list_len
; i
++) {
680 if (i
+ 4 >= ch_list_len
|| !ch_info
[i
+ 4].chan
|| !ch_info
[i
].chan
)
682 avg_load
= ch_info
[i
].avg_chan_utilization
+ ch_info
[i
+ 4].avg_chan_utilization
;
683 total_num_ap
= ch_info
[i
].num_ap
+ ch_info
[i
+ 4].num_ap
;
684 total_rssi
= ch_info
[i
].adj_rssi_factor
+ ch_info
[i
+ 4].adj_rssi_factor
;
686 if (avg_load
< min_avg_chan_utilization
) {
687 min_avg_chan_utilization
= avg_load
;
689 } else if (avg_load
== min_avg_chan_utilization
&&
690 total_num_ap
< ch_info
[ch_idx_min_load
].num_ap
+
691 ch_info
[ch_idx_min_load
+ 4].num_ap
) {
694 if (total_rssi
< min_adjacent_rssi
) {
695 min_adjacent_rssi
= total_rssi
;
697 } else if (total_rssi
== min_adjacent_rssi
&&
698 total_num_ap
< ch_info
[ch_idx_min_rssi
].num_ap
+
699 ch_info
[ch_idx_min_rssi
+ 4].num_ap
) {
704 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_load
].chan
;
705 acs_selected_channels
->sec_channel
= ch_info
[ch_idx_min_load
].chan
+ 4;
707 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_rssi
].chan
;
708 acs_selected_channels
->sec_channel
= ch_info
[ch_idx_min_rssi
].chan
+ 4;
711 if (!acs_selected_channels
->pri_channel
)
712 acs_selected_channels
->ch_width
= 20;
715 if (acs_selected_channels
->ch_width
== 20) {
717 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_load_20
].chan
;
719 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_rssi_20
].chan
;
724 int slsi_is_40mhz_5gchan(u8 pri_channel
, u8 sec_channel
)
726 int slsi_40mhz_chan
[12] = {38, 46, 54, 62, 102, 110, 118, 126, 134, 142, 151, 159};
729 for (i
= 0; i
< 12; i
++) {
730 if (pri_channel
== slsi_40mhz_chan
[i
] - 2 && sec_channel
== slsi_40mhz_chan
[i
] + 2)
732 else if (pri_channel
< slsi_40mhz_chan
[i
])
738 int slsi_is_80mhz_5gchan(u8 pri_channel
, u8 last_channel
)
740 int slsi_80mhz_chan
[6] = {42, 58, 106, 122, 138, 155};
743 for (i
= 0; i
< 6; i
++) {
744 if (pri_channel
== slsi_80mhz_chan
[i
] - 6 && last_channel
== slsi_80mhz_chan
[i
] + 6)
746 else if (pri_channel
< slsi_80mhz_chan
[i
])
752 int slsi_set_5g_auto_channel(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
,
753 struct slsi_acs_selected_channels
*acs_selected_channels
,
754 struct slsi_acs_chan_info
*ch_info
)
756 int i
= 0, avg_load
, total_num_ap
;
757 bool all_bss_load
= true, none_bss_load
= true;
758 int min_num_ap
= INT_MAX
, min_avg_chan_utilization
= INT_MAX
;
759 int ch_idx_min_load
= 0, ch_idx_min_ap
= 0;
760 int min_avg_chan_utilization_20
= INT_MAX
, min_num_ap_20
= INT_MAX
;
761 int ch_idx_min_load_20
= 0, ch_idx_min_ap_20
= 0;
763 int ch_list_len
= MAX_5G_CHANNELS
;
765 acs_selected_channels
->ch_width
= ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->ch_width
;
766 acs_selected_channels
->hw_mode
= ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
;
768 SLSI_DBG3(sdev
, SLSI_MLME
, "ch_lis_len:%d\n", ch_list_len
);
769 for (i
= 0; i
< ch_list_len
; i
++) {
770 if (!ch_info
[i
].chan
)
772 if (ch_info
[i
].num_bss_load_ap
!= 0) {
773 ch_info
[i
].avg_chan_utilization
= ch_info
[i
].total_chan_utilization
/
774 ch_info
[i
].num_bss_load_ap
;
775 if (ch_info
[i
].avg_chan_utilization
< min_avg_chan_utilization_20
) {
776 min_avg_chan_utilization_20
= ch_info
[i
].avg_chan_utilization
;
777 ch_idx_min_load_20
= i
;
778 } else if (ch_info
[i
].avg_chan_utilization
== min_avg_chan_utilization_20
&&
779 ch_info
[i
].num_ap
< ch_info
[ch_idx_min_load_20
].num_ap
) {
780 ch_idx_min_load_20
= i
;
782 none_bss_load
= false;
784 if (ch_info
[i
].num_ap
< min_num_ap_20
) {
785 min_num_ap_20
= ch_info
[i
].num_ap
;
786 ch_idx_min_ap_20
= i
;
788 SLSI_DBG3(sdev
, SLSI_MLME
, "BSS load IE not found\n");
789 ch_info
[i
].avg_chan_utilization
= 128;
790 all_bss_load
= false;
792 SLSI_DBG3(sdev
, SLSI_MLME
, "num_ap:%d chan:%d, total_chan_util:%d, avg_chan_util:%d, bss_load_ap:%d\n",
793 ch_info
[i
].num_ap
, ch_info
[i
].chan
, ch_info
[i
].total_chan_utilization
,
794 ch_info
[i
].avg_chan_utilization
, ch_info
[i
].num_bss_load_ap
);
797 if (acs_selected_channels
->ch_width
== 80) {
798 for (i
= 0; i
< ch_list_len
; i
++) {
799 if (i
+ 3 >= ch_list_len
)
801 if (!ch_info
[i
].chan
|| !ch_info
[i
+ 1].chan
|| !ch_info
[i
+ 2].chan
|| !ch_info
[i
+ 3].chan
)
803 if (slsi_is_80mhz_5gchan(ch_info
[i
].chan
, ch_info
[i
+ 3].chan
)) {
804 avg_load
= ch_info
[i
].avg_chan_utilization
+ ch_info
[i
+ 1].avg_chan_utilization
+
805 ch_info
[i
+ 2].avg_chan_utilization
+ ch_info
[i
+ 3].avg_chan_utilization
;
806 total_num_ap
= ch_info
[i
].num_ap
+ ch_info
[i
+ 1].num_ap
+ ch_info
[i
+ 2].num_ap
+
807 ch_info
[i
+ 3].num_ap
;
808 if (avg_load
< min_avg_chan_utilization
) {
809 min_avg_chan_utilization
= avg_load
;
811 } else if (avg_load
== min_avg_chan_utilization
&& total_num_ap
<
812 (ch_info
[ch_idx_min_load
].num_ap
+ ch_info
[ch_idx_min_load
+ 1].num_ap
+
813 ch_info
[ch_idx_min_load
+ 2].num_ap
+
814 ch_info
[ch_idx_min_load
+ 3].num_ap
)) {
817 if (total_num_ap
< min_num_ap
) {
818 min_num_ap
= total_num_ap
;
823 if (all_bss_load
|| min_avg_chan_utilization
<= 512) {
824 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_load
].chan
;
825 acs_selected_channels
->vht_seg0_center_ch
= ch_info
[ch_idx_min_load
].chan
+ 6;
826 } else if (none_bss_load
|| min_avg_chan_utilization
> 512) {
827 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_ap
].chan
;
828 acs_selected_channels
->vht_seg0_center_ch
= ch_info
[ch_idx_min_ap
].chan
+ 6;
831 if (!acs_selected_channels
->pri_channel
)
832 acs_selected_channels
->ch_width
= 40;
835 if (acs_selected_channels
->ch_width
== 40) {
836 for (i
= 0; i
< ch_list_len
; i
++) {
837 if (!ch_info
[i
].chan
|| i
+ 1 >= ch_list_len
|| !ch_info
[i
+ 1].chan
)
839 if (slsi_is_40mhz_5gchan(ch_info
[i
].chan
, ch_info
[i
+ 1].chan
)) {
840 avg_load
= ch_info
[i
].avg_chan_utilization
+ ch_info
[i
+ 1].avg_chan_utilization
;
841 total_num_ap
= ch_info
[i
].num_ap
+ ch_info
[i
+ 1].num_ap
;
842 if (avg_load
< min_avg_chan_utilization
) {
843 min_avg_chan_utilization
= avg_load
;
845 } else if (avg_load
== min_avg_chan_utilization
&& total_num_ap
<
846 ch_info
[ch_idx_min_load
].num_ap
+ ch_info
[ch_idx_min_load
+ 1].num_ap
) {
849 if (total_num_ap
< min_num_ap
) {
850 min_num_ap
= total_num_ap
;
855 if (all_bss_load
|| min_avg_chan_utilization
<= 256) {
856 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_load
].chan
;
857 acs_selected_channels
->sec_channel
= ch_info
[ch_idx_min_load
+ 1].chan
;
858 } else if (none_bss_load
|| min_avg_chan_utilization
> 256) {
859 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_ap
].chan
;
860 acs_selected_channels
->sec_channel
= ch_info
[ch_idx_min_ap
+ 1].chan
;
863 if (!acs_selected_channels
->pri_channel
)
864 acs_selected_channels
->ch_width
= 20;
867 if (acs_selected_channels
->ch_width
== 20) {
868 if (all_bss_load
|| min_avg_chan_utilization_20
< 128)
869 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_load_20
].chan
;
870 else if (none_bss_load
|| min_avg_chan_utilization_20
>= 128)
871 acs_selected_channels
->pri_channel
= ch_info
[ch_idx_min_ap_20
].chan
;
876 int slsi_set_band_any_auto_channel(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
,
877 struct slsi_acs_selected_channels
*acs_selected_channels
,
878 struct slsi_acs_chan_info
*ch_info
)
880 struct slsi_acs_chan_info ch_info_2g
[MAX_24G_CHANNELS
];
881 struct slsi_acs_chan_info ch_info_5g
[MAX_5G_CHANNELS
];
882 struct slsi_acs_selected_channels acs_selected_channels_5g
;
883 struct slsi_acs_selected_channels acs_selected_channels_2g
;
884 int Best_channel_5g
= -1;
885 int Best_channel_5g_num_ap
= 0;
886 int Best_channel_2g
= -1;
887 int Best_channel_2g_num_ap
= 0;
891 memset(&acs_selected_channels_5g
, 0, sizeof(acs_selected_channels_5g
));
892 memset(&acs_selected_channels_2g
, 0, sizeof(acs_selected_channels_2g
));
893 memset(&ch_info_5g
, 0, sizeof(ch_info_5g
));
894 memset(&ch_info_2g
, 0, sizeof(ch_info_2g
));
896 for(i
= MAX_24G_CHANNELS
; i
< MAX_CHAN_VALUE_ACS
; i
++) {
897 ch_info_5g
[j
] = ch_info
[i
];
900 ret
= slsi_set_5g_auto_channel(sdev
, ndev_vif
, &acs_selected_channels_5g
, ch_info_5g
);
903 Best_channel_5g
= acs_selected_channels_5g
.pri_channel
;
904 for(i
= 0; i
< MAX_5G_CHANNELS
; i
++) {
905 if (ch_info_5g
[i
].chan
== Best_channel_5g
) {
906 Best_channel_5g_num_ap
= ch_info_5g
[i
].num_ap
;
910 SLSI_DBG3(sdev
, SLSI_MLME
, "Best 5G channel = %d, num_ap = %d\n", Best_channel_5g
,
911 Best_channel_5g_num_ap
);
913 if (Best_channel_5g_num_ap
< MAX_AP_THRESHOLD
) {
914 *acs_selected_channels
= acs_selected_channels_5g
;
919 SLSI_DBG3(sdev
, SLSI_MLME
, "5G AP threshold exceed, trying to select from 2G band\n");
921 for(i
=0; i
< MAX_24G_CHANNELS
; i
++) {
922 ch_info_2g
[i
] = ch_info
[i
];
924 ret
= slsi_set_2g_auto_channel(sdev
, ndev_vif
, &acs_selected_channels_2g
, ch_info_2g
);
927 Best_channel_2g
= acs_selected_channels_2g
.pri_channel
;
928 for(i
=0; i
< MAX_24G_CHANNELS
; i
++) {
929 if (ch_info_2g
[i
].chan
== Best_channel_2g
) {
930 Best_channel_2g_num_ap
= ch_info_2g
[i
].num_ap
;
934 SLSI_DBG3(sdev
, SLSI_MLME
, "Best 2G channel = %d, num_ap = %d\n", Best_channel_2g
,
935 Best_channel_2g_num_ap
);
936 if (Best_channel_5g
== -1) {
937 *acs_selected_channels
= acs_selected_channels_2g
;
940 /* Based on min no of APs selecting channel from that band */
941 /* If no. of APs are equal, selecting the 5G channel */
942 if(Best_channel_5g_num_ap
> Best_channel_2g_num_ap
)
943 *acs_selected_channels
= acs_selected_channels_2g
;
945 *acs_selected_channels
= acs_selected_channels_5g
;
951 int slsi_acs_get_rssi_factor(struct slsi_dev
*sdev
, int rssi
, int ch_util
)
953 int frac_pow_val
[10] = {10, 12, 15, 19, 25, 31, 39, 50, 63, 79};
961 for (i
= 0; i
< rssi
/ 10; i
++)
963 res
= (10000000 * ch_util
/ res
) / frac_pow_val
[rssi
% 10];
965 SLSI_DBG3(sdev
, SLSI_MLME
, "ch_util:%d\n", ch_util
);
969 struct slsi_acs_chan_info
*slsi_acs_scan_results(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
, u16 scan_id
)
971 struct sk_buff
*scan_res
;
972 struct sk_buff
*unique_scan
;
973 struct sk_buff_head unique_scan_results
;
974 struct slsi_acs_chan_info
*ch_info
= ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->acs_chan_info
;
976 SLSI_DBG3(sdev
, SLSI_MLME
, "Received acs_results\n");
977 skb_queue_head_init(&unique_scan_results
);
978 SLSI_MUTEX_LOCK(ndev_vif
->scan_result_mutex
);
979 scan_res
= slsi_dequeue_cached_scan_result(&ndev_vif
->scan
[SLSI_SCAN_HW_ID
], NULL
);
982 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(scan_res
);
983 size_t mgmt_len
= fapi_get_mgmtlen(scan_res
);
984 struct ieee80211_channel
*scan_channel
;
990 /* ieee80211_mgmt structure is similar for Probe Response and Beacons */
991 size_t ies_len
= mgmt_len
- offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
992 /* make sure this BSSID has not already been used */
993 skb_queue_walk(&unique_scan_results
, unique_scan
) {
994 struct ieee80211_mgmt
*unique_mgmt
= fapi_get_mgmt(unique_scan
);
996 if (compare_ether_addr(mgmt
->bssid
, unique_mgmt
->bssid
) == 0)
999 slsi_skb_queue_head(&unique_scan_results
, scan_res
);
1000 scan_channel
= slsi_find_scan_channel(sdev
, mgmt
, mgmt_len
,
1001 fapi_get_u16(scan_res
, u
.mlme_scan_ind
.channel_frequency
) / 2);
1004 SLSI_DBG3(sdev
, SLSI_MLME
, "scan result (scan_id:%d, %pM, channel:%d, rssi:%d, ie_len = %zu)\n",
1005 fapi_get_u16(scan_res
, u
.mlme_scan_ind
.scan_id
),
1006 fapi_get_mgmt(scan_res
)->bssid
, scan_channel
->hw_value
,
1007 fapi_get_s16(scan_res
, u
.mlme_scan_ind
.rssi
),
1010 idx
= slsi_find_chan_idx(scan_channel
->hw_value
, ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
);
1011 SLSI_DBG3(sdev
, SLSI_MLME
, "chan_idx:%d chan_value: %d\n", idx
, ch_info
[idx
].chan
);
1013 if ((idx
< 0) || (idx
== MAX_CHAN_VALUE_ACS
)) {
1014 SLSI_DBG3(sdev
, SLSI_MLME
, "idx is not in range idx=%d\n", idx
);
1017 if (ch_info
[idx
].chan
) {
1018 ch_info
[idx
].num_ap
+= 1;
1019 ie
= cfg80211_find_ie(WLAN_EID_QBSS_LOAD
, mgmt
->u
.beacon
.variable
, ies_len
);
1024 ch_util
= ie_data
[2];
1025 ch_info
[idx
].num_bss_load_ap
+= 1;
1026 ch_info
[idx
].total_chan_utilization
+= ch_util
;
1029 if (idx
== scan_channel
->hw_value
- 1) { /*if 2.4GHZ channel */
1032 res
= slsi_acs_get_rssi_factor(sdev
, fapi_get_s16(scan_res
, u
.mlme_scan_ind
.rssi
),
1034 ch_info
[idx
].rssi_factor
+= res
;
1035 SLSI_DBG3(sdev
, SLSI_MLME
, "ch_info[idx].rssi_factor:%d\n", ch_info
[idx
].rssi_factor
);
1041 scan_res
= slsi_dequeue_cached_scan_result(&ndev_vif
->scan
[scan_id
], NULL
);
1043 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_result_mutex
);
1044 slsi_skb_queue_purge(&unique_scan_results
);
1048 void slsi_acs_scan_complete(struct slsi_dev
*sdev
, struct netdev_vif
*ndev_vif
, u16 scan_id
)
1050 struct slsi_acs_selected_channels acs_selected_channels
;
1051 struct slsi_acs_chan_info
*ch_info
;
1054 memset(&acs_selected_channels
, 0, sizeof(acs_selected_channels
));
1055 ch_info
= slsi_acs_scan_results(sdev
, ndev_vif
, scan_id
);
1056 if (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
== SLSI_ACS_MODE_IEEE80211A
)
1057 r
= slsi_set_5g_auto_channel(sdev
, ndev_vif
, &acs_selected_channels
, ch_info
);
1058 else if (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
== SLSI_ACS_MODE_IEEE80211B
||
1059 ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
== SLSI_ACS_MODE_IEEE80211G
)
1060 r
= slsi_set_2g_auto_channel(sdev
, ndev_vif
, &acs_selected_channels
, ch_info
);
1061 else if (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
->hw_mode
== SLSI_ACS_MODE_IEEE80211ANY
)
1062 r
= slsi_set_band_any_auto_channel(sdev
, ndev_vif
, &acs_selected_channels
, ch_info
);
1066 r
= slsi_send_acs_event(sdev
, acs_selected_channels
);
1068 SLSI_ERR(sdev
, "Could not send ACS vendor event up\n");
1070 SLSI_ERR(sdev
, "set_auto_channel failed: %d\n", r
);
1072 sdev
->acs_channel_switched
= true;
1073 kfree(ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
);
1074 if (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
)
1075 ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
= NULL
;
1078 void slsi_rx_scan_done_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1080 u16 scan_id
= fapi_get_u16(skb
, u
.mlme_scan_done_ind
.scan_id
);
1081 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1083 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1084 SLSI_MUTEX_LOCK(ndev_vif
->scan_mutex
);
1085 SLSI_NET_DBG3(dev
, SLSI_GSCAN
, "slsi_rx_scan_done_ind Received scan_id:%#x\n", scan_id
);
1087 #ifdef CONFIG_SCSC_WLAN_GSCAN_ENABLE
1088 if (slsi_is_gscan_id(scan_id
)) {
1089 SLSI_NET_DBG3(dev
, SLSI_GSCAN
, "scan_id:%#x\n", scan_id
);
1091 slsi_gscan_handle_scan_result(sdev
, dev
, skb
, scan_id
, true);
1093 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_mutex
);
1094 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1098 scan_id
= (scan_id
& 0xFF);
1100 if (scan_id
== SLSI_SCAN_HW_ID
&& (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].scan_req
||
1101 ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
))
1102 cancel_delayed_work(&ndev_vif
->scan_timeout_work
);
1103 if (ndev_vif
->scan
[SLSI_SCAN_HW_ID
].acs_request
)
1104 slsi_acs_scan_complete(sdev
, ndev_vif
, scan_id
);
1106 slsi_scan_complete(sdev
, dev
, scan_id
, false);
1108 SLSI_MUTEX_UNLOCK(ndev_vif
->scan_mutex
);
1109 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1110 slsi_kfree_skb(skb
);
1113 void slsi_rx_channel_switched_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1117 int primary_chan_pos
;
1119 struct cfg80211_chan_def chandef
;
1121 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1123 temp_chan_info
= fapi_get_u16(skb
, u
.mlme_channel_switched_ind
.channel_information
);
1124 cf1
= fapi_get_u16(skb
, u
.mlme_channel_switched_ind
.channel_frequency
);
1127 primary_chan_pos
= (temp_chan_info
>> 8);
1128 width
= (temp_chan_info
& 0x00FF);
1130 /* If width is 80MHz/40MHz then do frequency calculation, else store as it is */
1132 freq
= cf1
+ (primary_chan_pos
* 20) - 10;
1133 else if (width
== 80)
1134 freq
= cf1
+ (primary_chan_pos
* 20) - 30;
1139 width
= NL80211_CHAN_WIDTH_20
;
1140 else if (width
== 40)
1141 width
= NL80211_CHAN_WIDTH_40
;
1142 else if (width
== 80)
1143 width
= NL80211_CHAN_WIDTH_80
;
1144 else if (width
== 160)
1145 width
= NL80211_CHAN_WIDTH_160
;
1147 chandef
.chan
= ieee80211_get_channel(sdev
->wiphy
, freq
);
1148 chandef
.width
= width
;
1149 chandef
.center_freq1
= cf1
;
1150 chandef
.center_freq2
= 0;
1152 ndev_vif
->ap
.channel_freq
= freq
; /* updated for GETSTAINFO */
1153 ndev_vif
->chan
= chandef
.chan
;
1155 cfg80211_ch_switch_notify(dev
, &chandef
);
1156 slsi_kfree_skb(skb
);
1159 void __slsi_rx_blockack_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1161 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1162 struct slsi_peer
*peer
;
1164 SLSI_NET_DBG1(dev
, SLSI_MLME
, "ma_blockack_ind(vif:%d, peer_qsta_address:%pM, parameter_set:%d, sequence_number:%d, reason_code:%d, direction:%d)\n",
1166 fapi_get_buff(skb
, u
.ma_blockack_ind
.peer_qsta_address
),
1167 fapi_get_u16(skb
, u
.ma_blockack_ind
.blockack_parameter_set
),
1168 fapi_get_u16(skb
, u
.ma_blockack_ind
.sequence_number
),
1169 fapi_get_u16(skb
, u
.ma_blockack_ind
.reason_code
),
1170 fapi_get_u16(skb
, u
.ma_blockack_ind
.direction
));
1172 peer
= slsi_get_peer_from_mac(sdev
, dev
, fapi_get_buff(skb
, u
.ma_blockack_ind
.peer_qsta_address
));
1176 /* Buffering of frames before the mlme_connected_ind */
1177 if ((ndev_vif
->vif_type
== FAPI_VIFTYPE_AP
) && (peer
->connected_state
== SLSI_STA_CONN_STATE_CONNECTING
)) {
1178 SLSI_DBG3(sdev
, SLSI_MLME
, "Buffering MA-BlockAck.Indication\n");
1179 slsi_skb_queue_tail(&peer
->buffered_frames
, skb
);
1182 slsi_handle_blockack(
1186 fapi_get_buff(skb
, u
.ma_blockack_ind
.peer_qsta_address
),
1187 fapi_get_u16(skb
, u
.ma_blockack_ind
.blockack_parameter_set
),
1188 fapi_get_u16(skb
, u
.ma_blockack_ind
.sequence_number
),
1189 fapi_get_u16(skb
, u
.ma_blockack_ind
.reason_code
),
1190 fapi_get_u16(skb
, u
.ma_blockack_ind
.direction
)
1194 slsi_kfree_skb(skb
);
1197 void slsi_rx_blockack_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1199 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1201 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1202 __slsi_rx_blockack_ind(sdev
, dev
, skb
);
1203 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1206 static bool get_wmm_ie_from_resp_ie(struct slsi_dev
*sdev
, struct net_device
*dev
, u8
*resp_ie
, size_t resp_ie_len
, const u8
**wmm_elem
, size_t *wmm_elem_len
)
1208 struct ieee80211_vendor_ie
*ie
;
1210 SLSI_UNUSED_PARAMETER(sdev
);
1213 SLSI_NET_ERR(dev
, "Received invalid pointer to the ie's of the association response\n");
1217 *wmm_elem
= resp_ie
;
1218 while (*wmm_elem
&& (*wmm_elem
- resp_ie
< resp_ie_len
)) {
1219 /* parse response ie elements and return the wmm ie */
1220 *wmm_elem
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WMM
, *wmm_elem
,
1221 resp_ie_len
- (*wmm_elem
- resp_ie
));
1222 /* re-assoc-res can contain wmm parameter IE and wmm TSPEC IE.
1223 * we want wmm parameter Element)
1225 if (*wmm_elem
&& (*wmm_elem
)[1] > 6 && (*wmm_elem
)[6] == WMM_OUI_SUBTYPE_PARAMETER_ELEMENT
)
1228 *wmm_elem
+= (*wmm_elem
)[1];
1232 SLSI_NET_DBG2(dev
, SLSI_MLME
, "No WMM IE\n");
1235 ie
= (struct ieee80211_vendor_ie
*)*wmm_elem
;
1236 *wmm_elem_len
= ie
->len
+ 2;
1238 SLSI_NET_DBG3(dev
, SLSI_MLME
, "WMM IE received and parsed successfully\n");
1242 static bool sta_wmm_update_uapsd(struct slsi_dev
*sdev
, struct net_device
*dev
, struct slsi_peer
*peer
, u8
*assoc_req_ie
, size_t assoc_req_ie_len
)
1244 const u8
*wmm_information_ie
;
1246 if (!assoc_req_ie
) {
1247 SLSI_NET_ERR(dev
, "null reference to IE\n");
1251 wmm_information_ie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WMM
, assoc_req_ie
, assoc_req_ie_len
);
1252 if (!wmm_information_ie
) {
1253 SLSI_NET_DBG1(dev
, SLSI_MLME
, "no WMM IE\n");
1257 peer
->uapsd
= wmm_information_ie
[8];
1258 SLSI_NET_DBG1(dev
, SLSI_MLME
, "peer->uapsd = 0x%x\n", peer
->uapsd
);
1262 static bool sta_wmm_update_wmm_ac_ies(struct slsi_dev
*sdev
, struct net_device
*dev
, struct slsi_peer
*peer
,
1263 u8
*assoc_rsp_ie
, size_t assoc_rsp_ie_len
)
1267 const u8
*wmm_elem
= NULL
;
1268 size_t wmm_elem_len
= 0;
1269 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1270 struct slsi_wmm_ac
*wmm_ac
= &ndev_vif
->sta
.wmm_ac
[0];
1272 if (!get_wmm_ie_from_resp_ie(sdev
, dev
, assoc_rsp_ie
, assoc_rsp_ie_len
, &wmm_elem
, &wmm_elem_len
)) {
1273 SLSI_NET_DBG1(dev
, SLSI_MLME
, "No WMM IE received\n");
1277 if (wmm_elem_len
< 10 || wmm_elem
[7] /* version */ != 1) {
1278 SLSI_NET_WARN(dev
, "Invalid WMM IE: wmm_elem_len=%lu, wmm_elem[7]=%d\n", (unsigned long int)wmm_elem_len
, (int)wmm_elem
[7]);
1282 pos
= wmm_elem
+ 10;
1283 left
= wmm_elem_len
- 10;
1285 for (; left
>= 4; left
-= 4, pos
+= 4) {
1286 int aci
= (pos
[0] >> 5) & 0x03;
1287 int acm
= (pos
[0] >> 4) & 0x01;
1289 memcpy(wmm_ac
, pos
, sizeof(struct slsi_wmm_ac
));
1294 peer
->wmm_acm
|= BIT(1) | BIT(2); /* BK/- */
1298 peer
->wmm_acm
|= BIT(4) | BIT(5); /* CL/VI */
1302 peer
->wmm_acm
|= BIT(6) | BIT(7); /* VO/NC */
1307 peer
->wmm_acm
|= BIT(0) | BIT(3); /* BE/EE */
1313 SLSI_NET_DBG3(dev
, SLSI_MLME
, "WMM ies have been updated successfully\n");
1317 #ifdef CONFIG_SCSC_WLAN_KEY_MGMT_OFFLOAD
1318 enum slsi_wlan_vendor_attr_roam_auth
{
1319 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID
= 0,
1320 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID
,
1321 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE
,
1322 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE
,
1323 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED
,
1324 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR
,
1325 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK
,
1326 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK
,
1327 SLSI_WLAN_VENDOR_ATTR_ROAM_BEACON_IE
,
1329 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST
,
1330 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX
=
1331 SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST
- 1
1334 int slsi_send_roam_vendor_event(struct slsi_dev
*sdev
, const u8
*bssid
,
1335 const u8
*req_ie
, u32 req_ie_len
, const u8
*resp_ie
, u32 resp_ie_len
,
1336 const u8
*beacon_ie
, u32 beacon_ie_len
, bool authorized
)
1338 bool is_secured_bss
;
1339 struct sk_buff
*skb
= NULL
;
1342 is_secured_bss
= cfg80211_find_ie(WLAN_EID_RSN
, req_ie
, req_ie_len
) ||
1343 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WPA
, req_ie
, req_ie_len
);
1345 SLSI_DBG2(sdev
, SLSI_MLME
, "authorized:%d, is_secured_bss:%d\n", authorized
, is_secured_bss
);
1347 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
1348 skb
= cfg80211_vendor_event_alloc(sdev
->wiphy
, NULL
, NLMSG_DEFAULT_SIZE
,
1349 SLSI_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH
, GFP_KERNEL
);
1351 skb
= cfg80211_vendor_event_alloc(sdev
->wiphy
, NLMSG_DEFAULT_SIZE
,
1352 SLSI_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH
, GFP_KERNEL
);
1355 SLSI_ERR_NODEV("Failed to allocate skb for VENDOR Roam event\n");
1359 err
|= nla_put(skb
, SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID
, ETH_ALEN
, bssid
) ? BIT(1) : 0;
1360 err
|= nla_put(skb
, SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED
, 1, &authorized
) ? BIT(2) : 0;
1361 err
|= (req_ie
&& nla_put(skb
, SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE
, req_ie_len
, req_ie
)) ? BIT(3) : 0;
1362 err
|= (resp_ie
&& nla_put(skb
, SLSI_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE
, resp_ie_len
, resp_ie
)) ? BIT(4) : 0;
1363 err
|= (beacon_ie
&& nla_put(skb
, SLSI_WLAN_VENDOR_ATTR_ROAM_BEACON_IE
, beacon_ie_len
, beacon_ie
)) ? BIT(5) : 0;
1365 SLSI_ERR_NODEV("Failed nla_put ,req_ie_len=%d,resp_ie_len=%d,beacon_ie_len=%d,condition_failed=%d\n",
1366 req_ie_len
, resp_ie_len
, beacon_ie_len
, err
);
1367 slsi_kfree_skb(skb
);
1370 SLSI_DBG3_NODEV(SLSI_MLME
, "Event: KEY_MGMT_ROAM_AUTH(%d)\n", SLSI_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH
);
1371 cfg80211_vendor_event(skb
, GFP_KERNEL
);
1374 #endif /* offload */
1376 void slsi_rx_roamed_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1378 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1379 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
1380 struct slsi_peer
*peer
;
1381 u16 temporal_keys_required
= fapi_get_u16(skb
, u
.mlme_roamed_ind
.temporal_keys_required
);
1382 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
1383 enum ieee80211_privacy bss_privacy
;
1385 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
1386 struct cfg80211_roam_info roam_info
= {};
1389 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1391 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_roamed_ind(vif:%d) Roaming to %pM\n",
1395 peer
= slsi_get_peer_from_qs(sdev
, dev
, SLSI_STA_PEER_QUEUESET
);
1399 if (WARN_ON(!ndev_vif
->sta
.sta_bss
))
1402 slsi_rx_ba_stop_all(dev
, peer
);
1404 SLSI_ETHER_COPY(peer
->address
, mgmt
->bssid
);
1406 if (ndev_vif
->sta
.mlme_scan_ind_skb
) {
1407 /* saved skb [mlme_scan_ind] freed inside slsi_rx_scan_pass_to_cfg80211 */
1408 slsi_rx_scan_pass_to_cfg80211(sdev
, dev
, ndev_vif
->sta
.mlme_scan_ind_skb
);
1409 ndev_vif
->sta
.mlme_scan_ind_skb
= NULL
;
1412 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
1413 if (ndev_vif
->sta
.sta_bss
->capability
& WLAN_CAPABILITY_PRIVACY
)
1414 bss_privacy
= IEEE80211_PRIVACY_ON
;
1416 bss_privacy
= IEEE80211_PRIVACY_OFF
;
1419 slsi_cfg80211_put_bss(sdev
->wiphy
, ndev_vif
->sta
.sta_bss
);
1421 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
1422 ndev_vif
->sta
.sta_bss
= cfg80211_get_bss(sdev
->wiphy
, NULL
, peer
->address
, NULL
, 0,
1423 IEEE80211_BSS_TYPE_ANY
, bss_privacy
);
1425 ndev_vif
->sta
.sta_bss
= cfg80211_get_bss(sdev
->wiphy
, NULL
, peer
->address
, NULL
, 0, 0, 0);
1428 if (!ndev_vif
->sta
.sta_bss
|| !ndev_vif
->sta
.roam_mlme_procedure_started_ind
) {
1429 if (!ndev_vif
->sta
.sta_bss
)
1430 SLSI_INFO(sdev
, "BSS not updated in cfg80211\n");
1431 if (!ndev_vif
->sta
.roam_mlme_procedure_started_ind
)
1432 SLSI_INFO(sdev
, "procedure-started-ind not received before roamed-ind\n");
1433 netif_carrier_off(dev
);
1434 slsi_mlme_disconnect(sdev
, dev
, peer
->address
, 0, true);
1435 slsi_handle_disconnect(sdev
, dev
, peer
->address
, 0, NULL
, 0);
1437 u8
*assoc_ie
= NULL
;
1438 int assoc_ie_len
= 0;
1439 u8
*assoc_rsp_ie
= NULL
;
1440 int assoc_rsp_ie_len
= 0;
1442 slsi_peer_reset_stats(sdev
, dev
, peer
);
1443 slsi_peer_update_assoc_req(sdev
, dev
, peer
, ndev_vif
->sta
.roam_mlme_procedure_started_ind
);
1444 slsi_peer_update_assoc_rsp(sdev
, dev
, peer
, skb
);
1446 /* skb is consumed by slsi_peer_update_assoc_rsp. So do not access this anymore. */
1449 if (peer
->assoc_ie
) {
1450 assoc_ie
= peer
->assoc_ie
->data
;
1451 assoc_ie_len
= peer
->assoc_ie
->len
;
1454 if (peer
->assoc_resp_ie
) {
1455 assoc_rsp_ie
= peer
->assoc_resp_ie
->data
;
1456 assoc_rsp_ie_len
= peer
->assoc_resp_ie
->len
;
1459 /* this is the right place to initialize the bitmasks for
1460 * acm bit and tspec establishment
1463 peer
->tspec_established
= 0;
1466 /* update the uapsd bitmask according to the bit values
1467 * in wmm information element of association request
1469 if (!sta_wmm_update_uapsd(sdev
, dev
, peer
, assoc_ie
, assoc_ie_len
))
1470 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM uapsd\n");
1472 /* update the acm bitmask according to the acm bit values that
1473 * are included in wmm ie element of association response
1475 if (!sta_wmm_update_wmm_ac_ies(sdev
, dev
, peer
, assoc_rsp_ie
, assoc_rsp_ie_len
))
1476 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM AC ies\n");
1478 ndev_vif
->sta
.roam_mlme_procedure_started_ind
= NULL
;
1480 if (temporal_keys_required
) {
1481 peer
->pairwise_key_set
= 0;
1482 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
);
1485 WARN_ON(assoc_ie_len
&& !assoc_ie
);
1486 WARN_ON(assoc_rsp_ie_len
&& !assoc_rsp_ie
);
1488 SLSI_NET_DBG3(dev
, SLSI_MLME
, "cfg80211_roamed()\n");
1490 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
1491 /* cfg80211 does not require bss pointer in roam_info.
1492 * If bss pointer is given in roam_info, cfg80211 bss
1493 * data base goes bad and results in random panic.
1495 roam_info
.channel
= ndev_vif
->sta
.sta_bss
->channel
;
1496 roam_info
.bssid
= peer
->address
;
1497 roam_info
.req_ie
= assoc_ie
;
1498 roam_info
.req_ie_len
= assoc_ie_len
;
1499 roam_info
.resp_ie
= assoc_rsp_ie
;
1500 roam_info
.resp_ie_len
= assoc_rsp_ie_len
;
1501 cfg80211_roamed(dev
, &roam_info
, GFP_KERNEL
);
1503 cfg80211_roamed(dev
,
1504 ndev_vif
->sta
.sta_bss
->channel
,
1512 #ifdef CONFIG_SCSC_WLAN_KEY_MGMT_OFFLOAD
1513 if (slsi_send_roam_vendor_event(sdev
, peer
->address
, assoc_ie
, assoc_ie_len
,
1514 assoc_rsp_ie
, assoc_rsp_ie_len
,
1515 ndev_vif
->sta
.sta_bss
->ies
->data
, ndev_vif
->sta
.sta_bss
->ies
->len
,
1516 !temporal_keys_required
) != 0) {
1517 SLSI_NET_ERR(dev
, "Could not send Roam vendor event up");
1520 SLSI_NET_DBG3(dev
, SLSI_MLME
, "cfg80211_roamed() Done\n");
1522 ndev_vif
->sta
.roam_in_progress
= false;
1523 ndev_vif
->chan
= ndev_vif
->sta
.sta_bss
->channel
;
1524 #if !defined SLSI_TEST_DEV && defined CONFIG_ANDROID
1525 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Taking a wakelock for DHCP to finish after roaming\n");
1526 wake_lock_timeout(&sdev
->wlan_wl_roam
, msecs_to_jiffies(10 * 1000));
1527 #ifdef CONFIG_SCSC_WIFILOGGER
1528 SCSC_WLOG_WAKELOCK(WLOG_NORMAL
, WL_TAKEN
, "wlan_wl_roam", WL_REASON_ROAM
);
1532 if (!temporal_keys_required
) {
1533 slsi_mlme_roamed_resp(sdev
, dev
);
1534 cac_update_roam_traffic_params(sdev
, dev
);
1536 ndev_vif
->sta
.resp_id
= MLME_ROAMED_RES
;
1541 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1542 slsi_kfree_skb(skb
);
1545 void slsi_rx_roam_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1547 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1548 enum ieee80211_statuscode status
= WLAN_STATUS_SUCCESS
;
1550 SLSI_UNUSED_PARAMETER(sdev
);
1552 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_roam_ind(vif:%d, aid:0, result:0x%04x )\n",
1554 fapi_get_u16(skb
, u
.mlme_roam_ind
.result_code
));
1556 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1558 if (!ndev_vif
->activated
) {
1559 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1560 goto exit_with_lock
;
1563 if (WARN(ndev_vif
->vif_type
!= FAPI_VIFTYPE_STATION
, "Not a Station VIF\n"))
1564 goto exit_with_lock
;
1566 if (fapi_get_u16(skb
, u
.mlme_roam_ind
.result_code
) != FAPI_RESULTCODE_HOST_REQUEST_SUCCESS
)
1567 status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
1570 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1571 slsi_kfree_skb(skb
);
1574 static void slsi_tdls_event_discovered(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1576 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1577 u16 tdls_event
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.tdls_event
);
1578 u16 peer_index
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.peer_index
);
1579 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
1580 int len
= fapi_get_mgmtlen(skb
);
1582 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1584 SLSI_INFO(sdev
, "\n");
1587 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
1588 cfg80211_rx_mgmt(&ndev_vif
->wdev
, ndev_vif
->chan
->center_freq
, 0, (const u8
*)mgmt
, len
, GFP_ATOMIC
);
1590 cfg80211_rx_mgmt(dev
, ndev_vif
->chan
->center_freq
, 0, (const u8
*)mgmt
, len
, GFP_ATOMIC
);
1592 /* Handling MLME-TDLS-PEER.response */
1593 slsi_mlme_tdls_peer_resp(sdev
, dev
, peer_index
, tdls_event
);
1596 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1598 slsi_kfree_skb(skb
);
1601 static void slsi_tdls_event_connected(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1603 struct slsi_peer
*peer
= NULL
;
1604 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1605 u16 peer_index
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.peer_index
);
1606 u16 tdls_event
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.tdls_event
);
1608 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1610 ndev_vif
->sta
.tdls_enabled
= true;
1612 SLSI_INFO(sdev
, "(vif:%d, peer_index:%d mac[%pM])\n",
1613 fapi_get_vif(skb
), peer_index
, fapi_get_buff(skb
, u
.mlme_tdls_peer_ind
.peer_sta_address
));
1615 if (!ndev_vif
->activated
) {
1616 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1617 goto exit_with_lock
;
1620 if (WARN(ndev_vif
->vif_type
!= FAPI_VIFTYPE_STATION
, "STA VIF"))
1621 goto exit_with_lock
;
1623 if (peer_index
< SLSI_TDLS_PEER_INDEX_MIN
|| peer_index
> SLSI_TDLS_PEER_INDEX_MAX
) {
1624 SLSI_NET_ERR(dev
, "Received incorrect peer_index: %d\n", peer_index
);
1625 goto exit_with_lock
;
1628 slsi_spinlock_lock(&ndev_vif
->peer_lock
);
1629 /* Check for MAX client */
1630 if ((ndev_vif
->sta
.tdls_peer_sta_records
) + 1 > SLSI_TDLS_PEER_CONNECTIONS_MAX
) {
1631 SLSI_NET_ERR(dev
, "MAX TDLS peer limit reached. Ignore ind for peer_index:%d\n", peer_index
);
1632 slsi_spinlock_unlock(&ndev_vif
->peer_lock
);
1633 goto exit_with_lock
;
1636 peer
= slsi_peer_add(sdev
, dev
, fapi_get_buff(skb
, u
.mlme_tdls_peer_ind
.peer_sta_address
), peer_index
);
1639 SLSI_NET_ERR(dev
, "Peer NOT Created\n");
1640 slsi_spinlock_unlock(&ndev_vif
->peer_lock
);
1641 goto exit_with_lock
;
1644 /* QoS is mandatory for TDLS - enable QoS for TDLS peer by default */
1645 peer
->qos_enabled
= true;
1647 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
1649 /* Move TDLS packets from STA_Q to TDLS_Q */
1650 slsi_tdls_move_packets(sdev
, dev
, ndev_vif
->peer_sta_record
[SLSI_STA_PEER_QUEUESET
], peer
, true);
1651 slsi_spinlock_unlock(&ndev_vif
->peer_lock
);
1653 /* Handling MLME-TDLS-PEER.response */
1654 slsi_mlme_tdls_peer_resp(sdev
, dev
, peer_index
, tdls_event
);
1657 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1658 slsi_kfree_skb(skb
);
1661 static void slsi_tdls_event_disconnected(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1663 struct slsi_peer
*peer
= NULL
;
1664 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1665 u16 pid
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.peer_index
);
1666 u16 tdls_event
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.tdls_event
);
1668 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1673 SLSI_INFO(sdev
, "(vif:%d, MAC:%pM)\n", ndev_vif
->ifnum
,
1674 fapi_get_buff(skb
, u
.mlme_tdls_peer_ind
.peer_sta_address
));
1676 if (!ndev_vif
->activated
) {
1677 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1681 slsi_spinlock_lock(&ndev_vif
->peer_lock
);
1682 peer
= slsi_get_peer_from_mac(sdev
, dev
, fapi_get_buff(skb
, u
.mlme_tdls_peer_ind
.peer_sta_address
));
1684 if (!peer
|| (peer
->aid
== 0)) {
1685 WARN_ON(!peer
|| (peer
->aid
== 0));
1686 SLSI_NET_DBG1(dev
, SLSI_MLME
, "peer NOT found by MAC address\n");
1687 slsi_spinlock_unlock(&ndev_vif
->peer_lock
);
1691 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_DISCONNECTED
);
1693 /* Move TDLS packets from TDLS_Q to STA_Q */
1694 slsi_tdls_move_packets(sdev
, dev
, ndev_vif
->peer_sta_record
[SLSI_STA_PEER_QUEUESET
], peer
, false);
1696 slsi_peer_remove(sdev
, dev
, peer
);
1697 slsi_spinlock_unlock(&ndev_vif
->peer_lock
);
1699 slsi_mlme_tdls_peer_resp(sdev
, dev
, pid
, tdls_event
);
1701 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1702 slsi_kfree_skb(skb
);
1705 /* Handling for MLME-TDLS-PEER.indication
1707 void slsi_tdls_peer_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1709 u16 tdls_event
= fapi_get_u16(skb
, u
.mlme_tdls_peer_ind
.tdls_event
);
1711 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_tdls_peer_ind tdls_event: %d\n", tdls_event
);
1713 switch (tdls_event
) {
1714 case FAPI_TDLSEVENT_CONNECTED
:
1715 slsi_tdls_event_connected(sdev
, dev
, skb
);
1717 case FAPI_TDLSEVENT_DISCONNECTED
:
1718 slsi_tdls_event_disconnected(sdev
, dev
, skb
);
1720 case FAPI_TDLSEVENT_DISCOVERED
:
1721 slsi_tdls_event_discovered(sdev
, dev
, skb
);
1724 WARN_ON((tdls_event
== 0) || (tdls_event
> 4));
1725 slsi_kfree_skb(skb
);
1730 /* Retrieve any buffered frame before connected_ind and pass them up. */
1731 void slsi_rx_buffered_frames(struct slsi_dev
*sdev
, struct net_device
*dev
, struct slsi_peer
*peer
)
1733 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1734 struct sk_buff
*buff_frame
= NULL
;
1736 WARN_ON(!SLSI_MUTEX_IS_LOCKED(ndev_vif
->vif_mutex
));
1737 if (WARN(!peer
, "Peer is NULL"))
1739 WARN(peer
->connected_state
== SLSI_STA_CONN_STATE_CONNECTING
, "Wrong state");
1741 SLSI_NET_DBG2(dev
, SLSI_MLME
, "Processing buffered RX frames received before mlme_connected_ind for (vif:%d, aid:%d)\n",
1742 ndev_vif
->ifnum
, peer
->aid
);
1743 buff_frame
= slsi_skb_dequeue(&peer
->buffered_frames
);
1744 while (buff_frame
) {
1745 slsi_debug_frame(sdev
, dev
, buff_frame
, "RX_BUFFERED");
1746 switch (fapi_get_sigid(buff_frame
)) {
1747 case MA_BLOCKACK_IND
:
1748 SLSI_NET_DBG2(dev
, SLSI_MLME
, "Transferring buffered MA_BLOCKACK_IND frame");
1749 __slsi_rx_blockack_ind(sdev
, dev
, buff_frame
);
1752 SLSI_NET_WARN(dev
, "Unexpected Data: 0x%.4x\n", fapi_get_sigid(buff_frame
));
1753 slsi_kfree_skb(buff_frame
);
1756 buff_frame
= slsi_skb_dequeue(&peer
->buffered_frames
);
1760 #ifdef CONFIG_SCSC_WLAN_SAE_CONFIG
1761 void slsi_rx_synchronised_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1763 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1764 const u8
*connecting_ssid
= NULL
;
1765 struct cfg80211_external_auth_params auth_request
;
1768 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1769 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Received slsi_rx_synchronised_ind\n");
1770 if (ndev_vif
->sta
.sta_bss
->ies
->len
)
1771 connecting_ssid
= cfg80211_find_ie(WLAN_EID_SSID
, ndev_vif
->sta
.sta_bss
->ies
->data
,
1772 ndev_vif
->sta
.sta_bss
->ies
->len
);
1774 auth_request
.action
= NL80211_EXTERNAL_AUTH_START
;
1775 memcpy(auth_request
.bssid
, ndev_vif
->sta
.sta_bss
->bssid
, ETH_ALEN
);
1776 if (connecting_ssid
&& (connecting_ssid
[1] > 0)) {
1777 memcpy(auth_request
.ssid
.ssid
, &connecting_ssid
[2], connecting_ssid
[1]);
1778 auth_request
.ssid
.ssid_len
= connecting_ssid
[1];
1780 auth_request
.key_mgmt_suite
= ndev_vif
->sta
.crypto
.akm_suites
[0];
1781 r
= cfg80211_external_auth_request(dev
, &auth_request
, GFP_KERNEL
);
1783 SLSI_NET_DBG1(dev
, SLSI_MLME
, "cfg80211_external_auth_request failed");
1784 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1788 void slsi_rx_connected_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1790 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1791 struct slsi_peer
*peer
= NULL
;
1792 u16 aid
= fapi_get_u16(skb
, u
.mlme_connected_ind
.association_identifier
);
1794 /* For AP mode, peer_index value is equivalent to aid(association_index) value */
1796 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1798 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_connected_ind(vif:%d, peer_index:%d)\n",
1801 SLSI_INFO(sdev
, "Received Association Response\n");
1803 if (!ndev_vif
->activated
) {
1804 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1805 goto exit_with_lock
;
1808 if (WARN(ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
, "STA VIF and Not Roaming"))
1809 goto exit_with_lock
;
1811 switch (ndev_vif
->vif_type
) {
1812 case FAPI_VIFTYPE_AP
:
1814 if (aid
< SLSI_PEER_INDEX_MIN
|| aid
> SLSI_PEER_INDEX_MAX
) {
1815 SLSI_NET_ERR(dev
, "Received incorrect peer_index: %d\n", aid
);
1816 goto exit_with_lock
;
1819 peer
= slsi_get_peer_from_qs(sdev
, dev
, aid
- 1);
1821 SLSI_NET_ERR(dev
, "Peer (aid:%d) Not Found - Disconnect peer\n", aid
);
1822 goto exit_with_lock
;
1825 cfg80211_new_sta(dev
, peer
->address
, &peer
->sinfo
, GFP_KERNEL
);
1827 if (ndev_vif
->ap
.privacy
) {
1828 peer
->connected_state
= SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
;
1829 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
);
1831 peer
->connected_state
= SLSI_STA_CONN_STATE_CONNECTED
;
1832 slsi_mlme_connected_resp(sdev
, dev
, aid
);
1833 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
1835 slsi_rx_buffered_frames(sdev
, dev
, peer
);
1840 SLSI_NET_WARN(dev
, "mlme_connected_ind(vif:%d, unexpected vif type:%d)\n", fapi_get_vif(skb
), ndev_vif
->vif_type
);
1844 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1845 slsi_kfree_skb(skb
);
1848 void slsi_rx_reassoc_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1850 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1851 enum ieee80211_statuscode status
= WLAN_STATUS_SUCCESS
;
1852 struct slsi_peer
*peer
= NULL
;
1853 u8
*assoc_ie
= NULL
;
1854 int assoc_ie_len
= 0;
1855 u8
*reassoc_rsp_ie
= NULL
;
1856 int reassoc_rsp_ie_len
= 0;
1858 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_reassoc_ind(vif:%d, result:0x%04x)\n",
1860 fapi_get_u16(skb
, u
.mlme_reassociate_ind
.result_code
));
1862 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1864 if (!ndev_vif
->activated
) {
1865 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1866 goto exit_with_lock
;
1869 if (WARN(ndev_vif
->vif_type
!= FAPI_VIFTYPE_STATION
, "Not a Station VIF\n"))
1870 goto exit_with_lock
;
1872 peer
= slsi_get_peer_from_qs(sdev
, dev
, 0);
1873 if (WARN_ON(!peer
)) {
1874 SLSI_NET_ERR(dev
, "PEER Not found\n");
1875 goto exit_with_lock
;
1878 if (fapi_get_u16(skb
, u
.mlme_reassociate_ind
.result_code
) != FAPI_RESULTCODE_SUCCESS
) {
1879 status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
1880 slsi_rx_ba_stop_all(dev
, peer
);
1882 peer
->pairwise_key_set
= 0;
1884 if (peer
->assoc_ie
) {
1885 assoc_ie
= peer
->assoc_ie
->data
;
1886 assoc_ie_len
= peer
->assoc_ie
->len
;
1887 WARN_ON(assoc_ie_len
&& !assoc_ie
);
1890 slsi_peer_reset_stats(sdev
, dev
, peer
);
1892 peer
->sinfo
.assoc_req_ies
= assoc_ie
;
1893 peer
->sinfo
.assoc_req_ies_len
= assoc_ie_len
;
1894 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0))
1895 peer
->sinfo
.filled
|= STATION_INFO_ASSOC_REQ_IES
;
1897 slsi_peer_update_assoc_rsp(sdev
, dev
, peer
, skb
);
1898 /* skb is consumed by slsi_peer_update_assoc_rsp. So do not access this anymore. */
1900 if (peer
->assoc_resp_ie
) {
1901 reassoc_rsp_ie
= peer
->assoc_resp_ie
->data
;
1902 reassoc_rsp_ie_len
= peer
->assoc_resp_ie
->len
;
1903 WARN_ON(reassoc_rsp_ie_len
&& !reassoc_rsp_ie
);
1906 /* update the uapsd bitmask according to the bit values
1907 * in wmm information element of association request
1909 if (!sta_wmm_update_uapsd(sdev
, dev
, peer
, assoc_ie
, assoc_ie_len
))
1910 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM uapsd\n");
1912 /* update the acm bitmask according to the acm bit values that
1913 * are included in wmm ie elements of re-association response
1915 if (!sta_wmm_update_wmm_ac_ies(sdev
, dev
, peer
, reassoc_rsp_ie
, reassoc_rsp_ie_len
))
1916 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM AC ies\n");
1919 /* cfg80211_connect_result will take a copy of any ASSOC or (RE)ASSOC RSP IEs passed to it */
1920 cfg80211_connect_result(dev
,
1922 assoc_ie
, assoc_ie_len
,
1923 reassoc_rsp_ie
, reassoc_rsp_ie_len
,
1927 if (status
== WLAN_STATUS_SUCCESS
) {
1928 ndev_vif
->sta
.vif_status
= SLSI_VIF_STATUS_CONNECTED
;
1930 /* For Open & WEP AP,send reassoc response.
1931 * For secured AP, all this would be done after handshake
1933 if ((peer
->capabilities
& WLAN_CAPABILITY_PRIVACY
) &&
1934 (cfg80211_find_ie(WLAN_EID_RSN
, assoc_ie
, assoc_ie_len
) ||
1935 cfg80211_find_ie(SLSI_WLAN_EID_WAPI
, assoc_ie
, assoc_ie_len
) ||
1936 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WPA
, assoc_ie
, assoc_ie_len
))) {
1938 ndev_vif
->sta
.resp_id
= MLME_REASSOCIATE_RES
;
1939 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
);
1940 peer
->connected_state
= SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
;
1943 slsi_mlme_reassociate_resp(sdev
, dev
);
1944 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
1945 peer
->connected_state
= SLSI_STA_CONN_STATE_CONNECTED
;
1948 netif_carrier_off(dev
);
1949 slsi_mlme_del_vif(sdev
, dev
);
1950 slsi_vif_deactivated(sdev
, dev
);
1954 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
1955 slsi_kfree_skb(skb
);
1958 void slsi_rx_connect_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
1960 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
1961 enum ieee80211_statuscode status
= WLAN_STATUS_SUCCESS
;
1962 struct slsi_peer
*peer
= NULL
;
1963 u8
*assoc_ie
= NULL
;
1964 int assoc_ie_len
= 0;
1965 u8
*assoc_rsp_ie
= NULL
;
1966 int assoc_rsp_ie_len
= 0;
1970 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
1972 fw_result_code
= fapi_get_u16(skb
, u
.mlme_connect_ind
.result_code
);
1974 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_connect_ind(vif:%d, result:0x%04x)\n",
1975 fapi_get_vif(skb
), fw_result_code
);
1977 if (!ndev_vif
->activated
) {
1978 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
1979 goto exit_with_lock
;
1982 if (WARN(ndev_vif
->vif_type
!= FAPI_VIFTYPE_STATION
, "Not a Station VIF\n"))
1983 goto exit_with_lock
;
1985 if (ndev_vif
->sta
.vif_status
!= SLSI_VIF_STATUS_CONNECTING
) {
1986 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not connecting\n");
1987 goto exit_with_lock
;
1990 peer
= slsi_get_peer_from_qs(sdev
, dev
, SLSI_STA_PEER_QUEUESET
);
1992 SLSI_ETHER_COPY(bssid
, peer
->address
);
1994 SLSI_NET_ERR(dev
, "!!NO peer record for AP\n");
1995 eth_zero_addr(bssid
);
1997 sdev
->assoc_result_code
= fw_result_code
;
1998 if (fw_result_code
!= FAPI_RESULTCODE_SUCCESS
) {
1999 if (fw_result_code
== FAPI_RESULTCODE_AUTH_NO_ACK
) {
2000 SLSI_INFO(sdev
, "Connect failed,Result code:AUTH_NO_ACK\n");
2001 } else if (fw_result_code
== FAPI_RESULTCODE_ASSOC_NO_ACK
) {
2002 SLSI_INFO(sdev
, "Connect failed,Result code:ASSOC_NO_ACK\n");
2003 } else if (fw_result_code
>= 0x8100 && fw_result_code
<= 0x81FF) {
2004 fw_result_code
= fw_result_code
& 0x00FF;
2005 SLSI_INFO(sdev
, "Connect failed(Auth failure), Result code:0x%04x\n", fw_result_code
);
2006 } else if (fw_result_code
>= 0x8200 && fw_result_code
<= 0x82FF) {
2007 fw_result_code
= fw_result_code
& 0x00FF;
2008 SLSI_INFO(sdev
, "Connect failed(Assoc Failure), Result code:0x%04x\n", fw_result_code
);
2009 if (fapi_get_datalen(skb
)) {
2011 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
2013 if (ieee80211_is_assoc_resp(mgmt
->frame_control
)) {
2014 mgmt_hdr_len
= (mgmt
->u
.assoc_resp
.variable
- (u8
*)mgmt
);
2015 } else if (ieee80211_is_reassoc_resp(mgmt
->frame_control
)) {
2016 mgmt_hdr_len
= (mgmt
->u
.reassoc_resp
.variable
- (u8
*)mgmt
);
2018 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Assoc/Reassoc response not found!\n");
2019 goto exit_with_lock
;
2022 assoc_rsp_ie
= (char *)mgmt
+ mgmt_hdr_len
;
2023 assoc_rsp_ie_len
= fapi_get_datalen(skb
) - mgmt_hdr_len
;
2026 SLSI_INFO(sdev
, "Connect failed,Result code:0x%04x\n", fw_result_code
);
2028 #ifdef CONFIG_SCSC_LOG_COLLECTION
2029 /* Trigger log collection if fw result code is not success */
2030 scsc_log_collector_schedule_collection(SCSC_LOG_HOST_WLAN
, SCSC_LOG_HOST_WLAN_REASON_CONNECT_ERR
);
2032 status
= fw_result_code
;
2033 #ifdef CONFIG_SCSC_WLAN_SAE_CONFIG
2034 if (ndev_vif
->sta
.crypto
.wpa_versions
== 3) {
2035 const u8
*connecting_ssid
= NULL
;
2037 struct cfg80211_external_auth_params auth_request
;
2039 if (ndev_vif
->sta
.sta_bss
->ies
->len
)
2040 connecting_ssid
= cfg80211_find_ie(WLAN_EID_SSID
, ndev_vif
->sta
.sta_bss
->ies
->data
,
2041 ndev_vif
->sta
.sta_bss
->ies
->len
);
2043 auth_request
.action
= NL80211_EXTERNAL_AUTH_ABORT
;
2044 memcpy(auth_request
.bssid
, ndev_vif
->sta
.sta_bss
->bssid
, ETH_ALEN
);
2045 if (connecting_ssid
&& (connecting_ssid
[1] > 0)) {
2046 memcpy(auth_request
.ssid
.ssid
, &connecting_ssid
[2], connecting_ssid
[1]);
2047 auth_request
.ssid
.ssid_len
= connecting_ssid
[1];
2049 auth_request
.key_mgmt_suite
= ndev_vif
->sta
.crypto
.akm_suites
[0];
2050 r
= cfg80211_external_auth_request(dev
, &auth_request
, GFP_KERNEL
);
2052 SLSI_NET_DBG1(dev
, SLSI_MLME
, "cfg80211_external_auth_request Abort failed");
2056 SLSI_INFO(sdev
, "Received Association Response\n");
2057 if (!peer
|| !peer
->assoc_ie
) {
2059 WARN(!peer
->assoc_ie
, "proc-started-ind not received before connect-ind");
2060 status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
2062 if (peer
->assoc_ie
) {
2063 assoc_ie
= peer
->assoc_ie
->data
;
2064 assoc_ie_len
= peer
->assoc_ie
->len
;
2067 slsi_peer_update_assoc_rsp(sdev
, dev
, peer
, skb
);
2068 /* skb is consumed by slsi_peer_update_assoc_rsp. So do not access this anymore. */
2071 if (peer
->assoc_resp_ie
) {
2072 assoc_rsp_ie
= peer
->assoc_resp_ie
->data
;
2073 assoc_rsp_ie_len
= peer
->assoc_resp_ie
->len
;
2076 /* this is the right place to initialize the bitmasks for
2077 * acm bit and tspec establishment
2080 peer
->tspec_established
= 0;
2083 /* update the uapsd bitmask according to the bit values
2084 * in wmm information element of association request
2086 if (!sta_wmm_update_uapsd(sdev
, dev
, peer
, assoc_ie
, assoc_ie_len
))
2087 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM uapsd\n");
2089 /* update the wmm ac bitmasks according to the bit values that
2090 * are included in wmm ie elements of association response
2092 if (!sta_wmm_update_wmm_ac_ies(sdev
, dev
, peer
, assoc_rsp_ie
, assoc_rsp_ie_len
))
2093 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Fail to update WMM AC ies\n");
2095 WARN_ON(!assoc_rsp_ie_len
&& !assoc_rsp_ie
);
2098 WARN(!ndev_vif
->sta
.mlme_scan_ind_skb
, "mlme_scan.ind not received before connect-ind");
2100 if (ndev_vif
->sta
.mlme_scan_ind_skb
) {
2101 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Sending scan indication to cfg80211, bssid: %pM\n", fapi_get_mgmt(ndev_vif
->sta
.mlme_scan_ind_skb
)->bssid
);
2103 /* saved skb [mlme_scan_ind] freed inside slsi_rx_scan_pass_to_cfg80211 */
2104 slsi_rx_scan_pass_to_cfg80211(sdev
, dev
, ndev_vif
->sta
.mlme_scan_ind_skb
);
2105 ndev_vif
->sta
.mlme_scan_ind_skb
= NULL
;
2108 if (!ndev_vif
->sta
.sta_bss
) {
2110 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
2111 ndev_vif
->sta
.sta_bss
= cfg80211_get_bss(sdev
->wiphy
, ndev_vif
->chan
, peer
->address
,
2112 NULL
, 0, IEEE80211_BSS_TYPE_ANY
,
2113 IEEE80211_PRIVACY_ANY
);
2115 ndev_vif
->sta
.sta_bss
= cfg80211_get_bss(sdev
->wiphy
, ndev_vif
->chan
, peer
->address
,
2118 if (!ndev_vif
->sta
.sta_bss
) {
2119 SLSI_NET_ERR(dev
, "sta_bss is not available, terminating the connection (peer: %p)\n", peer
);
2120 status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
2125 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))
2126 cfg80211_ref_bss(sdev
->wiphy
, ndev_vif
->sta
.sta_bss
);
2127 cfg80211_connect_bss(dev
, bssid
, ndev_vif
->sta
.sta_bss
, assoc_ie
, assoc_ie_len
, assoc_rsp_ie
,
2128 assoc_rsp_ie_len
, status
, GFP_KERNEL
, NL80211_TIMEOUT_UNSPECIFIED
);
2130 /* cfg80211_connect_result will take a copy of any ASSOC or
2131 * ASSOC RSP IEs passed to it
2133 cfg80211_connect_result(dev
,
2135 assoc_ie
, assoc_ie_len
,
2136 assoc_rsp_ie
, assoc_rsp_ie_len
,
2140 if (status
== WLAN_STATUS_SUCCESS
) {
2141 ndev_vif
->sta
.vif_status
= SLSI_VIF_STATUS_CONNECTED
;
2143 /* For Open & WEP AP,set the power mode (static IP scenario) ,send connect response and install the packet filters .
2144 * For secured AP, all this would be done after handshake
2146 if ((peer
->capabilities
& WLAN_CAPABILITY_PRIVACY
) &&
2147 (cfg80211_find_ie(WLAN_EID_RSN
, assoc_ie
, assoc_ie_len
) ||
2148 cfg80211_find_ie(SLSI_WLAN_EID_WAPI
, assoc_ie
, assoc_ie_len
) ||
2149 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WPA
, assoc_ie
, assoc_ie_len
))) {
2151 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_DOING_KEY_CONFIG
);
2152 ndev_vif
->sta
.resp_id
= MLME_CONNECT_RES
;
2155 slsi_mlme_connect_resp(sdev
, dev
);
2156 slsi_set_packet_filters(sdev
, dev
);
2158 if (ndev_vif
->ipaddress
)
2159 slsi_mlme_powermgt(sdev
, dev
, ndev_vif
->set_power_mode
);
2160 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
2163 /* For P2PCLI, set the Connection Timeout (beacon miss) mib to 10 seconds
2164 * This MIB set failure does not cause any fatal isuue. It just varies the
2165 * detection time of GO's absence from 10 sec to FW default. So Do not disconnect
2167 if (ndev_vif
->iftype
== NL80211_IFTYPE_P2P_CLIENT
)
2168 SLSI_P2P_STATE_CHANGE(sdev
, P2P_GROUP_FORMED_CLI
);
2170 /*Update the firmware with cached channels*/
2171 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
2172 if (!sdev
->device_config
.roam_scan_mode
&& ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
&& ndev_vif
->activated
&& ndev_vif
->iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
2174 if (ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
&& ndev_vif
->activated
&& ndev_vif
->iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
2176 const u8
*ssid
= cfg80211_find_ie(WLAN_EID_SSID
, assoc_ie
, assoc_ie_len
);
2177 u8 channels
[SLSI_ROAMING_CHANNELS_MAX
];
2178 u32 channels_count
= slsi_roaming_scan_configure_channels(sdev
, dev
, ssid
, channels
);
2181 if (slsi_mlme_set_cached_channels(sdev
, dev
, channels_count
, channels
) != 0)
2182 SLSI_NET_ERR(dev
, "MLME-SET-CACHED-CHANNELS.req failed\n");
2185 /* Firmware reported connection success, but driver reported failure to cfg80211:
2186 * send mlme-disconnect.req to firmware
2188 if ((fw_result_code
== FAPI_RESULTCODE_SUCCESS
) && peer
) {
2189 slsi_mlme_disconnect(sdev
, dev
, peer
->address
, FAPI_REASONCODE_UNSPECIFIED_REASON
, true);
2190 slsi_handle_disconnect(sdev
, dev
, peer
->address
, FAPI_REASONCODE_UNSPECIFIED_REASON
, NULL
, 0);
2192 slsi_handle_disconnect(sdev
, dev
, NULL
, FAPI_REASONCODE_UNSPECIFIED_REASON
, NULL
, 0);
2197 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2198 slsi_kfree_skb(skb
);
2201 void slsi_rx_disconnect_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2203 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2205 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2207 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_disconnect_ind(vif:%d, MAC:%pM)\n",
2209 fapi_get_buff(skb
, u
.mlme_disconnect_ind
.peer_sta_address
));
2211 #ifdef CONFIG_SCSC_LOG_COLLECTION
2212 scsc_log_collector_schedule_collection(SCSC_LOG_HOST_WLAN
, SCSC_LOG_HOST_WLAN_REASON_DISCONNECT_IND
);
2217 SLSI_INFO(sdev
, "Received DEAUTH, reason = 0\n");
2218 slsi_handle_disconnect(sdev
,
2220 fapi_get_buff(skb
, u
.mlme_disconnect_ind
.peer_sta_address
),
2225 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2226 slsi_kfree_skb(skb
);
2229 void slsi_rx_disconnected_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2231 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2233 u8
*disassoc_rsp_ie
= NULL
;
2234 u32 disassoc_rsp_ie_len
= 0;
2236 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2237 reason
= fapi_get_u16(skb
, u
.mlme_disconnected_ind
.reason_code
);
2238 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_disconnected_ind(vif:%d, reason:%d, MAC:%pM)\n",
2240 fapi_get_u16(skb
, u
.mlme_disconnected_ind
.reason_code
),
2241 fapi_get_buff(skb
, u
.mlme_disconnected_ind
.peer_sta_address
));
2243 #ifdef CONFIG_SCSC_LOG_COLLECTION
2244 scsc_log_collector_schedule_collection(SCSC_LOG_HOST_WLAN
, SCSC_LOG_HOST_WLAN_REASON_DISCONNECTED_IND
);
2248 if (reason
<= 0xFF) {
2249 SLSI_INFO(sdev
, "Received DEAUTH, reason = %d\n", reason
);
2250 } else if (reason
>= 0x8100 && reason
<= 0x81FF) {
2251 reason
= reason
& 0x00FF;
2252 SLSI_INFO(sdev
, "Received DEAUTH, reason = %d\n", reason
);
2253 } else if (reason
>= 0x8200 && reason
<= 0x82FF) {
2254 reason
= reason
& 0x00FF;
2255 SLSI_INFO(sdev
, "Received DISASSOC, reason = %d\n", reason
);
2257 SLSI_INFO(sdev
, "Received DEAUTH, reason = Local Disconnect <%d>\n", reason
);
2260 if (fapi_get_datalen(skb
)) {
2261 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
2263 if (ieee80211_is_deauth(mgmt
->frame_control
)) {
2264 disassoc_rsp_ie
= (char *)&mgmt
->u
.deauth
.reason_code
+ 2;
2265 disassoc_rsp_ie_len
= fapi_get_datalen(skb
) -
2266 (u32
)(disassoc_rsp_ie
- (u8
*)fapi_get_data(skb
));
2267 } else if (ieee80211_is_disassoc(mgmt
->frame_control
)) {
2268 disassoc_rsp_ie
= (char *)&mgmt
->u
.disassoc
.reason_code
+ 2;
2269 disassoc_rsp_ie_len
= fapi_get_datalen(skb
) -
2270 (u32
)(disassoc_rsp_ie
- (u8
*)fapi_get_data(skb
));
2272 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Not a disassoc/deauth packet\n");
2276 if (ndev_vif
->vif_type
== FAPI_VIFTYPE_AP
) {
2277 if (fapi_get_u16(skb
, u
.mlme_disconnected_ind
.reason_code
) ==
2278 FAPI_REASONCODE_HOTSPOT_MAX_CLIENT_REACHED
) {
2279 SLSI_NET_DBG1(dev
, SLSI_MLME
,
2280 "Sending max hotspot client reached notification to user space\n");
2281 cfg80211_conn_failed(dev
, fapi_get_buff(skb
, u
.mlme_disconnected_ind
.peer_sta_address
),
2282 NL80211_CONN_FAIL_MAX_CLIENTS
, GFP_KERNEL
);
2287 slsi_handle_disconnect(sdev
,
2289 fapi_get_buff(skb
, u
.mlme_disconnected_ind
.peer_sta_address
),
2290 fapi_get_u16(skb
, u
.mlme_disconnected_ind
.reason_code
),
2292 disassoc_rsp_ie_len
);
2295 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2296 slsi_kfree_skb(skb
);
2300 /* Handle Procedure Started (Type = Device Discovered) indication for P2P */
2301 static void slsi_rx_p2p_device_discovered_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2303 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2306 SLSI_UNUSED_PARAMETER(sdev
);
2308 SLSI_NET_DBG2(dev
, SLSI_CFG80211
, "Freq = %d\n", ndev_vif
->chan
->center_freq
);
2310 /* Only Probe Request is expected as of now */
2311 mgmt_len
= fapi_get_mgmtlen(skb
);
2313 struct ieee80211_mgmt
*mgmt
= fapi_get_mgmt(skb
);
2315 if (ieee80211_is_mgmt(mgmt
->frame_control
)) {
2316 if (ieee80211_is_probe_req(mgmt
->frame_control
)) {
2317 SLSI_NET_DBG3(dev
, SLSI_CFG80211
, "Received Probe Request\n");
2318 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
2319 cfg80211_rx_mgmt(&ndev_vif
->wdev
, ndev_vif
->chan
->center_freq
, 0, (const u8
*)mgmt
, mgmt_len
, GFP_ATOMIC
);
2321 cfg80211_rx_mgmt(dev
, ndev_vif
->chan
->center_freq
, 0, (const u8
*)mgmt
, mgmt_len
, GFP_ATOMIC
);
2324 SLSI_NET_ERR(dev
, "Ignore Indication - Not Probe Request frame\n");
2326 SLSI_NET_ERR(dev
, "Ignore Indication - Not Management frame\n");
2331 void slsi_rx_procedure_started_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2333 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2334 struct slsi_peer
*peer
= NULL
;
2336 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2338 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_procedure_started_ind(vif:%d, type:%d, aid:%d)\n",
2340 fapi_get_u16(skb
, u
.mlme_procedure_started_ind
.procedure_type
),
2341 fapi_get_u16(skb
, u
.mlme_procedure_started_ind
.association_identifier
));
2342 SLSI_INFO(sdev
, "Send Association Request\n");
2344 if (!ndev_vif
->activated
) {
2345 SLSI_NET_DBG1(dev
, SLSI_MLME
, "VIF not activated\n");
2346 goto exit_with_lock
;
2349 switch (fapi_get_u16(skb
, u
.mlme_procedure_started_ind
.procedure_type
)) {
2350 case FAPI_PROCEDURETYPE_CONNECTION_STARTED
:
2351 switch (ndev_vif
->vif_type
) {
2352 case FAPI_VIFTYPE_AP
:
2354 u16 aid
= fapi_get_u16(skb
, u
.mlme_procedure_started_ind
.association_identifier
);
2356 /* Check for MAX client */
2357 if ((ndev_vif
->peer_sta_records
+ 1) > SLSI_AP_PEER_CONNECTIONS_MAX
) {
2358 SLSI_NET_ERR(dev
, "MAX Station limit reached. Ignore ind for aid:%d\n", aid
);
2359 goto exit_with_lock
;
2362 if (aid
< SLSI_PEER_INDEX_MIN
|| aid
> SLSI_PEER_INDEX_MAX
) {
2363 SLSI_NET_ERR(dev
, "Received incorrect aid: %d\n", aid
);
2364 goto exit_with_lock
;
2367 peer
= slsi_peer_add(sdev
, dev
, (fapi_get_mgmt(skb
))->sa
, aid
);
2369 SLSI_NET_ERR(dev
, "Peer NOT Created\n");
2370 goto exit_with_lock
;
2372 slsi_peer_update_assoc_req(sdev
, dev
, peer
, skb
);
2373 /* skb is consumed by slsi_peer_update_assoc_req. So do not access this anymore. */
2375 peer
->connected_state
= SLSI_STA_CONN_STATE_CONNECTING
;
2377 if ((ndev_vif
->iftype
== NL80211_IFTYPE_P2P_GO
) &&
2379 (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
, WLAN_OUI_TYPE_MICROSOFT_WPS
, peer
->assoc_ie
->data
, peer
->assoc_ie
->len
))) {
2380 SLSI_NET_DBG2(dev
, SLSI_MLME
, "WPS IE is present. Setting peer->is_wps to TRUE\n");
2381 peer
->is_wps
= true;
2384 /* Take a wakelock to avoid platform suspend before EAPOL exchanges (to avoid connection delay) */
2385 slsi_wakelock_timeout(&sdev
->wlan_wl_mlme
, SLSI_WAKELOCK_TIME_MSEC_EAPOL
);
2388 case FAPI_VIFTYPE_STATION
:
2390 peer
= slsi_get_peer_from_qs(sdev
, dev
, SLSI_STA_PEER_QUEUESET
);
2391 if (WARN_ON(!peer
)) {
2392 SLSI_NET_ERR(dev
, "Peer NOT FOUND\n");
2393 goto exit_with_lock
;
2395 slsi_peer_update_assoc_req(sdev
, dev
, peer
, skb
);
2396 /* skb is consumed by slsi_peer_update_assoc_rsp. So do not access this anymore. */
2401 SLSI_NET_ERR(dev
, "Incorrect vif type for proceduretype_connection_started\n");
2405 case FAPI_PROCEDURETYPE_DEVICE_DISCOVERED
:
2406 /* Expected only in P2P Device and P2P GO role */
2407 if (WARN_ON(!SLSI_IS_VIF_INDEX_P2P(ndev_vif
) && (ndev_vif
->iftype
!= NL80211_IFTYPE_P2P_GO
)))
2408 goto exit_with_lock
;
2410 /* Send probe request to supplicant only if in listening state. Issues were seen earlier if
2411 * Probe request was sent to supplicant while waiting for GO Neg Req from peer.
2412 * Send Probe request to supplicant if received in GO mode
2414 if ((sdev
->p2p_state
== P2P_LISTENING
) || (ndev_vif
->iftype
== NL80211_IFTYPE_P2P_GO
))
2415 slsi_rx_p2p_device_discovered_ind(sdev
, dev
, skb
);
2417 case FAPI_PROCEDURETYPE_ROAMING_STARTED
:
2419 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Roaming Procedure Starting with %pM\n", (fapi_get_mgmt(skb
))->bssid
);
2420 if (WARN_ON(ndev_vif
->vif_type
!= FAPI_VIFTYPE_STATION
))
2421 goto exit_with_lock
;
2422 if (WARN_ON(!ndev_vif
->peer_sta_record
[SLSI_STA_PEER_QUEUESET
] || !ndev_vif
->peer_sta_record
[SLSI_STA_PEER_QUEUESET
]->valid
))
2423 goto exit_with_lock
;
2424 slsi_kfree_skb(ndev_vif
->sta
.roam_mlme_procedure_started_ind
);
2425 ndev_vif
->sta
.roam_mlme_procedure_started_ind
= skb
;
2426 /* skb is consumed here. So remove reference to this.*/
2431 SLSI_NET_DBG1(dev
, SLSI_MLME
, "Unknown Procedure: %d\n", fapi_get_u16(skb
, u
.mlme_procedure_started_ind
.procedure_type
));
2432 goto exit_with_lock
;
2436 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2437 slsi_kfree_skb(skb
);
2440 void slsi_rx_frame_transmission_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2442 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2443 struct slsi_peer
*peer
;
2444 u16 host_tag
= fapi_get_u16(skb
, u
.mlme_frame_transmission_ind
.host_tag
);
2445 u16 tx_status
= fapi_get_u16(skb
, u
.mlme_frame_transmission_ind
.transmission_status
);
2448 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2450 SLSI_NET_DBG2(dev
, SLSI_MLME
, "mlme_frame_transmission_ind(vif:%d, host_tag:%d, transmission_status:%d)\n", fapi_get_vif(skb
),
2454 if (ndev_vif
->mgmt_tx_data
.host_tag
== host_tag
) {
2455 struct netdev_vif
*ndev_vif_to_cfg
= ndev_vif
;
2457 /* If frame tx failed allow del_vif work to take care of vif deletion.
2458 * This work would be queued as part of frame_tx with the wait duration
2460 if (tx_status
!= FAPI_TRANSMISSIONSTATUS_SUCCESSFUL
) {
2462 if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif
)) {
2463 if (sdev
->wlan_unsync_vif_state
== WLAN_UNSYNC_VIF_TX
)
2464 sdev
->wlan_unsync_vif_state
= WLAN_UNSYNC_VIF_ACTIVE
; /*We wouldn't delete VIF*/
2466 if (sdev
->p2p_group_exp_frame
!= SLSI_P2P_PA_INVALID
)
2467 slsi_clear_offchannel_data(sdev
, false);
2468 else if (ndev_vif
->mgmt_tx_data
.exp_frame
!= SLSI_P2P_PA_INVALID
)
2469 (void)slsi_mlme_reset_dwell_time(sdev
, dev
);
2470 ndev_vif
->mgmt_tx_data
.exp_frame
= SLSI_P2P_PA_INVALID
;
2474 /* Change state if frame tx was in Listen as peer response is not expected */
2475 if (SLSI_IS_VIF_INDEX_P2P(ndev_vif
) && (ndev_vif
->mgmt_tx_data
.exp_frame
== SLSI_P2P_PA_INVALID
)) {
2476 if (delayed_work_pending(&ndev_vif
->unsync
.roc_expiry_work
))
2477 SLSI_P2P_STATE_CHANGE(sdev
, P2P_LISTENING
);
2479 SLSI_P2P_STATE_CHANGE(sdev
, P2P_IDLE_VIF_ACTIVE
);
2480 } else if (SLSI_IS_VIF_INDEX_P2P_GROUP(sdev
, ndev_vif
)) {
2481 const struct ieee80211_mgmt
*mgmt
= (const struct ieee80211_mgmt
*)ndev_vif
->mgmt_tx_data
.buf
;
2483 /* If frame transmission was initiated on P2P device vif by supplicant, then use the net_dev of that vif (i.e. p2p0) */
2484 if ((mgmt
) && (memcmp(mgmt
->sa
, dev
->dev_addr
, ETH_ALEN
) != 0)) {
2485 struct net_device
*ndev
= slsi_get_netdev(sdev
, SLSI_NET_INDEX_P2P
);
2487 SLSI_NET_DBG2(dev
, SLSI_MLME
, "Frame Tx was requested with device address - Change ndev_vif for tx_status\n");
2489 ndev_vif_to_cfg
= netdev_priv(ndev
);
2490 if (!ndev_vif_to_cfg
) {
2491 SLSI_NET_ERR(dev
, "Getting P2P Index netdev failed\n");
2492 ndev_vif_to_cfg
= ndev_vif
;
2496 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
2497 if (!sdev
->device_config
.wes_mode
) {
2499 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
2500 cfg80211_mgmt_tx_status(&ndev_vif_to_cfg
->wdev
, ndev_vif
->mgmt_tx_data
.cookie
, ndev_vif
->mgmt_tx_data
.buf
, ndev_vif
->mgmt_tx_data
.buf_len
, ack
, GFP_KERNEL
);
2502 cfg80211_mgmt_tx_status(ndev_vif_to_cfg
->wdev
.netdev
, ndev_vif
->mgmt_tx_data
.cookie
, ndev_vif
->mgmt_tx_data
.buf
, ndev_vif
->mgmt_tx_data
.buf_len
, ack
, GFP_KERNEL
);
2505 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
2508 (void)slsi_set_mgmt_tx_data(ndev_vif
, 0, 0, NULL
, 0);
2511 if ((tx_status
== FAPI_TRANSMISSIONSTATUS_SUCCESSFUL
) || (tx_status
== FAPI_TRANSMISSIONSTATUS_RETRY_LIMIT
)) {
2512 #ifdef CONFIG_SCSC_WLAN_STA_ENHANCED_ARP_DETECT
2513 if (ndev_vif
->enhanced_arp_detect_enabled
&& (ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
)) {
2516 for (i
= 0; i
< SLSI_MAX_ARP_SEND_FRAME
; i
++) {
2517 if (ndev_vif
->enhanced_arp_host_tag
[i
] == host_tag
) {
2518 ndev_vif
->enhanced_arp_host_tag
[i
] = 0;
2519 ndev_vif
->enhanced_arp_stats
.arp_req_rx_count_by_lower_mac
++;
2520 if (tx_status
== FAPI_TRANSMISSIONSTATUS_SUCCESSFUL
)
2521 ndev_vif
->enhanced_arp_stats
.arp_req_count_tx_success
++;
2527 if ((ndev_vif
->vif_type
== FAPI_VIFTYPE_STATION
) &&
2528 (ndev_vif
->sta
.m4_host_tag
== host_tag
)) {
2529 switch (ndev_vif
->sta
.resp_id
) {
2530 case MLME_ROAMED_RES
:
2531 slsi_mlme_roamed_resp(sdev
, dev
);
2532 peer
= slsi_get_peer_from_qs(sdev
, dev
, SLSI_STA_PEER_QUEUESET
);
2535 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
2536 cac_update_roam_traffic_params(sdev
, dev
);
2538 case MLME_CONNECT_RES
:
2539 slsi_mlme_connect_resp(sdev
, dev
);
2540 slsi_set_packet_filters(sdev
, dev
);
2541 peer
= slsi_get_peer_from_qs(sdev
, dev
, SLSI_STA_PEER_QUEUESET
);
2544 slsi_ps_port_control(sdev
, dev
, peer
, SLSI_STA_CONN_STATE_CONNECTED
);
2546 case MLME_REASSOCIATE_RES
:
2547 slsi_mlme_reassociate_resp(sdev
, dev
);
2552 ndev_vif
->sta
.m4_host_tag
= 0;
2553 ndev_vif
->sta
.resp_id
= 0;
2555 if (tx_status
== FAPI_TRANSMISSIONSTATUS_RETRY_LIMIT
) {
2556 if ((ndev_vif
->iftype
== NL80211_IFTYPE_STATION
) &&
2557 (ndev_vif
->sta
.eap_hosttag
== host_tag
)) {
2558 if (ndev_vif
->sta
.sta_bss
) {
2559 SLSI_NET_WARN(dev
, "Disconnect as EAP frame transmission failed\n");
2560 slsi_mlme_disconnect(sdev
, dev
, ndev_vif
->sta
.sta_bss
->bssid
, FAPI_REASONCODE_UNSPECIFIED_REASON
, false);
2562 SLSI_NET_WARN(dev
, "EAP frame transmission failed, sta_bss not available\n");
2565 ndev_vif
->stats
.tx_errors
++;
2568 ndev_vif
->stats
.tx_errors
++;
2570 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2571 slsi_kfree_skb(skb
);
2574 void slsi_rx_received_frame_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2576 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2577 u16 data_unit_descriptor
= fapi_get_u16(skb
, u
.mlme_received_frame_ind
.data_unit_descriptor
);
2578 u16 frequency
= SLSI_FREQ_FW_TO_HOST(fapi_get_u16(skb
, u
.mlme_received_frame_ind
.channel_frequency
));
2582 u32 dhcp_message_type
= SLSI_DHCP_MESSAGE_TYPE_INVALID
;
2585 SLSI_NET_DBG2(dev
, SLSI_MLME
, "mlme_received_frame_ind(vif:%d, data descriptor:%d, freq:%d)\n",
2587 data_unit_descriptor
,
2590 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2591 if (data_unit_descriptor
== FAPI_DATAUNITDESCRIPTOR_IEEE802_11_FRAME
) {
2592 struct ieee80211_mgmt
*mgmt
;
2595 mgmt_len
= fapi_get_mgmtlen(skb
);
2598 mgmt
= fapi_get_mgmt(skb
);
2599 if (ieee80211_is_auth(mgmt
->frame_control
)) {
2600 cfg80211_rx_mgmt(&ndev_vif
->wdev
, frequency
, 0, (const u8
*)mgmt
, mgmt_len
, GFP_ATOMIC
);
2603 #ifdef CONFIG_SLSI_WLAN_STA_FWD_BEACON
2604 if (ndev_vif
->is_wips_running
&& ieee80211_is_beacon(mgmt
->frame_control
) &&
2605 SLSI_IS_VIF_INDEX_WLAN(ndev_vif
)) {
2606 slsi_handle_wips_beacon(sdev
, dev
, skb
, mgmt
, mgmt_len
);
2610 if (WARN_ON(!(ieee80211_is_action(mgmt
->frame_control
))))
2612 if (SLSI_IS_VIF_INDEX_WLAN(ndev_vif
)) {
2613 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
2614 if (slsi_is_wes_action_frame(mgmt
)) {
2615 SLSI_NET_DBG1(dev
, SLSI_CFG80211
, "Received NCHO WES VS action frame\n");
2616 if (!sdev
->device_config
.wes_mode
)
2620 if (mgmt
->u
.action
.category
== WLAN_CATEGORY_WMM
) {
2621 cac_rx_wmm_action(sdev
, dev
, mgmt
, mgmt_len
);
2623 slsi_wlan_dump_public_action_subtype(sdev
, mgmt
, false);
2624 if (sdev
->wlan_unsync_vif_state
== WLAN_UNSYNC_VIF_TX
)
2625 sdev
->wlan_unsync_vif_state
= WLAN_UNSYNC_VIF_ACTIVE
;
2627 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
2631 int subtype
= slsi_p2p_get_public_action_subtype(mgmt
);
2633 SLSI_NET_DBG2(dev
, SLSI_CFG80211
, "Received action frame (%s)\n", slsi_p2p_pa_subtype_text(subtype
));
2635 if (SLSI_IS_P2P_UNSYNC_VIF(ndev_vif
) && (ndev_vif
->mgmt_tx_data
.exp_frame
!= SLSI_P2P_PA_INVALID
) && (subtype
== ndev_vif
->mgmt_tx_data
.exp_frame
)) {
2636 if (sdev
->p2p_state
== P2P_LISTENING
)
2637 SLSI_NET_WARN(dev
, "Driver in incorrect P2P state (P2P_LISTENING)");
2639 cancel_delayed_work(&ndev_vif
->unsync
.del_vif_work
);
2640 /* Sending down the Unset channel is delayed when listen work expires in
2641 * middle of P2P procedure. For example,When Listen Work expires after
2642 * sending provision discovery req,unset channel is not sent to FW.
2643 * After Receiving the PROV_DISC_RESP, if listen work is not present
2644 * Unset channel to be sent down.Similarly During P2P Negotiation procedure,
2645 * Unset channel is not sent to FW.Once Negotiation is complete,
2646 * if listen work is not present Unset channel to be sent down.
2648 if ((subtype
== SLSI_P2P_PA_GO_NEG_CFM
) || (subtype
== SLSI_P2P_PA_PROV_DISC_RSP
)) {
2649 ndev_vif
->drv_in_p2p_procedure
= false;
2650 if (!delayed_work_pending(&ndev_vif
->unsync
.roc_expiry_work
)) {
2651 slsi_mlme_unset_channel_req(ndev_vif
->sdev
, ndev_vif
->wdev
.netdev
);
2652 ndev_vif
->driver_channel
= 0;
2656 ndev_vif
->mgmt_tx_data
.exp_frame
= SLSI_P2P_PA_INVALID
;
2657 (void)slsi_mlme_reset_dwell_time(sdev
, dev
);
2658 if (delayed_work_pending(&ndev_vif
->unsync
.roc_expiry_work
)) {
2659 SLSI_P2P_STATE_CHANGE(sdev
, P2P_LISTENING
);
2661 queue_delayed_work(sdev
->device_wq
, &ndev_vif
->unsync
.del_vif_work
,
2662 msecs_to_jiffies(SLSI_P2P_UNSYNC_VIF_EXTRA_MSEC
));
2663 SLSI_P2P_STATE_CHANGE(sdev
, P2P_IDLE_VIF_ACTIVE
);
2665 } else if ((sdev
->p2p_group_exp_frame
!= SLSI_P2P_PA_INVALID
) && (sdev
->p2p_group_exp_frame
== subtype
)) {
2666 SLSI_NET_DBG2(dev
, SLSI_MLME
, "Expected action frame (%s) received on Group VIF\n", slsi_p2p_pa_subtype_text(subtype
));
2667 slsi_clear_offchannel_data(sdev
,
2668 (!SLSI_IS_VIF_INDEX_P2P_GROUP(sdev
,
2669 ndev_vif
)) ? true : false);
2673 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
2674 cfg80211_rx_mgmt(&ndev_vif
->wdev
, frequency
, 0, (const u8
*)mgmt
, mgmt_len
, GFP_ATOMIC
);
2676 cfg80211_rx_mgmt(dev
, frequency
, 0, (const u8
*)mgmt
, mgmt_len
, GFP_ATOMIC
);
2678 } else if (data_unit_descriptor
== FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME
) {
2679 struct slsi_peer
*peer
= NULL
;
2680 struct ethhdr
*ehdr
= (struct ethhdr
*)fapi_get_data(skb
);
2682 peer
= slsi_get_peer_from_mac(sdev
, dev
, ehdr
->h_source
);
2684 SLSI_DBG1(sdev
, SLSI_RX
, "drop packet as No peer found\n");
2688 /* strip signal and any signal/bulk roundings/offsets */
2689 skb_pull(skb
, fapi_get_siglen(skb
));
2692 skb
->ip_summed
= CHECKSUM_NONE
;
2694 ndev_vif
->stats
.rx_packets
++;
2695 ndev_vif
->stats
.rx_bytes
+= skb
->len
;
2696 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 10, 0))
2697 dev
->last_rx
= jiffies
;
2699 /* Storing Data for Logging Information */
2700 if ((skb
->len
- sizeof(struct ethhdr
)) >= 99)
2701 eapol
= skb
->data
+ sizeof(struct ethhdr
);
2703 if ((skb
->len
- sizeof(struct ethhdr
)) >= 9) {
2704 eap_length
= (skb
->len
- sizeof(struct ethhdr
)) - 4;
2705 eap
= skb
->data
+ sizeof(struct ethhdr
);
2707 if (skb
->len
>= 285 && slsi_is_dhcp_packet(skb
->data
) != SLSI_TX_IS_NOT_DHCP
)
2708 dhcp_message_type
= skb
->data
[284];
2710 skb
->protocol
= eth_type_trans(skb
, dev
);
2711 protocol
= ntohs(skb
->protocol
);
2712 if (protocol
== ETH_P_PAE
) {
2713 if (eapol
&& eapol
[SLSI_EAPOL_IEEE8021X_TYPE_POS
] == SLSI_IEEE8021X_TYPE_EAPOL_KEY
) {
2714 if ((eapol
[SLSI_EAPOL_TYPE_POS
] == SLSI_EAPOL_TYPE_RSN_KEY
||
2715 eapol
[SLSI_EAPOL_TYPE_POS
] == SLSI_EAPOL_TYPE_WPA_KEY
) &&
2716 (eapol
[SLSI_EAPOL_KEY_INFO_LOWER_BYTE_POS
] &
2717 SLSI_EAPOL_KEY_INFO_KEY_TYPE_BIT_IN_LOWER_BYTE
) &&
2718 (eapol
[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS
] &
2719 SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE
) &&
2720 (eapol
[SLSI_EAPOL_KEY_DATA_LENGTH_HIGHER_BYTE_POS
] == 0) &&
2721 (eapol
[SLSI_EAPOL_KEY_DATA_LENGTH_LOWER_BYTE_POS
] == 0)) {
2722 SLSI_INFO(sdev
, "Received 4way-H/S, M4\n");
2723 } else if (!(eapol
[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS
] &
2724 SLSI_EAPOL_KEY_INFO_MIC_BIT_IN_HIGHER_BYTE
)) {
2725 SLSI_INFO(sdev
, "Received 4way-H/S, M1\n");
2726 } else if (eapol
[SLSI_EAPOL_KEY_INFO_HIGHER_BYTE_POS
] &
2727 SLSI_EAPOL_KEY_INFO_SECURE_BIT_IN_HIGHER_BYTE
) {
2728 SLSI_INFO(sdev
, "Received 4way-H/S, M3\n");
2730 SLSI_INFO(sdev
, "Received 4way-H/S, M2\n");
2732 } else if (eap
&& eap
[SLSI_EAPOL_IEEE8021X_TYPE_POS
] == SLSI_IEEE8021X_TYPE_EAP_PACKET
) {
2733 if (eap
[SLSI_EAP_CODE_POS
] == SLSI_EAP_PACKET_REQUEST
)
2734 SLSI_INFO(sdev
, "Received EAP-Request (%d)\n", eap_length
);
2735 else if (eap
[SLSI_EAP_CODE_POS
] == SLSI_EAP_PACKET_RESPONSE
)
2736 SLSI_INFO(sdev
, "Received EAP-Response (%d)\n", eap_length
);
2737 else if (eap
[SLSI_EAP_CODE_POS
] == SLSI_EAP_PACKET_SUCCESS
)
2738 SLSI_INFO(sdev
, "Received EAP-Success (%d)\n", eap_length
);
2739 else if (eap
[SLSI_EAP_CODE_POS
] == SLSI_EAP_PACKET_FAILURE
)
2740 SLSI_INFO(sdev
, "Received EAP-Failure (%d)\n", eap_length
);
2742 } else if (protocol
== ETH_P_IP
) {
2743 if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_DISCOVER
)
2744 SLSI_INFO(sdev
, "Received DHCP [DISCOVER]\n");
2745 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_OFFER
)
2746 SLSI_INFO(sdev
, "Received DHCP [OFFER]\n");
2747 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_REQUEST
)
2748 SLSI_INFO(sdev
, "Received DHCP [REQUEST]\n");
2749 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_DECLINE
)
2750 SLSI_INFO(sdev
, "Received DHCP [DECLINE]\n");
2751 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_ACK
)
2752 SLSI_INFO(sdev
, "Received DHCP [ACK]\n");
2753 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_NAK
)
2754 SLSI_INFO(sdev
, "Received DHCP [NAK]\n");
2755 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_RELEASE
)
2756 SLSI_INFO(sdev
, "Received DHCP [RELEASE]\n");
2757 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_INFORM
)
2758 SLSI_INFO(sdev
, "Received DHCP [INFORM]\n");
2759 else if (dhcp_message_type
== SLSI_DHCP_MESSAGE_TYPE_FORCERENEW
)
2760 SLSI_INFO(sdev
, "Received DHCP [FORCERENEW]\n");
2762 SLSI_INFO(sdev
, "Received DHCP [INVALID]\n");
2764 slsi_dbg_untrack_skb(skb
);
2765 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2766 SLSI_DBG2(sdev
, SLSI_MLME
, "pass %u bytes up (proto:%d)\n", skb
->len
, ntohs(skb
->protocol
));
2768 slsi_wakelock_timeout(&sdev
->wlan_wl_mlme
, SLSI_WAKELOCK_TIME_MSEC_EAPOL
);
2772 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2773 slsi_kfree_skb(skb
);
2776 void slsi_rx_mic_failure_ind(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
)
2778 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2780 u16 key_type
, key_id
;
2781 enum nl80211_key_type nl_key_type
;
2783 SLSI_UNUSED_PARAMETER(sdev
);
2785 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2787 mac_addr
= fapi_get_buff(skb
, u
.mlme_disconnected_ind
.peer_sta_address
);
2788 key_type
= fapi_get_u16(skb
, u
.mlme_mic_failure_ind
.key_type
);
2789 key_id
= fapi_get_u16(skb
, u
.mlme_mic_failure_ind
.key_id
);
2791 SLSI_NET_DBG1(dev
, SLSI_MLME
, "mlme_mic_failure_ind(vif:%d, MAC:%pM, key_type:%d, key_id:%d)\n",
2792 fapi_get_vif(skb
), mac_addr
, key_type
, key_id
);
2794 if (WARN_ON((key_type
!= FAPI_KEYTYPE_GROUP
) && (key_type
!= FAPI_KEYTYPE_PAIRWISE
)))
2797 nl_key_type
= (key_type
== FAPI_KEYTYPE_GROUP
) ? NL80211_KEYTYPE_GROUP
: NL80211_KEYTYPE_PAIRWISE
;
2799 cfg80211_michael_mic_failure(dev
, mac_addr
, nl_key_type
, key_id
, NULL
, GFP_KERNEL
);
2802 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2803 slsi_kfree_skb(skb
);
2807 * Handler for mlme_listen_end_ind.
2808 * The listen_end_ind would be received when the total Listen Offloading time is over.
2809 * Indicate completion of Listen Offloading to supplicant by sending Cancel-ROC event
2810 * with cookie 0xffff. Queue delayed work for unsync vif deletion.
2812 void slsi_rx_listen_end_ind(struct net_device
*dev
, struct sk_buff
*skb
)
2814 struct netdev_vif
*ndev_vif
= netdev_priv(dev
);
2816 SLSI_MUTEX_LOCK(ndev_vif
->vif_mutex
);
2818 SLSI_NET_DBG2(dev
, SLSI_CFG80211
, "Inform completion of P2P Listen Offloading\n");
2820 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
2821 cfg80211_remain_on_channel_expired(&ndev_vif
->wdev
, 0xffff, ndev_vif
->chan
, GFP_KERNEL
);
2823 cfg80211_remain_on_channel_expired(ndev_vif
->wdev
.netdev
, 0xffff, ndev_vif
->chan
, ndev_vif
->channel_type
, GFP_KERNEL
);
2826 ndev_vif
->unsync
.listen_offload
= false;
2828 slsi_p2p_queue_unsync_vif_del_work(ndev_vif
, SLSI_P2P_UNSYNC_VIF_EXTRA_MSEC
);
2830 SLSI_P2P_STATE_CHANGE(ndev_vif
->sdev
, P2P_IDLE_VIF_ACTIVE
);
2832 SLSI_MUTEX_UNLOCK(ndev_vif
->vif_mutex
);
2833 slsi_kfree_skb(skb
);
2836 static int slsi_rx_wait_ind_match(u16 recv_id
, u16 wait_id
)
2838 if (recv_id
== wait_id
)
2840 if (wait_id
== MLME_DISCONNECT_IND
&& recv_id
== MLME_DISCONNECTED_IND
)
2845 int slsi_rx_blocking_signals(struct slsi_dev
*sdev
, struct sk_buff
*skb
)
2848 struct slsi_sig_send
*sig_wait
;
2849 u16 vif
= fapi_get_vif(skb
);
2851 sig_wait
= &sdev
->sig_wait
;
2852 id
= fapi_get_sigid(skb
);
2853 pid
= fapi_get_u16(skb
, receiver_pid
);
2855 /* ALL mlme cfm signals MUST have blocking call waiting for it (Per Vif or Global) */
2856 if (fapi_is_cfm(skb
)) {
2857 struct net_device
*dev
;
2858 struct netdev_vif
*ndev_vif
;
2861 dev
= slsi_get_netdev_rcu(sdev
, vif
);
2863 ndev_vif
= netdev_priv(dev
);
2864 sig_wait
= &ndev_vif
->sig_wait
;
2866 spin_lock_bh(&sig_wait
->send_signal_lock
);
2867 if (id
== sig_wait
->cfm_id
&& pid
== sig_wait
->process_id
) {
2868 if (WARN_ON(sig_wait
->cfm
))
2869 slsi_kfree_skb(sig_wait
->cfm
);
2870 sig_wait
->cfm
= skb
;
2871 spin_unlock_bh(&sig_wait
->send_signal_lock
);
2872 complete(&sig_wait
->completion
);
2877 * Important data frames such as EAPOL, ARP, DHCP are send
2878 * over MLME. For these frames driver does not block on confirms.
2879 * So there can be unexpected confirms here for such data frames.
2880 * These confirms are treated as normal and is silently dropped
2883 if (id
== MLME_SEND_FRAME_CFM
) {
2884 spin_unlock_bh(&sig_wait
->send_signal_lock
);
2886 slsi_kfree_skb(skb
);
2890 SLSI_DBG1(sdev
, SLSI_MLME
, "Unexpected cfm(0x%.4x, pid:0x%.4x, vif:%d)\n", id
, pid
, vif
);
2891 spin_unlock_bh(&sig_wait
->send_signal_lock
);
2895 /* Some mlme ind signals have a blocking call waiting (Per Vif or Global) */
2896 if (fapi_is_ind(skb
)) {
2897 struct net_device
*dev
;
2898 struct netdev_vif
*ndev_vif
;
2901 dev
= slsi_get_netdev_rcu(sdev
, vif
);
2903 ndev_vif
= netdev_priv(dev
);
2904 sig_wait
= &ndev_vif
->sig_wait
;
2906 spin_lock_bh(&sig_wait
->send_signal_lock
);
2907 if (slsi_rx_wait_ind_match(id
, sig_wait
->ind_id
) && pid
== sig_wait
->process_id
) {
2908 if (WARN_ON(sig_wait
->ind
))
2909 slsi_kfree_skb(sig_wait
->ind
);
2910 sig_wait
->ind
= skb
;
2911 spin_unlock_bh(&sig_wait
->send_signal_lock
);
2912 complete(&sig_wait
->completion
);
2916 spin_unlock_bh(&sig_wait
->send_signal_lock
);