From d8911a911d493199e2caa66486b40ef7c5c9eef7 Mon Sep 17 00:00:00 2001 From: Marc Date: Sat, 15 Jan 2022 21:51:44 +0000 Subject: gen: Add ability to set different BSSID than Transmitter for Beacons --- src/libwifi/gen/management/beacon.c | 9 +++++++-- src/libwifi/gen/management/beacon.h | 9 +++++++-- utils/src/test_generation.c | 11 +++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/libwifi/gen/management/beacon.c b/src/libwifi/gen/management/beacon.c index 8703205..f884c6e 100644 --- a/src/libwifi/gen/management/beacon.c +++ b/src/libwifi/gen/management/beacon.c @@ -77,14 +77,19 @@ int libwifi_set_beacon_channel(struct libwifi_beacon *beacon, uint8_t channel) { * The generated beacon frame is made with sane defaults defined in common.h. * Three tagged parameters are also added to the beacon: SSID, Channel and Supported Rates. */ -int libwifi_create_beacon(struct libwifi_beacon *beacon, const unsigned char receiver[6], - const unsigned char transmitter[6], const char *ssid, uint8_t channel) { +int libwifi_create_beacon(struct libwifi_beacon *beacon, + const unsigned char receiver[6], + const unsigned char transmitter[6], + const unsigned char bssid[6], + const char *ssid, + uint8_t channel) { memset(beacon, 0, sizeof(struct libwifi_beacon)); beacon->frame_header.frame_control.type = TYPE_MANAGEMENT; beacon->frame_header.frame_control.subtype = SUBTYPE_BEACON; memcpy(&beacon->frame_header.addr1, receiver, 6); memcpy(&beacon->frame_header.addr2, transmitter, 6); + memcpy(&beacon->frame_header.addr3, bssid, 6); beacon->frame_header.seq_control.sequence_number = (rand() % 4096); beacon->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); diff --git a/src/libwifi/gen/management/beacon.h b/src/libwifi/gen/management/beacon.h index 971df88..943be55 100644 --- a/src/libwifi/gen/management/beacon.h +++ b/src/libwifi/gen/management/beacon.h @@ -51,12 +51,17 @@ size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon); * @param beacon A struct libwifi_beacon * @param receiver The receiver MAC address, aka address 1 * @param transmitter The source MAC address, aka address 2 + * @param bssid The BSSID MAC address, aka address 3 * @param ssid The SSID of the beacon. Maximum length is 32 characters * @param channel The desired channel of the beacon * */ -int libwifi_create_beacon(struct libwifi_beacon *beacon, const unsigned char receiver[6], - const unsigned char transmitter[6], const char *ssid, uint8_t channel); +int libwifi_create_beacon(struct libwifi_beacon *beacon, + const unsigned char receiver[6], + const unsigned char transmitter[6], + const unsigned char bssid[6], + const char *ssid, + uint8_t channel); /** * Dump a struct libwifi_beacon into a raw format for packet injection. diff --git a/utils/src/test_generation.c b/utils/src/test_generation.c index 314ce34..f269fe4 100644 --- a/utils/src/test_generation.c +++ b/utils/src/test_generation.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -55,7 +56,8 @@ static unsigned char to[] = TO_MAC; static unsigned char from[] = FROM_MAC; static unsigned char bcast[] = BCAST_MAC; static unsigned char reassoc_mac[] = REASSOC_MAC; -static unsigned char tag_data[] = "\x00\x00\00\x01This is a 221 tag from libwifi.\n"; +static unsigned char tag_data1[] = "\x00\x13\x37\x01Hello, World!\n"; +static unsigned char tag_data2[] = "\x00\x20\x91\x00Goodbye, World!\n"; static int mode = 0; static int inject_mode = 0; @@ -147,8 +149,9 @@ void inject_beacons(int random_mac) { } else { memcpy(txmac, FROM_MAC, 6); } - libwifi_create_beacon(&beacon, bcast, txmac, BEACON_SSID, CHANNEL); - libwifi_quick_add_tag(&beacon.tags, TAG_VENDOR_SPECIFIC, tag_data, sizeof(tag_data)); + libwifi_create_beacon(&beacon, bcast, txmac, txmac, "wifi-beacon", CHANNEL); + libwifi_quick_add_tag(&beacon.tags, TAG_VENDOR_SPECIFIC, tag_data1, sizeof(tag_data1)); + libwifi_quick_add_tag(&beacon.tags, TAG_VENDOR_SPECIFIC, tag_data2, sizeof(tag_data2)); unsigned char *buf = NULL; size_t buf_sz = libwifi_get_beacon_length(&beacon); @@ -184,7 +187,7 @@ void inject_probe_responses() { memset(&probe_resp, 0, sizeof(struct libwifi_probe_resp)); libwifi_create_probe_resp(&probe_resp, to, from, PROBE_RESP_SSID, CHANNEL); - libwifi_quick_add_tag(&probe_resp.tags, TAG_VENDOR_SPECIFIC, tag_data, sizeof(tag_data)); + libwifi_quick_add_tag(&probe_resp.tags, TAG_VENDOR_SPECIFIC, tag_data1, sizeof(tag_data1)); unsigned char *buf = NULL; size_t buf_sz = libwifi_get_probe_resp_length(&probe_resp); -- cgit 1.4.1