ieee80211_ioctl.c (229968) | ieee80211_ioctl.c (251488) |
---|---|
1/*- 2 * Copyright (c) 2001 Atsushi Onoe 3 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2001 Atsushi Onoe 3 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ioctl.c 229968 2012-01-11 17:10:27Z adrian $"); | 28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ioctl.c 251488 2013-06-07 09:03:56Z adrian $"); |
29 30/* 31 * IEEE 802.11 ioctl support (FreeBSD-specific) 32 */ 33 34#include "opt_inet.h" 35#include "opt_ipx.h" 36#include "opt_wlan.h" --- 1298 unchanged lines hidden (view full) --- 1335 struct ieee80211_node_table *nt = &ic->ic_sta; 1336 struct ieee80211_node *ni; 1337 int error = 0; 1338 1339 /* NB: the broadcast address means do 'em all */ 1340 if (!IEEE80211_ADDR_EQ(mac, ic->ic_ifp->if_broadcastaddr)) { 1341 IEEE80211_NODE_LOCK(nt); 1342 ni = ieee80211_find_node_locked(nt, mac); | 29 30/* 31 * IEEE 802.11 ioctl support (FreeBSD-specific) 32 */ 33 34#include "opt_inet.h" 35#include "opt_ipx.h" 36#include "opt_wlan.h" --- 1298 unchanged lines hidden (view full) --- 1335 struct ieee80211_node_table *nt = &ic->ic_sta; 1336 struct ieee80211_node *ni; 1337 int error = 0; 1338 1339 /* NB: the broadcast address means do 'em all */ 1340 if (!IEEE80211_ADDR_EQ(mac, ic->ic_ifp->if_broadcastaddr)) { 1341 IEEE80211_NODE_LOCK(nt); 1342 ni = ieee80211_find_node_locked(nt, mac); |
1343 IEEE80211_NODE_UNLOCK(nt); 1344 /* 1345 * Don't do the node update inside the node 1346 * table lock. This unfortunately causes LORs 1347 * with drivers and their TX paths. 1348 */ |
|
1343 if (ni != NULL) { 1344 domlme(mlmeop, ni); 1345 ieee80211_free_node(ni); 1346 } else 1347 error = ENOENT; | 1349 if (ni != NULL) { 1350 domlme(mlmeop, ni); 1351 ieee80211_free_node(ni); 1352 } else 1353 error = ENOENT; |
1348 IEEE80211_NODE_UNLOCK(nt); | |
1349 } else { 1350 ieee80211_iterate_nodes(nt, domlme, mlmeop); 1351 } 1352 return error; 1353} 1354 1355static __noinline int 1356setmlme_common(struct ieee80211vap *vap, int op, --- 38 unchanged lines hidden (view full) --- 1395 ni = ieee80211_ref_node(vap->iv_bss); 1396 IEEE80211_SEND_MGMT(ni, 1397 IEEE80211_FC0_SUBTYPE_DEAUTH, reason); 1398 ieee80211_free_node(ni); 1399 break; 1400 case IEEE80211_M_MBSS: 1401 IEEE80211_NODE_LOCK(nt); 1402 ni = ieee80211_find_node_locked(nt, mac); | 1354 } else { 1355 ieee80211_iterate_nodes(nt, domlme, mlmeop); 1356 } 1357 return error; 1358} 1359 1360static __noinline int 1361setmlme_common(struct ieee80211vap *vap, int op, --- 38 unchanged lines hidden (view full) --- 1400 ni = ieee80211_ref_node(vap->iv_bss); 1401 IEEE80211_SEND_MGMT(ni, 1402 IEEE80211_FC0_SUBTYPE_DEAUTH, reason); 1403 ieee80211_free_node(ni); 1404 break; 1405 case IEEE80211_M_MBSS: 1406 IEEE80211_NODE_LOCK(nt); 1407 ni = ieee80211_find_node_locked(nt, mac); |
1408 /* 1409 * Don't do the node update inside the node 1410 * table lock. This unfortunately causes LORs 1411 * with drivers and their TX paths. 1412 */ 1413 IEEE80211_NODE_UNLOCK(nt); |
|
1403 if (ni != NULL) { 1404 ieee80211_node_leave(ni); 1405 ieee80211_free_node(ni); 1406 } else { 1407 error = ENOENT; 1408 } | 1414 if (ni != NULL) { 1415 ieee80211_node_leave(ni); 1416 ieee80211_free_node(ni); 1417 } else { 1418 error = ENOENT; 1419 } |
1409 IEEE80211_NODE_UNLOCK(nt); | |
1410 break; 1411 default: 1412 error = EINVAL; 1413 break; 1414 } 1415 break; 1416 case IEEE80211_MLME_AUTHORIZE: 1417 case IEEE80211_MLME_UNAUTHORIZE: 1418 if (vap->iv_opmode != IEEE80211_M_HOSTAP && 1419 vap->iv_opmode != IEEE80211_M_WDS) { 1420 error = EINVAL; 1421 break; 1422 } 1423 IEEE80211_NODE_LOCK(nt); 1424 ni = ieee80211_find_vap_node_locked(nt, vap, mac); | 1420 break; 1421 default: 1422 error = EINVAL; 1423 break; 1424 } 1425 break; 1426 case IEEE80211_MLME_AUTHORIZE: 1427 case IEEE80211_MLME_UNAUTHORIZE: 1428 if (vap->iv_opmode != IEEE80211_M_HOSTAP && 1429 vap->iv_opmode != IEEE80211_M_WDS) { 1430 error = EINVAL; 1431 break; 1432 } 1433 IEEE80211_NODE_LOCK(nt); 1434 ni = ieee80211_find_vap_node_locked(nt, vap, mac); |
1435 /* 1436 * Don't do the node update inside the node 1437 * table lock. This unfortunately causes LORs 1438 * with drivers and their TX paths. 1439 */ 1440 IEEE80211_NODE_UNLOCK(nt); |
|
1425 if (ni != NULL) { 1426 mlmedebug(vap, mac, op, reason); 1427 if (op == IEEE80211_MLME_AUTHORIZE) 1428 ieee80211_node_authorize(ni); 1429 else 1430 ieee80211_node_unauthorize(ni); 1431 ieee80211_free_node(ni); 1432 } else 1433 error = ENOENT; | 1441 if (ni != NULL) { 1442 mlmedebug(vap, mac, op, reason); 1443 if (op == IEEE80211_MLME_AUTHORIZE) 1444 ieee80211_node_authorize(ni); 1445 else 1446 ieee80211_node_unauthorize(ni); 1447 ieee80211_free_node(ni); 1448 } else 1449 error = ENOENT; |
1434 IEEE80211_NODE_UNLOCK(nt); | |
1435 break; 1436 case IEEE80211_MLME_AUTH: 1437 if (vap->iv_opmode != IEEE80211_M_HOSTAP) { 1438 error = EINVAL; 1439 break; 1440 } 1441 IEEE80211_NODE_LOCK(nt); 1442 ni = ieee80211_find_vap_node_locked(nt, vap, mac); | 1450 break; 1451 case IEEE80211_MLME_AUTH: 1452 if (vap->iv_opmode != IEEE80211_M_HOSTAP) { 1453 error = EINVAL; 1454 break; 1455 } 1456 IEEE80211_NODE_LOCK(nt); 1457 ni = ieee80211_find_vap_node_locked(nt, vap, mac); |
1458 /* 1459 * Don't do the node update inside the node 1460 * table lock. This unfortunately causes LORs 1461 * with drivers and their TX paths. 1462 */ 1463 IEEE80211_NODE_UNLOCK(nt); |
|
1443 if (ni != NULL) { 1444 mlmedebug(vap, mac, op, reason); 1445 if (reason == IEEE80211_STATUS_SUCCESS) { 1446 IEEE80211_SEND_MGMT(ni, 1447 IEEE80211_FC0_SUBTYPE_AUTH, 2); 1448 /* 1449 * For shared key auth, just continue the 1450 * exchange. Otherwise when 802.1x is not in --- 7 unchanged lines hidden (view full) --- 1458 vap->iv_stats.is_rx_acl++; 1459 ieee80211_send_error(ni, ni->ni_macaddr, 1460 IEEE80211_FC0_SUBTYPE_AUTH, 2|(reason<<16)); 1461 ieee80211_node_leave(ni); 1462 } 1463 ieee80211_free_node(ni); 1464 } else 1465 error = ENOENT; | 1464 if (ni != NULL) { 1465 mlmedebug(vap, mac, op, reason); 1466 if (reason == IEEE80211_STATUS_SUCCESS) { 1467 IEEE80211_SEND_MGMT(ni, 1468 IEEE80211_FC0_SUBTYPE_AUTH, 2); 1469 /* 1470 * For shared key auth, just continue the 1471 * exchange. Otherwise when 802.1x is not in --- 7 unchanged lines hidden (view full) --- 1479 vap->iv_stats.is_rx_acl++; 1480 ieee80211_send_error(ni, ni->ni_macaddr, 1481 IEEE80211_FC0_SUBTYPE_AUTH, 2|(reason<<16)); 1482 ieee80211_node_leave(ni); 1483 } 1484 ieee80211_free_node(ni); 1485 } else 1486 error = ENOENT; |
1466 IEEE80211_NODE_UNLOCK(nt); | |
1467 break; 1468 default: 1469 error = EINVAL; 1470 break; 1471 } 1472 return error; 1473} 1474 --- 1965 unchanged lines hidden --- | 1487 break; 1488 default: 1489 error = EINVAL; 1490 break; 1491 } 1492 return error; 1493} 1494 --- 1965 unchanged lines hidden --- |