Deleted Added
full compact
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 ---