ieee80211_ioctl.c (202935) | ieee80211_ioctl.c (206457) |
---|---|
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 202935 2010-01-24 16:17:58Z syrinx $"); | 28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ioctl.c 206457 2010-04-10 13:54:00Z bschmidt $"); |
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" --- 28 unchanged lines hidden (view full) --- 65 66#define IS_UP_AUTO(_vap) \ 67 (IFNET_IS_UP_RUNNING((_vap)->iv_ifp) && \ 68 (_vap)->iv_roaming == IEEE80211_ROAMING_AUTO) 69 70static const uint8_t zerobssid[IEEE80211_ADDR_LEN]; 71static struct ieee80211_channel *findchannel(struct ieee80211com *, 72 int ieee, int mode); | 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" --- 28 unchanged lines hidden (view full) --- 65 66#define IS_UP_AUTO(_vap) \ 67 (IFNET_IS_UP_RUNNING((_vap)->iv_ifp) && \ 68 (_vap)->iv_roaming == IEEE80211_ROAMING_AUTO) 69 70static const uint8_t zerobssid[IEEE80211_ADDR_LEN]; 71static struct ieee80211_channel *findchannel(struct ieee80211com *, 72 int ieee, int mode); |
73static int ieee80211_scanreq(struct ieee80211vap *, 74 struct ieee80211_scan_req *); |
|
73 74static __noinline int 75ieee80211_ioctl_getkey(struct ieee80211vap *vap, struct ieee80211req *ireq) 76{ 77 struct ieee80211com *ic = vap->iv_ic; 78 struct ieee80211_node *ni; 79 struct ieee80211req_key ik; 80 struct ieee80211_key *wk; --- 1385 unchanged lines hidden (view full) --- 1466 return; 1467 if (memcmp(look->essid, se->se_ssid+2, look->esslen)) 1468 return; 1469 } 1470 look->se = se; 1471} 1472 1473static __noinline int | 75 76static __noinline int 77ieee80211_ioctl_getkey(struct ieee80211vap *vap, struct ieee80211req *ireq) 78{ 79 struct ieee80211com *ic = vap->iv_ic; 80 struct ieee80211_node *ni; 81 struct ieee80211req_key ik; 82 struct ieee80211_key *wk; --- 1385 unchanged lines hidden (view full) --- 1468 return; 1469 if (memcmp(look->essid, se->se_ssid+2, look->esslen)) 1470 return; 1471 } 1472 look->se = se; 1473} 1474 1475static __noinline int |
1474setmlme_assoc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN], 1475 int ssid_len, const uint8_t ssid[IEEE80211_NWID_LEN]) | 1476setmlme_assoc_sta(struct ieee80211vap *vap, 1477 const uint8_t mac[IEEE80211_ADDR_LEN], int ssid_len, 1478 const uint8_t ssid[IEEE80211_NWID_LEN]) |
1476{ 1477 struct scanlookup lookup; 1478 | 1479{ 1480 struct scanlookup lookup; 1481 |
1479 /* XXX ibss/ahdemo */ 1480 if (vap->iv_opmode != IEEE80211_M_STA) 1481 return EINVAL; | 1482 KASSERT(vap->iv_opmode == IEEE80211_M_STA, 1483 ("expected opmode STA not %s", 1484 ieee80211_opmode_name[vap->iv_opmode])); |
1482 1483 /* NB: this is racey if roaming is !manual */ 1484 lookup.se = NULL; 1485 lookup.mac = mac; 1486 lookup.esslen = ssid_len; 1487 lookup.essid = ssid; 1488 ieee80211_scan_iterate(vap, mlmelookup, &lookup); 1489 if (lookup.se == NULL) 1490 return ENOENT; 1491 mlmedebug(vap, mac, IEEE80211_MLME_ASSOC, 0); 1492 if (!ieee80211_sta_join(vap, lookup.se->se_chan, lookup.se)) 1493 return EIO; /* XXX unique but could be better */ 1494 return 0; 1495} 1496 1497static __noinline int | 1485 1486 /* NB: this is racey if roaming is !manual */ 1487 lookup.se = NULL; 1488 lookup.mac = mac; 1489 lookup.esslen = ssid_len; 1490 lookup.essid = ssid; 1491 ieee80211_scan_iterate(vap, mlmelookup, &lookup); 1492 if (lookup.se == NULL) 1493 return ENOENT; 1494 mlmedebug(vap, mac, IEEE80211_MLME_ASSOC, 0); 1495 if (!ieee80211_sta_join(vap, lookup.se->se_chan, lookup.se)) 1496 return EIO; /* XXX unique but could be better */ 1497 return 0; 1498} 1499 1500static __noinline int |
1501setmlme_assoc_adhoc(struct ieee80211vap *vap, 1502 const uint8_t mac[IEEE80211_ADDR_LEN], int ssid_len, 1503 const uint8_t ssid[IEEE80211_NWID_LEN]) 1504{ 1505 struct ieee80211_scan_req sr; 1506 1507 KASSERT(vap->iv_opmode == IEEE80211_M_IBSS || 1508 vap->iv_opmode == IEEE80211_M_AHDEMO, 1509 ("expected opmode IBSS or AHDEMO not %s", 1510 ieee80211_opmode_name[vap->iv_opmode])); 1511 1512 if (ssid_len == 0) 1513 return EINVAL; 1514 1515 /* NB: IEEE80211_IOC_SSID call missing for ap_scan=2. */ 1516 memset(vap->iv_des_ssid[0].ssid, 0, IEEE80211_NWID_LEN); 1517 vap->iv_des_ssid[0].len = ssid_len; 1518 memcpy(vap->iv_des_ssid[0].ssid, ssid, ssid_len); 1519 vap->iv_des_nssid = 1; 1520 1521 sr.sr_flags = IEEE80211_IOC_SCAN_ACTIVE | IEEE80211_IOC_SCAN_ONCE; 1522 sr.sr_duration = IEEE80211_IOC_SCAN_FOREVER; 1523 memcpy(sr.sr_ssid[0].ssid, ssid, ssid_len); 1524 sr.sr_ssid[0].len = ssid_len; 1525 sr.sr_nssid = 1; 1526 1527 return ieee80211_scanreq(vap, &sr); 1528} 1529 1530static __noinline int |
|
1498ieee80211_ioctl_setmlme(struct ieee80211vap *vap, struct ieee80211req *ireq) 1499{ 1500 struct ieee80211req_mlme mlme; 1501 int error; 1502 1503 if (ireq->i_len != sizeof(mlme)) 1504 return EINVAL; 1505 error = copyin(ireq->i_data, &mlme, sizeof(mlme)); 1506 if (error) 1507 return error; | 1531ieee80211_ioctl_setmlme(struct ieee80211vap *vap, struct ieee80211req *ireq) 1532{ 1533 struct ieee80211req_mlme mlme; 1534 int error; 1535 1536 if (ireq->i_len != sizeof(mlme)) 1537 return EINVAL; 1538 error = copyin(ireq->i_data, &mlme, sizeof(mlme)); 1539 if (error) 1540 return error; |
1508 if (mlme.im_op == IEEE80211_MLME_ASSOC) 1509 return setmlme_assoc(vap, mlme.im_macaddr, | 1541 if (vap->iv_opmode == IEEE80211_M_STA && 1542 mlme.im_op == IEEE80211_MLME_ASSOC) 1543 return setmlme_assoc_sta(vap, mlme.im_macaddr, |
1510 vap->iv_des_ssid[0].len, vap->iv_des_ssid[0].ssid); | 1544 vap->iv_des_ssid[0].len, vap->iv_des_ssid[0].ssid); |
1545 else if (mlme.im_op == IEEE80211_MLME_ASSOC) 1546 return setmlme_assoc_adhoc(vap, mlme.im_macaddr, 1547 mlme.im_ssid_len, mlme.im_ssid); |
|
1511 else 1512 return setmlme_common(vap, mlme.im_op, 1513 mlme.im_macaddr, mlme.im_reason); 1514} 1515 1516static __noinline int 1517ieee80211_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq) 1518{ --- 808 unchanged lines hidden (view full) --- 2327 else if (csr.csa_count == 0) 2328 ieee80211_csa_cancelswitch(ic); 2329 else 2330 error = EBUSY; 2331 IEEE80211_UNLOCK(ic); 2332 return error; 2333} 2334 | 1548 else 1549 return setmlme_common(vap, mlme.im_op, 1550 mlme.im_macaddr, mlme.im_reason); 1551} 1552 1553static __noinline int 1554ieee80211_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq) 1555{ --- 808 unchanged lines hidden (view full) --- 2364 else if (csr.csa_count == 0) 2365 ieee80211_csa_cancelswitch(ic); 2366 else 2367 error = EBUSY; 2368 IEEE80211_UNLOCK(ic); 2369 return error; 2370} 2371 |
2335static __noinline int 2336ieee80211_ioctl_scanreq(struct ieee80211vap *vap, struct ieee80211req *ireq) | 2372static int 2373ieee80211_scanreq(struct ieee80211vap *vap, struct ieee80211_scan_req *sr) |
2337{ 2338#define IEEE80211_IOC_SCAN_FLAGS \ 2339 (IEEE80211_IOC_SCAN_NOPICK | IEEE80211_IOC_SCAN_ACTIVE | \ 2340 IEEE80211_IOC_SCAN_PICK1ST | IEEE80211_IOC_SCAN_BGSCAN | \ 2341 IEEE80211_IOC_SCAN_ONCE | IEEE80211_IOC_SCAN_NOBCAST | \ 2342 IEEE80211_IOC_SCAN_NOJOIN | IEEE80211_IOC_SCAN_FLUSH | \ 2343 IEEE80211_IOC_SCAN_CHECK) 2344 struct ieee80211com *ic = vap->iv_ic; | 2374{ 2375#define IEEE80211_IOC_SCAN_FLAGS \ 2376 (IEEE80211_IOC_SCAN_NOPICK | IEEE80211_IOC_SCAN_ACTIVE | \ 2377 IEEE80211_IOC_SCAN_PICK1ST | IEEE80211_IOC_SCAN_BGSCAN | \ 2378 IEEE80211_IOC_SCAN_ONCE | IEEE80211_IOC_SCAN_NOBCAST | \ 2379 IEEE80211_IOC_SCAN_NOJOIN | IEEE80211_IOC_SCAN_FLUSH | \ 2380 IEEE80211_IOC_SCAN_CHECK) 2381 struct ieee80211com *ic = vap->iv_ic; |
2345 struct ieee80211_scan_req sr; /* XXX off stack? */ 2346 int error, i; | 2382 int i; |
2347 | 2383 |
2348 /* NB: parent must be running */ 2349 if ((ic->ic_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 2350 return ENXIO; 2351 2352 if (ireq->i_len != sizeof(sr)) 2353 return EINVAL; 2354 error = copyin(ireq->i_data, &sr, sizeof(sr)); 2355 if (error != 0) 2356 return error; | |
2357 /* convert duration */ | 2384 /* convert duration */ |
2358 if (sr.sr_duration == IEEE80211_IOC_SCAN_FOREVER) 2359 sr.sr_duration = IEEE80211_SCAN_FOREVER; | 2385 if (sr->sr_duration == IEEE80211_IOC_SCAN_FOREVER) 2386 sr->sr_duration = IEEE80211_SCAN_FOREVER; |
2360 else { | 2387 else { |
2361 if (sr.sr_duration < IEEE80211_IOC_SCAN_DURATION_MIN || 2362 sr.sr_duration > IEEE80211_IOC_SCAN_DURATION_MAX) | 2388 if (sr->sr_duration < IEEE80211_IOC_SCAN_DURATION_MIN || 2389 sr->sr_duration > IEEE80211_IOC_SCAN_DURATION_MAX) |
2363 return EINVAL; | 2390 return EINVAL; |
2364 sr.sr_duration = msecs_to_ticks(sr.sr_duration); 2365 if (sr.sr_duration < 1) 2366 sr.sr_duration = 1; | 2391 sr->sr_duration = msecs_to_ticks(sr->sr_duration); 2392 if (sr->sr_duration < 1) 2393 sr->sr_duration = 1; |
2367 } 2368 /* convert min/max channel dwell */ | 2394 } 2395 /* convert min/max channel dwell */ |
2369 if (sr.sr_mindwell != 0) { 2370 sr.sr_mindwell = msecs_to_ticks(sr.sr_mindwell); 2371 if (sr.sr_mindwell < 1) 2372 sr.sr_mindwell = 1; | 2396 if (sr->sr_mindwell != 0) { 2397 sr->sr_mindwell = msecs_to_ticks(sr->sr_mindwell); 2398 if (sr->sr_mindwell < 1) 2399 sr->sr_mindwell = 1; |
2373 } | 2400 } |
2374 if (sr.sr_maxdwell != 0) { 2375 sr.sr_maxdwell = msecs_to_ticks(sr.sr_maxdwell); 2376 if (sr.sr_maxdwell < 1) 2377 sr.sr_maxdwell = 1; | 2401 if (sr->sr_maxdwell != 0) { 2402 sr->sr_maxdwell = msecs_to_ticks(sr->sr_maxdwell); 2403 if (sr->sr_maxdwell < 1) 2404 sr->sr_maxdwell = 1; |
2378 } 2379 /* NB: silently reduce ssid count to what is supported */ | 2405 } 2406 /* NB: silently reduce ssid count to what is supported */ |
2380 if (sr.sr_nssid > IEEE80211_SCAN_MAX_SSID) 2381 sr.sr_nssid = IEEE80211_SCAN_MAX_SSID; 2382 for (i = 0; i < sr.sr_nssid; i++) 2383 if (sr.sr_ssid[i].len > IEEE80211_NWID_LEN) | 2407 if (sr->sr_nssid > IEEE80211_SCAN_MAX_SSID) 2408 sr->sr_nssid = IEEE80211_SCAN_MAX_SSID; 2409 for (i = 0; i < sr->sr_nssid; i++) 2410 if (sr->sr_ssid[i].len > IEEE80211_NWID_LEN) |
2384 return EINVAL; 2385 /* cleanse flags just in case, could reject if invalid flags */ | 2411 return EINVAL; 2412 /* cleanse flags just in case, could reject if invalid flags */ |
2386 sr.sr_flags &= IEEE80211_IOC_SCAN_FLAGS; | 2413 sr->sr_flags &= IEEE80211_IOC_SCAN_FLAGS; |
2387 /* 2388 * Add an implicit NOPICK if the vap is not marked UP. This 2389 * allows applications to scan without joining a bss (or picking 2390 * a channel and setting up a bss) and without forcing manual 2391 * roaming mode--you just need to mark the parent device UP. 2392 */ 2393 if ((vap->iv_ifp->if_flags & IFF_UP) == 0) | 2414 /* 2415 * Add an implicit NOPICK if the vap is not marked UP. This 2416 * allows applications to scan without joining a bss (or picking 2417 * a channel and setting up a bss) and without forcing manual 2418 * roaming mode--you just need to mark the parent device UP. 2419 */ 2420 if ((vap->iv_ifp->if_flags & IFF_UP) == 0) |
2394 sr.sr_flags |= IEEE80211_IOC_SCAN_NOPICK; | 2421 sr->sr_flags |= IEEE80211_IOC_SCAN_NOPICK; |
2395 2396 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 2397 "%s: flags 0x%x%s duration 0x%x mindwell %u maxdwell %u nssid %d\n", | 2422 2423 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 2424 "%s: flags 0x%x%s duration 0x%x mindwell %u maxdwell %u nssid %d\n", |
2398 __func__, sr.sr_flags, | 2425 __func__, sr->sr_flags, |
2399 (vap->iv_ifp->if_flags & IFF_UP) == 0 ? " (!IFF_UP)" : "", | 2426 (vap->iv_ifp->if_flags & IFF_UP) == 0 ? " (!IFF_UP)" : "", |
2400 sr.sr_duration, sr.sr_mindwell, sr.sr_maxdwell, sr.sr_nssid); | 2427 sr->sr_duration, sr->sr_mindwell, sr->sr_maxdwell, sr->sr_nssid); |
2401 /* 2402 * If we are in INIT state then the driver has never had a chance 2403 * to setup hardware state to do a scan; we must use the state 2404 * machine to get us up to the SCAN state but once we reach SCAN 2405 * state we then want to use the supplied params. Stash the 2406 * parameters in the vap and mark IEEE80211_FEXT_SCANREQ; the 2407 * state machines will recognize this and use the stashed params 2408 * to issue the scan request. 2409 * 2410 * Otherwise just invoke the scan machinery directly. 2411 */ 2412 IEEE80211_LOCK(ic); 2413 if (vap->iv_state == IEEE80211_S_INIT) { 2414 /* NB: clobbers previous settings */ | 2428 /* 2429 * If we are in INIT state then the driver has never had a chance 2430 * to setup hardware state to do a scan; we must use the state 2431 * machine to get us up to the SCAN state but once we reach SCAN 2432 * state we then want to use the supplied params. Stash the 2433 * parameters in the vap and mark IEEE80211_FEXT_SCANREQ; the 2434 * state machines will recognize this and use the stashed params 2435 * to issue the scan request. 2436 * 2437 * Otherwise just invoke the scan machinery directly. 2438 */ 2439 IEEE80211_LOCK(ic); 2440 if (vap->iv_state == IEEE80211_S_INIT) { 2441 /* NB: clobbers previous settings */ |
2415 vap->iv_scanreq_flags = sr.sr_flags; 2416 vap->iv_scanreq_duration = sr.sr_duration; 2417 vap->iv_scanreq_nssid = sr.sr_nssid; 2418 for (i = 0; i < sr.sr_nssid; i++) { 2419 vap->iv_scanreq_ssid[i].len = sr.sr_ssid[i].len; 2420 memcpy(vap->iv_scanreq_ssid[i].ssid, sr.sr_ssid[i].ssid, 2421 sr.sr_ssid[i].len); | 2442 vap->iv_scanreq_flags = sr->sr_flags; 2443 vap->iv_scanreq_duration = sr->sr_duration; 2444 vap->iv_scanreq_nssid = sr->sr_nssid; 2445 for (i = 0; i < sr->sr_nssid; i++) { 2446 vap->iv_scanreq_ssid[i].len = sr->sr_ssid[i].len; 2447 memcpy(vap->iv_scanreq_ssid[i].ssid, 2448 sr->sr_ssid[i].ssid, sr->sr_ssid[i].len); |
2422 } 2423 vap->iv_flags_ext |= IEEE80211_FEXT_SCANREQ; 2424 IEEE80211_UNLOCK(ic); 2425 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0); 2426 } else { 2427 vap->iv_flags_ext &= ~IEEE80211_FEXT_SCANREQ; 2428 IEEE80211_UNLOCK(ic); 2429 /* XXX neeed error return codes */ | 2449 } 2450 vap->iv_flags_ext |= IEEE80211_FEXT_SCANREQ; 2451 IEEE80211_UNLOCK(ic); 2452 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0); 2453 } else { 2454 vap->iv_flags_ext &= ~IEEE80211_FEXT_SCANREQ; 2455 IEEE80211_UNLOCK(ic); 2456 /* XXX neeed error return codes */ |
2430 if (sr.sr_flags & IEEE80211_IOC_SCAN_CHECK) { 2431 (void) ieee80211_check_scan(vap, sr.sr_flags, 2432 sr.sr_duration, sr.sr_mindwell, sr.sr_maxdwell, 2433 sr.sr_nssid, | 2457 if (sr->sr_flags & IEEE80211_IOC_SCAN_CHECK) { 2458 (void) ieee80211_check_scan(vap, sr->sr_flags, 2459 sr->sr_duration, sr->sr_mindwell, sr->sr_maxdwell, 2460 sr->sr_nssid, |
2434 /* NB: cheat, we assume structures are compatible */ | 2461 /* NB: cheat, we assume structures are compatible */ |
2435 (const struct ieee80211_scan_ssid *) &sr.sr_ssid[0]); | 2462 (const struct ieee80211_scan_ssid *) &sr->sr_ssid[0]); |
2436 } else { | 2463 } else { |
2437 (void) ieee80211_start_scan(vap, sr.sr_flags, 2438 sr.sr_duration, sr.sr_mindwell, sr.sr_maxdwell, 2439 sr.sr_nssid, | 2464 (void) ieee80211_start_scan(vap, sr->sr_flags, 2465 sr->sr_duration, sr->sr_mindwell, sr->sr_maxdwell, 2466 sr->sr_nssid, |
2440 /* NB: cheat, we assume structures are compatible */ | 2467 /* NB: cheat, we assume structures are compatible */ |
2441 (const struct ieee80211_scan_ssid *) &sr.sr_ssid[0]); | 2468 (const struct ieee80211_scan_ssid *) &sr->sr_ssid[0]); |
2442 } 2443 } | 2469 } 2470 } |
2444 return error; | 2471 return 0; |
2445#undef IEEE80211_IOC_SCAN_FLAGS 2446} 2447 2448static __noinline int | 2472#undef IEEE80211_IOC_SCAN_FLAGS 2473} 2474 2475static __noinline int |
2476ieee80211_ioctl_scanreq(struct ieee80211vap *vap, struct ieee80211req *ireq) 2477{ 2478 struct ieee80211com *ic = vap->iv_ic; 2479 struct ieee80211_scan_req sr; /* XXX off stack? */ 2480 int error; 2481 2482 /* NB: parent must be running */ 2483 if ((ic->ic_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 2484 return ENXIO; 2485 2486 if (ireq->i_len != sizeof(sr)) 2487 return EINVAL; 2488 error = copyin(ireq->i_data, &sr, sizeof(sr)); 2489 if (error != 0) 2490 return error; 2491 return ieee80211_scanreq(vap, &sr); 2492} 2493 2494static __noinline int |
|
2449ieee80211_ioctl_setstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq) 2450{ 2451 struct ieee80211_node *ni; 2452 struct ieee80211req_sta_vlan vlan; 2453 int error; 2454 2455 if (ireq->i_len != sizeof(vlan)) 2456 return EINVAL; --- 887 unchanged lines hidden --- | 2495ieee80211_ioctl_setstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq) 2496{ 2497 struct ieee80211_node *ni; 2498 struct ieee80211req_sta_vlan vlan; 2499 int error; 2500 2501 if (ireq->i_len != sizeof(vlan)) 2502 return EINVAL; --- 887 unchanged lines hidden --- |