ieee80211_sta.c (260444) | ieee80211_sta.c (264855) |
---|---|
1/*- 2 * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ | 1/*- 2 * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ |
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_sta.c 260444 2014-01-08 08:06:56Z kevlo $"); | 28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_sta.c 264855 2014-04-24 01:39:53Z adrian $"); |
29#endif 30 31/* 32 * IEEE 802.11 Station mode support. 33 */ 34#include "opt_inet.h" 35#include "opt_wlan.h" 36 --- 192 unchanged lines hidden (view full) --- 229 ni = vap->iv_bss; /* NB: no reference held */ 230 if (vap->iv_flags_ext & IEEE80211_FEXT_SWBMISS) 231 callout_stop(&vap->iv_swbmiss); 232 switch (nstate) { 233 case IEEE80211_S_INIT: 234 switch (ostate) { 235 case IEEE80211_S_SLEEP: 236 /* XXX wakeup */ | 29#endif 30 31/* 32 * IEEE 802.11 Station mode support. 33 */ 34#include "opt_inet.h" 35#include "opt_wlan.h" 36 --- 192 unchanged lines hidden (view full) --- 229 ni = vap->iv_bss; /* NB: no reference held */ 230 if (vap->iv_flags_ext & IEEE80211_FEXT_SWBMISS) 231 callout_stop(&vap->iv_swbmiss); 232 switch (nstate) { 233 case IEEE80211_S_INIT: 234 switch (ostate) { 235 case IEEE80211_S_SLEEP: 236 /* XXX wakeup */ |
237 /* XXX driver hook to wakeup the hardware? */ |
|
237 case IEEE80211_S_RUN: 238 IEEE80211_SEND_MGMT(ni, 239 IEEE80211_FC0_SUBTYPE_DISASSOC, 240 IEEE80211_REASON_ASSOC_LEAVE); 241 ieee80211_sta_leave(ni); 242 break; 243 case IEEE80211_S_ASSOC: 244 IEEE80211_SEND_MGMT(ni, --- 153 unchanged lines hidden (view full) --- 398 IEEE80211_RATE2MBS(ni->ni_txrate)); 399 } 400#endif 401 ieee80211_scan_assoc_success(vap, ni->ni_macaddr); 402 ieee80211_notify_node_join(ni, 403 arg == IEEE80211_FC0_SUBTYPE_ASSOC_RESP); 404 break; 405 case IEEE80211_S_SLEEP: | 238 case IEEE80211_S_RUN: 239 IEEE80211_SEND_MGMT(ni, 240 IEEE80211_FC0_SUBTYPE_DISASSOC, 241 IEEE80211_REASON_ASSOC_LEAVE); 242 ieee80211_sta_leave(ni); 243 break; 244 case IEEE80211_S_ASSOC: 245 IEEE80211_SEND_MGMT(ni, --- 153 unchanged lines hidden (view full) --- 399 IEEE80211_RATE2MBS(ni->ni_txrate)); 400 } 401#endif 402 ieee80211_scan_assoc_success(vap, ni->ni_macaddr); 403 ieee80211_notify_node_join(ni, 404 arg == IEEE80211_FC0_SUBTYPE_ASSOC_RESP); 405 break; 406 case IEEE80211_S_SLEEP: |
407 /* Wake up from sleep */ |
|
406 vap->iv_sta_ps(vap, 0); 407 break; 408 default: 409 goto invalid; 410 } 411 ieee80211_sync_curchan(ic); 412 if (ostate != IEEE80211_S_RUN && 413 (vap->iv_flags_ext & IEEE80211_FEXT_SWBMISS)) { --- 11 unchanged lines hidden (view full) --- 425 /* 426 * When 802.1x is not in use mark the port authorized 427 * at this point so traffic can flow. 428 */ 429 if (ni->ni_authmode != IEEE80211_AUTH_8021X) 430 ieee80211_node_authorize(ni); 431 /* 432 * Fake association when joining an existing bss. | 408 vap->iv_sta_ps(vap, 0); 409 break; 410 default: 411 goto invalid; 412 } 413 ieee80211_sync_curchan(ic); 414 if (ostate != IEEE80211_S_RUN && 415 (vap->iv_flags_ext & IEEE80211_FEXT_SWBMISS)) { --- 11 unchanged lines hidden (view full) --- 427 /* 428 * When 802.1x is not in use mark the port authorized 429 * at this point so traffic can flow. 430 */ 431 if (ni->ni_authmode != IEEE80211_AUTH_8021X) 432 ieee80211_node_authorize(ni); 433 /* 434 * Fake association when joining an existing bss. |
435 * 436 * Don't do this if we're doing SLEEP->RUN. |
|
433 */ | 437 */ |
434 if (ic->ic_newassoc != NULL) 435 ic->ic_newassoc(vap->iv_bss, ostate != IEEE80211_S_RUN); | 438 if (ic->ic_newassoc != NULL && ostate != IEEE80211_S_SLEEP) 439 ic->ic_newassoc(vap->iv_bss, (ostate != IEEE80211_S_RUN)); |
436 break; 437 case IEEE80211_S_CSA: 438 if (ostate != IEEE80211_S_RUN) 439 goto invalid; 440 break; 441 case IEEE80211_S_SLEEP: 442 vap->iv_sta_ps(vap, 1); 443 break; --- 863 unchanged lines hidden (view full) --- 1307 return; 1308 } 1309 /* XXX probe response in sta mode when !scanning? */ 1310 if (ieee80211_parse_beacon(ni, m0, &scan) != 0) { 1311 if (! (ic->ic_flags & IEEE80211_F_SCAN)) 1312 vap->iv_stats.is_beacon_bad++; 1313 return; 1314 } | 440 break; 441 case IEEE80211_S_CSA: 442 if (ostate != IEEE80211_S_RUN) 443 goto invalid; 444 break; 445 case IEEE80211_S_SLEEP: 446 vap->iv_sta_ps(vap, 1); 447 break; --- 863 unchanged lines hidden (view full) --- 1311 return; 1312 } 1313 /* XXX probe response in sta mode when !scanning? */ 1314 if (ieee80211_parse_beacon(ni, m0, &scan) != 0) { 1315 if (! (ic->ic_flags & IEEE80211_F_SCAN)) 1316 vap->iv_stats.is_beacon_bad++; 1317 return; 1318 } |
1319 |
|
1315 /* 1316 * Count frame now that we know it's to be processed. 1317 */ 1318 if (subtype == IEEE80211_FC0_SUBTYPE_BEACON) { 1319 vap->iv_stats.is_rx_beacon++; /* XXX remove */ 1320 IEEE80211_NODE_STAT(ni, rx_beacons); 1321 } else 1322 IEEE80211_NODE_STAT(ni, rx_proberesp); --- 53 unchanged lines hidden (view full) --- 1376 (vap->iv_flags_ht & IEEE80211_FHT_HT)) { 1377 /* XXX state changes? */ 1378 if (ieee80211_ht_updateparams(ni, 1379 scan.htcap, scan.htinfo)) 1380 ht_state_change = 1; 1381 } 1382 if (scan.quiet) 1383 ic->ic_set_quiet(ni, scan.quiet); | 1320 /* 1321 * Count frame now that we know it's to be processed. 1322 */ 1323 if (subtype == IEEE80211_FC0_SUBTYPE_BEACON) { 1324 vap->iv_stats.is_rx_beacon++; /* XXX remove */ 1325 IEEE80211_NODE_STAT(ni, rx_beacons); 1326 } else 1327 IEEE80211_NODE_STAT(ni, rx_proberesp); --- 53 unchanged lines hidden (view full) --- 1381 (vap->iv_flags_ht & IEEE80211_FHT_HT)) { 1382 /* XXX state changes? */ 1383 if (ieee80211_ht_updateparams(ni, 1384 scan.htcap, scan.htinfo)) 1385 ht_state_change = 1; 1386 } 1387 if (scan.quiet) 1388 ic->ic_set_quiet(ni, scan.quiet); |
1389 |
|
1384 if (scan.tim != NULL) { 1385 struct ieee80211_tim_ie *tim = 1386 (struct ieee80211_tim_ie *) scan.tim; | 1390 if (scan.tim != NULL) { 1391 struct ieee80211_tim_ie *tim = 1392 (struct ieee80211_tim_ie *) scan.tim; |
1387#if 0 | 1393 /* 1394 * XXX Check/debug this code; see if it's about 1395 * the right time to force the VAP awake if we 1396 * receive a frame destined for us? 1397 */ |
1388 int aid = IEEE80211_AID(ni->ni_associd); 1389 int ix = aid / NBBY; 1390 int min = tim->tim_bitctl &~ 1; 1391 int max = tim->tim_len + min - 4; | 1398 int aid = IEEE80211_AID(ni->ni_associd); 1399 int ix = aid / NBBY; 1400 int min = tim->tim_bitctl &~ 1; 1401 int max = tim->tim_len + min - 4; |
1392 if ((tim->tim_bitctl&1) || | 1402 1403 /* 1404 * Only do this for unicast traffic in the TIM 1405 * The multicast traffic notification for 1406 * the scan notification stuff should occur 1407 * differently. 1408 */ 1409 if (min <= ix && ix <= max && 1410 isset(tim->tim_bitmap - min, aid)) { 1411 ieee80211_sta_tim_notify(vap, 1); 1412 ic->ic_lastdata = ticks; 1413 } 1414 1415 /* 1416 * XXX TODO: do a separate notification 1417 * for the multicast bit being set. 1418 */ 1419#if 0 1420 if ((tim->tim_bitctl & 1) || |
1393 (min <= ix && ix <= max && 1394 isset(tim->tim_bitmap - min, aid))) { 1395 /* 1396 * XXX Do not let bg scan kick off 1397 * we are expecting data. 1398 */ | 1421 (min <= ix && ix <= max && 1422 isset(tim->tim_bitmap - min, aid))) { 1423 /* 1424 * XXX Do not let bg scan kick off 1425 * we are expecting data. 1426 */ |
1427 ieee80211_sta_tim_notify(vap, 1); |
|
1399 ic->ic_lastdata = ticks; | 1428 ic->ic_lastdata = ticks; |
1400 vap->iv_sta_ps(vap, 0); | 1429 // XXX not yet? 1430// vap->iv_sta_ps(vap, 0); |
1401 } 1402#endif 1403 ni->ni_dtim_count = tim->tim_count; 1404 ni->ni_dtim_period = tim->tim_period; 1405 } 1406 if (scan.csa != NULL && 1407 (vap->iv_flags & IEEE80211_F_DOTH)) 1408 ieee80211_parse_csaparams(vap, scan.csa, wh); --- 32 unchanged lines hidden (view full) --- 1441#if 0 1442 /* wakeup if we are sleeing */ 1443 ieee80211_set_pwrsave(vap, 0); 1444#endif 1445 ieee80211_bg_scan(vap, 0); 1446 } 1447 1448 /* | 1431 } 1432#endif 1433 ni->ni_dtim_count = tim->tim_count; 1434 ni->ni_dtim_period = tim->tim_period; 1435 } 1436 if (scan.csa != NULL && 1437 (vap->iv_flags & IEEE80211_F_DOTH)) 1438 ieee80211_parse_csaparams(vap, scan.csa, wh); --- 32 unchanged lines hidden (view full) --- 1471#if 0 1472 /* wakeup if we are sleeing */ 1473 ieee80211_set_pwrsave(vap, 0); 1474#endif 1475 ieee80211_bg_scan(vap, 0); 1476 } 1477 1478 /* |
1479 * Put the station to sleep if we haven't seen 1480 * traffic in a while. 1481 */ 1482 IEEE80211_LOCK(ic); 1483 ieee80211_sta_ps_timer_check(vap); 1484 IEEE80211_UNLOCK(ic); 1485 1486 /* |
|
1449 * If we've had a channel width change (eg HT20<->HT40) 1450 * then schedule a delayed driver notification. 1451 */ 1452 if (ht_state_change) 1453 ieee80211_update_chw(ic); 1454 return; 1455 } 1456 /* --- 348 unchanged lines hidden --- | 1487 * If we've had a channel width change (eg HT20<->HT40) 1488 * then schedule a delayed driver notification. 1489 */ 1490 if (ht_state_change) 1491 ieee80211_update_chw(ic); 1492 return; 1493 } 1494 /* --- 348 unchanged lines hidden --- |