diff options
| author | Marc <foxtrot@malloc.me> | 2022-01-28 23:21:55 +0000 |
|---|---|---|
| committer | Marc <foxtrot@malloc.me> | 2022-01-28 23:21:55 +0000 |
| commit | 4c1232aaccdafcd213b615f7e8f36e5b5604fb59 (patch) | |
| tree | 95c819fb528ec6e5af3451283a47fef148e07a6d /src/libwifi | |
| parent | a9a46f40228429e128390d4d4979788e2778e8d0 (diff) | |
| download | libwifi-4c1232aaccdafcd213b615f7e8f36e5b5604fb59.tar.gz libwifi-4c1232aaccdafcd213b615f7e8f36e5b5604fb59.tar.bz2 libwifi-4c1232aaccdafcd213b615f7e8f36e5b5604fb59.zip | |
gen: Improve header comments, add ability to set Address 3 field for all management frames
Diffstat (limited to 'src/libwifi')
26 files changed, 388 insertions, 181 deletions
| diff --git a/src/libwifi/gen/management/action.c b/src/libwifi/gen/management/action.c index 04d7a5f..dc37987 100644 --- a/src/libwifi/gen/management/action.c +++ b/src/libwifi/gen/management/action.c | |||
| @@ -46,15 +46,18 @@ void libwifi_free_action_detail(struct libwifi_action_detail *detail) { | |||
| 46 | } | 46 | } |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | int libwifi_create_action(struct libwifi_action *action, const unsigned char receiver[6], | 49 | int libwifi_create_action(struct libwifi_action *action, |
| 50 | const unsigned char transmitter[6], uint8_t category) { | 50 | const unsigned char receiver[6], |
| 51 | const unsigned char transmitter[6], | ||
| 52 | const unsigned char address3[6], | ||
| 53 | uint8_t category) { | ||
| 51 | memset(action, 0, sizeof(struct libwifi_action)); | 54 | memset(action, 0, sizeof(struct libwifi_action)); |
| 52 | 55 | ||
| 53 | action->frame_header.frame_control.type = TYPE_MANAGEMENT; | 56 | action->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 54 | action->frame_header.frame_control.subtype = SUBTYPE_ACTION; | 57 | action->frame_header.frame_control.subtype = SUBTYPE_ACTION; |
| 55 | memcpy(&action->frame_header.addr1, receiver, 6); | 58 | memcpy(&action->frame_header.addr1, receiver, 6); |
| 56 | memcpy(&action->frame_header.addr2, transmitter, 6); | 59 | memcpy(&action->frame_header.addr2, transmitter, 6); |
| 57 | memcpy(&action->frame_header.addr3, transmitter, 6); | 60 | memcpy(&action->frame_header.addr3, address3, 6); |
| 58 | 61 | ||
| 59 | action->frame_header.seq_control.sequence_number = (rand() % 4096); | 62 | action->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 60 | 63 | ||
| @@ -63,15 +66,18 @@ int libwifi_create_action(struct libwifi_action *action, const unsigned char rec | |||
| 63 | return 0; | 66 | return 0; |
| 64 | } | 67 | } |
| 65 | 68 | ||
| 66 | int libwifi_create_action_no_ack(struct libwifi_action *action, const unsigned char receiver[6], | 69 | int libwifi_create_action_no_ack(struct libwifi_action *action, |
| 67 | const unsigned char transmitter[6], uint8_t category) { | 70 | const unsigned char receiver[6], |
| 71 | const unsigned char transmitter[6], | ||
| 72 | const unsigned char address3[6], | ||
| 73 | uint8_t category) { | ||
| 68 | memset(action, 0, sizeof(struct libwifi_action)); | 74 | memset(action, 0, sizeof(struct libwifi_action)); |
| 69 | 75 | ||
| 70 | action->frame_header.frame_control.type = TYPE_MANAGEMENT; | 76 | action->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 71 | action->frame_header.frame_control.subtype = SUBTYPE_ACTION_NOACK; | 77 | action->frame_header.frame_control.subtype = SUBTYPE_ACTION_NOACK; |
| 72 | memcpy(&action->frame_header.addr1, receiver, 6); | 78 | memcpy(&action->frame_header.addr1, receiver, 6); |
| 73 | memcpy(&action->frame_header.addr2, transmitter, 6); | 79 | memcpy(&action->frame_header.addr2, transmitter, 6); |
| 74 | memcpy(&action->frame_header.addr3, transmitter, 6); | 80 | memcpy(&action->frame_header.addr3, address3, 6); |
| 75 | 81 | ||
| 76 | action->frame_header.seq_control.sequence_number = (rand() % 4096); | 82 | action->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 77 | 83 | ||
| diff --git a/src/libwifi/gen/management/action.h b/src/libwifi/gen/management/action.h index ae1b5cc..2073f7d 100644 --- a/src/libwifi/gen/management/action.h +++ b/src/libwifi/gen/management/action.h | |||
| @@ -23,12 +23,13 @@ | |||
| 23 | * Create a detail for an action frame by supplying raw data and it's length. | 23 | * Create a detail for an action frame by supplying raw data and it's length. |
| 24 | * New data can be added to an existing libwifi_action_detail. | 24 | * New data can be added to an existing libwifi_action_detail. |
| 25 | * | 25 | * |
| 26 | * @param detail A libwifi_action_detail struct | 26 | * @param detail A libwifi_action_detail struct |
| 27 | * @param data Raw data to be added to the libwifi_action_detail | 27 | * @param data Raw data to be added to the libwifi_action_detail |
| 28 | * @param data_len Length of the raw data | 28 | * @param data_len Length of the raw data |
| 29 | * @return Length of the action | 29 | * @return Length of the action, or negative error |
| 30 | */ | 30 | */ |
| 31 | size_t libwifi_add_action_detail(struct libwifi_action_detail *detail, const unsigned char *data, | 31 | size_t libwifi_add_action_detail(struct libwifi_action_detail *detail, |
| 32 | const unsigned char *data, | ||
| 32 | size_t data_len); | 33 | size_t data_len); |
| 33 | 34 | ||
| 34 | /** | 35 | /** |
| @@ -44,13 +45,20 @@ void libwifi_free_action_detail(struct libwifi_action_detail *detail); | |||
| 44 | * @param action A new libwifi_action struct | 45 | * @param action A new libwifi_action struct |
| 45 | * @param receiver The receiver MAC address | 46 | * @param receiver The receiver MAC address |
| 46 | * @param transmitter The transmitter MAC address | 47 | * @param transmitter The transmitter MAC address |
| 48 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 47 | * @param category The action frame category | 49 | * @param category The action frame category |
| 48 | * @return zero on success | 50 | * @return Zero on success, or negative error |
| 49 | */ | 51 | */ |
| 50 | int libwifi_create_action(struct libwifi_action *action, const unsigned char receiver[6], | 52 | int libwifi_create_action(struct libwifi_action *action, |
| 51 | const unsigned char transmitter[6], uint8_t category); | 53 | const unsigned char receiver[6], |
| 52 | int libwifi_create_action_no_ack(struct libwifi_action *action, const unsigned char receiver[6], | 54 | const unsigned char transmitter[6], |
| 53 | const unsigned char transmitter[6], uint8_t category); | 55 | const unsigned char address3[6], |
| 56 | uint8_t category); | ||
| 57 | int libwifi_create_action_no_ack(struct libwifi_action *action, | ||
| 58 | const unsigned char receiver[6], | ||
| 59 | const unsigned char transmitter[6], | ||
| 60 | const unsigned char address3[6], | ||
| 61 | uint8_t category); | ||
| 54 | 62 | ||
| 55 | /** | 63 | /** |
| 56 | * Get the length of a given libwifi_action | 64 | * Get the length of a given libwifi_action |
| @@ -63,10 +71,10 @@ size_t libwifi_get_action_length(struct libwifi_action *action); | |||
| 63 | /** | 71 | /** |
| 64 | * Dump a given libwifi_action to a raw buffer | 72 | * Dump a given libwifi_action to a raw buffer |
| 65 | * | 73 | * |
| 66 | * @param action A used libwifi_action struct | 74 | * @param action A used libwifi_action struct |
| 67 | * @param buf A buffer receiver | 75 | * @param buf A buffer receiver |
| 68 | * @param buf_len The length of the given buf | 76 | * @param buf_len The length of the given buf |
| 69 | * @return Bytes written to the buf | 77 | * @return Bytes written to the buf, or negative error |
| 70 | */ | 78 | */ |
| 71 | size_t libwifi_dump_action(struct libwifi_action *action, unsigned char *buf, size_t buf_len); | 79 | size_t libwifi_dump_action(struct libwifi_action *action, unsigned char *buf, size_t buf_len); |
| 72 | 80 | ||
| diff --git a/src/libwifi/gen/management/assoc_request.c b/src/libwifi/gen/management/assoc_request.c index 268b167..a709dc3 100644 --- a/src/libwifi/gen/management/assoc_request.c +++ b/src/libwifi/gen/management/assoc_request.c | |||
| @@ -33,15 +33,18 @@ size_t libwifi_get_assoc_req_length(struct libwifi_assoc_req *assoc_req) { | |||
| 33 | * The generated association request frame is made with sane defaults defined in common.h. | 33 | * The generated association request frame is made with sane defaults defined in common.h. |
| 34 | * Two tagged parameters are also added to the association request: SSID and Channel. | 34 | * Two tagged parameters are also added to the association request: SSID and Channel. |
| 35 | */ | 35 | */ |
| 36 | int libwifi_create_assoc_req(struct libwifi_assoc_req *assoc_req, const unsigned char receiver[6], | 36 | int libwifi_create_assoc_req(struct libwifi_assoc_req *assoc_req, |
| 37 | const unsigned char transmitter[6], const char *ssid, uint8_t channel) { | 37 | const unsigned char receiver[6], |
| 38 | const unsigned char transmitter[6], | ||
| 39 | const unsigned char address3[6], | ||
| 40 | const char *ssid, uint8_t channel) { | ||
| 38 | memset(assoc_req, 0, sizeof(struct libwifi_assoc_req)); | 41 | memset(assoc_req, 0, sizeof(struct libwifi_assoc_req)); |
| 39 | 42 | ||
| 40 | assoc_req->frame_header.frame_control.type = TYPE_MANAGEMENT; | 43 | assoc_req->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 41 | assoc_req->frame_header.frame_control.subtype = SUBTYPE_ASSOC_REQ; | 44 | assoc_req->frame_header.frame_control.subtype = SUBTYPE_ASSOC_REQ; |
| 42 | memcpy(&assoc_req->frame_header.addr1, receiver, 6); | 45 | memcpy(&assoc_req->frame_header.addr1, receiver, 6); |
| 43 | memcpy(&assoc_req->frame_header.addr2, transmitter, 6); | 46 | memcpy(&assoc_req->frame_header.addr2, transmitter, 6); |
| 44 | memcpy(&assoc_req->frame_header.addr3, receiver, 6); | 47 | memcpy(&assoc_req->frame_header.addr3, address3, 6); |
| 45 | assoc_req->frame_header.seq_control.sequence_number = (rand() % 4096); | 48 | assoc_req->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 46 | 49 | ||
| 47 | assoc_req->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); | 50 | assoc_req->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); |
| diff --git a/src/libwifi/gen/management/assoc_request.h b/src/libwifi/gen/management/assoc_request.h index 85cbd3b..fc43d03 100644 --- a/src/libwifi/gen/management/assoc_request.h +++ b/src/libwifi/gen/management/assoc_request.h | |||
| @@ -24,16 +24,44 @@ | |||
| 24 | * Create a new association request | 24 | * Create a new association request |
| 25 | * | 25 | * |
| 26 | * @param assoc_req A new libwifi_assoc_req struct | 26 | * @param assoc_req A new libwifi_assoc_req struct |
| 27 | * @param receiver The receiver MAC address | 27 | * @param receiver The receiver MAC address |
| 28 | * @param transmitter The transmitter MAC address | 28 | * @param transmitter The transmitter MAC address |
| 29 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 29 | * @param ssid The desired BSS SSID | 30 | * @param ssid The desired BSS SSID |
| 30 | * @param channel The desired channel | 31 | * @param channel The desired channel |
| 31 | * @param zero on success | 32 | * @param Zero on success, or negative error |
| 33 | */ | ||
| 34 | int libwifi_create_assoc_req(struct libwifi_assoc_req *assoc_req, | ||
| 35 | const unsigned char receiver[6], | ||
| 36 | const unsigned char transmitter[6], | ||
| 37 | const unsigned char address3[6], | ||
| 38 | const char *ssid, | ||
| 39 | uint8_t channel); | ||
| 40 | |||
| 41 | /** | ||
| 42 | * Get the length of a given libwifi_assoc_req | ||
| 43 | * | ||
| 44 | * @param assoc_req A libwifi_assoc_req struct | ||
| 45 | * @return Length of the given libwifi_assoc_req | ||
| 32 | */ | 46 | */ |
| 33 | int libwifi_create_assoc_req(struct libwifi_assoc_req *assoc_req, const unsigned char receiver[6], | ||
| 34 | const unsigned char transmitter[6], const char *ssid, uint8_t channel); | ||
| 35 | size_t libwifi_get_assoc_req_length(struct libwifi_assoc_req *assoc_req); | 47 | size_t libwifi_get_assoc_req_length(struct libwifi_assoc_req *assoc_req); |
| 48 | |||
| 49 | /** | ||
| 50 | * Dump a libwifi_assoc_req into a raw format for packet injection. | ||
| 51 | * | ||
| 52 | * @param assoc_req A libwifi_assoc_req struct | ||
| 53 | * @param buf The buffer to dump into | ||
| 54 | * @param buf_len The length of the supplied buffer | ||
| 55 | * @param The amount of bytes dumped, or negative error | ||
| 56 | */ | ||
| 36 | size_t libwifi_dump_assoc_req(struct libwifi_assoc_req *assoc_req, unsigned char *buf, size_t buf_len); | 57 | size_t libwifi_dump_assoc_req(struct libwifi_assoc_req *assoc_req, unsigned char *buf, size_t buf_len); |
| 58 | |||
| 59 | |||
| 60 | /** | ||
| 61 | * Free any memory claimed by a libwifi_assoc_req back to the system. | ||
| 62 | * | ||
| 63 | * @param assoc_req A libwifi_assoc_req | ||
| 64 | */ | ||
| 37 | void libwifi_free_assoc_req(struct libwifi_assoc_req *assoc_req); | 65 | void libwifi_free_assoc_req(struct libwifi_assoc_req *assoc_req); |
| 38 | 66 | ||
| 39 | #endif /* LIBWIFI_GEN_ASSOCREQUEST_H */ | 67 | #endif /* LIBWIFI_GEN_ASSOCREQUEST_H */ |
| diff --git a/src/libwifi/gen/management/assoc_response.c b/src/libwifi/gen/management/assoc_response.c index 70f53d6..0fd145c 100644 --- a/src/libwifi/gen/management/assoc_response.c +++ b/src/libwifi/gen/management/assoc_response.c | |||
| @@ -33,7 +33,8 @@ | |||
| 33 | */ | 33 | */ |
| 34 | size_t libwifi_get_assoc_resp_length(struct libwifi_assoc_resp *assoc_resp) { | 34 | size_t libwifi_get_assoc_resp_length(struct libwifi_assoc_resp *assoc_resp) { |
| 35 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + | 35 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + |
| 36 | sizeof(struct libwifi_assoc_resp_fixed_parameters) + assoc_resp->tags.length; | 36 | sizeof(struct libwifi_assoc_resp_fixed_parameters) + |
| 37 | assoc_resp->tags.length; | ||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | /** | 40 | /** |
| @@ -61,14 +62,18 @@ int libwifi_set_assoc_resp_channel(struct libwifi_assoc_resp *assoc_resp, uint8_ | |||
| 61 | * The generated association response frame is made with sane defaults defined in common.h and core/types.h. | 62 | * The generated association response frame is made with sane defaults defined in common.h and core/types.h. |
| 62 | * Two tagged parameters are also added to the association response: Channel and Supported Rates. | 63 | * Two tagged parameters are also added to the association response: Channel and Supported Rates. |
| 63 | */ | 64 | */ |
| 64 | int libwifi_create_assoc_resp(struct libwifi_assoc_resp *assoc_resp, const unsigned char receiver[6], | 65 | int libwifi_create_assoc_resp(struct libwifi_assoc_resp *assoc_resp, |
| 65 | const unsigned char transmitter[6], uint8_t channel) { | 66 | const unsigned char receiver[6], |
| 67 | const unsigned char transmitter[6], | ||
| 68 | const unsigned char address3[6], | ||
| 69 | uint8_t channel) { | ||
| 66 | memset(assoc_resp, 0, sizeof(struct libwifi_assoc_resp)); | 70 | memset(assoc_resp, 0, sizeof(struct libwifi_assoc_resp)); |
| 67 | 71 | ||
| 68 | assoc_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; | 72 | assoc_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 69 | assoc_resp->frame_header.frame_control.subtype = SUBTYPE_ASSOC_RESP; | 73 | assoc_resp->frame_header.frame_control.subtype = SUBTYPE_ASSOC_RESP; |
| 70 | memcpy(&assoc_resp->frame_header.addr1, receiver, 6); | 74 | memcpy(&assoc_resp->frame_header.addr1, receiver, 6); |
| 71 | memcpy(&assoc_resp->frame_header.addr2, transmitter, 6); | 75 | memcpy(&assoc_resp->frame_header.addr2, transmitter, 6); |
| 76 | memcpy(&assoc_resp->frame_header.addr3, address3, 6); | ||
| 72 | 77 | ||
| 73 | assoc_resp->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); | 78 | assoc_resp->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); |
| 74 | assoc_resp->fixed_parameters.status_code = STATUS_SUCCESS; | 79 | assoc_resp->fixed_parameters.status_code = STATUS_SUCCESS; |
| diff --git a/src/libwifi/gen/management/assoc_response.h b/src/libwifi/gen/management/assoc_response.h index 07ad4b4..cac0171 100644 --- a/src/libwifi/gen/management/assoc_response.h +++ b/src/libwifi/gen/management/assoc_response.h | |||
| @@ -22,7 +22,8 @@ | |||
| 22 | * Set the channel of a libwifi_assoc_resp. | 22 | * Set the channel of a libwifi_assoc_resp. |
| 23 | * | 23 | * |
| 24 | * @param assoc_resp A libwifi_assoc_resp | 24 | * @param assoc_resp A libwifi_assoc_resp |
| 25 | * @param channel The new channel | 25 | * @param channel The new channel |
| 26 | * @return Zero on success, or negative error | ||
| 26 | */ | 27 | */ |
| 27 | int libwifi_set_assoc_resp_channel(struct libwifi_assoc_resp *assoc_resp, uint8_t channel); | 28 | int libwifi_set_assoc_resp_channel(struct libwifi_assoc_resp *assoc_resp, uint8_t channel); |
| 28 | 29 | ||
| @@ -30,7 +31,7 @@ int libwifi_set_assoc_resp_channel(struct libwifi_assoc_resp *assoc_resp, uint8_ | |||
| 30 | * Calculate the length of a given libwifi_assoc_resp | 31 | * Calculate the length of a given libwifi_assoc_resp |
| 31 | * | 32 | * |
| 32 | * @param assoc_resp A libwifi_assoc_resp | 33 | * @param assoc_resp A libwifi_assoc_resp |
| 33 | * @return The length of the given assoc_resp | 34 | * @return The length of the given assoc_resp, or negative error |
| 34 | */ | 35 | */ |
| 35 | size_t libwifi_get_assoc_resp_length(struct libwifi_assoc_resp *assoc_resp); | 36 | size_t libwifi_get_assoc_resp_length(struct libwifi_assoc_resp *assoc_resp); |
| 36 | 37 | ||
| @@ -40,22 +41,26 @@ size_t libwifi_get_assoc_resp_length(struct libwifi_assoc_resp *assoc_resp); | |||
| 40 | * A generated libwifi assoc_resp can be "dumped" into a buffer for packet injection | 41 | * A generated libwifi assoc_resp can be "dumped" into a buffer for packet injection |
| 41 | * via the libwifi_dump_assoc_resp. | 42 | * via the libwifi_dump_assoc_resp. |
| 42 | * | 43 | * |
| 43 | * @param assoc_resp A libwifi_assoc_resp | 44 | * @param assoc_resp A libwifi_assoc_resp |
| 44 | * @param receiver The receiver MAC address, aka address 1 | 45 | * @param receiver The receiver MAC address, aka address 1 |
| 45 | * @param transmitter The source MAC address, aka address 2 | 46 | * @param transmitter The source MAC address, aka address 2 |
| 46 | * @param channel The desired channel of the assoc_resp | 47 | * @param address3 The address 3 frame field value, typically the BSSID |
| 47 | * | 48 | * @param channel The desired channel of the assoc_resp |
| 49 | * @return Zero on success, or negative error | ||
| 48 | */ | 50 | */ |
| 49 | int libwifi_create_assoc_resp(struct libwifi_assoc_resp *assoc_resp, const unsigned char receiver[6], | 51 | int libwifi_create_assoc_resp(struct libwifi_assoc_resp *assoc_resp, |
| 50 | const unsigned char transmitter[6], uint8_t channel); | 52 | const unsigned char receiver[6], |
| 53 | const unsigned char transmitter[6], | ||
| 54 | const unsigned char address3[6], | ||
| 55 | uint8_t channel); | ||
| 51 | 56 | ||
| 52 | /** | 57 | /** |
| 53 | * Dump a libwifi_assoc_resp into a raw format for packet injection. | 58 | * Dump a libwifi_assoc_resp into a raw format for packet injection. |
| 54 | * | 59 | * |
| 55 | * @param assoc_resp A libwifi_assoc_resp | 60 | * @param assoc_resp A libwifi_assoc_resp |
| 56 | * @param buf The output buffer for the frame data | 61 | * @param buf The output buffer for the frame data |
| 57 | * @param buf_len The length of the output buffer | 62 | * @param buf_len The length of the output buffer |
| 58 | * @return The length of the dumped assoc_resp | 63 | * @return The length of the dumped assoc_resp, or negative error |
| 59 | */ | 64 | */ |
| 60 | size_t libwifi_dump_assoc_resp(struct libwifi_assoc_resp *assoc_resp, unsigned char *buf, size_t buf_len); | 65 | size_t libwifi_dump_assoc_resp(struct libwifi_assoc_resp *assoc_resp, unsigned char *buf, size_t buf_len); |
| 61 | 66 | ||
| diff --git a/src/libwifi/gen/management/atim.c b/src/libwifi/gen/management/atim.c index 960a2de..60b5203 100644 --- a/src/libwifi/gen/management/atim.c +++ b/src/libwifi/gen/management/atim.c | |||
| @@ -18,15 +18,17 @@ | |||
| 18 | #include <stdlib.h> | 18 | #include <stdlib.h> |
| 19 | #include <string.h> | 19 | #include <string.h> |
| 20 | 20 | ||
| 21 | int libwifi_create_atim(struct libwifi_atim *atim, const unsigned char transmitter[6], | 21 | int libwifi_create_atim(struct libwifi_atim *atim, |
| 22 | const unsigned char receiver[6], const unsigned char bssid[6]) { | 22 | const unsigned char transmitter[6], |
| 23 | const unsigned char receiver[6], | ||
| 24 | const unsigned char address3[6]) { | ||
| 23 | memset(atim, 0, sizeof(struct libwifi_atim)); | 25 | memset(atim, 0, sizeof(struct libwifi_atim)); |
| 24 | 26 | ||
| 25 | atim->frame_header.frame_control.type = TYPE_MANAGEMENT; | 27 | atim->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 26 | atim->frame_header.frame_control.subtype = SUBTYPE_ATIM; | 28 | atim->frame_header.frame_control.subtype = SUBTYPE_ATIM; |
| 27 | memcpy(&atim->frame_header.addr1, transmitter, 6); | 29 | memcpy(&atim->frame_header.addr1, transmitter, 6); |
| 28 | memcpy(&atim->frame_header.addr2, receiver, 6); | 30 | memcpy(&atim->frame_header.addr2, receiver, 6); |
| 29 | memcpy(&atim->frame_header.addr3, bssid, 6); | 31 | memcpy(&atim->frame_header.addr3, address3, 6); |
| 30 | atim->frame_header.frame_control.flags.power_mgmt = 1; | 32 | atim->frame_header.frame_control.flags.power_mgmt = 1; |
| 31 | atim->frame_header.duration = (rand() % 4096); | 33 | atim->frame_header.duration = (rand() % 4096); |
| 32 | atim->frame_header.seq_control.sequence_number = (rand() % 4096); | 34 | atim->frame_header.seq_control.sequence_number = (rand() % 4096); |
| diff --git a/src/libwifi/gen/management/atim.h b/src/libwifi/gen/management/atim.h index d9a306a..ca3b8a4 100644 --- a/src/libwifi/gen/management/atim.h +++ b/src/libwifi/gen/management/atim.h | |||
| @@ -18,7 +18,18 @@ | |||
| 18 | 18 | ||
| 19 | #include "../../core/frame/management/atim.h" | 19 | #include "../../core/frame/management/atim.h" |
| 20 | 20 | ||
| 21 | int libwifi_create_atim(struct libwifi_atim *atim, const unsigned char transmitter[6], | 21 | /** |
| 22 | const unsigned char receiver[6], const unsigned char bssid[6]); | 22 | * Generate a populated ATIM frame. |
| 23 | * | ||
| 24 | * @param atim A new libwifi_atim struct | ||
| 25 | * @param transmitter The transmitter address, aka address 1 | ||
| 26 | * @param receiver The receiver address, aka address 2 | ||
| 27 | * @param address3 The address 3 frame value, typically the BSSID | ||
| 28 | * @return Zero on success, or negative error | ||
| 29 | */ | ||
| 30 | int libwifi_create_atim(struct libwifi_atim *atim, | ||
| 31 | const unsigned char transmitter[6], | ||
| 32 | const unsigned char receiver[6], | ||
| 33 | const unsigned char address3[6]); | ||
| 23 | 34 | ||
| 24 | #endif /* LIBWIFI_GEN_ATIM_H */ | 35 | #endif /* LIBWIFI_GEN_ATIM_H */ |
| diff --git a/src/libwifi/gen/management/authentication.c b/src/libwifi/gen/management/authentication.c index e8ffea2..fa1d769 100644 --- a/src/libwifi/gen/management/authentication.c +++ b/src/libwifi/gen/management/authentication.c | |||
| @@ -32,16 +32,20 @@ size_t libwifi_get_auth_length(struct libwifi_auth *auth) { | |||
| 32 | /** | 32 | /** |
| 33 | * The generated authentication frame is made with sane defaults defined in common.h. | 33 | * The generated authentication frame is made with sane defaults defined in common.h. |
| 34 | */ | 34 | */ |
| 35 | int libwifi_create_auth(struct libwifi_auth *auth, const unsigned char receiver[6], | 35 | int libwifi_create_auth(struct libwifi_auth *auth, |
| 36 | const unsigned char transmitter[6], uint16_t algorithm_number, | 36 | const unsigned char receiver[6], |
| 37 | uint16_t transaction_sequence, uint16_t status_code) { | 37 | const unsigned char transmitter[6], |
| 38 | const unsigned char address3[6], | ||
| 39 | uint16_t algorithm_number, | ||
| 40 | uint16_t transaction_sequence, | ||
| 41 | uint16_t status_code) { | ||
| 38 | memset(auth, 0, sizeof(struct libwifi_auth)); | 42 | memset(auth, 0, sizeof(struct libwifi_auth)); |
| 39 | 43 | ||
| 40 | auth->frame_header.frame_control.type = TYPE_MANAGEMENT; | 44 | auth->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 41 | auth->frame_header.frame_control.subtype = SUBTYPE_AUTH; | 45 | auth->frame_header.frame_control.subtype = SUBTYPE_AUTH; |
| 42 | memcpy(&auth->frame_header.addr1, receiver, 6); | 46 | memcpy(&auth->frame_header.addr1, receiver, 6); |
| 43 | memcpy(&auth->frame_header.addr2, transmitter, 6); | 47 | memcpy(&auth->frame_header.addr2, transmitter, 6); |
| 44 | memcpy(&auth->frame_header.addr3, transmitter, 6); | 48 | memcpy(&auth->frame_header.addr3, address3, 6); |
| 45 | auth->frame_header.seq_control.sequence_number = (rand() % 4096); | 49 | auth->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 46 | 50 | ||
| 47 | auth->fixed_parameters.algorithm_number = algorithm_number; | 51 | auth->fixed_parameters.algorithm_number = algorithm_number; |
| diff --git a/src/libwifi/gen/management/authentication.h b/src/libwifi/gen/management/authentication.h index 75e8dcf..5468c5f 100644 --- a/src/libwifi/gen/management/authentication.h +++ b/src/libwifi/gen/management/authentication.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | * Calculate the length of a given libwifi_auth | 24 | * Calculate the length of a given libwifi_auth |
| 25 | * | 25 | * |
| 26 | * @param auth A libwifi_auth | 26 | * @param auth A libwifi_auth |
| 27 | * @return The length of the given auth | 27 | * @return The length of the given auth |
| 28 | */ | 28 | */ |
| 29 | size_t libwifi_get_auth_length(struct libwifi_auth *auth); | 29 | size_t libwifi_get_auth_length(struct libwifi_auth *auth); |
| 30 | 30 | ||
| @@ -34,23 +34,30 @@ size_t libwifi_get_auth_length(struct libwifi_auth *auth); | |||
| 34 | * A generated libwifi auth can be "dumped" into a buffer for packet injection | 34 | * A generated libwifi auth can be "dumped" into a buffer for packet injection |
| 35 | * via the libwifi_dump_auth. | 35 | * via the libwifi_dump_auth. |
| 36 | * | 36 | * |
| 37 | * @param auth A libwifi_auth | 37 | * @param auth A libwifi_auth |
| 38 | * @param receiver The receiver MAC address, aka address 1 | 38 | * @param receiver The receiver MAC address, aka address 1 |
| 39 | * @param transmitter The source MAC address, aka address 2 | 39 | * @param transmitter The source MAC address, aka address 2 |
| 40 | * @param algorithm_number Algorithm type to use | 40 | * @param address3 The address 3 frame field value, typically the BSSID |
| 41 | * | 41 | * @param algorithm_number Algorithm type to use, as defined in the IEEE802.11 spec |
| 42 | * @param transaction_sequence Transaction sequence value to use | ||
| 43 | * @param status_code Status code to use, as defined in the IEEE802.11 spec | ||
| 44 | * @return Zero on success, or negative error | ||
| 42 | */ | 45 | */ |
| 43 | int libwifi_create_auth(struct libwifi_auth *auth, const unsigned char receiver[6], | 46 | int libwifi_create_auth(struct libwifi_auth *auth, |
| 44 | const unsigned char transmitter[6], uint16_t algorithm_number, | 47 | const unsigned char receiver[6], |
| 45 | uint16_t transaction_sequence, uint16_t status_code); | 48 | const unsigned char transmitter[6], |
| 49 | const unsigned char address3[6], | ||
| 50 | uint16_t algorithm_number, | ||
| 51 | uint16_t transaction_sequence, | ||
| 52 | uint16_t status_code); | ||
| 46 | 53 | ||
| 47 | /** | 54 | /** |
| 48 | * Dump a libwifi_auth into a raw format for packet injection. | 55 | * Dump a libwifi_auth into a raw format for packet injection. |
| 49 | * | 56 | * |
| 50 | * @param auth A libwifi_auth | 57 | * @param auth A libwifi_auth |
| 51 | * @param buf The output buffer for the frame data | 58 | * @param buf The output buffer for the frame data |
| 52 | * @param buf_len The length of the output buffer | 59 | * @param buf_len The length of the output buffer |
| 53 | * @return The length of the dumped auth | 60 | * @return The length of the dumped auth, or negative error |
| 54 | */ | 61 | */ |
| 55 | size_t libwifi_dump_auth(struct libwifi_auth *auth, unsigned char *buf, size_t buf_len); | 62 | size_t libwifi_dump_auth(struct libwifi_auth *auth, unsigned char *buf, size_t buf_len); |
| 56 | 63 | ||
| diff --git a/src/libwifi/gen/management/beacon.c b/src/libwifi/gen/management/beacon.c index f884c6e..ab99254 100644 --- a/src/libwifi/gen/management/beacon.c +++ b/src/libwifi/gen/management/beacon.c | |||
| @@ -32,7 +32,8 @@ | |||
| 32 | */ | 32 | */ |
| 33 | size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon) { | 33 | size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon) { |
| 34 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + | 34 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + |
| 35 | sizeof(struct libwifi_beacon_fixed_parameters) + beacon->tags.length; | 35 | sizeof(struct libwifi_beacon_fixed_parameters) + |
| 36 | beacon->tags.length; | ||
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | /** | 39 | /** |
| @@ -75,12 +76,12 @@ int libwifi_set_beacon_channel(struct libwifi_beacon *beacon, uint8_t channel) { | |||
| 75 | 76 | ||
| 76 | /** | 77 | /** |
| 77 | * The generated beacon frame is made with sane defaults defined in common.h. | 78 | * The generated beacon frame is made with sane defaults defined in common.h. |
| 78 | * Three tagged parameters are also added to the beacon: SSID, Channel and Supported Rates. | 79 | * Two tagged parameters are also added to the beacon: SSID and Channel. |
| 79 | */ | 80 | */ |
| 80 | int libwifi_create_beacon(struct libwifi_beacon *beacon, | 81 | int libwifi_create_beacon(struct libwifi_beacon *beacon, |
| 81 | const unsigned char receiver[6], | 82 | const unsigned char receiver[6], |
| 82 | const unsigned char transmitter[6], | 83 | const unsigned char transmitter[6], |
| 83 | const unsigned char bssid[6], | 84 | const unsigned char address3[6], |
| 84 | const char *ssid, | 85 | const char *ssid, |
| 85 | uint8_t channel) { | 86 | uint8_t channel) { |
| 86 | memset(beacon, 0, sizeof(struct libwifi_beacon)); | 87 | memset(beacon, 0, sizeof(struct libwifi_beacon)); |
| @@ -89,18 +90,19 @@ int libwifi_create_beacon(struct libwifi_beacon *beacon, | |||
| 89 | beacon->frame_header.frame_control.subtype = SUBTYPE_BEACON; | 90 | beacon->frame_header.frame_control.subtype = SUBTYPE_BEACON; |
| 90 | memcpy(&beacon->frame_header.addr1, receiver, 6); | 91 | memcpy(&beacon->frame_header.addr1, receiver, 6); |
| 91 | memcpy(&beacon->frame_header.addr2, transmitter, 6); | 92 | memcpy(&beacon->frame_header.addr2, transmitter, 6); |
| 92 | memcpy(&beacon->frame_header.addr3, bssid, 6); | 93 | memcpy(&beacon->frame_header.addr3, address3, 6); |
| 93 | beacon->frame_header.seq_control.sequence_number = (rand() % 4096); | 94 | beacon->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 94 | 95 | ||
| 95 | beacon->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); | 96 | beacon->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); |
| 96 | beacon->fixed_parameters.beacon_interval = BYTESWAP16(LIBWIFI_DEFAULT_BEACON_INTERVAL); | 97 | beacon->fixed_parameters.beacon_interval = BYTESWAP16(LIBWIFI_DEFAULT_BEACON_INTERVAL); |
| 97 | beacon->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); | 98 | beacon->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); |
| 98 | 99 | ||
| 99 | libwifi_set_beacon_ssid(beacon, ssid); | 100 | int ret = libwifi_set_beacon_ssid(beacon, ssid); |
| 100 | libwifi_set_beacon_channel(beacon, channel); | 101 | if (ret != 0) { |
| 102 | return ret; | ||
| 103 | } | ||
| 101 | 104 | ||
| 102 | const unsigned char supported_rates[] = LIBWIFI_DEFAULT_SUPP_RATES; | 105 | ret = libwifi_set_beacon_channel(beacon, channel); |
| 103 | int ret = libwifi_quick_add_tag(&beacon->tags, TAG_SUPP_RATES, supported_rates, sizeof(supported_rates) - 1); | ||
| 104 | 106 | ||
| 105 | return ret; | 107 | return ret; |
| 106 | } | 108 | } |
| diff --git a/src/libwifi/gen/management/beacon.h b/src/libwifi/gen/management/beacon.h index 943be55..631a475 100644 --- a/src/libwifi/gen/management/beacon.h +++ b/src/libwifi/gen/management/beacon.h | |||
| @@ -22,23 +22,25 @@ | |||
| 22 | * Set the SSID of a struct libwifi_beacon. | 22 | * Set the SSID of a struct libwifi_beacon. |
| 23 | * | 23 | * |
| 24 | * @param beacon A struct libwifi_beacon | 24 | * @param beacon A struct libwifi_beacon |
| 25 | * @param ssid The new SSID | 25 | * @param ssid The new SSID |
| 26 | * @return Zero on success, or negative error | ||
| 26 | */ | 27 | */ |
| 27 | int libwifi_set_beacon_ssid(struct libwifi_beacon *beacon, const char *ssid); | 28 | int libwifi_set_beacon_ssid(struct libwifi_beacon *beacon, const char *ssid); |
| 28 | 29 | ||
| 29 | /** | 30 | /** |
| 30 | * Set the channel of a struct libwifi_beacon. | 31 | * Set the channel of a struct libwifi_beacon. |
| 31 | * | 32 | * |
| 32 | * @param beacon A struct libwifi_beacon | 33 | * @param beacon A struct libwifi_beacon |
| 33 | * @param channel The new channel | 34 | * @param channel The new channel |
| 35 | * @return Zero on success, or negative error | ||
| 34 | */ | 36 | */ |
| 35 | int libwifi_set_beacon_channel(struct libwifi_beacon *beacon, uint8_t channel); | 37 | int libwifi_set_beacon_channel(struct libwifi_beacon *beacon, uint8_t channel); |
| 36 | 38 | ||
| 37 | /** | 39 | /** |
| 38 | * Calculate the length of a given struct libwifi_beacon | 40 | * Calculate the length of a given struct libwifi_beacon |
| 39 | * | 41 | * |
| 40 | * @param beacon A struct libwifi_beacon | 42 | * @param beacon A libwifi_beacon struct |
| 41 | * @return The length of the given beacon | 43 | * @return The length of the given beacon, or negative error |
| 42 | */ | 44 | */ |
| 43 | size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon); | 45 | size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon); |
| 44 | 46 | ||
| @@ -48,28 +50,28 @@ size_t libwifi_get_beacon_length(struct libwifi_beacon *beacon); | |||
| 48 | * A generated libwifi beacon can be "dumped" into a buffer for packet injection | 50 | * A generated libwifi beacon can be "dumped" into a buffer for packet injection |
| 49 | * via the libwifi_dump_beacon. | 51 | * via the libwifi_dump_beacon. |
| 50 | * | 52 | * |
| 51 | * @param beacon A struct libwifi_beacon | 53 | * @param beacon A struct libwifi_beacon |
| 52 | * @param receiver The receiver MAC address, aka address 1 | 54 | * @param receiver The receiver MAC address, aka address 1 |
| 53 | * @param transmitter The source MAC address, aka address 2 | 55 | * @param transmitter The source MAC address, aka address 2 |
| 54 | * @param bssid The BSSID MAC address, aka address 3 | 56 | * @param address3 The address 3 frame field value, typically the BSSID |
| 55 | * @param ssid The SSID of the beacon. Maximum length is 32 characters | 57 | * @param ssid The SSID of the beacon. Maximum length is 32 characters |
| 56 | * @param channel The desired channel of the beacon | 58 | * @param channel The desired channel of the beacon |
| 57 | * | 59 | * @return Zero on success, or negative error |
| 58 | */ | 60 | */ |
| 59 | int libwifi_create_beacon(struct libwifi_beacon *beacon, | 61 | int libwifi_create_beacon(struct libwifi_beacon *beacon, |
| 60 | const unsigned char receiver[6], | 62 | const unsigned char receiver[6], |
| 61 | const unsigned char transmitter[6], | 63 | const unsigned char transmitter[6], |
| 62 | const unsigned char bssid[6], | 64 | const unsigned char address3[6], |
| 63 | const char *ssid, | 65 | const char *ssid, |
| 64 | uint8_t channel); | 66 | uint8_t channel); |
| 65 | 67 | ||
| 66 | /** | 68 | /** |
| 67 | * Dump a struct libwifi_beacon into a raw format for packet injection. | 69 | * Dump a struct libwifi_beacon into a raw format for packet injection. |
| 68 | * | 70 | * |
| 69 | * @param beacon A struct libwifi_beacon | 71 | * @param beacon A struct libwifi_beacon |
| 70 | * @param buf The output buffer for the frame data | 72 | * @param buf The output buffer for the frame data |
| 71 | * @param buf_len The length of the output buffer | 73 | * @param buf_len The length of the output buffer |
| 72 | * @return The length of the dumped beacon | 74 | * @return The length of the dumped beacon, or negative error |
| 73 | */ | 75 | */ |
| 74 | size_t libwifi_dump_beacon(struct libwifi_beacon *beacon, unsigned char *buf, size_t buf_len); | 76 | size_t libwifi_dump_beacon(struct libwifi_beacon *beacon, unsigned char *buf, size_t buf_len); |
| 75 | 77 | ||
| diff --git a/src/libwifi/gen/management/deauthentication.c b/src/libwifi/gen/management/deauthentication.c index 14f2c26..a388a6e 100644 --- a/src/libwifi/gen/management/deauthentication.c +++ b/src/libwifi/gen/management/deauthentication.c | |||
| @@ -33,15 +33,18 @@ size_t libwifi_get_deauth_length(struct libwifi_deauth *deauth) { | |||
| 33 | * The generated deauthentication frame contains only the supplied receiver, transmitter and reason_code by | 33 | * The generated deauthentication frame contains only the supplied receiver, transmitter and reason_code by |
| 34 | * default. | 34 | * default. |
| 35 | */ | 35 | */ |
| 36 | int libwifi_create_deauth(struct libwifi_deauth *deauth, const unsigned char receiver[6], | 36 | int libwifi_create_deauth(struct libwifi_deauth *deauth, |
| 37 | const unsigned char transmitter[6], uint16_t reason_code) { | 37 | const unsigned char receiver[6], |
| 38 | const unsigned char transmitter[6], | ||
| 39 | const unsigned char address3[6], | ||
| 40 | uint16_t reason_code) { | ||
| 38 | memset(deauth, 0, sizeof(struct libwifi_deauth)); | 41 | memset(deauth, 0, sizeof(struct libwifi_deauth)); |
| 39 | 42 | ||
| 40 | deauth->frame_header.frame_control.type = TYPE_MANAGEMENT; | 43 | deauth->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 41 | deauth->frame_header.frame_control.subtype = SUBTYPE_DEAUTH; | 44 | deauth->frame_header.frame_control.subtype = SUBTYPE_DEAUTH; |
| 42 | memcpy(&deauth->frame_header.addr1, receiver, 6); | 45 | memcpy(&deauth->frame_header.addr1, receiver, 6); |
| 43 | memcpy(&deauth->frame_header.addr2, transmitter, 6); | 46 | memcpy(&deauth->frame_header.addr2, transmitter, 6); |
| 44 | memcpy(&deauth->frame_header.addr3, transmitter, 6); | 47 | memcpy(&deauth->frame_header.addr3, address3, 6); |
| 45 | 48 | ||
| 46 | deauth->frame_header.seq_control.sequence_number = (rand() % 4096); | 49 | deauth->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 47 | 50 | ||
| diff --git a/src/libwifi/gen/management/deauthentication.h b/src/libwifi/gen/management/deauthentication.h index 902241d..f118ade 100644 --- a/src/libwifi/gen/management/deauthentication.h +++ b/src/libwifi/gen/management/deauthentication.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | * Calculate the length of a given libwifi_deauth | 24 | * Calculate the length of a given libwifi_deauth |
| 25 | * | 25 | * |
| 26 | * @param deauth A libwifi_deauth | 26 | * @param deauth A libwifi_deauth |
| 27 | * @return The length of the given deauth | 27 | * @return The length of the given deauth |
| 28 | */ | 28 | */ |
| 29 | size_t libwifi_get_deauth_length(struct libwifi_deauth *deauth); | 29 | size_t libwifi_get_deauth_length(struct libwifi_deauth *deauth); |
| 30 | 30 | ||
| @@ -34,22 +34,26 @@ size_t libwifi_get_deauth_length(struct libwifi_deauth *deauth); | |||
| 34 | * A generated libwifi deauth can be "dumped" into a buffer for packet injection | 34 | * A generated libwifi deauth can be "dumped" into a buffer for packet injection |
| 35 | * via the libwifi_dump_deauth. | 35 | * via the libwifi_dump_deauth. |
| 36 | * | 36 | * |
| 37 | * @param deauth A libwifi_deauth | 37 | * @param deauth A libwifi_deauth |
| 38 | * @param receiver The receiver MAC address, aka address 1 | 38 | * @param receiver The receiver MAC address, aka address 1 |
| 39 | * @param transmitter The source MAC address, aka address 2 | 39 | * @param transmitter The source MAC address, aka address 2 |
| 40 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 40 | * @param reason_code The deauth reason code | 41 | * @param reason_code The deauth reason code |
| 41 | * | 42 | * @return Zero on success, or negative error |
| 42 | */ | 43 | */ |
| 43 | int libwifi_create_deauth(struct libwifi_deauth *deauth, const unsigned char receiver[6], | 44 | int libwifi_create_deauth(struct libwifi_deauth *deauth, |
| 44 | const unsigned char transmitter[6], uint16_t reason_code); | 45 | const unsigned char receiver[6], |
| 46 | const unsigned char transmitter[6], | ||
| 47 | const unsigned char address3[6], | ||
| 48 | uint16_t reason_code); | ||
| 45 | 49 | ||
| 46 | /** | 50 | /** |
| 47 | * Dump a libwifi_deauth into a raw format for packet injection. | 51 | * Dump a libwifi_deauth into a raw format for packet injection. |
| 48 | * | 52 | * |
| 49 | * @param deauth A libwifi_deauth | 53 | * @param deauth A libwifi_deauth |
| 50 | * @param buf The output buffer for the frame data | 54 | * @param buf The output buffer for the frame data |
| 51 | * @param buf_len The length of the output buffer | 55 | * @param buf_len The length of the output buffer |
| 52 | * @return The length of the dumped deauth | 56 | * @return The length of the dumped deauth, or negative error |
| 53 | */ | 57 | */ |
| 54 | size_t libwifi_dump_deauth(struct libwifi_deauth *deauth, unsigned char *buf, size_t buf_len); | 58 | size_t libwifi_dump_deauth(struct libwifi_deauth *deauth, unsigned char *buf, size_t buf_len); |
| 55 | 59 | ||
| diff --git a/src/libwifi/gen/management/disassociation.c b/src/libwifi/gen/management/disassociation.c index d6cf237..dde1f1e 100644 --- a/src/libwifi/gen/management/disassociation.c +++ b/src/libwifi/gen/management/disassociation.c | |||
| @@ -33,15 +33,18 @@ size_t libwifi_get_disassoc_length(struct libwifi_disassoc *disassoc) { | |||
| 33 | * The generated disassociation frame contains only the supplied receiver, transmitter and reason_code by | 33 | * The generated disassociation frame contains only the supplied receiver, transmitter and reason_code by |
| 34 | * default. | 34 | * default. |
| 35 | */ | 35 | */ |
| 36 | int libwifi_create_disassoc(struct libwifi_disassoc *disassoc, const unsigned char receiver[6], | 36 | int libwifi_create_disassoc(struct libwifi_disassoc *disassoc, |
| 37 | const unsigned char transmitter[6], uint16_t reason_code) { | 37 | const unsigned char receiver[6], |
| 38 | const unsigned char transmitter[6], | ||
| 39 | const unsigned char address3[6], | ||
| 40 | uint16_t reason_code) { | ||
| 38 | memset(disassoc, 0, sizeof(struct libwifi_disassoc)); | 41 | memset(disassoc, 0, sizeof(struct libwifi_disassoc)); |
| 39 | 42 | ||
| 40 | disassoc->frame_header.frame_control.type = TYPE_MANAGEMENT; | 43 | disassoc->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 41 | disassoc->frame_header.frame_control.subtype = SUBTYPE_DISASSOC; | 44 | disassoc->frame_header.frame_control.subtype = SUBTYPE_DISASSOC; |
| 42 | memcpy(&disassoc->frame_header.addr1, receiver, 6); | 45 | memcpy(&disassoc->frame_header.addr1, receiver, 6); |
| 43 | memcpy(&disassoc->frame_header.addr2, transmitter, 6); | 46 | memcpy(&disassoc->frame_header.addr2, transmitter, 6); |
| 44 | memcpy(&disassoc->frame_header.addr3, transmitter, 6); | 47 | memcpy(&disassoc->frame_header.addr3, address3, 6); |
| 45 | 48 | ||
| 46 | disassoc->frame_header.seq_control.sequence_number = (rand() % 4096); | 49 | disassoc->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 47 | 50 | ||
| diff --git a/src/libwifi/gen/management/disassociation.h b/src/libwifi/gen/management/disassociation.h index 10f1db9..3d0dded 100644 --- a/src/libwifi/gen/management/disassociation.h +++ b/src/libwifi/gen/management/disassociation.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | * Calculate the length of a given libwifi_disassoc | 24 | * Calculate the length of a given libwifi_disassoc |
| 25 | * | 25 | * |
| 26 | * @param disassoc A libwifi_disassoc | 26 | * @param disassoc A libwifi_disassoc |
| 27 | * @return The length of the given disassoc | 27 | * @return The length of the given disassoc, or negative error |
| 28 | */ | 28 | */ |
| 29 | size_t libwifi_get_disassoc_length(struct libwifi_disassoc *disassoc); | 29 | size_t libwifi_get_disassoc_length(struct libwifi_disassoc *disassoc); |
| 30 | 30 | ||
| @@ -37,19 +37,23 @@ size_t libwifi_get_disassoc_length(struct libwifi_disassoc *disassoc); | |||
| 37 | * @param disassoc A libwifi_disassoc | 37 | * @param disassoc A libwifi_disassoc |
| 38 | * @param receiver The receiver MAC address, aka address 1 | 38 | * @param receiver The receiver MAC address, aka address 1 |
| 39 | * @param transmitter The source MAC address, aka address 2 | 39 | * @param transmitter The source MAC address, aka address 2 |
| 40 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 40 | * @param reason_code The disassoc reason code | 41 | * @param reason_code The disassoc reason code |
| 41 | * | 42 | * @return zero |
| 42 | */ | 43 | */ |
| 43 | int libwifi_create_disassoc(struct libwifi_disassoc *disassoc, const unsigned char receiver[6], | 44 | int libwifi_create_disassoc(struct libwifi_disassoc *disassoc, |
| 44 | const unsigned char transmitter[6], uint16_t reason_code); | 45 | const unsigned char receiver[6], |
| 46 | const unsigned char transmitter[6], | ||
| 47 | const unsigned char address3[6], | ||
| 48 | uint16_t reason_code); | ||
| 45 | 49 | ||
| 46 | /** | 50 | /** |
| 47 | * Dump a libwifi_disassoc into a raw format for packet injection. | 51 | * Dump a libwifi_disassoc into a raw format for packet injection. |
| 48 | * | 52 | * |
| 49 | * @param disassoc A libwifi_disassoc | 53 | * @param disassoc A libwifi_disassoc |
| 50 | * @param buf The output buffer for the frame data | 54 | * @param buf The output buffer for the frame data |
| 51 | * @param buf_len The length of the output buffer | 55 | * @param buf_len The length of the output buffer |
| 52 | * @return The length of the dumped disassoc | 56 | * @return The length of the dumped disassoc, or negative error |
| 53 | */ | 57 | */ |
| 54 | size_t libwifi_dump_disassoc(struct libwifi_disassoc *disassoc, unsigned char *buf, size_t buf_len); | 58 | size_t libwifi_dump_disassoc(struct libwifi_disassoc *disassoc, unsigned char *buf, size_t buf_len); |
| 55 | 59 | ||
| diff --git a/src/libwifi/gen/management/probe_request.c b/src/libwifi/gen/management/probe_request.c index 95cdcdb..8e4ce60 100644 --- a/src/libwifi/gen/management/probe_request.c +++ b/src/libwifi/gen/management/probe_request.c | |||
| @@ -31,16 +31,19 @@ size_t libwifi_get_probe_req_length(struct libwifi_probe_req *probe_req) { | |||
| 31 | * The generated probe request frame is made with sane defaults defined in common.h. | 31 | * The generated probe request frame is made with sane defaults defined in common.h. |
| 32 | * Two tagged parameters are also added to the beacon: SSID and Channel. | 32 | * Two tagged parameters are also added to the beacon: SSID and Channel. |
| 33 | */ | 33 | */ |
| 34 | int libwifi_create_probe_req(struct libwifi_probe_req *probe_req, const unsigned char receiver[6], | 34 | int libwifi_create_probe_req(struct libwifi_probe_req *probe_req, |
| 35 | const unsigned char transmitter[6], const unsigned char bssid[6], | 35 | const unsigned char receiver[6], |
| 36 | const char *ssid, uint8_t channel) { | 36 | const unsigned char transmitter[6], |
| 37 | const unsigned char address3[6], | ||
| 38 | const char *ssid, | ||
| 39 | uint8_t channel) { | ||
| 37 | memset(probe_req, 0, sizeof(struct libwifi_probe_req)); | 40 | memset(probe_req, 0, sizeof(struct libwifi_probe_req)); |
| 38 | 41 | ||
| 39 | probe_req->frame_header.frame_control.type = TYPE_MANAGEMENT; | 42 | probe_req->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 40 | probe_req->frame_header.frame_control.subtype = SUBTYPE_PROBE_REQ; | 43 | probe_req->frame_header.frame_control.subtype = SUBTYPE_PROBE_REQ; |
| 41 | memcpy(&probe_req->frame_header.addr1, receiver, 6); | 44 | memcpy(&probe_req->frame_header.addr1, receiver, 6); |
| 42 | memcpy(&probe_req->frame_header.addr2, transmitter, 6); | 45 | memcpy(&probe_req->frame_header.addr2, transmitter, 6); |
| 43 | memcpy(&probe_req->frame_header.addr3, bssid, 6); | 46 | memcpy(&probe_req->frame_header.addr3, address3, 6); |
| 44 | probe_req->frame_header.seq_control.sequence_number = (rand() % 4096); | 47 | probe_req->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 45 | 48 | ||
| 46 | int ret = libwifi_quick_add_tag(&probe_req->tags, TAG_SSID, (const unsigned char *) ssid, strlen(ssid)); | 49 | int ret = libwifi_quick_add_tag(&probe_req->tags, TAG_SSID, (const unsigned char *) ssid, strlen(ssid)); |
| diff --git a/src/libwifi/gen/management/probe_request.h b/src/libwifi/gen/management/probe_request.h index c71897b..47dc23a 100644 --- a/src/libwifi/gen/management/probe_request.h +++ b/src/libwifi/gen/management/probe_request.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | * Calculate the length of a given libwifi_probe_req | 24 | * Calculate the length of a given libwifi_probe_req |
| 25 | * | 25 | * |
| 26 | * @param probe_req A libwifi_probe_req | 26 | * @param probe_req A libwifi_probe_req |
| 27 | * @return The length of the given probe_req | 27 | * @return The length of the given probe_req, or negative error |
| 28 | */ | 28 | */ |
| 29 | size_t libwifi_get_probe_req_length(struct libwifi_probe_req *probe_req); | 29 | size_t libwifi_get_probe_req_length(struct libwifi_probe_req *probe_req); |
| 30 | 30 | ||
| @@ -34,23 +34,28 @@ size_t libwifi_get_probe_req_length(struct libwifi_probe_req *probe_req); | |||
| 34 | * A generated libwifi probe_req can be "dumped" into a buffer for packet injection | 34 | * A generated libwifi probe_req can be "dumped" into a buffer for packet injection |
| 35 | * via the libwifi_dump_probe_req. | 35 | * via the libwifi_dump_probe_req. |
| 36 | * | 36 | * |
| 37 | * @param probe_req A libwifi_probe_req | 37 | * @param probe_req A libwifi_probe_req |
| 38 | * @param receiver The receiver MAC address, aka address 1 | 38 | * @param receiver The receiver MAC address, aka address 1 |
| 39 | * @param transmitter The source MAC address, aka address 2 | 39 | * @param transmitter The source MAC address, aka address 2 |
| 40 | * @param reason_code The probe_req reason code | 40 | * @param address3 The address 3 frame field value, typically the BSSID |
| 41 | * | 41 | * @param ssid The probe request SSID |
| 42 | * @param channel The probe request channel | ||
| 43 | * @return Zero on success, or negative error | ||
| 42 | */ | 44 | */ |
| 43 | int libwifi_create_probe_req(struct libwifi_probe_req *probe_req, const unsigned char receiver[6], | 45 | int libwifi_create_probe_req(struct libwifi_probe_req *probe_req, |
| 44 | const unsigned char transmitter[6], const unsigned char bssid[6], | 46 | const unsigned char receiver[6], |
| 45 | const char *ssid, uint8_t channel); | 47 | const unsigned char transmitter[6], |
| 48 | const unsigned char address3[6], | ||
| 49 | const char *ssid, | ||
| 50 | uint8_t channel); | ||
| 46 | 51 | ||
| 47 | /** | 52 | /** |
| 48 | * Dump a libwifi_probe_req into a raw format for packet injection. | 53 | * Dump a libwifi_probe_req into a raw format for packet injection. |
| 49 | * | 54 | * |
| 50 | * @param probe_req A libwifi_probe_req | 55 | * @param probe_req A libwifi_probe_req |
| 51 | * @param buf The output buffer for the frame data | 56 | * @param buf The output buffer for the frame data |
| 52 | * @param buf_len The length of the output buffer | 57 | * @param buf_len The length of the output buffer |
| 53 | * @return The length of the dumped probe_req | 58 | * @return The length of the dumped probe_req, or negative error |
| 54 | */ | 59 | */ |
| 55 | size_t libwifi_dump_probe_req(struct libwifi_probe_req *probe_req, unsigned char *buf, size_t buf_len); | 60 | size_t libwifi_dump_probe_req(struct libwifi_probe_req *probe_req, unsigned char *buf, size_t buf_len); |
| 56 | 61 | ||
| diff --git a/src/libwifi/gen/management/probe_response.c b/src/libwifi/gen/management/probe_response.c index 6c1e990..603d0c4 100644 --- a/src/libwifi/gen/management/probe_response.c +++ b/src/libwifi/gen/management/probe_response.c | |||
| @@ -32,7 +32,8 @@ | |||
| 32 | */ | 32 | */ |
| 33 | size_t libwifi_get_probe_resp_length(struct libwifi_probe_resp *probe_resp) { | 33 | size_t libwifi_get_probe_resp_length(struct libwifi_probe_resp *probe_resp) { |
| 34 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + | 34 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + |
| 35 | sizeof(struct libwifi_probe_resp_fixed_parameters) + probe_resp->tags.length; | 35 | sizeof(struct libwifi_probe_resp_fixed_parameters) + |
| 36 | probe_resp->tags.length; | ||
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | /** | 39 | /** |
| @@ -48,7 +49,7 @@ int libwifi_set_probe_resp_ssid(struct libwifi_probe_resp *probe_resp, const cha | |||
| 48 | } | 49 | } |
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | ret = libwifi_quick_add_tag(&probe_resp->tags, TAG_SSID, (void *) ssid, strlen(ssid)); | 52 | ret = libwifi_quick_add_tag(&probe_resp->tags, TAG_SSID, (const unsigned char *) ssid, strlen(ssid)); |
| 52 | 53 | ||
| 53 | return ret; | 54 | return ret; |
| 54 | } | 55 | } |
| @@ -75,16 +76,21 @@ int libwifi_set_probe_resp_channel(struct libwifi_probe_resp *probe_resp, uint8_ | |||
| 75 | 76 | ||
| 76 | /** | 77 | /** |
| 77 | * The generated probe response frame is made with sane defaults defined in common.h. | 78 | * The generated probe response frame is made with sane defaults defined in common.h. |
| 78 | * Three tagged parameters are also added to the probe response: SSID, Channel and Supported Rates. | 79 | * Two tagged parameters are also added to the probe response: SSID and Channel. |
| 79 | */ | 80 | */ |
| 80 | int libwifi_create_probe_resp(struct libwifi_probe_resp *probe_resp, const unsigned char receiver[6], | 81 | int libwifi_create_probe_resp(struct libwifi_probe_resp *probe_resp, |
| 81 | const unsigned char transmitter[6], const char *ssid, uint8_t channel) { | 82 | const unsigned char receiver[6], |
| 83 | const unsigned char transmitter[6], | ||
| 84 | const unsigned char address3[6], | ||
| 85 | const char *ssid, | ||
| 86 | uint8_t channel) { | ||
| 82 | memset(probe_resp, 0, sizeof(struct libwifi_probe_resp)); | 87 | memset(probe_resp, 0, sizeof(struct libwifi_probe_resp)); |
| 83 | 88 | ||
| 84 | probe_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; | 89 | probe_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 85 | probe_resp->frame_header.frame_control.subtype = SUBTYPE_PROBE_RESP; | 90 | probe_resp->frame_header.frame_control.subtype = SUBTYPE_PROBE_RESP; |
| 86 | memcpy(&probe_resp->frame_header.addr1, receiver, 6); | 91 | memcpy(&probe_resp->frame_header.addr1, receiver, 6); |
| 87 | memcpy(&probe_resp->frame_header.addr2, transmitter, 6); | 92 | memcpy(&probe_resp->frame_header.addr2, transmitter, 6); |
| 93 | memcpy(&probe_resp->frame_header.addr3, address3, 6); | ||
| 88 | 94 | ||
| 89 | probe_resp->frame_header.seq_control.sequence_number = (rand() % 4096); | 95 | probe_resp->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 90 | probe_resp->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); | 96 | probe_resp->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); |
| @@ -98,12 +104,6 @@ int libwifi_create_probe_resp(struct libwifi_probe_resp *probe_resp, const unsig | |||
| 98 | } | 104 | } |
| 99 | 105 | ||
| 100 | ret = libwifi_set_probe_resp_channel(probe_resp, channel); | 106 | ret = libwifi_set_probe_resp_channel(probe_resp, channel); |
| 101 | if (ret != 0) { | ||
| 102 | return ret; | ||
| 103 | } | ||
| 104 | |||
| 105 | const unsigned char supported_rates[] = LIBWIFI_DEFAULT_SUPP_RATES; | ||
| 106 | ret = libwifi_quick_add_tag(&probe_resp->tags, TAG_SUPP_RATES, supported_rates, sizeof(supported_rates) - 1); | ||
| 107 | 107 | ||
| 108 | return ret; | 108 | return ret; |
| 109 | } | 109 | } |
| diff --git a/src/libwifi/gen/management/probe_response.h b/src/libwifi/gen/management/probe_response.h index 80f5451..4e49a6e 100644 --- a/src/libwifi/gen/management/probe_response.h +++ b/src/libwifi/gen/management/probe_response.h | |||
| @@ -21,24 +21,26 @@ | |||
| 21 | /** | 21 | /** |
| 22 | * Set the SSID of a libwifi_probe_resp. | 22 | * Set the SSID of a libwifi_probe_resp. |
| 23 | * | 23 | * |
| 24 | * @param probe_resp A libwifi_probe_resp | 24 | * @param probe_resp A libwifi_probe_resp struct |
| 25 | * @param ssid The new SSID | 25 | * @param ssid The new SSID |
| 26 | * @return Zero on success, or negative error | ||
| 26 | */ | 27 | */ |
| 27 | int libwifi_set_probe_resp_ssid(struct libwifi_probe_resp *probe_resp, const char *ssid); | 28 | int libwifi_set_probe_resp_ssid(struct libwifi_probe_resp *probe_resp, const char *ssid); |
| 28 | 29 | ||
| 29 | /** | 30 | /** |
| 30 | * Set the channel of a libwifi_probe_resp. | 31 | * Set the channel of a libwifi_probe_resp. |
| 31 | * | 32 | * |
| 32 | * @param probe_resp A libwifi_probe_resp | 33 | * @param probe_resp A libwifi_probe_resp struct |
| 33 | * @param channel The new channel | 34 | * @param channel The new channel |
| 35 | * @return Zero on success, or negative error | ||
| 34 | */ | 36 | */ |
| 35 | int libwifi_set_probe_resp_channel(struct libwifi_probe_resp *probe_resp, uint8_t channel); | 37 | int libwifi_set_probe_resp_channel(struct libwifi_probe_resp *probe_resp, uint8_t channel); |
| 36 | 38 | ||
| 37 | /** | 39 | /** |
| 38 | * Calculate the length of a given libwifi_probe_resp | 40 | * Calculate the length of a given libwifi_probe_resp |
| 39 | * | 41 | * |
| 40 | * @param probe_resp A libwifi_probe_resp | 42 | * @param probe_resp A libwifi_probe_resp struct |
| 41 | * @return The length of the given probe_resp | 43 | * @return The length of the given probe_resp, or negative error |
| 42 | */ | 44 | */ |
| 43 | size_t libwifi_get_probe_resp_length(struct libwifi_probe_resp *probe_resp); | 45 | size_t libwifi_get_probe_resp_length(struct libwifi_probe_resp *probe_resp); |
| 44 | 46 | ||
| @@ -48,23 +50,28 @@ size_t libwifi_get_probe_resp_length(struct libwifi_probe_resp *probe_resp); | |||
| 48 | * A generated libwifi probe_resp can be "dumped" into a buffer for packet injection | 50 | * A generated libwifi probe_resp can be "dumped" into a buffer for packet injection |
| 49 | * via the libwifi_dump_probe_resp. | 51 | * via the libwifi_dump_probe_resp. |
| 50 | * | 52 | * |
| 51 | * @param probe_resp A libwifi_probe_resp | 53 | * @param probe_resp A libwifi_probe_resp |
| 52 | * @param receiver The receiver MAC address, aka address 1 | 54 | * @param receiver The receiver MAC address, aka address 1 |
| 53 | * @param transmitter The source MAC address, aka address 2 | 55 | * @param transmitter The source MAC address, aka address 2 |
| 54 | * @param ssid The SSID of the probe_resp. Maximum length is 32 characters | 56 | * @param address3 The address 3 frame field value, typically the BSSID |
| 55 | * @param channel The desired channel of the probe_resp | 57 | * @param ssid The SSID of the probe_resp. Maximum length is 32 characters |
| 56 | * | 58 | * @param channel The desired channel of the probe_resp |
| 59 | * @return Zero on success, or negative error | ||
| 57 | */ | 60 | */ |
| 58 | int libwifi_create_probe_resp(struct libwifi_probe_resp *probe_resp, const unsigned char receiver[6], | 61 | int libwifi_create_probe_resp(struct libwifi_probe_resp *probe_resp, |
| 59 | const unsigned char transmitter[6], const char *ssid, uint8_t channel); | 62 | const unsigned char receiver[6], |
| 63 | const unsigned char transmitter[6], | ||
| 64 | const unsigned char address3[6], | ||
| 65 | const char *ssid, | ||
| 66 | uint8_t channel); | ||
| 60 | 67 | ||
| 61 | /** | 68 | /** |
| 62 | * Dump a libwifi_probe_resp into a raw format for packet injection. | 69 | * Dump a libwifi_probe_resp into a raw format for packet injection. |
| 63 | * | 70 | * |
| 64 | * @param probe_resp A libwifi_probe_resp | 71 | * @param probe_resp A libwifi_probe_resp |
| 65 | * @param buf The output buffer for the frame data | 72 | * @param buf The output buffer for the frame data |
| 66 | * @param buf_len The length of the output buffer | 73 | * @param buf_len The length of the output buffer |
| 67 | * @return The length of the dumped probe_resp | 74 | * @return The length of the dumped probe_resp, or negative error |
| 68 | */ | 75 | */ |
| 69 | size_t libwifi_dump_probe_resp(struct libwifi_probe_resp *probe_resp, unsigned char *buf, size_t buf_len); | 76 | size_t libwifi_dump_probe_resp(struct libwifi_probe_resp *probe_resp, unsigned char *buf, size_t buf_len); |
| 70 | 77 | ||
| diff --git a/src/libwifi/gen/management/reassoc_request.c b/src/libwifi/gen/management/reassoc_request.c index 9e9bcd8..ed61a50 100644 --- a/src/libwifi/gen/management/reassoc_request.c +++ b/src/libwifi/gen/management/reassoc_request.c | |||
| @@ -26,23 +26,28 @@ | |||
| 26 | */ | 26 | */ |
| 27 | size_t libwifi_get_reassoc_req_length(struct libwifi_reassoc_req *reassoc_req) { | 27 | size_t libwifi_get_reassoc_req_length(struct libwifi_reassoc_req *reassoc_req) { |
| 28 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + | 28 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + |
| 29 | sizeof(struct libwifi_reassoc_req_fixed_parameters) + reassoc_req->tags.length; | 29 | sizeof(struct libwifi_reassoc_req_fixed_parameters) + |
| 30 | reassoc_req->tags.length; | ||
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | /** | 33 | /** |
| 33 | * The generated reassociation request frame is made with sane defaults defined in common.h. | 34 | * The generated reassociation request frame is made with sane defaults defined in common.h. |
| 34 | * Two tagged parameters are also added to the reassociation frame: SSID and Channel | 35 | * Two tagged parameters are also added to the reassociation frame: SSID and Channel |
| 35 | */ | 36 | */ |
| 36 | int libwifi_create_reassoc_req(struct libwifi_reassoc_req *reassoc_req, const unsigned char receiver[6], | 37 | int libwifi_create_reassoc_req(struct libwifi_reassoc_req *reassoc_req, |
| 37 | const unsigned char transmitter[6], const unsigned char current_ap[6], | 38 | const unsigned char receiver[6], |
| 38 | const char *ssid, uint8_t channel) { | 39 | const unsigned char transmitter[6], |
| 40 | const unsigned char address3[6], | ||
| 41 | const unsigned char current_ap[6], | ||
| 42 | const char *ssid, | ||
| 43 | uint8_t channel) { | ||
| 39 | memset(reassoc_req, 0, sizeof(struct libwifi_reassoc_req)); | 44 | memset(reassoc_req, 0, sizeof(struct libwifi_reassoc_req)); |
| 40 | 45 | ||
| 41 | reassoc_req->frame_header.frame_control.type = TYPE_MANAGEMENT; | 46 | reassoc_req->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 42 | reassoc_req->frame_header.frame_control.subtype = SUBTYPE_REASSOC_REQ; | 47 | reassoc_req->frame_header.frame_control.subtype = SUBTYPE_REASSOC_REQ; |
| 43 | memcpy(&reassoc_req->frame_header.addr1, receiver, 6); | 48 | memcpy(&reassoc_req->frame_header.addr1, receiver, 6); |
| 44 | memcpy(&reassoc_req->frame_header.addr2, transmitter, 6); | 49 | memcpy(&reassoc_req->frame_header.addr2, transmitter, 6); |
| 45 | memcpy(&reassoc_req->frame_header.addr3, receiver, 6); | 50 | memcpy(&reassoc_req->frame_header.addr3, address3, 6); |
| 46 | reassoc_req->frame_header.seq_control.sequence_number = (rand() % 4096); | 51 | reassoc_req->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 47 | 52 | ||
| 48 | reassoc_req->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); | 53 | reassoc_req->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); |
| diff --git a/src/libwifi/gen/management/reassoc_request.h b/src/libwifi/gen/management/reassoc_request.h index 3db971f..04dbb14 100644 --- a/src/libwifi/gen/management/reassoc_request.h +++ b/src/libwifi/gen/management/reassoc_request.h | |||
| @@ -20,11 +20,48 @@ | |||
| 20 | #include "../../core/frame/management/common.h" | 20 | #include "../../core/frame/management/common.h" |
| 21 | #include "../../core/frame/management/reassoc_request.h" | 21 | #include "../../core/frame/management/reassoc_request.h" |
| 22 | 22 | ||
| 23 | int libwifi_create_reassoc_req(struct libwifi_reassoc_req *reassoc_req, const unsigned char receiver[6], | 23 | /** |
| 24 | const unsigned char transmitter[6], const unsigned char current_ap[6], | 24 | * Create a new libwifi reassociation request |
| 25 | * | ||
| 26 | * @param reassoc_req A new libwifi_reassoc_req struct | ||
| 27 | * @param receiver The receiver MAC address | ||
| 28 | * @param transmitter The transmitter MAC address | ||
| 29 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 30 | * @param current_ap The current AP BSSID | ||
| 31 | * @param ssid The desired BSS SSID | ||
| 32 | * @param channel The desired channel | ||
| 33 | * @return Zero on success, or negative error | ||
| 34 | */ | ||
| 35 | int libwifi_create_reassoc_req(struct libwifi_reassoc_req *reassoc_req, | ||
| 36 | const unsigned char receiver[6], | ||
| 37 | const unsigned char transmitter[6], | ||
| 38 | const unsigned char address3[6], | ||
| 39 | const unsigned char current_ap[6], | ||
| 25 | const char *ssid, uint8_t channel); | 40 | const char *ssid, uint8_t channel); |
| 41 | |||
| 42 | /** | ||
| 43 | * Get the length of a given libwifi_reassoc_req | ||
| 44 | * | ||
| 45 | * @param reassoc_req A libwifi_reassoc_req struct | ||
| 46 | * @return The length of the given libwifi_reassoc_req, or negative error | ||
| 47 | */ | ||
| 26 | size_t libwifi_get_reassoc_req_length(struct libwifi_reassoc_req *reassoc_req); | 48 | size_t libwifi_get_reassoc_req_length(struct libwifi_reassoc_req *reassoc_req); |
| 49 | |||
| 50 | /** | ||
| 51 | * Dump a libwifi_reassoc_req into a raw format for packet injection. | ||
| 52 | * | ||
| 53 | * @param reassoc_req A libwifi_reassoc_req struct | ||
| 54 | * @param buf The buffer to dump into | ||
| 55 | * @param buf_len The length of the supplied buffer | ||
| 56 | * @return The amount of bytes dumped, or negative error | ||
| 57 | */ | ||
| 27 | size_t libwifi_dump_reassoc_req(struct libwifi_reassoc_req *reassoc_req, unsigned char *buf, size_t buf_len); | 58 | size_t libwifi_dump_reassoc_req(struct libwifi_reassoc_req *reassoc_req, unsigned char *buf, size_t buf_len); |
| 59 | |||
| 60 | /** | ||
| 61 | * Free any memory claimed by a libwifi_reassoc_req back to the system. | ||
| 62 | * | ||
| 63 | * @param reassoc_req A libwifi_reassoc_req | ||
| 64 | */ | ||
| 28 | void libwifi_free_reassoc_req(struct libwifi_reassoc_req *reassoc_req); | 65 | void libwifi_free_reassoc_req(struct libwifi_reassoc_req *reassoc_req); |
| 29 | 66 | ||
| 30 | #endif /* LIBWIFI_GEN_REASSOCREQUEST_H */ | 67 | #endif /* LIBWIFI_GEN_REASSOCREQUEST_H */ |
| diff --git a/src/libwifi/gen/management/reassoc_response.c b/src/libwifi/gen/management/reassoc_response.c index 30a2389..5d85a86 100644 --- a/src/libwifi/gen/management/reassoc_response.c +++ b/src/libwifi/gen/management/reassoc_response.c | |||
| @@ -33,7 +33,8 @@ | |||
| 33 | */ | 33 | */ |
| 34 | size_t libwifi_get_reassoc_resp_length(struct libwifi_reassoc_resp *reassoc_resp) { | 34 | size_t libwifi_get_reassoc_resp_length(struct libwifi_reassoc_resp *reassoc_resp) { |
| 35 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + | 35 | return sizeof(struct libwifi_mgmt_unordered_frame_header) + |
| 36 | sizeof(struct libwifi_reassoc_resp_fixed_parameters) + reassoc_resp->tags.length; | 36 | sizeof(struct libwifi_reassoc_resp_fixed_parameters) + |
| 37 | reassoc_resp->tags.length; | ||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | /** | 40 | /** |
| @@ -58,28 +59,26 @@ int libwifi_set_reassoc_resp_channel(struct libwifi_reassoc_resp *reassoc_resp, | |||
| 58 | 59 | ||
| 59 | /** | 60 | /** |
| 60 | * The generated reassoc_resp frame is made with sane defaults defined in common.h. | 61 | * The generated reassoc_resp frame is made with sane defaults defined in common.h. |
| 61 | * Three tagged parameters are also added to the reassoc_resp: SSID, Channel and Supported Rates. | 62 | * One tagged parameters is also added to the reassoc_resp: Channel. |
| 62 | */ | 63 | */ |
| 63 | int libwifi_create_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, const unsigned char receiver[6], | 64 | int libwifi_create_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, |
| 64 | const unsigned char transmitter[6], uint8_t channel) { | 65 | const unsigned char receiver[6], |
| 66 | const unsigned char transmitter[6], | ||
| 67 | const unsigned char address3[6], | ||
| 68 | uint8_t channel) { | ||
| 65 | memset(reassoc_resp, 0, sizeof(struct libwifi_reassoc_resp)); | 69 | memset(reassoc_resp, 0, sizeof(struct libwifi_reassoc_resp)); |
| 66 | 70 | ||
| 67 | reassoc_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; | 71 | reassoc_resp->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 68 | reassoc_resp->frame_header.frame_control.subtype = SUBTYPE_REASSOC_RESP; | 72 | reassoc_resp->frame_header.frame_control.subtype = SUBTYPE_REASSOC_RESP; |
| 69 | memcpy(&reassoc_resp->frame_header.addr1, receiver, 6); | 73 | memcpy(&reassoc_resp->frame_header.addr1, receiver, 6); |
| 70 | memcpy(&reassoc_resp->frame_header.addr2, transmitter, 6); | 74 | memcpy(&reassoc_resp->frame_header.addr2, transmitter, 6); |
| 75 | memcpy(&reassoc_resp->frame_header.addr3, address3, 6); | ||
| 71 | 76 | ||
| 72 | reassoc_resp->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); | 77 | reassoc_resp->fixed_parameters.capabilities_information = BYTESWAP16(LIBWIFI_DEFAULT_AP_CAPABS); |
| 73 | reassoc_resp->fixed_parameters.status_code = STATUS_SUCCESS; | 78 | reassoc_resp->fixed_parameters.status_code = STATUS_SUCCESS; |
| 74 | reassoc_resp->fixed_parameters.association_id = rand() % 4096; | 79 | reassoc_resp->fixed_parameters.association_id = rand() % 4096; |
| 75 | 80 | ||
| 76 | int ret = libwifi_set_reassoc_resp_channel(reassoc_resp, channel); | 81 | int ret = libwifi_set_reassoc_resp_channel(reassoc_resp, channel); |
| 77 | if (ret != 0) { | ||
| 78 | return ret; | ||
| 79 | } | ||
| 80 | |||
| 81 | const unsigned char supported_rates[] = LIBWIFI_DEFAULT_SUPP_RATES; | ||
| 82 | ret = libwifi_quick_add_tag(&reassoc_resp->tags, TAG_SUPP_RATES, supported_rates, sizeof(supported_rates) - 1); | ||
| 83 | 82 | ||
| 84 | return ret; | 83 | return ret; |
| 85 | } | 84 | } |
| diff --git a/src/libwifi/gen/management/reassoc_response.h b/src/libwifi/gen/management/reassoc_response.h index 420ed66..9db4696 100644 --- a/src/libwifi/gen/management/reassoc_response.h +++ b/src/libwifi/gen/management/reassoc_response.h | |||
| @@ -22,7 +22,8 @@ | |||
| 22 | * Set the channel of a libwifi_reassoc_resp. | 22 | * Set the channel of a libwifi_reassoc_resp. |
| 23 | * | 23 | * |
| 24 | * @param reassoc_resp A libwifi_reassoc_resp | 24 | * @param reassoc_resp A libwifi_reassoc_resp |
| 25 | * @param channel The new channel | 25 | * @param channel The desired channel |
| 26 | * @return Zero on success, or negative error | ||
| 26 | */ | 27 | */ |
| 27 | int libwifi_set_reassoc_resp_channel(struct libwifi_reassoc_resp *reassoc_resp, uint8_t channel); | 28 | int libwifi_set_reassoc_resp_channel(struct libwifi_reassoc_resp *reassoc_resp, uint8_t channel); |
| 28 | 29 | ||
| @@ -30,7 +31,7 @@ int libwifi_set_reassoc_resp_channel(struct libwifi_reassoc_resp *reassoc_resp, | |||
| 30 | * Calculate the length of a given libwifi_reassoc_resp | 31 | * Calculate the length of a given libwifi_reassoc_resp |
| 31 | * | 32 | * |
| 32 | * @param reassoc_resp A libwifi_reassoc_resp | 33 | * @param reassoc_resp A libwifi_reassoc_resp |
| 33 | * @return The length of the given reassoc_resp | 34 | * @return The length of the given reassoc_resp, or negative error |
| 34 | */ | 35 | */ |
| 35 | size_t libwifi_get_reassoc_resp_length(struct libwifi_reassoc_resp *reassoc_resp); | 36 | size_t libwifi_get_reassoc_resp_length(struct libwifi_reassoc_resp *reassoc_resp); |
| 36 | 37 | ||
| @@ -41,13 +42,17 @@ size_t libwifi_get_reassoc_resp_length(struct libwifi_reassoc_resp *reassoc_resp | |||
| 41 | * via the libwifi_dump_reassoc_resp. | 42 | * via the libwifi_dump_reassoc_resp. |
| 42 | * | 43 | * |
| 43 | * @param reassoc_resp A libwifi_reassoc_resp | 44 | * @param reassoc_resp A libwifi_reassoc_resp |
| 44 | * @param receiver The receiver MAC address, aka address 1 | 45 | * @param receiver The receiver MAC address, aka address 1 |
| 45 | * @param transmitter The source MAC address, aka address 2 | 46 | * @param transmitter The source MAC address, aka address 2 |
| 46 | * @param channel The desired channel of the reassoc_resp | 47 | * @param address3 The address 3 frame field value, typically the BSSID |
| 47 | * | 48 | * @param channel The desired channel of the reassoc_resp |
| 49 | * @return Zero on success, or negative error | ||
| 48 | */ | 50 | */ |
| 49 | int libwifi_create_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, const unsigned char receiver[6], | 51 | int libwifi_create_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, |
| 50 | const unsigned char transmitter[6], uint8_t channel); | 52 | const unsigned char receiver[6], |
| 53 | const unsigned char transmitter[6], | ||
| 54 | const unsigned char address3[6], | ||
| 55 | uint8_t channel); | ||
| 51 | 56 | ||
| 52 | /** | 57 | /** |
| 53 | * Dump a libwifi_reassoc_resp into a raw format for packet injection. | 58 | * Dump a libwifi_reassoc_resp into a raw format for packet injection. |
| @@ -55,7 +60,7 @@ int libwifi_create_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, const | |||
| 55 | * @param reassoc_resp A libwifi_reassoc_resp | 60 | * @param reassoc_resp A libwifi_reassoc_resp |
| 56 | * @param buf The output buffer for the frame data | 61 | * @param buf The output buffer for the frame data |
| 57 | * @param buf_len The length of the output buffer | 62 | * @param buf_len The length of the output buffer |
| 58 | * @return The length of the dumped reassoc_resp | 63 | * @return The length of the dumped reassoc_resp, or negative error |
| 59 | */ | 64 | */ |
| 60 | size_t libwifi_dump_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, unsigned char *buf, | 65 | size_t libwifi_dump_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, unsigned char *buf, |
| 61 | size_t buf_len); | 66 | size_t buf_len); |
| @@ -63,7 +68,7 @@ size_t libwifi_dump_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp, unsi | |||
| 63 | /** | 68 | /** |
| 64 | * Free any memory claimed by a libwifi_reassoc_resp back to the system. | 69 | * Free any memory claimed by a libwifi_reassoc_resp back to the system. |
| 65 | * | 70 | * |
| 66 | * @param reassoc_resp A libwifi_reassoc_resp | 71 | * @param reassoc_resp A libwifi_reassoc_resp struct |
| 67 | */ | 72 | */ |
| 68 | void libwifi_free_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp); | 73 | void libwifi_free_reassoc_resp(struct libwifi_reassoc_resp *reassoc_resp); |
| 69 | 74 | ||
| diff --git a/src/libwifi/gen/management/timing_ad.c b/src/libwifi/gen/management/timing_ad.c index 61b9003..73a1188 100644 --- a/src/libwifi/gen/management/timing_ad.c +++ b/src/libwifi/gen/management/timing_ad.c | |||
| @@ -23,16 +23,23 @@ | |||
| 23 | #include <stdlib.h> | 23 | #include <stdlib.h> |
| 24 | #include <string.h> | 24 | #include <string.h> |
| 25 | 25 | ||
| 26 | int libwifi_create_timing_advert(struct libwifi_timing_advert *adv, const unsigned char destination[6], | 26 | int libwifi_create_timing_advert(struct libwifi_timing_advert *adv, |
| 27 | const unsigned char transmitter[6], struct libwifi_timing_advert_fields *adv_fields, | 27 | const unsigned char destination[6], |
| 28 | const char country[3], uint16_t max_reg_power, uint8_t max_tx_power, uint8_t tx_power_used, | 28 | const unsigned char transmitter[6], |
| 29 | uint8_t noise_floor) { | 29 | const unsigned char address3[6], |
| 30 | struct libwifi_timing_advert_fields *adv_fields, | ||
| 31 | const char country[3], | ||
| 32 | uint16_t max_reg_power, | ||
| 33 | uint8_t max_tx_power, | ||
| 34 | uint8_t tx_power_used, | ||
| 35 | uint8_t noise_floor) { | ||
| 30 | memset(adv, 0, sizeof(struct libwifi_timing_advert)); | 36 | memset(adv, 0, sizeof(struct libwifi_timing_advert)); |
| 31 | 37 | ||
| 32 | adv->frame_header.frame_control.type = TYPE_MANAGEMENT; | 38 | adv->frame_header.frame_control.type = TYPE_MANAGEMENT; |
| 33 | adv->frame_header.frame_control.subtype = SUBTYPE_TIME_ADV; | 39 | adv->frame_header.frame_control.subtype = SUBTYPE_TIME_ADV; |
| 34 | memcpy(&adv->frame_header.addr1, destination, 6); | 40 | memcpy(&adv->frame_header.addr1, destination, 6); |
| 35 | memcpy(&adv->frame_header.addr2, transmitter, 6); | 41 | memcpy(&adv->frame_header.addr2, transmitter, 6); |
| 42 | memcpy(&adv->frame_header.addr3, address3, 6); | ||
| 36 | adv->frame_header.seq_control.sequence_number = (rand() % 4096); | 43 | adv->frame_header.seq_control.sequence_number = (rand() % 4096); |
| 37 | 44 | ||
| 38 | adv->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); | 45 | adv->fixed_parameters.timestamp = BYTESWAP64(libwifi_get_epoch()); |
| diff --git a/src/libwifi/gen/management/timing_ad.h b/src/libwifi/gen/management/timing_ad.h index 51c7729..7f0de18 100644 --- a/src/libwifi/gen/management/timing_ad.h +++ b/src/libwifi/gen/management/timing_ad.h | |||
| @@ -18,15 +18,57 @@ | |||
| 18 | 18 | ||
| 19 | #include "../../core/frame/management/timing_ad.h" | 19 | #include "../../core/frame/management/timing_ad.h" |
| 20 | 20 | ||
| 21 | int libwifi_create_timing_advert(struct libwifi_timing_advert *adv, const unsigned char destination[6], | 21 | /** |
| 22 | const unsigned char transmitter[6], struct libwifi_timing_advert_fields *adv_fields, | 22 | * Create a populated libwifi_timing_advert struct |
| 23 | const char country[3], uint16_t max_reg_power, uint8_t max_tx_power, uint8_t tx_power_used, | 23 | * |
| 24 | uint8_t noise_floor); | 24 | * A generated libwifi timing advert can be "dumped" into a buffer for packet injection |
| 25 | * via the libwifi_dump_timing_advert function. | ||
| 26 | * | ||
| 27 | * @param adv A new libwifi_timing_advert struct | ||
| 28 | * @param receiver The receiver MAC address, aka address 1 | ||
| 29 | * @param transmitter The source MAC address, aka address 2 | ||
| 30 | * @param address3 The address 3 frame field value, typically the BSSID | ||
| 31 | * @param adv_fields A libwifi_timing_advert_fields struct | ||
| 32 | * @param country The ISO 3166-1 country code field value | ||
| 33 | * @param max_reg_power Maximum Regulatory Power value | ||
| 34 | * @param max_tx_power Maximum Transmit Power value | ||
| 35 | * @param tx_power_used Transmit Power Used value | ||
| 36 | * @param noise_floor Noise Floor value | ||
| 37 | * @return Zero on success, or negative errno | ||
| 38 | */ | ||
| 39 | int libwifi_create_timing_advert(struct libwifi_timing_advert *adv, | ||
| 40 | const unsigned char receiver[6], | ||
| 41 | const unsigned char transmitter[6], | ||
| 42 | const unsigned char address3[6], | ||
| 43 | struct libwifi_timing_advert_fields *adv_fields, | ||
| 44 | const char country[3], | ||
| 45 | uint16_t max_reg_power, | ||
| 46 | uint8_t max_tx_power, | ||
| 47 | uint8_t tx_power_used, | ||
| 48 | uint8_t noise_floor); | ||
| 25 | 49 | ||
| 50 | /** | ||
| 51 | * Get the length of the specified libwifi_timing_advert struct | ||
| 52 | * | ||
| 53 | * @return Length of the specified timing advert, or negative error | ||
| 54 | */ | ||
| 26 | size_t libwifi_get_timing_advert_length(struct libwifi_timing_advert *adv); | 55 | size_t libwifi_get_timing_advert_length(struct libwifi_timing_advert *adv); |
| 27 | 56 | ||
| 57 | /** | ||
| 58 | * Dump a libwifi_timing_advert into a raw format for packet injection. | ||
| 59 | * | ||
| 60 | * @param adv A libwifi_timing_advert | ||
| 61 | * @param buf The output buffer for the frame data | ||
| 62 | * @param buf_len The length of the output buffer | ||
| 63 | * @return The length of the dumped timing advert, or negative error | ||
| 64 | */ | ||
| 28 | size_t libwifi_dump_timing_advert(struct libwifi_timing_advert *adv, unsigned char *buf, size_t buf_len); | 65 | size_t libwifi_dump_timing_advert(struct libwifi_timing_advert *adv, unsigned char *buf, size_t buf_len); |
| 29 | 66 | ||
| 67 | /** | ||
| 68 | * Free any memory claimed by a libwifi_timing_advert back to the system. | ||
| 69 | * | ||
| 70 | * @param adv A libwifi_timing_advert struct | ||
| 71 | */ | ||
| 30 | void libwifi_free_timing_advert(struct libwifi_timing_advert *adv); | 72 | void libwifi_free_timing_advert(struct libwifi_timing_advert *adv); |
| 31 | 73 | ||
| 32 | #endif /* LIBWIFI_GEN_TIMINGAD_H */ | 74 | #endif /* LIBWIFI_GEN_TIMINGAD_H */ |
