[6319] | 1 | /** @file wlan_mac_packet_types.h |
---|
| 2 | * @brief Packet Constructors |
---|
| 3 | * |
---|
| 4 | * This contains code for constructing a variety of different types of MPDUs. |
---|
| 5 | * |
---|
| 6 | * @copyright Copyright 2013-2019, Mango Communications. All rights reserved. |
---|
| 7 | * Distributed under the Mango Communications Reference Design License |
---|
| 8 | * See LICENSE.txt included in the design archive or |
---|
| 9 | * at http://mangocomm.com/802.11/license |
---|
| 10 | * |
---|
| 11 | * This file is part of the Mango 802.11 Reference Design (https://mangocomm.com/802.11) |
---|
| 12 | */ |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | #ifndef WLAN_MAC_PACKET_TYPES_H_ |
---|
| 16 | #define WLAN_MAC_PACKET_TYPES_H_ |
---|
| 17 | |
---|
| 18 | #include "xil_types.h" |
---|
| 19 | |
---|
| 20 | //Forward declarations |
---|
| 21 | struct mac_header_80211_common; |
---|
| 22 | struct network_info_t; |
---|
| 23 | |
---|
| 24 | typedef struct authentication_frame { |
---|
| 25 | u16 auth_algorithm; |
---|
| 26 | u16 auth_sequence; |
---|
| 27 | u16 status_code; |
---|
| 28 | } authentication_frame; |
---|
| 29 | ASSERT_TYPE_SIZE(authentication_frame, 6); |
---|
| 30 | |
---|
| 31 | typedef struct deauthentication_frame { |
---|
| 32 | u16 reason_code; |
---|
| 33 | } deauthentication_frame; |
---|
| 34 | ASSERT_TYPE_SIZE(deauthentication_frame, 2); |
---|
| 35 | |
---|
| 36 | typedef struct association_response_frame { |
---|
| 37 | u16 capabilities; |
---|
| 38 | u16 status_code; |
---|
| 39 | u16 association_id; |
---|
| 40 | } association_response_frame; |
---|
| 41 | ASSERT_TYPE_SIZE(association_response_frame, 6); |
---|
| 42 | |
---|
| 43 | typedef struct association_request_frame { |
---|
| 44 | u16 capabilities; |
---|
| 45 | u16 listen_interval; |
---|
| 46 | } association_request_frame; |
---|
| 47 | ASSERT_TYPE_SIZE(association_request_frame, 4); |
---|
| 48 | |
---|
| 49 | typedef struct channel_switch_announcement_frame { |
---|
| 50 | u8 category; |
---|
| 51 | u8 action; |
---|
| 52 | |
---|
| 53 | // Channel Switch Announcement Element (Section 8.4.2.21) |
---|
| 54 | u8 element_id; // Set to 37 (Table 8-54 - Section 8.4.2.1) |
---|
| 55 | u8 length; // Set to 3 |
---|
| 56 | u8 chan_switch_mode; // Set to 0 - No restrictions on transmission until a channel switch |
---|
| 57 | u8 new_chan_num; |
---|
| 58 | u8 chan_switch_count; // Set to 0 - Switch occurs any time after the frame is transmitted |
---|
| 59 | |
---|
| 60 | } channel_switch_announcement_frame; |
---|
| 61 | ASSERT_TYPE_SIZE(channel_switch_announcement_frame, 7); |
---|
| 62 | |
---|
| 63 | typedef struct measurement_common_frame { |
---|
| 64 | u8 category; |
---|
| 65 | u8 action; |
---|
| 66 | u8 dialog_token; |
---|
| 67 | u8 element_id; |
---|
| 68 | u8 length; |
---|
| 69 | u8 measurement_token; |
---|
| 70 | u8 request_mode; |
---|
| 71 | u8 measurement_type; |
---|
| 72 | ///Note, technically measurement action frames can follow this comment with additional fields of unknown length |
---|
| 73 | ///But currently, the three types of measurements are all the same so for ease we'll hardcode that structure here |
---|
| 74 | u8 channel; |
---|
| 75 | u8 start_time[8]; |
---|
| 76 | u8 duration[2]; |
---|
| 77 | } measurement_common_frame; |
---|
| 78 | ASSERT_TYPE_SIZE(measurement_common_frame, 19); |
---|
| 79 | |
---|
| 80 | //#define MEASUREMENT_REQ_MODE_ENABLE 0x40 |
---|
| 81 | //#define MEASUREMENT_REQ_MODE_REQUEST 0x20 |
---|
| 82 | //#define MEASUREMENT_REQ_MODE_REPORT 0x10 |
---|
| 83 | |
---|
| 84 | #define MEASUREMENT_REQ_MODE_PARALLEL 0x01 |
---|
| 85 | #define MEASUREMENT_REQ_MODE_ENABLE 0x02 |
---|
| 86 | #define MEASUREMENT_REQ_MODE_REPORTS 0x04 |
---|
| 87 | #define MEASUREMENT_REQ_MODE_AUTONOMOUS 0x08 |
---|
| 88 | |
---|
| 89 | #define MEASUREMENT_TYPE_BASIC 0 |
---|
| 90 | #define MEASUREMENT_TYPE_CCA 1 |
---|
| 91 | #define MEASUREMENT_TYPE_RPA 2 |
---|
| 92 | |
---|
| 93 | |
---|
| 94 | |
---|
| 95 | |
---|
| 96 | #define AUTH_ALGO_OPEN_SYSTEM 0x00 |
---|
| 97 | |
---|
| 98 | #define AUTH_SEQ_REQ 0x01 |
---|
| 99 | #define AUTH_SEQ_RESP 0x02 |
---|
| 100 | |
---|
| 101 | // Reason Codes as per IEEE 802.11-2012 standard.(table 8.36) |
---|
| 102 | #define DEAUTH_REASON_STA_IS_LEAVING 3 |
---|
| 103 | #define DEAUTH_REASON_INACTIVITY 4 |
---|
| 104 | #define DEAUTH_REASON_NONASSOCIATED_STA 7 |
---|
| 105 | #define DISASSOC_REASON_STA_IS_LEAVING 8 |
---|
| 106 | |
---|
| 107 | // Status Codes: Table 7-23 in 802.11-2007 |
---|
| 108 | #define STATUS_SUCCESS 0 |
---|
| 109 | #define STATUS_AUTH_REJECT_UNSPECIFIED 1 |
---|
| 110 | #define STATUS_AUTH_REJECT_OUTSIDE_SCOPE 12 |
---|
| 111 | #define STATUS_AUTH_REJECT_CHALLENGE_FAILURE 15 |
---|
| 112 | #define STATUS_REJECT_TOO_MANY_ASSOCIATIONS 17 |
---|
| 113 | |
---|
| 114 | #define wlan_create_beacon_frame(a,b,c,d,e) wlan_create_beacon_probe_resp_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_BEACON,e) |
---|
| 115 | #define wlan_create_probe_resp_frame(a,b,c,d,e) wlan_create_beacon_probe_resp_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_PROBE_RESP,e) |
---|
| 116 | |
---|
| 117 | int wlan_create_beacon_probe_resp_frame(u8* pkt, |
---|
| 118 | u8* addr1, |
---|
| 119 | u8* addr2, |
---|
| 120 | u8* addr3, |
---|
| 121 | u8 frame_control_1, |
---|
| 122 | struct network_info_t* network_info); |
---|
| 123 | |
---|
| 124 | int wlan_create_probe_req_frame(u8* pkt, |
---|
| 125 | u8* addr1, |
---|
| 126 | u8* addr2, |
---|
| 127 | u8* addr3, |
---|
| 128 | char* ssid); |
---|
| 129 | |
---|
| 130 | int wlan_create_auth_frame(u8* pkt, |
---|
| 131 | u8* addr1, |
---|
| 132 | u8* addr2, |
---|
| 133 | u8* addr3, |
---|
| 134 | u16 auth_algorithm, |
---|
| 135 | u16 auth_seq, |
---|
| 136 | u16 status_code); |
---|
| 137 | |
---|
| 138 | #define wlan_create_deauth_frame(a,b,c,d,e) wlan_create_deauth_disassoc_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_DEAUTH,e) |
---|
| 139 | #define wlan_create_disassoc_frame(a,b,c,d,e) wlan_create_deauth_disassoc_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_DISASSOC,e) |
---|
| 140 | |
---|
| 141 | int wlan_create_deauth_disassoc_frame(u8* pkt, |
---|
| 142 | u8* addr1, |
---|
| 143 | u8* addr2, |
---|
| 144 | u8* addr3, |
---|
| 145 | u8 frame_control_1, |
---|
| 146 | u16 reason_code); |
---|
| 147 | |
---|
| 148 | int wlan_create_association_response_frame(u8* pkt, |
---|
| 149 | u8* addr1, |
---|
| 150 | u8* addr2, |
---|
| 151 | u8* addr3, |
---|
| 152 | u16 status, |
---|
| 153 | u16 AID, |
---|
| 154 | struct network_info_t* network_info); |
---|
| 155 | |
---|
| 156 | #define wlan_create_association_req_frame(a,b,c,d,e) wlan_create_reassoc_assoc_req_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_ASSOC_REQ,e) |
---|
| 157 | #define wlan_create_reassociation_req_frame(a,b,c,d,e) wlan_create_reassoc_assoc_req_frame(a,b,c,d,MAC_FRAME_CTRL1_SUBTYPE_REASSOC_REQ,e) |
---|
| 158 | |
---|
| 159 | int wlan_create_reassoc_assoc_req_frame(u8* pkt, |
---|
| 160 | u8* addr1, |
---|
| 161 | u8* addr2, |
---|
| 162 | u8* addr3, |
---|
| 163 | u8 frame_control_1, |
---|
| 164 | struct network_info_t* network_info); |
---|
| 165 | |
---|
| 166 | int wlan_create_data_frame_header(u8* pkt, |
---|
| 167 | u8* addr1, |
---|
| 168 | u8* addr2, |
---|
| 169 | u8* addr3, |
---|
| 170 | u8 frame_control_2); |
---|
| 171 | |
---|
| 172 | #endif /* WLAN_MAC_PACKET_TYPES_H_ */ |
---|