Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_rson.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* You should have received a copy of the GNU General Public License along with
15
* this program; if not, write to the Free Software Foundation, Inc.,
16
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17
*
18
*
19
******************************************************************************/
20
#define _RTW_RSON_C_
21
22
#include <drv_types.h>
23
24
#ifdef CONFIG_RTW_REPEATER_SON
25
26
/******** Custommize Part ***********************/
27
28
unsigned char RTW_RSON_OUI[] = {0xFA, 0xFA, 0xFA};
29
#define RSON_SCORE_DIFF_TH 8
30
31
/*
32
Calculate the corresponding score.
33
*/
34
inline u8 rtw_cal_rson_score(struct rtw_rson_struct *cand_rson_data, NDIS_802_11_RSSI Rssi)
35
{
36
if ((cand_rson_data->hopcnt == RTW_RSON_HC_NOTREADY)
37
|| (cand_rson_data->connectible == RTW_RSON_DENYCONNECT))
38
return RTW_RSON_SCORE_NOTCNNT;
39
40
return RTW_RSON_SCORE_MAX - (cand_rson_data->hopcnt * 10) + (Rssi/10);
41
}
42
43
/*************************************************/
44
45
46
static u8 rtw_rson_block_bssid_idx = 0;
47
u8 rtw_rson_block_bssid[10][6] = {
48
/*{0x02, 0xE0, 0x4C, 0x07, 0xC3, 0xF6}*/
49
};
50
51
/* fake root, regard a real AP as a SO root */
52
static u8 rtw_rson_root_bssid_idx = 0;
53
u8 rtw_rson_root_bssid[10][6] = {
54
/*{0x1c, 0x5f, 0x2b, 0x5a, 0x60, 0x24}*/
55
};
56
57
int is_match_bssid(u8 *mac, u8 bssid_array[][6], int num)
58
{
59
int i;
60
61
for (i = 0; i < num; i++)
62
if (_rtw_memcmp(mac, bssid_array[i], 6) == _TRUE)
63
return _TRUE;
64
return _FALSE;
65
}
66
67
void init_rtw_rson_data(struct dvobj_priv *dvobj)
68
{
69
/*Aries todo. if pdvobj->rson_data.ver == 1 */
70
dvobj->rson_data.ver = RTW_RSON_VER;
71
dvobj->rson_data.id = CONFIG_RTW_REPEATER_SON_ID;
72
#ifdef CONFIG_RTW_REPEATER_SON_ROOT
73
dvobj->rson_data.hopcnt = RTW_RSON_HC_ROOT;
74
dvobj->rson_data.connectible = RTW_RSON_ALLOWCONNECT;
75
#else
76
dvobj->rson_data.hopcnt = RTW_RSON_HC_NOTREADY;
77
dvobj->rson_data.connectible = RTW_RSON_DENYCONNECT;
78
#endif
79
dvobj->rson_data.loading = 0;
80
_rtw_memset(dvobj->rson_data.res, 0xAA, sizeof(dvobj->rson_data.res));
81
}
82
83
void rtw_rson_get_property_str(_adapter *padapter, char *rson_data_str)
84
{
85
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
86
87
sprintf(rson_data_str, "version : \t%d\nid : \t\t%08x\nhop count : \t%d\nconnectible : \t%s\nloading : \t%d\nreserve : \t%16ph\n",
88
pdvobj->rson_data.ver,
89
pdvobj->rson_data.id,
90
pdvobj->rson_data.hopcnt,
91
pdvobj->rson_data.connectible ? "connectable":"unconnectable",
92
pdvobj->rson_data.loading,
93
pdvobj->rson_data.res);
94
}
95
96
int str2hexbuf(char *str, u8 *hexbuf, int len)
97
{
98
u8 *p;
99
int i, slen, idx = 0;
100
101
p = (unsigned char *)str;
102
if ((*p != '0') || (*(p+1) != 'x'))
103
return _FALSE;
104
slen = strlen(str);
105
if (slen > (len*2) + 2)
106
return _FALSE;
107
p += 2;
108
for (i = 0 ; i < len; i++, idx = idx+2) {
109
hexbuf[i] = key_2char2num(p[idx], p[idx + 1]);
110
if (slen <= idx+2)
111
break;
112
}
113
return _TRUE;
114
}
115
116
int rtw_rson_set_property(_adapter *padapter, char *field, char *value)
117
{
118
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
119
int num = 0;
120
121
if (_rtw_memcmp(field, (u8 *)"ver", 3) == _TRUE)
122
pdvobj->rson_data.ver = rtw_atoi(value);
123
else if (_rtw_memcmp(field, (u8 *)"id", 2) == _TRUE)
124
num = sscanf(value, "%08x", &(pdvobj->rson_data.id));
125
else if (_rtw_memcmp(field, (u8 *)"hc", 2) == _TRUE)
126
num = sscanf(value, "%hhu", &(pdvobj->rson_data.hopcnt));
127
else if (_rtw_memcmp(field, (u8 *)"cnt", 3) == _TRUE)
128
num = sscanf(value, "%hhu", &(pdvobj->rson_data.connectible));
129
else if (_rtw_memcmp(field, (u8 *)"loading", 2) == _TRUE)
130
num = sscanf(value, "%hhu", &(pdvobj->rson_data.loading));
131
else if (_rtw_memcmp(field, (u8 *)"res", 2) == _TRUE) {
132
str2hexbuf(value, pdvobj->rson_data.res, 16);
133
return 1;
134
} else
135
return _FALSE;
136
return num;
137
}
138
139
/*
140
return : TRUE -- competitor is taking advantage than condidate
141
FALSE -- we should continue keeping candidate
142
*/
143
int rtw_rson_choose(struct wlan_network **candidate, struct wlan_network *competitor)
144
{
145
s16 comp_score = 0, cand_score = 0;
146
struct rtw_rson_struct rson_cand, rson_comp;
147
148
if (is_match_bssid(competitor->network.MacAddress, rtw_rson_block_bssid, rtw_rson_block_bssid_idx) == _TRUE)
149
return _FALSE;
150
151
if ((competitor == NULL)
152
|| (rtw_get_rson_struct(&(competitor->network), &rson_comp) != _TRUE)
153
|| (rson_comp.id != CONFIG_RTW_REPEATER_SON_ID))
154
return _FALSE;
155
156
comp_score = rtw_cal_rson_score(&rson_comp, competitor->network.Rssi);
157
if (comp_score == RTW_RSON_SCORE_NOTCNNT)
158
return _FALSE;
159
160
if (*candidate == NULL)
161
return _TRUE;
162
if (rtw_get_rson_struct(&((*candidate)->network), &rson_cand) != _TRUE)
163
return _FALSE;
164
165
cand_score = rtw_cal_rson_score(&rson_cand, (*candidate)->network.Rssi);
166
RTW_INFO("%s: competitor_score=%d, candidate_score=%d\n", __func__, comp_score, cand_score);
167
if (comp_score - cand_score > RSON_SCORE_DIFF_TH)
168
return _TRUE;
169
170
return _FALSE;
171
}
172
173
inline u8 rtw_rson_varify_ie(u8 *p)
174
{
175
u8 *ptr = NULL;
176
u8 ver;
177
u32 id;
178
u8 hopcnt;
179
u8 allcnnt;
180
181
ptr = p + 2 + sizeof(RTW_RSON_OUI);
182
ver = *ptr;
183
184
/* for (ver == 1) */
185
if (ver != 1)
186
return _FALSE;
187
188
return _TRUE;
189
}
190
191
/*
192
Parsing RTK self-organization vendor IE
193
*/
194
int rtw_get_rson_struct(WLAN_BSSID_EX *bssid, struct rtw_rson_struct *rson_data)
195
{
196
sint limit = 0;
197
u32 len;
198
u8 *p;
199
200
if ((rson_data == NULL) || (bssid == NULL))
201
return -EINVAL;
202
203
/* Default */
204
rson_data->id = 0;
205
rson_data->ver = 0;
206
rson_data->hopcnt = 0;
207
rson_data->connectible = 0;
208
rson_data->loading = 0;
209
/* fake root */
210
if (is_match_bssid(bssid->MacAddress, rtw_rson_root_bssid, rtw_rson_root_bssid_idx) == _TRUE) {
211
rson_data->id = CONFIG_RTW_REPEATER_SON_ID;
212
rson_data->ver = RTW_RSON_VER;
213
rson_data->hopcnt = RTW_RSON_HC_ROOT;
214
rson_data->connectible = RTW_RSON_ALLOWCONNECT;
215
rson_data->loading = 0;
216
return _TRUE;
217
}
218
limit = bssid->IELength - _BEACON_IE_OFFSET_;
219
220
for (p = bssid->IEs + _BEACON_IE_OFFSET_; ; p += (len + 2)) {
221
p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &len, limit);
222
limit -= len;
223
if ((p == NULL) || (len == 0))
224
break;
225
if (p && (_rtw_memcmp(p + 2, RTW_RSON_OUI, sizeof(RTW_RSON_OUI)) == _TRUE)
226
&& rtw_rson_varify_ie(p)) {
227
p = p + 2 + sizeof(RTW_RSON_OUI);
228
rson_data->ver = *p;
229
/* for (ver == 1) */
230
p = p + 1;
231
rson_data->id = le32_to_cpup((__le32 *)p);
232
p = p + 4;
233
rson_data->hopcnt = *p;
234
p = p + 1;
235
rson_data->connectible = *p;
236
p = p + 1;
237
rson_data->loading = *p;
238
239
return _TRUE;
240
}
241
}
242
return -EBADMSG;
243
}
244
245
u32 rtw_rson_append_ie(_adapter *padapter, unsigned char *pframe, u32 *len)
246
{
247
u8 *ptr, *ori, ie_len = 0;
248
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
249
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
250
/* static int iii = 0;*/
251
252
if ((!pdvobj) || (!pframe))
253
return 0;
254
ptr = ori = pframe;
255
*ptr++ = _VENDOR_SPECIFIC_IE_;
256
*ptr++ = ie_len = sizeof(RTW_RSON_OUI)+sizeof(pdvobj->rson_data);
257
_rtw_memcpy(ptr, RTW_RSON_OUI, sizeof(RTW_RSON_OUI));
258
ptr = ptr + sizeof(RTW_RSON_OUI);
259
*ptr++ = pdvobj->rson_data.ver;
260
*(s32 *)ptr = cpu_to_le32(pdvobj->rson_data.id);
261
ptr = ptr + sizeof(pdvobj->rson_data.id);
262
*ptr++ = pdvobj->rson_data.hopcnt;
263
*ptr++ = pdvobj->rson_data.connectible;
264
*ptr++ = pdvobj->rson_data.loading;
265
_rtw_memcpy(ptr, pdvobj->rson_data.res, sizeof(pdvobj->rson_data.res));
266
pframe = ptr;
267
/*
268
iii = iii % 20;
269
if (iii++ == 0)
270
RTW_INFO("%s : RTW RSON IE : %20ph\n", __func__, ori);
271
*/
272
*len += (ie_len+2);
273
return ie_len;
274
275
}
276
277
void rtw_rson_do_disconnect(_adapter *padapter)
278
{
279
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
280
281
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
282
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
283
pdvobj->rson_data.ver = RTW_RSON_VER;
284
pdvobj->rson_data.id = CONFIG_RTW_REPEATER_SON_ID;
285
pdvobj->rson_data.hopcnt = RTW_RSON_HC_NOTREADY;
286
pdvobj->rson_data.connectible = RTW_RSON_DENYCONNECT;
287
pdvobj->rson_data.loading = 0;
288
rtw_mi_tx_beacon_hdl(padapter);
289
#endif
290
}
291
292
void rtw_rson_join_done(_adapter *padapter)
293
{
294
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
295
WLAN_BSSID_EX *cur_network = NULL;
296
struct rtw_rson_struct rson_data;
297
298
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
299
if (!padapter->mlmepriv.cur_network_scanned)
300
return;
301
cur_network = &(padapter->mlmepriv.cur_network_scanned->network);
302
if (rtw_get_rson_struct(cur_network, &rson_data) != _TRUE) {
303
RTW_ERR("%s: try to join a improper network(%s)\n", __func__, cur_network->Ssid.Ssid);
304
return;
305
}
306
307
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
308
/* update rson_data */
309
pdvobj->rson_data.ver = RTW_RSON_VER;
310
pdvobj->rson_data.id = rson_data.id;
311
pdvobj->rson_data.hopcnt = rson_data.hopcnt + 1;
312
pdvobj->rson_data.connectible = RTW_RSON_ALLOWCONNECT;
313
pdvobj->rson_data.loading = 0;
314
rtw_mi_tx_beacon_hdl(padapter);
315
#endif
316
}
317
318
int rtw_rson_isupdate_roamcan(struct mlme_priv *mlme
319
, struct wlan_network **candidate, struct wlan_network *competitor)
320
{
321
struct rtw_rson_struct rson_cand, rson_comp, rson_curr;
322
s16 comp_score, cand_score, curr_score;
323
324
if ((competitor == NULL)
325
|| (rtw_get_rson_struct(&(competitor->network), &rson_comp) != _TRUE)
326
|| (rson_comp.id != CONFIG_RTW_REPEATER_SON_ID))
327
return _FALSE;
328
329
if (is_match_bssid(competitor->network.MacAddress, rtw_rson_block_bssid, rtw_rson_block_bssid_idx) == _TRUE)
330
return _FALSE;
331
332
if ((!mlme->cur_network_scanned)
333
|| (mlme->cur_network_scanned == competitor)
334
|| (rtw_get_rson_struct(&(mlme->cur_network_scanned->network), &rson_curr)) != _TRUE)
335
return _FALSE;
336
337
if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms)
338
return _FALSE;
339
340
comp_score = rtw_cal_rson_score(&rson_comp, competitor->network.Rssi);
341
curr_score = rtw_cal_rson_score(&rson_curr, mlme->cur_network_scanned->network.Rssi);
342
if (comp_score - curr_score < RSON_SCORE_DIFF_TH)
343
return _FALSE;
344
345
if (*candidate == NULL)
346
return _TRUE;
347
348
if (rtw_get_rson_struct(&((*candidate)->network), &rson_cand) != _TRUE) {
349
RTW_ERR("%s : Unable to get rson_struct from candidate(%s -- " MAC_FMT")\n",
350
__func__, (*candidate)->network.Ssid.Ssid, MAC_ARG((*candidate)->network.MacAddress));
351
return _FALSE;
352
}
353
cand_score = rtw_cal_rson_score(&rson_cand, (*candidate)->network.Rssi);
354
RTW_DBG("comp_score=%d , cand_score=%d , curr_score=%d\n", comp_score, cand_score, curr_score);
355
if (cand_score < comp_score)
356
return _TRUE;
357
358
#if 0 /* Handle 11R protocol */
359
#ifdef CONFIG_RTW_80211R
360
if (rtw_chk_ft_flags(adapter, RTW_FT_SUPPORTED)) {
361
ptmp = rtw_get_ie(&competitor->network.IEs[12], _MDIE_, &mdie_len, competitor->network.IELength-12);
362
if (ptmp) {
363
if (!_rtw_memcmp(&pftpriv->mdid, ptmp+2, 2))
364
goto exit;
365
366
/*The candidate don't support over-the-DS*/
367
if (rtw_chk_ft_flags(adapter, RTW_FT_STA_OVER_DS_SUPPORTED)) {
368
if ((rtw_chk_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED) && !(*(ptmp+4) & 0x01)) ||
369
(!rtw_chk_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED) && (*(ptmp+4) & 0x01))) {
370
RTW_INFO("FT: ignore the candidate(" MAC_FMT ") for over-the-DS\n", MAC_ARG(competitor->network.MacAddress));
371
rtw_clr_ft_flags(adapter, RTW_FT_OVER_DS_SUPPORTED);
372
goto exit;
373
}
374
}
375
} else
376
goto exit;
377
}
378
#endif
379
#endif
380
return _FALSE;
381
}
382
383
void rtw_rson_show_survey_info(struct seq_file *m, _list *plist, _list *phead)
384
{
385
struct wlan_network *pnetwork = NULL;
386
struct rtw_rson_struct rson_data;
387
s16 rson_score;
388
u16 index = 0;
389
390
RTW_PRINT_SEL(m, "%5s %-17s %3s %5s %14s %10s %-3s %5s %32s\n", "index", "bssid", "ch", "id", "hop_cnt", "loading", "RSSI", "score", "ssid");
391
while (1) {
392
if (rtw_end_of_queue_search(phead, plist) == _TRUE)
393
break;
394
395
pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
396
if (!pnetwork)
397
break;
398
399
_rtw_memset(&rson_data, 0, sizeof(rson_data));
400
rson_score = 0;
401
if (rtw_get_rson_struct(&(pnetwork->network), &rson_data) == _TRUE)
402
rson_score = rtw_cal_rson_score(&rson_data, pnetwork->network.Rssi);
403
RTW_PRINT_SEL(m, "%5d "MAC_FMT" %3d 0x%08x %6d %10d %6d %6d %32s\n",
404
++index,
405
MAC_ARG(pnetwork->network.MacAddress),
406
pnetwork->network.Configuration.DSConfig,
407
rson_data.id,
408
rson_data.hopcnt,
409
rson_data.loading,
410
(int)pnetwork->network.Rssi,
411
rson_score,
412
pnetwork->network.Ssid.Ssid);
413
plist = get_next(plist);
414
}
415
416
}
417
418
/*
419
Description : As a AP role, We need to check the qualify of associating STA.
420
We also need to check if we are ready to be associated.
421
422
return : TRUE -- AP REJECT this STA
423
FALSE -- AP ACCEPT this STA
424
*/
425
u8 rtw_rson_ap_check_sta(_adapter *padapter, u8 *pframe, uint pkt_len, unsigned short ie_offset)
426
{
427
struct wlan_network *pnetwork = NULL;
428
struct rtw_rson_struct rson_target;
429
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
430
int len = 0;
431
u8 ret = _FALSE;
432
u8 *p;
433
434
#ifndef CONFIG_RTW_REPEATER_SON_ROOT
435
_rtw_memset(&rson_target, 0, sizeof(rson_target));
436
for (p = pframe + WLAN_HDR_A3_LEN + ie_offset; ; p += (len + 2)) {
437
p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);
438
439
if ((p == NULL) || (len == 0))
440
break;
441
442
if (p && (_rtw_memcmp(p + 2, RTW_RSON_OUI, sizeof(RTW_RSON_OUI)) == _TRUE)
443
&& rtw_rson_varify_ie(p)) {
444
p = p + 2 + sizeof(RTW_RSON_OUI);
445
rson_target.ver = *p;
446
/* for (ver == 1) */
447
p = p + 1;
448
rson_target.id = le32_to_cpup((__le32 *)p);
449
p = p + 4;
450
rson_target.hopcnt = *p;
451
p = p + 1;
452
rson_target.connectible = *p;
453
p = p + 1;
454
rson_target.loading = *p;
455
break;
456
}
457
}
458
459
if (rson_target.id == 0) /* Normal STA, not a RSON STA */
460
ret = _FALSE;
461
else if (rson_target.id != pdvobj->rson_data.id) {
462
ret = _TRUE;
463
RTW_INFO("%s : Reject AssoReq because RSON ID not match, STA=%08x, our=%08x\n",
464
__func__, rson_target.id, pdvobj->rson_data.id);
465
} else if ((pdvobj->rson_data.hopcnt == RTW_RSON_HC_NOTREADY)
466
|| (pdvobj->rson_data.connectible == RTW_RSON_DENYCONNECT)) {
467
ret = _TRUE;
468
RTW_INFO("%s : Reject AssoReq becuase our hopcnt=%d or connectbile=%d\n",
469
__func__, pdvobj->rson_data.hopcnt, pdvobj->rson_data.connectible);
470
}
471
#endif
472
return ret;
473
}
474
475
u8 rtw_rson_scan_wk_cmd(_adapter *padapter, int op)
476
{
477
struct cmd_obj *ph2c;
478
struct drvextra_cmd_parm *pdrvextra_cmd_parm;
479
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
480
u8 *extra_cmd_buf;
481
u8 res = _SUCCESS;
482
483
ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));
484
if (ph2c == NULL) {
485
res = _FAIL;
486
goto exit;
487
}
488
489
pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
490
if (pdrvextra_cmd_parm == NULL) {
491
rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj));
492
res = _FAIL;
493
goto exit;
494
}
495
pdrvextra_cmd_parm->ec_id = RSON_SCAN_WK_CID;
496
pdrvextra_cmd_parm->type = op;
497
pdrvextra_cmd_parm->size = 0;
498
pdrvextra_cmd_parm->pbuf = NULL;
499
500
init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
501
502
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
503
504
exit:
505
return res;
506
507
}
508
509
void rtw_rson_scan_cmd_hdl(_adapter *padapter, int op)
510
{
511
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
512
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
513
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
514
u8 val8;
515
516
if (mlmeext_chk_scan_state(pmlmeext, SCAN_DISABLE) != _TRUE)
517
return;
518
if (op == RSON_SCAN_PROCESS) {
519
padapter->rtw_rson_scanstage = RSON_SCAN_PROCESS;
520
val8 = 0x1e;
521
rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &val8, _FALSE);
522
val8 = 1;
523
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
524
issue_probereq(padapter, NULL, NULL);
525
/* stop rson_scan after 100ms */
526
_set_timer(&(pmlmeext->rson_scan_timer), 100);
527
} else if (op == RSON_SCAN_DISABLE) {
528
padapter->rtw_rson_scanstage = RSON_SCAN_DISABLE;
529
val8 = 0;
530
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
531
val8 = 0xff;
532
rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &val8, _FALSE);
533
/* report_surveydone_event(padapter);*/
534
if (pmlmepriv->to_join == _TRUE) {
535
if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) != _TRUE) {
536
int s_ret;
537
538
set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
539
pmlmepriv->to_join = _FALSE;
540
s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv);
541
if (s_ret == _SUCCESS)
542
_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
543
else if (s_ret == 2) {
544
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
545
rtw_indicate_connect(padapter);
546
} else {
547
RTW_INFO("try_to_join, but select scanning queue fail, to_roam:%d\n", rtw_to_roam(padapter));
548
if (rtw_to_roam(padapter) != 0) {
549
if (rtw_dec_to_roam(padapter) == 0) {
550
rtw_set_to_roam(padapter, 0);
551
rtw_free_assoc_resources(padapter, _TRUE);
552
rtw_indicate_disconnect(padapter, 0, _FALSE);
553
} else
554
pmlmepriv->to_join = _TRUE;
555
} else
556
rtw_indicate_disconnect(padapter, 0, _FALSE);
557
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
558
}
559
}
560
} else {
561
if (rtw_chk_roam_flags(padapter, RTW_ROAM_ACTIVE)) {
562
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
563
&& check_fwstate(pmlmepriv, _FW_LINKED)) {
564
if (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) {
565
#ifdef CONFIG_RTW_80211R
566
if (rtw_chk_ft_flags(padapter, RTW_FT_OVER_DS_SUPPORTED)) {
567
start_clnt_ft_action(adapter, (u8 *)pmlmepriv->roam_network->network.MacAddress);
568
} else {
569
/*wait a little time to retrieve packets buffered in the current ap while scan*/
570
_set_timer(&pmlmeext->ft_roam_timer, 30);
571
}
572
#else
573
receive_disconnect(padapter, pmlmepriv->cur_network.network.MacAddress
574
, WLAN_REASON_ACTIVE_ROAM, _FALSE);
575
#endif
576
}
577
}
578
}
579
issue_action_BSSCoexistPacket(padapter);
580
issue_action_BSSCoexistPacket(padapter);
581
issue_action_BSSCoexistPacket(padapter);
582
}
583
} else {
584
RTW_ERR("%s : improper parameter -- op = %d\n", __func__, op);
585
}
586
}
587
588
#endif /* CONFIG_RTW_REPEATER_SON */
589
590