summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net80211
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-11 15:26:17 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-12 09:17:32 +0100
commit556ec29b4ea1a7bf64304913ca7c881738589f3a (patch)
tree3b4216bb4da32855c7f8c4938cf8d7bb6ed9fe3d /freebsd/sys/net80211
parentatomic.h: Add atomic_fetchadd_64() (diff)
downloadrtems-libbsd-556ec29b4ea1a7bf64304913ca7c881738589f3a.tar.bz2
Update to FreeBSD stable/12 2019-02-11
Git mirror commit 606b591dae1023a71ff020faf99789059eb6591f.
Diffstat (limited to 'freebsd/sys/net80211')
-rw-r--r--freebsd/sys/net80211/ieee80211.c11
-rw-r--r--freebsd/sys/net80211/ieee80211.h2
-rw-r--r--freebsd/sys/net80211/ieee80211_amrr.c4
-rw-r--r--freebsd/sys/net80211/ieee80211_dfs.c3
-rw-r--r--freebsd/sys/net80211/ieee80211_freebsd.c10
-rw-r--r--freebsd/sys/net80211/ieee80211_freebsd.h6
-rw-r--r--freebsd/sys/net80211/ieee80211_ioctl.c91
-rw-r--r--freebsd/sys/net80211/ieee80211_rssadapt.c4
-rw-r--r--freebsd/sys/net80211/ieee80211_scan.c2
-rw-r--r--freebsd/sys/net80211/ieee80211_scan_sta.c1
-rw-r--r--freebsd/sys/net80211/ieee80211_var.h2
-rw-r--r--freebsd/sys/net80211/ieee80211_wps.h149
12 files changed, 242 insertions, 43 deletions
diff --git a/freebsd/sys/net80211/ieee80211.c b/freebsd/sys/net80211/ieee80211.c
index 74aeeb80..927905bb 100644
--- a/freebsd/sys/net80211/ieee80211.c
+++ b/freebsd/sys/net80211/ieee80211.c
@@ -1634,6 +1634,17 @@ ieee80211_add_channel_list_2ghz(struct ieee80211_channel chans[], int maxchans,
}
int
+ieee80211_add_channels_default_2ghz(struct ieee80211_channel chans[],
+ int maxchans, int *nchans, const uint8_t bands[], int ht40)
+{
+ const uint8_t default_chan_list[] =
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
+
+ return (ieee80211_add_channel_list_2ghz(chans, maxchans, nchans,
+ default_chan_list, nitems(default_chan_list), bands, ht40));
+}
+
+int
ieee80211_add_channel_list_5ghz(struct ieee80211_channel chans[], int maxchans,
int *nchans, const uint8_t ieee[], int nieee, const uint8_t bands[],
int ht40)
diff --git a/freebsd/sys/net80211/ieee80211.h b/freebsd/sys/net80211/ieee80211.h
index db46b8f1..61389169 100644
--- a/freebsd/sys/net80211/ieee80211.h
+++ b/freebsd/sys/net80211/ieee80211.h
@@ -951,9 +951,11 @@ enum {
IEEE80211_ELEMID_ERP = 42,
IEEE80211_ELEMID_HTCAP = 45,
IEEE80211_ELEMID_QOS = 46,
+ IEEE80211_ELEMID_RESERVED_47 = 47,
IEEE80211_ELEMID_RSN = 48,
IEEE80211_ELEMID_XRATES = 50,
IEEE80211_ELEMID_APCHANREP = 51,
+ IEEE80211_ELEMID_MOBILITY_DOMAIN = 54,
IEEE80211_ELEMID_HTINFO = 61,
IEEE80211_ELEMID_SECCHAN_OFFSET = 62,
IEEE80211_ELEMID_RRM_ENACAPS = 70,
diff --git a/freebsd/sys/net80211/ieee80211_amrr.c b/freebsd/sys/net80211/ieee80211_amrr.c
index 9bb1d92d..a827f470 100644
--- a/freebsd/sys/net80211/ieee80211_amrr.c
+++ b/freebsd/sys/net80211/ieee80211_amrr.c
@@ -104,15 +104,13 @@ static void
amrr_setinterval(const struct ieee80211vap *vap, int msecs)
{
struct ieee80211_amrr *amrr = vap->iv_rs;
- int t;
if (!amrr)
return;
if (msecs < 100)
msecs = 100;
- t = msecs_to_ticks(msecs);
- amrr->amrr_interval = (t < 1) ? 1 : t;
+ amrr->amrr_interval = msecs_to_ticks(msecs);
}
static void
diff --git a/freebsd/sys/net80211/ieee80211_dfs.c b/freebsd/sys/net80211/ieee80211_dfs.c
index 2c454516..119c11a7 100644
--- a/freebsd/sys/net80211/ieee80211_dfs.c
+++ b/freebsd/sys/net80211/ieee80211_dfs.c
@@ -158,8 +158,7 @@ cac_timeout(void *arg)
/* XXX clobbers any existing desired channel */
/* NB: dfs->newchan may be NULL, that's ok */
vap->iv_des_chan = dfs->newchan;
- /* XXX recursive lock need ieee80211_new_state_locked */
- ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
+ ieee80211_new_state_locked(vap, IEEE80211_S_SCAN, 0);
} else {
if_printf(vap->iv_ifp,
"CAC timer on channel %u (%u MHz) expired; "
diff --git a/freebsd/sys/net80211/ieee80211_freebsd.c b/freebsd/sys/net80211/ieee80211_freebsd.c
index 57e2f23f..f8d5d0f3 100644
--- a/freebsd/sys/net80211/ieee80211_freebsd.c
+++ b/freebsd/sys/net80211/ieee80211_freebsd.c
@@ -70,8 +70,6 @@ SYSCTL_INT(_net_wlan, OID_AUTO, debug, CTLFLAG_RW, &ieee80211_debug,
0, "debugging printfs");
#endif
-static MALLOC_DEFINE(M_80211_COM, "80211com", "802.11 com state");
-
static const char wlanname[] = "wlan";
static struct if_clone *wlan_cloner;
@@ -138,13 +136,12 @@ int
ieee80211_sysctl_msecs_ticks(SYSCTL_HANDLER_ARGS)
{
int msecs = ticks_to_msecs(*(int *)arg1);
- int error, t;
+ int error;
error = sysctl_handle_int(oidp, &msecs, 0, req);
if (error || !req->newptr)
return error;
- t = msecs_to_ticks(msecs);
- *(int *)arg1 = (t < 1) ? 1 : t;
+ *(int *)arg1 = msecs_to_ticks(msecs);
return 0;
}
@@ -349,9 +346,6 @@ ieee80211_com_vdetach(struct ieee80211vap *vap)
int sleep_time;
sleep_time = msecs_to_ticks(250);
- if (sleep_time == 0)
- sleep_time = 1;
-
atomic_set_32(&vap->iv_com_state, IEEE80211_COM_DETACHED);
while (MS(atomic_load_32(&vap->iv_com_state), IEEE80211_COM_REF) != 0)
pause("comref", sleep_time);
diff --git a/freebsd/sys/net80211/ieee80211_freebsd.h b/freebsd/sys/net80211/ieee80211_freebsd.h
index a70de108..4e06b76a 100644
--- a/freebsd/sys/net80211/ieee80211_freebsd.h
+++ b/freebsd/sys/net80211/ieee80211_freebsd.h
@@ -38,6 +38,7 @@
#include <sys/rwlock.h>
#include <sys/sysctl.h>
#include <sys/taskqueue.h>
+#include <sys/time.h>
/*
* Common state locking definitions.
@@ -249,9 +250,8 @@ void ieee80211_vap_destroy(struct ieee80211vap *);
(((_ifp)->if_flags & IFF_UP) && \
((_ifp)->if_drv_flags & IFF_DRV_RUNNING))
-/* XXX TODO: cap these at 1, as hz may not be 1000 */
-#define msecs_to_ticks(ms) (((ms)*hz)/1000)
-#define ticks_to_msecs(t) (1000*(t) / hz)
+#define msecs_to_ticks(ms) MSEC_2_TICKS(ms)
+#define ticks_to_msecs(t) TICKS_2_MSEC(t)
#define ticks_to_secs(t) ((t) / hz)
#define ieee80211_time_after(a,b) ((long)(b) - (long)(a) < 0)
diff --git a/freebsd/sys/net80211/ieee80211_ioctl.c b/freebsd/sys/net80211/ieee80211_ioctl.c
index fb8357bd..0396e8be 100644
--- a/freebsd/sys/net80211/ieee80211_ioctl.c
+++ b/freebsd/sys/net80211/ieee80211_ioctl.c
@@ -2206,18 +2206,6 @@ ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
}
static int
-ieee80211_ioctl_setroam(struct ieee80211vap *vap,
- const struct ieee80211req *ireq)
-{
- if (ireq->i_len != sizeof(vap->iv_roamparms))
- return EINVAL;
- /* XXX validate params */
- /* XXX? ENETRESET to push to device? */
- return copyin(ireq->i_data, vap->iv_roamparms,
- sizeof(vap->iv_roamparms));
-}
-
-static int
checkrate(const struct ieee80211_rateset *rs, int rate)
{
int i;
@@ -2247,6 +2235,73 @@ checkmcs(const struct ieee80211_htrateset *rs, int mcs)
}
static int
+ieee80211_ioctl_setroam(struct ieee80211vap *vap,
+ const struct ieee80211req *ireq)
+{
+ struct ieee80211com *ic = vap->iv_ic;
+ struct ieee80211_roamparams_req *parms;
+ struct ieee80211_roamparam *src, *dst;
+ const struct ieee80211_htrateset *rs_ht;
+ const struct ieee80211_rateset *rs;
+ int changed, error, mode, is11n, nmodes;
+
+ if (ireq->i_len != sizeof(vap->iv_roamparms))
+ return EINVAL;
+
+ parms = IEEE80211_MALLOC(sizeof(*parms), M_TEMP,
+ IEEE80211_M_NOWAIT | IEEE80211_M_ZERO);
+ if (parms == NULL)
+ return ENOMEM;
+
+ error = copyin(ireq->i_data, parms, ireq->i_len);
+ if (error != 0)
+ goto fail;
+
+ changed = 0;
+ nmodes = IEEE80211_MODE_MAX;
+
+ /* validate parameters and check if anything changed */
+ for (mode = IEEE80211_MODE_11A; mode < nmodes; mode++) {
+ if (isclr(ic->ic_modecaps, mode))
+ continue;
+ src = &parms->params[mode];
+ dst = &vap->iv_roamparms[mode];
+ rs = &ic->ic_sup_rates[mode]; /* NB: 11n maps to legacy */
+ rs_ht = &ic->ic_sup_htrates;
+ is11n = (mode == IEEE80211_MODE_11NA ||
+ mode == IEEE80211_MODE_11NG);
+ /* XXX TODO: 11ac */
+ if (src->rate != dst->rate) {
+ if (!checkrate(rs, src->rate) &&
+ (!is11n || !checkmcs(rs_ht, src->rate))) {
+ error = EINVAL;
+ goto fail;
+ }
+ changed++;
+ }
+ if (src->rssi != dst->rssi)
+ changed++;
+ }
+ if (changed) {
+ /*
+ * Copy new parameters in place and notify the
+ * driver so it can push state to the device.
+ */
+ /* XXX locking? */
+ for (mode = IEEE80211_MODE_11A; mode < nmodes; mode++) {
+ if (isset(ic->ic_modecaps, mode))
+ vap->iv_roamparms[mode] = parms->params[mode];
+ }
+
+ if (vap->iv_roaming == IEEE80211_ROAMING_DEVICE)
+ error = ERESTART;
+ }
+
+fail: IEEE80211_FREE(parms, M_TEMP);
+ return error;
+}
+
+static int
ieee80211_ioctl_settxparams(struct ieee80211vap *vap,
const struct ieee80211req *ireq)
{
@@ -2517,20 +2572,12 @@ ieee80211_scanreq(struct ieee80211vap *vap, struct ieee80211_scan_req *sr)
sr->sr_duration > IEEE80211_IOC_SCAN_DURATION_MAX)
return EINVAL;
sr->sr_duration = msecs_to_ticks(sr->sr_duration);
- if (sr->sr_duration < 1)
- sr->sr_duration = 1;
}
/* convert min/max channel dwell */
- if (sr->sr_mindwell != 0) {
+ if (sr->sr_mindwell != 0)
sr->sr_mindwell = msecs_to_ticks(sr->sr_mindwell);
- if (sr->sr_mindwell < 1)
- sr->sr_mindwell = 1;
- }
- if (sr->sr_maxdwell != 0) {
+ if (sr->sr_maxdwell != 0)
sr->sr_maxdwell = msecs_to_ticks(sr->sr_maxdwell);
- if (sr->sr_maxdwell < 1)
- sr->sr_maxdwell = 1;
- }
/* NB: silently reduce ssid count to what is supported */
if (sr->sr_nssid > IEEE80211_SCAN_MAX_SSID)
sr->sr_nssid = IEEE80211_SCAN_MAX_SSID;
diff --git a/freebsd/sys/net80211/ieee80211_rssadapt.c b/freebsd/sys/net80211/ieee80211_rssadapt.c
index 4b49b77e..52f81a99 100644
--- a/freebsd/sys/net80211/ieee80211_rssadapt.c
+++ b/freebsd/sys/net80211/ieee80211_rssadapt.c
@@ -119,15 +119,13 @@ static void
rssadapt_setinterval(const struct ieee80211vap *vap, int msecs)
{
struct ieee80211_rssadapt *rs = vap->iv_rs;
- int t;
if (!rs)
return;
if (msecs < 100)
msecs = 100;
- t = msecs_to_ticks(msecs);
- rs->interval = (t < 1) ? 1 : t;
+ rs->interval = msecs_to_ticks(msecs);
}
static void
diff --git a/freebsd/sys/net80211/ieee80211_scan.c b/freebsd/sys/net80211/ieee80211_scan.c
index 9b58ff98..86056415 100644
--- a/freebsd/sys/net80211/ieee80211_scan.c
+++ b/freebsd/sys/net80211/ieee80211_scan.c
@@ -296,7 +296,7 @@ ieee80211_scan_dump(struct ieee80211_scan_state *ss)
if_printf(vap->iv_ifp, "scan set ");
ieee80211_scan_dump_channels(ss);
- printf(" dwell min %lums max %lums\n",
+ printf(" dwell min %ums max %ums\n",
ticks_to_msecs(ss->ss_mindwell), ticks_to_msecs(ss->ss_maxdwell));
}
#endif /* IEEE80211_DEBUG */
diff --git a/freebsd/sys/net80211/ieee80211_scan_sta.c b/freebsd/sys/net80211/ieee80211_scan_sta.c
index 3ea313d5..926504f4 100644
--- a/freebsd/sys/net80211/ieee80211_scan_sta.c
+++ b/freebsd/sys/net80211/ieee80211_scan_sta.c
@@ -1361,7 +1361,6 @@ sta_roam_check(struct ieee80211_scan_state *ss, struct ieee80211vap *vap)
curRssi = ic->ic_node_getrssi(ni);
if (ucastRate == IEEE80211_FIXED_RATE_NONE) {
curRate = ni->ni_txrate;
- roamRate &= IEEE80211_RATE_VAL;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_ROAM,
"%s: currssi %d currate %u roamrssi %d roamrate %u\n",
__func__, curRssi, curRate, roamRssi, roamRate);
diff --git a/freebsd/sys/net80211/ieee80211_var.h b/freebsd/sys/net80211/ieee80211_var.h
index af42a249..8fe8f01c 100644
--- a/freebsd/sys/net80211/ieee80211_var.h
+++ b/freebsd/sys/net80211/ieee80211_var.h
@@ -735,6 +735,8 @@ uint32_t ieee80211_get_channel_center_freq1(const struct ieee80211_channel *);
uint32_t ieee80211_get_channel_center_freq2(const struct ieee80211_channel *);
int ieee80211_add_channel_list_2ghz(struct ieee80211_channel[], int, int *,
const uint8_t[], int, const uint8_t[], int);
+int ieee80211_add_channels_default_2ghz(struct ieee80211_channel[], int,
+ int *, const uint8_t[], int);
int ieee80211_add_channel_list_5ghz(struct ieee80211_channel[], int, int *,
const uint8_t[], int, const uint8_t[], int);
struct ieee80211_channel *ieee80211_find_channel(struct ieee80211com *,
diff --git a/freebsd/sys/net80211/ieee80211_wps.h b/freebsd/sys/net80211/ieee80211_wps.h
new file mode 100644
index 00000000..32cc667e
--- /dev/null
+++ b/freebsd/sys/net80211/ieee80211_wps.h
@@ -0,0 +1,149 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2017 J.R. Oldroyd, Open Advisors Limited
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+#ifndef _NET80211_IEEE80211_WPS_H_
+#define _NET80211_IEEE80211_WPS_H_
+
+/*
+ * 802.11 WPS implementation definitions.
+ */
+
+#define IEEE80211_WPS_ATTR_AP_CHANNEL 0x1001
+#define IEEE80211_WPS_ATTR_ASSOC_STATE 0x1002
+#define IEEE80211_WPS_ATTR_AUTH_TYPE 0x1003
+#define IEEE80211_WPS_ATTR_AUTH_TYPE_FLAGS 0x1004
+#define IEEE80211_WPS_ATTR_AUTHENTICATOR 0x1005
+#define IEEE80211_WPS_ATTR_CONFIG_METHODS 0x1008
+#define IEEE80211_WPS_ATTR_CONFIG_ERROR 0x1009
+#define IEEE80211_WPS_ATTR_CONFIRM_URL4 0x100a
+#define IEEE80211_WPS_ATTR_CONFIRM_URL6 0x100b
+#define IEEE80211_WPS_ATTR_CONN_TYPE 0x100c
+#define IEEE80211_WPS_ATTR_CONN_TYPE_FLAGS 0x100d
+#define IEEE80211_WPS_ATTR_CRED 0x100e
+#define IEEE80211_WPS_ATTR_ENCR_TYPE 0x100f
+#define IEEE80211_WPS_ATTR_ENCR_TYPE_FLAGS 0x1010
+#define IEEE80211_WPS_ATTR_DEV_NAME 0x1011
+#define IEEE80211_WPS_ATTR_DEV_PASSWORD_ID 0x1012
+#define IEEE80211_WPS_ATTR_E_HASH1 0x1014
+#define IEEE80211_WPS_ATTR_E_HASH2 0x1015
+#define IEEE80211_WPS_ATTR_E_SNONCE1 0x1016
+#define IEEE80211_WPS_ATTR_E_SNONCE2 0x1017
+#define IEEE80211_WPS_ATTR_ENCR_SETTINGS 0x1018
+#define IEEE80211_WPS_ATTR_ENROLLEE_NONCE 0x101a
+#define IEEE80211_WPS_ATTR_FEATURE_ID 0x101b
+#define IEEE80211_WPS_ATTR_IDENTITY 0x101c
+#define IEEE80211_WPS_ATTR_IDENTITY_PROOF 0x101d
+#define IEEE80211_WPS_ATTR_KEY_WRAP_AUTH 0x101e
+#define IEEE80211_WPS_ATTR_KEY_ID 0x101f
+#define IEEE80211_WPS_ATTR_MAC_ADDR 0x1020
+#define IEEE80211_WPS_ATTR_MANUFACTURER 0x1021
+#define IEEE80211_WPS_ATTR_MSG_TYPE 0x1022
+#define IEEE80211_WPS_ATTR_MODEL_NAME 0x1023
+#define IEEE80211_WPS_ATTR_MODEL_NUMBER 0x1024
+#define IEEE80211_WPS_ATTR_NETWORK_INDEX 0x1026
+#define IEEE80211_WPS_ATTR_NETWORK_KEY 0x1027
+#define IEEE80211_WPS_ATTR_NETWORK_KEY_INDEX 0x1028
+#define IEEE80211_WPS_ATTR_NEW_DEVICE_NAME 0x1029
+#define IEEE80211_WPS_ATTR_NEW_PASSWORD 0x102a
+#define IEEE80211_WPS_ATTR_OOB_DEVICE_PASSWORD 0x102c
+#define IEEE80211_WPS_ATTR_OS_VERSION 0x102d
+#define IEEE80211_WPS_ATTR_POWER_LEVEL 0x102f
+#define IEEE80211_WPS_ATTR_PSK_CURRENT 0x1030
+#define IEEE80211_WPS_ATTR_PSK_MAX 0x1031
+#define IEEE80211_WPS_ATTR_PUBLIC_KEY 0x1032
+#define IEEE80211_WPS_ATTR_RADIO_ENABLE 0x1033
+#define IEEE80211_WPS_ATTR_REBOOT 0x1034
+#define IEEE80211_WPS_ATTR_REGISTRAR_CURRENT 0x1035
+#define IEEE80211_WPS_ATTR_REGISTRAR_ESTBLSHD 0x1036
+#define IEEE80211_WPS_ATTR_REGISTRAR_LIST 0x1037
+#define IEEE80211_WPS_ATTR_REGISTRAR_MAX 0x1038
+#define IEEE80211_WPS_ATTR_REGISTRAR_NONCE 0x1039
+#define IEEE80211_WPS_ATTR_REQUEST_TYPE 0x103a
+#define IEEE80211_WPS_ATTR_RESPONSE_TYPE 0x103b
+#define IEEE80211_WPS_ATTR_RF_BANDS 0x103c
+#define IEEE80211_WPS_ATTR_R_HASH1 0x103d
+#define IEEE80211_WPS_ATTR_R_HASH2 0x103e
+#define IEEE80211_WPS_ATTR_R_SNONCE1 0x103f
+#define IEEE80211_WPS_ATTR_R_SNONCE2 0x1040
+#define IEEE80211_WPS_ATTR_SELECTED_REGISTRAR 0x1041
+#define IEEE80211_WPS_ATTR_SERIAL_NUMBER 0x1042
+#define IEEE80211_WPS_ATTR_WPS_STATE 0x1044
+#define IEEE80211_WPS_ATTR_SSID 0x1045
+#define IEEE80211_WPS_ATTR_TOTAL_NETWORKS 0x1046
+#define IEEE80211_WPS_ATTR_UUID_E 0x1047
+#define IEEE80211_WPS_ATTR_UUID_R 0x1048
+#define IEEE80211_WPS_ATTR_VENDOR_EXT 0x1049
+#define IEEE80211_WPS_ATTR_VERSION 0x104a
+#define IEEE80211_WPS_ATTR_X509_CERT_REQ 0x104b
+#define IEEE80211_WPS_ATTR_X509_CERT 0x104c
+#define IEEE80211_WPS_ATTR_EAP_IDENTITY 0x104d
+#define IEEE80211_WPS_ATTR_MSG_COUNTER 0x104e
+#define IEEE80211_WPS_ATTR_PUBKEY_HASH 0x104f
+#define IEEE80211_WPS_ATTR_REKEY_KEY 0x1050
+#define IEEE80211_WPS_ATTR_KEY_LIFETIME 0x1051
+#define IEEE80211_WPS_ATTR_PERMITTED_CONFIG_METHODS 0x1052
+#define IEEE80211_WPS_ATTR_SELECTED_REGISTRAR_CONFIG_METHODS 0x1053
+#define IEEE80211_WPS_ATTR_PRIMARY_DEV_TYPE 0x1054
+#define IEEE80211_WPS_ATTR_SECONDARY_DEV_TYPE_LIST 0x1055
+#define IEEE80211_WPS_ATTR_PORTABLE_DEV 0x1056
+#define IEEE80211_WPS_ATTR_AP_SETUP_LOCKED 0x1057
+#define IEEE80211_WPS_ATTR_APPLICATION_EXT 0x1058
+#define IEEE80211_WPS_ATTR_EAP_TYPE 0x1059
+#define IEEE80211_WPS_ATTR_IV 0x1060
+#define IEEE80211_WPS_ATTR_KEY_PROVIDED_AUTO 0x1061
+#define IEEE80211_WPS_ATTR_802_1X_ENABLED 0x1062
+#define IEEE80211_WPS_ATTR_AP_SESSION_KEY 0x1063
+#define IEEE80211_WPS_ATTR_WEP_TRANSMIT_KEY 0x1064
+#define IEEE80211_WPS_ATTR_REQUESTED_DEV_TYPE 0x106a
+#define IEEE80211_WPS_ATTR_EXTENSIBILITY_TEST 0x10fa /* _NOT_ defined in the spec */
+
+/* RF bands bitmask */
+#define IEEE80211_WPS_RF_BAND_24GHZ 0x01
+#define IEEE80211_WPS_RF_BAND_50GHZ 0x02
+#define IEEE80211_WPS_RF_BAND_600GHZ 0x04
+
+/* Config methods bitmask */
+#define IEEE80211_WPS_CONFIG_USBA 0x0001
+#define IEEE80211_WPS_CONFIG_ETHERNET 0x0002
+#define IEEE80211_WPS_CONFIG_LABEL 0x0004
+#define IEEE80211_WPS_CONFIG_DISPLAY 0x0008
+#define IEEE80211_WPS_CONFIG_EXT_NFC_TOKEN 0x0010
+#define IEEE80211_WPS_CONFIG_INT_NFC_TOKEN 0x0020
+#define IEEE80211_WPS_CONFIG_NFC_INTERFACE 0x0040
+#define IEEE80211_WPS_CONFIG_PUSHBUTTON 0x0080
+#define IEEE80211_WPS_CONFIG_KEYPAD 0x0100
+#define IEEE80211_WPS_CONFIG_VIRT_PUSHBUTTON 0x0200
+#define IEEE80211_WPS_CONFIG_PHY_PUSHBUTTON 0x0400
+#define IEEE80211_WPS_CONFIG_P2PS 0x1000
+#define IEEE80211_WPS_CONFIG_VIRT_DISPLAY 0x2000
+#define IEEE80211_WPS_CONFIG_PHY_DISPLAY 0x4000
+
+/* Wi-Fi Protected Setup state */
+#define IEEE80211_WPS_STATE_NOT_CONFIGURED 0x01
+#define IEEE80211_WPS_STATE_CONFIGURED 0x02
+#endif /* _NET80211_IEEE80211_WPS_H_ */