HE: Add MU EDCA Parameter Set element (AP)
Add support for configuring parameters for the MU EDCA Parameter Set element per IEEE P802.11ax/D3.0. Signed-off-by: Siva Mullati <siva.mullati@intel.com>
This commit is contained in:
parent
cfb01f58a6
commit
11ce7a1bc3
7 changed files with 189 additions and 2 deletions
|
@ -1379,6 +1379,14 @@ static int hostapd_config_vht_capab(struct hostapd_config *conf,
|
||||||
#endif /* CONFIG_IEEE80211AC */
|
#endif /* CONFIG_IEEE80211AC */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_IEEE80211AX
|
||||||
|
static u8 set_he_cap(int val, u8 mask)
|
||||||
|
{
|
||||||
|
return (u8) (mask & (val << ffs(mask)));
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_INTERWORKING
|
#ifdef CONFIG_INTERWORKING
|
||||||
static int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos,
|
static int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos,
|
||||||
int line)
|
int line)
|
||||||
|
@ -3397,6 +3405,90 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
conf->he_op.he_twt_required = atoi(pos);
|
conf->he_op.he_twt_required = atoi(pos);
|
||||||
} else if (os_strcmp(buf, "he_rts_threshold") == 0) {
|
} else if (os_strcmp(buf, "he_rts_threshold") == 0) {
|
||||||
conf->he_op.he_rts_threshold = atoi(pos);
|
conf->he_op.he_rts_threshold = atoi(pos);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_qos_info_param_count") == 0) {
|
||||||
|
conf->he_mu_edca.he_qos_info |=
|
||||||
|
set_he_cap(atoi(pos), HE_QOS_INFO_EDCA_PARAM_SET_COUNT);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_qos_info_q_ack") == 0) {
|
||||||
|
conf->he_mu_edca.he_qos_info |=
|
||||||
|
set_he_cap(atoi(pos), HE_QOS_INFO_Q_ACK);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_qos_info_queue_request") == 0) {
|
||||||
|
conf->he_mu_edca.he_qos_info |=
|
||||||
|
set_he_cap(atoi(pos), HE_QOS_INFO_QUEUE_REQUEST);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_qos_info_txop_request") == 0) {
|
||||||
|
conf->he_mu_edca.he_qos_info |=
|
||||||
|
set_he_cap(atoi(pos), HE_QOS_INFO_TXOP_REQUEST);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_aifsn") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_acm") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_aci") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmin") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_ecwmax") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_be_timer") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_be_param[HE_MU_AC_PARAM_TIMER_IDX] =
|
||||||
|
atoi(pos) & 0xff;
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_aifsn") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_acm") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_aci") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmin") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_ecwmax") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_bk_timer") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_bk_param[HE_MU_AC_PARAM_TIMER_IDX] =
|
||||||
|
atoi(pos) & 0xff;
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_aifsn") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_acm") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_aci") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmin") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_ecwmax") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vi_timer") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vi_param[HE_MU_AC_PARAM_TIMER_IDX] =
|
||||||
|
atoi(pos) & 0xff;
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_aifsn") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_AIFSN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_acm") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACM);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_aci") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ACI_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ACI);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmin") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMIN);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_ecwmax") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_ECW_IDX] |=
|
||||||
|
set_he_cap(atoi(pos), HE_MU_AC_PARAM_ECWMAX);
|
||||||
|
} else if (os_strcmp(buf, "he_mu_edca_ac_vo_timer") == 0) {
|
||||||
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_TIMER_IDX] =
|
||||||
|
atoi(pos) & 0xff;
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
} else if (os_strcmp(buf, "max_listen_interval") == 0) {
|
} else if (os_strcmp(buf, "max_listen_interval") == 0) {
|
||||||
bss->max_listen_interval = atoi(pos);
|
bss->max_listen_interval = atoi(pos);
|
||||||
|
|
|
@ -801,6 +801,30 @@ wmm_ac_vo_acm=0
|
||||||
# unsigned integer = duration in units of 16 us
|
# unsigned integer = duration in units of 16 us
|
||||||
#he_rts_threshold=0
|
#he_rts_threshold=0
|
||||||
|
|
||||||
|
#he_mu_edca_qos_info_param_count
|
||||||
|
#he_mu_edca_qos_info_q_ack
|
||||||
|
#he_mu_edca_qos_info_queue_request=1
|
||||||
|
#he_mu_edca_qos_info_txop_request
|
||||||
|
#he_mu_edca_ac_be_aifsn=0
|
||||||
|
#he_mu_edca_ac_be_ecwmin=15
|
||||||
|
#he_mu_edca_ac_be_ecwmax=15
|
||||||
|
#he_mu_edca_ac_be_timer=255
|
||||||
|
#he_mu_edca_ac_bk_aifsn=0
|
||||||
|
#he_mu_edca_ac_bk_aci=1
|
||||||
|
#he_mu_edca_ac_bk_ecwmin=15
|
||||||
|
#he_mu_edca_ac_bk_ecwmax=15
|
||||||
|
#he_mu_edca_ac_bk_timer=255
|
||||||
|
#he_mu_edca_ac_vi_ecwmin=15
|
||||||
|
#he_mu_edca_ac_vi_ecwmax=15
|
||||||
|
#he_mu_edca_ac_vi_aifsn=0
|
||||||
|
#he_mu_edca_ac_vi_aci=2
|
||||||
|
#he_mu_edca_ac_vi_timer=255
|
||||||
|
#he_mu_edca_ac_vo_aifsn=0
|
||||||
|
#he_mu_edca_ac_vo_aci=3
|
||||||
|
#he_mu_edca_ac_vo_ecwmin=15
|
||||||
|
#he_mu_edca_ac_vo_ecwmax=15
|
||||||
|
#he_mu_edca_ac_vo_timer=255
|
||||||
|
|
||||||
##### IEEE 802.1X-2004 related configuration ##################################
|
##### IEEE 802.1X-2004 related configuration ##################################
|
||||||
|
|
||||||
# Require IEEE 802.1X authorization
|
# Require IEEE 802.1X authorization
|
||||||
|
|
|
@ -843,6 +843,7 @@ struct hostapd_config {
|
||||||
#ifdef CONFIG_IEEE80211AX
|
#ifdef CONFIG_IEEE80211AX
|
||||||
struct he_phy_capabilities_info he_phy_capab;
|
struct he_phy_capabilities_info he_phy_capab;
|
||||||
struct he_operation he_op;
|
struct he_operation he_op;
|
||||||
|
struct ieee80211_he_mu_edca_parameter_set he_mu_edca;
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
/* VHT enable/disable config from CHAN_SWITCH */
|
/* VHT enable/disable config from CHAN_SWITCH */
|
||||||
|
|
|
@ -397,7 +397,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
||||||
#ifdef CONFIG_IEEE80211AX
|
#ifdef CONFIG_IEEE80211AX
|
||||||
if (hapd->iconf->ieee80211ax) {
|
if (hapd->iconf->ieee80211ax) {
|
||||||
buflen += 3 + sizeof(struct ieee80211_he_capabilities) +
|
buflen += 3 + sizeof(struct ieee80211_he_capabilities) +
|
||||||
3 + sizeof(struct ieee80211_he_operation);
|
3 + sizeof(struct ieee80211_he_operation) +
|
||||||
|
3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
|
@ -510,6 +511,7 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
||||||
if (hapd->iconf->ieee80211ax) {
|
if (hapd->iconf->ieee80211ax) {
|
||||||
pos = hostapd_eid_he_capab(hapd, pos);
|
pos = hostapd_eid_he_capab(hapd, pos);
|
||||||
pos = hostapd_eid_he_operation(hapd, pos);
|
pos = hostapd_eid_he_operation(hapd, pos);
|
||||||
|
pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
|
@ -1085,7 +1087,8 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
||||||
#ifdef CONFIG_IEEE80211AX
|
#ifdef CONFIG_IEEE80211AX
|
||||||
if (hapd->iconf->ieee80211ax) {
|
if (hapd->iconf->ieee80211ax) {
|
||||||
tail_len += 3 + sizeof(struct ieee80211_he_capabilities) +
|
tail_len += 3 + sizeof(struct ieee80211_he_capabilities) +
|
||||||
3 + sizeof(struct ieee80211_he_operation);
|
3 + sizeof(struct ieee80211_he_operation) +
|
||||||
|
3 + sizeof(struct ieee80211_he_mu_edca_parameter_set);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
|
@ -1222,6 +1225,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
||||||
if (hapd->iconf->ieee80211ax) {
|
if (hapd->iconf->ieee80211ax) {
|
||||||
tailpos = hostapd_eid_he_capab(hapd, tailpos);
|
tailpos = hostapd_eid_he_capab(hapd, tailpos);
|
||||||
tailpos = hostapd_eid_he_operation(hapd, tailpos);
|
tailpos = hostapd_eid_he_operation(hapd, tailpos);
|
||||||
|
tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid);
|
||||||
u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid);
|
u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid);
|
||||||
u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid);
|
u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid);
|
||||||
u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid);
|
u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid);
|
||||||
|
u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid);
|
||||||
|
|
||||||
int hostapd_ht_operation_update(struct hostapd_iface *iface);
|
int hostapd_ht_operation_update(struct hostapd_iface *iface);
|
||||||
void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
||||||
|
|
|
@ -86,3 +86,34 @@ u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid)
|
||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid)
|
||||||
|
{
|
||||||
|
struct ieee80211_he_mu_edca_parameter_set *edca;
|
||||||
|
u8 *pos;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
pos = (u8 *) &hapd->iface->conf->he_mu_edca;
|
||||||
|
for (i = 0; i < sizeof(*edca); i++) {
|
||||||
|
if (pos[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == sizeof(*edca))
|
||||||
|
return eid; /* no MU EDCA Parameters configured */
|
||||||
|
|
||||||
|
pos = eid;
|
||||||
|
*pos++ = WLAN_EID_EXTENSION;
|
||||||
|
*pos++ = 1 + sizeof(*edca);
|
||||||
|
*pos++ = WLAN_EID_EXT_HE_MU_EDCA_PARAMS;
|
||||||
|
|
||||||
|
edca = (struct ieee80211_he_mu_edca_parameter_set *) pos;
|
||||||
|
os_memcpy(edca, &hapd->iface->conf->he_mu_edca, sizeof(*edca));
|
||||||
|
|
||||||
|
wpa_hexdump(MSG_DEBUG, "HE: MU EDCA Parameter Set element",
|
||||||
|
pos, sizeof(*edca));
|
||||||
|
|
||||||
|
pos += sizeof(*edca);
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
|
@ -467,6 +467,7 @@
|
||||||
#define WLAN_EID_EXT_PASSWORD_IDENTIFIER 33
|
#define WLAN_EID_EXT_PASSWORD_IDENTIFIER 33
|
||||||
#define WLAN_EID_EXT_HE_CAPABILITIES 35
|
#define WLAN_EID_EXT_HE_CAPABILITIES 35
|
||||||
#define WLAN_EID_EXT_HE_OPERATION 36
|
#define WLAN_EID_EXT_HE_OPERATION 36
|
||||||
|
#define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38
|
||||||
#define WLAN_EID_EXT_OCV_OCI 54
|
#define WLAN_EID_EXT_OCV_OCI 54
|
||||||
|
|
||||||
/* Extended Capabilities field */
|
/* Extended Capabilities field */
|
||||||
|
@ -2147,6 +2148,39 @@ struct ieee80211_he_operation {
|
||||||
BIT(20) | BIT(21)))
|
BIT(20) | BIT(21)))
|
||||||
#define HE_OPERATION_RTS_THRESHOLD_OFFSET 12
|
#define HE_OPERATION_RTS_THRESHOLD_OFFSET 12
|
||||||
|
|
||||||
|
struct ieee80211_he_mu_edca_parameter_set {
|
||||||
|
u8 he_qos_info;
|
||||||
|
u8 he_mu_ac_be_param[3];
|
||||||
|
u8 he_mu_ac_bk_param[3];
|
||||||
|
u8 he_mu_ac_vi_param[3];
|
||||||
|
u8 he_mu_ac_vo_param[3];
|
||||||
|
} STRUCT_PACKED;
|
||||||
|
|
||||||
|
/* HE MU AC parameter record field format */
|
||||||
|
/* ACI/AIFSN */
|
||||||
|
#define HE_MU_AC_PARAM_ACI_IDX 0
|
||||||
|
#define HE_MU_AC_PARAM_AIFSN ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
|
||||||
|
#define HE_MU_AC_PARAM_ACM ((u8) BIT(4))
|
||||||
|
#define HE_MU_AC_PARAM_ACI ((u8) (BIT(5) | BIT(6)))
|
||||||
|
/* B7: Reserved */
|
||||||
|
|
||||||
|
/* ECWmin/ECWmax */
|
||||||
|
#define HE_MU_AC_PARAM_ECW_IDX 1
|
||||||
|
#define HE_MU_AC_PARAM_ECWMIN ((u8) (BIT(0) | BIT(1) | BIT(2) | BIT(3)))
|
||||||
|
#define HE_MU_AC_PARAM_ECWMAX ((u8) (BIT(4) | BIT(5) | BIT(6) | BIT(7)))
|
||||||
|
|
||||||
|
/* MU EDCA Timer */
|
||||||
|
#define HE_MU_AC_PARAM_TIMER_IDX 2
|
||||||
|
|
||||||
|
/* HE QoS Info field */
|
||||||
|
#define HE_QOS_INFO_EDCA_PARAM_SET_COUNT ((u8) (BIT(0) | BIT(1) | \
|
||||||
|
BIT(2) | BIT(3)))
|
||||||
|
#define HE_QOS_INFO_Q_ACK ((u8) (BIT(4)))
|
||||||
|
#define HE_QOS_INFO_QUEUE_REQUEST ((u8) (BIT(5)))
|
||||||
|
#define HE_QOS_INFO_TXOP_REQUEST ((u8) (BIT(6)))
|
||||||
|
/* B7: Reserved if sent by an AP; More Data Ack if sent by a non-AP STA */
|
||||||
|
#define HE_QOS_INFO_MORE_DATA_ACK ((u8) (BIT(7)))
|
||||||
|
|
||||||
/* DPP Public Action frame identifiers - OUI_WFA */
|
/* DPP Public Action frame identifiers - OUI_WFA */
|
||||||
#define DPP_OUI_TYPE 0x1A
|
#define DPP_OUI_TYPE 0x1A
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue