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