@@ -100,6 +100,7 @@ enum elem_id_ext {
EID_EXT_HE_CAPABILITY = 35,
EID_EXT_HE_OPERATION = 36,
EID_EXT_EHT_OPERATION = 106,
+ EID_EXT_MULTI_LINK = 107,
EID_EXT_EHT_CAPABILITY = 108,
};
@@ -247,6 +247,7 @@ void print_he_operation(const uint8_t *ie, int len);
void print_he_info(struct nlattr *nl_iftype);
void print_eht_capability(const uint8_t *ie, int len, const uint8_t *he_cap,
bool from_ap);
+void print_multi_link(const uint8_t *ie, int len);
void print_eht_operation(const uint8_t *ie, int len);
void print_eht_info(struct nlattr *nl_iftype, int band);
void print_s1g_capability(const uint8_t *caps);
@@ -2426,6 +2426,13 @@ static void print_eht_capa(const uint8_t type, uint8_t len,
print_eht_capability(data, len, ctx->he_cap, ctx->from_ap);
}
+static void _print_multi_link(const uint8_t type, uint8_t len, const uint8_t *data,
+ const struct ie_context *ctx)
+{
+ printf("\n");
+ print_multi_link(data, len);
+}
+
static void print_eht_oper(const uint8_t type, uint8_t len, const uint8_t *data,
const struct ie_context *ctx)
{
@@ -2437,6 +2444,7 @@ static const struct ie_print ext_printers[] = {
[EID_EXT_HE_CAPABILITY] = { "HE capabilities", print_he_capa, 21, 54, BIT(PRINT_SCAN), },
[EID_EXT_HE_OPERATION] = { "HE Operation", print_he_oper, 6, 15, BIT(PRINT_SCAN), },
[EID_EXT_EHT_CAPABILITY] = { "EHT capabilities", print_eht_capa, 13, 30, BIT(PRINT_SCAN), },
+ [EID_EXT_MULTI_LINK] = { "Multi-Link", _print_multi_link, 5, 23, BIT(PRINT_SCAN), },
[EID_EXT_EHT_OPERATION] = { "EHT Operation", print_eht_oper, 5, 10, BIT(PRINT_SCAN), },
};
@@ -1934,6 +1934,65 @@ void print_he_operation(const uint8_t *ie, int len)
}
}
+void print_multi_link(const uint8_t *ie, int len)
+{
+ uint16_t eml_capa = 0;
+ uint16_t mld_capa = 0;
+
+ uint16_t presence_bitmap = (ie[1] << 8) | ie[0];
+ bool link_id_info_present = presence_bitmap & 0x0010;
+ bool bss_param_change_present = presence_bitmap & 0x0020;
+ bool medium_sync_delay_present = presence_bitmap & 0x0040;
+ bool eml_capabilities_present = presence_bitmap & 0x0080;
+ bool mld_capabilities_present = presence_bitmap & 0x0100;
+
+ uint8_t common_info_len = ie[2] - 1; // Account for length value includes byte storing length
+ uint8_t offset = 3;
+
+ char mld_mac[20];
+ mac_addr_n2a(mld_mac, (void*)ie+offset);
+ printf("\t\tMLD MAC: %s\n", mld_mac);
+ offset += 6;
+
+ // Link ID Info
+ if (offset < common_info_len && link_id_info_present) {
+ printf("\t\tLink ID: %d\n", ie[offset] & 0xF);
+ offset += 1;
+ }
+
+ // BSS Parameters Change Count
+ if (offset < common_info_len && bss_param_change_present)
+ offset += 1;
+
+ // Medium Synchronization Delay Information
+ if (offset < common_info_len && medium_sync_delay_present)
+ offset += 2;
+
+ // EML Capabilities
+ if (offset < common_info_len && eml_capabilities_present) {
+ eml_capa = (ie[offset+1] << 8) | ie[offset];
+ printf("\t\t\tEML Capabilities: 0x%04x\n", eml_capa);
+
+ if (eml_capa & 0x0001)
+ printf("\t\t\t\tEMLSR Support\n");
+ if (eml_capa & 0x0080)
+ printf("\t\t\t\tEMLMR Support\n");
+
+ offset += 2;
+ }
+
+ // MLD Capabilities and Operations
+ if (offset < common_info_len && mld_capabilities_present) {
+ mld_capa = (ie[offset+1] << 8) | ie[offset];
+ printf("\t\t\tMLD Capabilities and Operations: 0x%04x\n", mld_capa);
+
+ // This is zero-indexed (i.e. 0 means 1 simulataneous link, 1 means 2, etc)
+ printf("\t\t\t\tMaximum Number of Simulatenous Links: %d\n", mld_capa & 0xF);
+
+ offset += 2;
+ }
+}
+
void print_eht_operation(const uint8_t *ie, int len)
{
uint8_t oper_parameters = ie[0];
Only print some basic items to start. Minimum and maximum length values are computed from the specification. Maximum only includes Common Info and does not consider Link Info. Signed-off-by: Alex Gavin <alex.gavin@candelatech.com> --- ieee80211.h | 1 + iw.h | 1 + scan.c | 8 ++++++++ util.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+)