return -1;
}
- mlebuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlebuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
if (!mlebuf) {
wpa_printf(MSG_ERROR,
"MLO: Basic Multi-Link element not found in (Re)Association Response frame");
FILS_SESSION_LEN);
os_memcpy(fils->session, elems.fils_session, FILS_SESSION_LEN);
- fils_wd = ieee802_11_defrag(&elems, WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ fils_wd = ieee802_11_defrag(elems.wrapped_data, elems.wrapped_data_len,
+ true);
if (!fils_wd) {
wpa_printf(MSG_DEBUG, "PASN: FILS: Missing wrapped data");
return;
}
if (pasn_params.wrapped_data_format != WPA_PASN_WRAPPED_DATA_NO) {
- wrapped_data = ieee802_11_defrag(&elems, WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ wrapped_data = ieee802_11_defrag(elems.wrapped_data,
+ elems.wrapped_data_len, true);
if (!wrapped_data) {
wpa_printf(MSG_DEBUG, "PASN: Missing wrapped data");
return;
goto out;
}
- mlbuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlbuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
if (!mlbuf)
goto out;
int ret = -1;
u16 ml_control;
- mlbuf = ieee802_11_defrag_mle(elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlbuf = ieee802_11_defrag(elems->basic_mle, elems->basic_mle_len, true);
if (!mlbuf)
return WLAN_STATUS_SUCCESS;
}
-struct wpabuf * ieee802_11_defrag_data(const u8 *data, size_t len,
- bool ext_elem)
+struct wpabuf * ieee802_11_defrag(const u8 *data, size_t len, bool ext_elem)
{
struct wpabuf *buf;
const u8 *pos, *end = data + len;
}
-struct wpabuf * ieee802_11_defrag(struct ieee802_11_elems *elems,
- u8 eid, u8 eid_ext)
-{
- const u8 *data;
- size_t len;
-
- /*
- * TODO: Defragmentation mechanism can be supported for all IEs. For now
- * handle only those that are used (or use ieee802_11_defrag_data()).
- */
- switch (eid) {
- case WLAN_EID_EXTENSION:
- switch (eid_ext) {
- case WLAN_EID_EXT_FILS_HLP_CONTAINER:
- data = elems->fils_hlp;
- len = elems->fils_hlp_len;
- break;
- case WLAN_EID_EXT_WRAPPED_DATA:
- data = elems->wrapped_data;
- len = elems->wrapped_data_len;
- break;
- default:
- wpa_printf(MSG_DEBUG,
- "Defragmentation not supported. eid_ext=%u",
- eid_ext);
- return NULL;
- }
- break;
- default:
- wpa_printf(MSG_DEBUG,
- "Defragmentation not supported. eid=%u", eid);
- return NULL;
- }
-
- return ieee802_11_defrag_data(data, len, true);
-}
-
-
const u8 * get_ml_ie(const u8 *ies, size_t len, u8 type)
{
const struct element *elem;
return &buf[mld_addr_pos];
}
-
-
-struct wpabuf * ieee802_11_defrag_mle(struct ieee802_11_elems *elems, u8 type)
-{
- const u8 *data;
- size_t len;
-
- switch (type) {
- case MULTI_LINK_CONTROL_TYPE_BASIC:
- data = elems->basic_mle;
- len = elems->basic_mle_len;
- break;
- case MULTI_LINK_CONTROL_TYPE_PROBE_REQ:
- data = elems->probe_req_mle;
- len = elems->probe_req_mle_len;
- break;
- case MULTI_LINK_CONTROL_TYPE_RECONF:
- data = elems->reconf_mle;
- len = elems->reconf_mle_len;
- break;
- case MULTI_LINK_CONTROL_TYPE_TDLS:
- data = elems->tdls_mle;
- len = elems->tdls_mle_len;
- break;
- case MULTI_LINK_CONTROL_TYPE_PRIOR_ACCESS:
- data = elems->prior_access_mle;
- len = elems->prior_access_mle_len;
- break;
- default:
- wpa_printf(MSG_DEBUG,
- "Defragmentation not supported for Multi-Link element type=%u",
- type);
- return NULL;
- }
-
- return ieee802_11_defrag_data(data, len, true);
-}
int ieee802_edmg_is_allowed(struct ieee80211_edmg_config allowed,
struct ieee80211_edmg_config requested);
-struct wpabuf * ieee802_11_defrag_data(const u8 *data, size_t len,
- bool ext_elem);
-struct wpabuf * ieee802_11_defrag(struct ieee802_11_elems *elems,
- u8 eid, u8 eid_ext);
-struct wpabuf * ieee802_11_defrag_mle(struct ieee802_11_elems *elems, u8 type);
+struct wpabuf * ieee802_11_defrag(const u8 *data, size_t len, bool ext_elem);
const u8 * get_ml_ie(const u8 *ies, size_t len, u8 type);
const u8 * get_basic_mle_mld_addr(const u8 *buf, size_t len);
if (fte_len < 255) {
res = wpa_ft_parse_fte(key_mgmt, fte, fte_len, parse);
} else {
- parse->fte_buf = ieee802_11_defrag_data(fte, fte_len,
- false);
+ parse->fte_buf = ieee802_11_defrag(fte, fte_len, false);
if (!parse->fte_buf)
goto fail;
res = wpa_ft_parse_fte(key_mgmt,
return -1;
}
- mle = ieee802_11_defrag_mle(&req_elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mle = ieee802_11_defrag(req_elems.basic_mle, req_elems.basic_mle_len,
+ true);
if (!mle) {
wpa_printf(MSG_INFO,
"nl80211: MLO: Basic Multi-Link element not found in Association Request");
&req_info);
wpabuf_free(mle);
- mle = ieee802_11_defrag_mle(&resp_elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mle = ieee802_11_defrag(resp_elems.basic_mle, resp_elems.basic_mle_len,
+ true);
if (!mle) {
wpa_printf(MSG_ERROR,
"nl80211: MLO: Basic Multi-Link element not found in Association Response");
return -1;
}
- fils_wd = ieee802_11_defrag(&elems, WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ fils_wd = ieee802_11_defrag(elems.wrapped_data, elems.wrapped_data_len,
+ true);
if (!fils_wd) {
wpa_printf(MSG_DEBUG,
}
if (pasn_params->wrapped_data_format != WPA_PASN_WRAPPED_DATA_NO) {
- wrapped_data = ieee802_11_defrag(&elems,
- WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ wrapped_data = ieee802_11_defrag(elems.wrapped_data,
+ elems.wrapped_data_len,
+ true);
if (!wrapped_data) {
wpa_printf(MSG_DEBUG, "PASN: Missing wrapped data");
derive_keys = true;
if (pasn_params.wrapped_data_format != WPA_PASN_WRAPPED_DATA_NO) {
- wrapped_data = ieee802_11_defrag(&elems,
- WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ wrapped_data = ieee802_11_defrag(elems.wrapped_data,
+ elems.wrapped_data_len, true);
if (!wrapped_data) {
wpa_printf(MSG_DEBUG, "PASN: Missing wrapped data");
status = WLAN_STATUS_UNSPECIFIED_FAILURE;
}
if (pasn_params.wrapped_data_format != WPA_PASN_WRAPPED_DATA_NO) {
- wrapped_data = ieee802_11_defrag(&elems,
- WLAN_EID_EXTENSION,
- WLAN_EID_EXT_WRAPPED_DATA);
+ wrapped_data = ieee802_11_defrag(elems.wrapped_data,
+ elems.wrapped_data_len,
+ true);
if (!wrapped_data) {
wpa_printf(MSG_DEBUG, "PASN: Missing wrapped data");
{
struct wpabuf *mlbuf;
- mlbuf = ieee802_11_defrag_mle(elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlbuf = ieee802_11_defrag(elems->basic_mle, elems->basic_mle_len, true);
if (mlbuf) {
parse_basic_ml(wpabuf_head(mlbuf), wpabuf_len(mlbuf), ap, sta,
fields_len);
}
-/**
- * wpa_bss_defrag_mle - Get a buffer holding a de-fragmented ML element
- * @bss: BSS table entry
- * @type: ML control type
- */
-struct wpabuf * wpa_bss_defrag_mle(const struct wpa_bss *bss, u8 type)
-{
- struct ieee802_11_elems elems;
- const u8 *pos = wpa_bss_ie_ptr(bss);
- size_t len = bss->ie_len;
-
- if (ieee802_11_parse_elems(pos, len, &elems, 1) == ParseFailed)
- return NULL;
-
- return ieee802_11_defrag_mle(&elems, type);
-}
-
-
static void
wpa_bss_parse_ml_rnr_ap_info(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss, u8 mbssid_idx,
return ret;
}
- mlbuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_BASIC);
+ mlbuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
if (!mlbuf) {
wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No Multi-Link element");
return ret;
if (!elems.reconf_mle || !elems.reconf_mle_len)
return 0;
- mlbuf = ieee802_11_defrag_mle(&elems, MULTI_LINK_CONTROL_TYPE_RECONF);
+ mlbuf = ieee802_11_defrag(elems.reconf_mle, elems.reconf_mle_len, true);
if (!mlbuf)
return 0;
unsigned int age_ms,
struct os_reltime *update_time);
-struct wpabuf * wpa_bss_defrag_mle(const struct wpa_bss *bss, u8 type);
int wpa_bss_parse_basic_ml_element(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss,
u8 *ap_mld_addr,
u8 ml_ie_len;
const struct ieee80211_eht_ml *eht_ml;
const struct eht_ml_basic_common_info *ml_basic_common_info;
+ struct ieee802_11_elems elems;
u8 i;
const u16 control =
host_to_le16(MULTI_LINK_CONTROL_TYPE_BASIC |
if (!(wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_MLO))
return false;
- mlbuf = wpa_bss_defrag_mle(bss, MULTI_LINK_CONTROL_TYPE_BASIC);
+ if (ieee802_11_parse_elems(wpa_bss_ie_ptr(bss),
+ bss->ie_len, &elems, 1) == ParseFailed)
+ return false;
+
+ mlbuf = ieee802_11_defrag(elems.basic_mle, elems.basic_mle_len, true);
if (!mlbuf) {
wpa_dbg(wpa_s, MSG_DEBUG, "MLD: No ML element");
return false;