From 7c2b373bf37186fd94fdc1d46393780e46f646a8 Mon Sep 17 00:00:00 2001 From: Marc Date: Sat, 10 Sep 2022 20:18:18 +0100 Subject: core/parse: Better handling of Radiotap information Radiotap information is now stored in the `libwifi_frame` struct, and will be kept automatically in `libwifi_frame.radiotap_info` for the lifecycle of said frame, if it is present. A new flag has been added for the frame for use with `libwifi_frame.flags` to detect if the radiotap info is present: `LIBWIFI_FLAGS_RADIOTAP_PRESENT`. The frame parser will now automatically calculate the band and center channel from radiotap data, and will store them in `libwifi_radiotap_info.channel.center` and `libwifi_radiotap_info.channel.band`. Four new flags have been added for use with the new radiotap band field: - `LIBWIFI_RADIOTAP_BAND_2GHZ` - `LIBWIFI_RADIOTAP_BAND_5GHZ` - `LIBWIFI_RADIOTAP_BAND_6GHZ` - `LIBWIFI_RADIOTAP_BAND_900MHZ` These can be used with a binary AND: `if (rtap.channel.band & LIBWIFI_RADIOTAP_BAND_6GHZ) { }` --- utils/src/test_parsing.c | 84 ++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 53 deletions(-) (limited to 'utils') diff --git a/utils/src/test_parsing.c b/utils/src/test_parsing.c index b9f9dbc..b5e2d53 100644 --- a/utils/src/test_parsing.c +++ b/utils/src/test_parsing.c @@ -132,26 +132,36 @@ void print_tag_info(unsigned char *data, size_t data_len) { } while (libwifi_tag_iterator_next(&it) != -1); } -void parse_radiotap(const unsigned char *packet, size_t packet_len) { - struct libwifi_radiotap_info rtap_info; - libwifi_parse_radiotap_info(&rtap_info, packet, packet_len); +void parse_radiotap(const struct libwifi_frame *frame) { + const struct libwifi_radiotap_info *rtap_info = frame->radiotap_info; printf("=== Radiotap Parsing ===\n"); - printf("Radiotap Channel: %d\n", rtap_info.channel.freq); - printf("Radiotap Channel Flags: 0x%04x\n", rtap_info.channel.flags); - printf("Radiotap Rate: %.2f Mb/s\n", rtap_info.rate); - printf("Radiotap Rate Raw: 0x%02x\n", rtap_info.rate_raw); - printf("Radiotap Signal: %d dBm\n", rtap_info.signal); - for (int i = 0; i < rtap_info.antenna_count; i++) { - printf("Radiotap Antenna %d: %d dBm\n", rtap_info.antennas[i].antenna_number, rtap_info.antennas[i].signal); + printf("Radiotap Channel Freq: %d MHz\n", rtap_info->channel.freq); + printf("Radiotap Freq Band: "); + if (rtap_info->channel.band & LIBWIFI_RADIOTAP_BAND_2GHZ) { + printf("2.4 GHz\n"); + } else if (rtap_info->channel.band & LIBWIFI_RADIOTAP_BAND_5GHZ) { + printf("5 GHz\n"); + } else if (rtap_info->channel.band & LIBWIFI_RADIOTAP_BAND_6GHZ) { + printf("6 GHz\n"); + } else { + printf("Unknown Band\n"); + } + printf("Radiotap Channel: %d\n", rtap_info->channel.center); + printf("Radiotap Channel Flags: 0x%04x\n", rtap_info->channel.flags); + printf("Radiotap Rate: %.2f Mb/s\n", rtap_info->rate); + printf("Radiotap Rate Raw: 0x%02x\n", rtap_info->rate_raw); + printf("Radiotap Signal: %d dBm\n", rtap_info->signal); + for (int i = 0; i < rtap_info->antenna_count; i++) { + printf("Radiotap Antenna %d: %d dBm\n", rtap_info->antennas[i].antenna_number, rtap_info->antennas[i].signal); } - printf("Radiotap Flags: 0x%04x\n", rtap_info.flags); - printf("Radiotap Extended Flags: 0x%08x\n", rtap_info.extended_flags); - printf("Radiotap RX Flags: 0x%04x\n", rtap_info.rx_flags); - printf("Radiotap TX Flags: 0x%04x\n", rtap_info.tx_flags); - printf("Radiotap TX Power: %d\n", rtap_info.tx_power); - printf("Radiotap RTS Retries: %d\n", rtap_info.rts_retries); - printf("Radiotap Data Retries: %d\n", rtap_info.data_retries); + printf("Radiotap Flags: 0x%04x\n", rtap_info->flags); + printf("Radiotap Extended Flags: 0x%08x\n", rtap_info->extended_flags); + printf("Radiotap RX Flags: 0x%04x\n", rtap_info->rx_flags); + printf("Radiotap TX Flags: 0x%04x\n", rtap_info->tx_flags); + printf("Radiotap TX Power: %d\n", rtap_info->tx_power); + printf("Radiotap RTS Retries: %d\n", rtap_info->rts_retries); + printf("Radiotap Data Retries: %d\n", rtap_info->data_retries); printf("=== Radiotap End ===\n"); } @@ -165,10 +175,6 @@ void parse_beacon(struct libwifi_frame frame, unsigned char *args, const struct return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_bss_info(&bss); } } @@ -183,10 +189,6 @@ void parse_probe_request(struct libwifi_frame frame, unsigned char *args, const return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_sta_info(&sta); } } @@ -200,10 +202,6 @@ void parse_probe_response(struct libwifi_frame frame, unsigned char *args, const return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_bss_info(&bss); } } @@ -218,10 +216,6 @@ void parse_deauth(struct libwifi_frame frame, unsigned char *args, const struct return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - printf("=== Deauthentication Frame ===\n"); if (deauth.ordered) { printf("Address 1: " MACSTR "\n", MAC2STR(deauth.frame_header.ordered.addr1)); @@ -257,10 +251,6 @@ void parse_disassoc(struct libwifi_frame frame, unsigned char *args, const struc return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - printf("=== Disassociation Frame ===\n"); if (disassoc.ordered) { printf("Address 1: " MACSTR "\n", MAC2STR(disassoc.frame_header.ordered.addr1)); @@ -295,10 +285,6 @@ void parse_assoc_request(struct libwifi_frame frame, unsigned char *args, const return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_sta_info(&sta); } } @@ -312,10 +298,6 @@ void parse_assoc_response(struct libwifi_frame frame, unsigned char *args, const return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_bss_info(&bss); } } @@ -329,10 +311,6 @@ void parse_reassoc_request(struct libwifi_frame frame, unsigned char *args, cons return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_sta_info(&sta); } } @@ -346,10 +324,6 @@ void parse_reassoc_response(struct libwifi_frame frame, unsigned char *args, con return; } - if (got_radiotap && parse_radiotap_header) { - parse_radiotap(packet, header->caplen); - } - print_bss_info(&bss); } } @@ -427,6 +401,10 @@ void parse_packet(unsigned char *args, const struct pcap_pkthdr *header, const u return; } + if (got_radiotap && parse_radiotap_header && frame.flags & LIBWIFI_FLAGS_RADIOTAP_PRESENT) { + parse_radiotap(&frame); + } + memset(&bss, 0, sizeof(struct libwifi_bss)); memset(&sta, 0, sizeof(struct libwifi_sta)); -- cgit 1.4.1