diff --git a/monitor/nlmon.c b/monitor/nlmon.c index 191ebf02..8ce50e68 100644 --- a/monitor/nlmon.c +++ b/monitor/nlmon.c @@ -2177,6 +2177,67 @@ static void print_measurement_report(unsigned int level, const char *label, } } +static void print_fast_bss_transition(unsigned int level, const char *label, + const void *data, + uint16_t size) +{ + struct ie_ft_info ft_info; + uint32_t mic_len = 16; + + /* Most likely the MIC is 16 bytes */ + if (ie_parse_fast_bss_transition_from_data(data - 2, size + 2, + mic_len, &ft_info) < 0) { + mic_len = 24; + + /* Must be FILS, try 24 */ + if (ie_parse_fast_bss_transition_from_data(data - 2, size + 2, + mic_len, &ft_info) < 0) { + print_attr(level + 1, "error parsing"); + return; + } + } + + print_attr(level, "%s", label); + + if (ft_info.rsnxe_used) + print_attr(level + 1, "RSNXE Used set"); + + print_attr(level + 1, "MIC Element Count: %u", + ft_info.mic_element_count); + print_attr(level + 1, "MIC:"); + print_hexdump(level + 2, ft_info.mic, mic_len); + print_attr(level + 1, "ANONCE:"); + print_hexdump(level + 2, ft_info.anonce, sizeof(ft_info.anonce)); + print_attr(level + 1, "SNONCE:"); + print_hexdump(level + 2, ft_info.snonce, sizeof(ft_info.snonce)); + print_attr(level + 1, "R0KHID:"); + print_hexdump(level + 2, ft_info.r0khid, ft_info.r0khid_len); + + if (ft_info.r1khid_present) { + print_attr(level + 1, "R1KHID:"); + print_hexdump(level + 2, ft_info.r1khid, + sizeof(ft_info.r1khid)); + } + + if (ft_info.gtk_len) { + print_attr(level + 1, "GTK Key ID: %u", ft_info.gtk_key_id); + print_attr(level + 1, "GTK RSC:"); + print_hexdump(level + 2, ft_info.gtk_rsc, + sizeof(ft_info.gtk_rsc)); + print_attr(level + 1, "GTK:"); + print_hexdump(level + 2, ft_info.gtk, ft_info.gtk_len); + } + + if (ft_info.igtk_len) { + print_attr(level + 1, "IGTK Key ID: %u", ft_info.igtk_key_id); + print_attr(level + 1, "IGTK IPN:"); + print_hexdump(level + 2, ft_info.igtk_ipn, + sizeof(ft_info.igtk_ipn)); + print_attr(level + 1, "IGTK:"); + print_hexdump(level + 2, ft_info.igtk, ft_info.igtk_len); + } +} + static struct attr_entry ie_entry[] = { { IE_TYPE_SSID, "SSID", ATTR_CUSTOM, { .function = print_ie_ssid } }, @@ -2235,6 +2296,8 @@ static struct attr_entry ie_entry[] = { ATTR_CUSTOM, { .function = print_measurement_request } }, { IE_TYPE_MEASUREMENT_REPORT, "Measurement Report", ATTR_CUSTOM, { .function = print_measurement_report } }, + { IE_TYPE_FAST_BSS_TRANSITION, "Fast BSS Transition", + ATTR_CUSTOM, { .function = print_fast_bss_transition } }, { }, };