00001 #ifndef IEEE_802_11
00002 #define IEEE_802_11
00003
00004 enum ieee_802_11_link_status_failure_reason {
00005 reserved0, Unspecified=1, Previous_not_valid,
00006 Sender_Quits_ESS_or_IBSS,
00007 Due_Inactivity, AP_Overload,
00008 Class_2_from_NonAuth,
00009 Class_3_from_NonAuth,
00010 Sender_Quits_BSS,
00011 Association_requester_not_authenticated,
00012 Reserved10
00013 };
00014
00015
00016 #define IEEE_802_11_LINK_STATUS_FAILURE_REASON_STRINGS \
00017 { \
00018 {reserved0, 0xff," Reserved reason "},\
00019 {Unspecified, 0xff," Unspecified Reason "},\
00020 {Previous_not_valid, 0xff," Previous Authentication no longer valid "},\
00021 {Sender_Quits_ESS_or_IBSS,0xff," Deauthenticated because sending station is leaving (has left) IBSS or ESS "},\
00022 {Due_Inactivity, 0xff," Disassociated due to inactivity "},\
00023 {AP_Overload, 0xff," Disassociated because AP is unable to handle all currently associated stations "},\
00024 {Class_2_from_NonAuth, 0xff," Class 2 frame received from non-Authenticated station"},\
00025 {Class_3_from_NonAuth, 0xff," Class 3 frame received from nonAssociated station"},\
00026 {Sender_Quits_BSS, 0xff," Disassociated because sending station is leaving (has left) BSS"},\
00027 {Association_requester_not_authenticated,0xff," Station requesting (Re)Association is not Authenticated with responding station"},\
00028 {Reserved10, 0xff," Reserved"},\
00029 {0,0,NULL}\
00030 };
00031
00032
00033
00034 struct ieee_802_11_header {
00035 u_int16_t frame_control;
00036 u_int16_t duration;
00037 u_int8_t mac1[6];
00038 u_int8_t mac2[6];
00039 u_int8_t mac3[6];
00040 u_int16_t SeqCtl;
00041 u_int8_t mac4[6];
00042
00043
00044 };
00045
00046
00047 struct ieee_802_3_header {
00048
00049 u_int16_t status;
00050 u_int16_t payload_length;
00051 u_int8_t dst_mac[6];
00052 u_int8_t src_mac[6];
00053
00054 };
00055
00056 #define P80211_OUI_LEN 3
00057
00058 struct ieee_802_11_802_2_header {
00059
00060 u_int8_t dsap;
00061 u_int8_t ssap;
00062 u_int8_t ctrl;
00063 u_int8_t oui[P80211_OUI_LEN];
00064 u_int16_t type;
00065 };
00066
00067
00068
00069
00070
00071
00072
00073
00074 #define ETH_ALEN 6
00075
00076 struct myarphdr
00077 {
00078 unsigned short int ar_hrd;
00079 unsigned short int ar_pro;
00080 unsigned char ar_hln;
00081 unsigned char ar_pln;
00082 unsigned short int ar_op;
00083
00084
00085 unsigned char ar_sha[ETH_ALEN];
00086 unsigned char ar_sip[4];
00087 unsigned char ar_tha[ETH_ALEN];
00088 unsigned char ar_tip[4];
00089 };
00090
00091
00092
00093
00094 #define ieee_802_11_frame_type_Management 0x00
00095 #define ieee_802_11_frame_type_Control 0x01
00096 #define ieee_802_11_frame_type_Data 0x10
00097 #define ieee_802_11_frame_type_Reserved 0x11
00098
00099 #define ieee_802_11_frame_subtype_Association_Req 0x0 // Association Request
00100 #define ieee_802_11_frame_subtype_Association_Resp 0x1 // Association Response
00101 #define ieee_802_11_frame_subtype_Reassociation_Req 0x2 // Reassociation Request
00102 #define ieee_802_11_frame_subtype_Reassociation_Resp 0x3 // Reassociation Response
00103 #define ieee_802_11_frame_subtype_Probe_Req 0x4 // Probe Request
00104 #define ieee_802_11_frame_subtype_Probe_Resp 0x5 // Probe Response
00105 #define ieee_802_11_frame_subtype_Beacon 0x8 // Beacon
00106 #define ieee_802_11_frame_subtype_ATIM 0x9 // ATIM
00107 #define ieee_802_11_frame_subtype_Disassociation 0xA // Disassociation
00108 #define ieee_802_11_frame_subtype_Authentication 0xB // Authentication
00109 #define ieee_802_11_frame_subtype_Deauthentication 0xC // Deauthentication
00110 #define ieee_802_11_frame_subtype_PS_Poll 0xA // PS-Poll
00111 #define ieee_802_11_frame_subtype_RTS 0xB // RTS
00112 #define ieee_802_11_frame_subtype_CTS 0xC // CTS
00113 #define ieee_802_11_frame_subtype_ACK 0xD // ACK
00114 #define ieee_802_11_frame_subtype_CFEnd 0xE // CF-End
00115 #define ieee_802_11_frame_subtype_CFEnd_CFAck 0xF // CF-End + CF-Ack
00116 #define ieee_802_11_frame_subtype_Data 0x0 // Data
00117 #define ieee_802_11_frame_subtype_Data_CFAck 0x1 // Data + CF-Ack
00118 #define ieee_802_11_frame_subtype_Data_CF_Poll 0x2 // Data + CF-Poll
00119 #define ieee_802_11_frame_subtype_Data_CF_AckCF_Poll 0x3 // Data + CF-Ack + CF-Poll
00120 #define ieee_802_11_frame_subtype_NullFunction 0x4 // Null Function (no data)
00121 #define ieee_802_11_frame_subtype_CF_Ack 0x5 // CF-Ack (no data)
00122 #define ieee_802_11_frame_subtype_CF_Poll 0x6 // CF-Poll (no data)
00123 #define ieee_802_11_frame_subtype_CF_AckCF_Poll 0x7 // CF-Ack + CF-Poll (no data)
00124
00125
00126 #define ieee_802_11_frame_subtype_strings {\
00127 { ieee_802_11_frame_subtype_Association_Req, 0xF,"f Association Request"},\
00128 { ieee_802_11_frame_subtype_Association_Resp, 0xF,"1 Association Response"},\
00129 { ieee_802_11_frame_subtype_Reassociation_Req, 0xF,"2 Reassociation Request"},\
00130 { ieee_802_11_frame_subtype_Reassociation_Resp, 0xF,"3 Reassociation Response"},\
00131 { ieee_802_11_frame_subtype_Probe_Req , 0xF,"4 Probe Request"},\
00132 { ieee_802_11_frame_subtype_Probe_Resp , 0xF,"5 Probe Response"},\
00133 { ieee_802_11_frame_subtype_Beacon , 0xF,"8 Beacon"},\
00134 { ieee_802_11_frame_subtype_ATIM , 0xF,"9 ATIM"},\
00135 { ieee_802_11_frame_subtype_Disassociation, 0xF,"A Disassociation"},\
00136 { ieee_802_11_frame_subtype_Authentication, 0xF,"B Authentication"},\
00137 { ieee_802_11_frame_subtype_Deauthentication, 0xF,"C Deauthentication"},\
00138 { ieee_802_11_frame_subtype_PS_Poll , 0xF,"A PS-Poll"},\
00139 { ieee_802_11_frame_subtype_RTS , 0xF,"B RTS"},\
00140 { ieee_802_11_frame_subtype_CTS , 0xF,"C CTS"},\
00141 { ieee_802_11_frame_subtype_ACK , 0xF,"D ACK"},\
00142 { ieee_802_11_frame_subtype_CFEnd , 0xF,"E CF-End"},\
00143 { ieee_802_11_frame_subtype_CFEnd_CFAck , 0xF,"F CF-End + CF-Ack"},\
00144 { ieee_802_11_frame_subtype_Data , 0xF,"0 Data"},\
00145 { ieee_802_11_frame_subtype_Data_CFAck , 0xF,"1 Data + CF-Ack"},\
00146 { ieee_802_11_frame_subtype_Data_CFPoll , 0xF,"2 Data + CF-Poll"},\
00147 { ieee_802_11_frame_subtype_Data_CFAck_CFPoll, 0xF,"3 Data + CF-Ack + CF-Poll"},\
00148 { ieee_802_11_frame_subtype_Null_Function , 0xF,"4 Null Function (no data)"},\
00149 { ieee_802_11_frame_subtype_CFAck , 0xF,"5 CF-Ack (no data)"},\
00150 { ieee_802_11_frame_subtype_CFPoll , 0xF,"6 CF-Poll (no data)"},\
00151 { ieee_802_11_frame_subtype_CFAck_CFPoll, 0xF,"y7 CF-Ack + CF-Poll (no data)"},\
00152 { 0,0,NULL}\
00153 }
00154 struct ieee_802_11_frame_subtype_class {
00155 u_int8_t subtype;
00156 u_int8_t mask;
00157 u_int8_t klass;
00158 u_int8_t type;
00159 };
00160 #define ieee_802_11_frame_subtype_classes {\
00161 { ieee_802_11_frame_subtype_Association_Req, 0xF,2,ieee_802_11_frame_type_Management},\
00162 { ieee_802_11_frame_subtype_Association_Resp, 0xF,2,ieee_802_11_frame_type_Management},\
00163 { ieee_802_11_frame_subtype_Reassociation_Req, 0xF,2,ieee_802_11_frame_type_Management},\
00164 { ieee_802_11_frame_subtype_Reassociation_Resp, 0xF,2,ieee_802_11_frame_type_Management},\
00165 { ieee_802_11_frame_subtype_Probe_Req , 0xF,1,ieee_802_11_frame_type_Management},\
00166 { ieee_802_11_frame_subtype_Probe_Resp , 0xF,1,ieee_802_11_frame_type_Management},\
00167 { ieee_802_11_frame_subtype_Beacon , 0xF,1,ieee_802_11_frame_type_Management},\
00168 { ieee_802_11_frame_subtype_ATIM , 0xF,1,ieee_802_11_frame_type_Management},\
00169 { ieee_802_11_frame_subtype_Disassociation, 0xF,2,ieee_802_11_frame_type_Management},\
00170 { ieee_802_11_frame_subtype_Authentication, 0xF,1,ieee_802_11_frame_type_Management},\
00171 { ieee_802_11_frame_subtype_Deauthentication, 0xF,3,ieee_802_11_frame_type_Management},\
00172 { ieee_802_11_frame_subtype_PS-Poll , 0xF,3,ieee_802_11_frame_type_Control},\
00173 { ieee_802_11_frame_subtype_RTS , 0xF,1,ieee_802_11_frame_type_Control},\
00174 { ieee_802_11_frame_subtype_CTS , 0xF,1,ieee_802_11_frame_type_Control},\
00175 { ieee_802_11_frame_subtype_ACK , 0xF,1,ieee_802_11_frame_type_Control},\
00176 { ieee_802_11_frame_subtype_CFEnd , 0xF,1,ieee_802_11_frame_type_Control},\
00177 { ieee_802_11_frame_subtype_CFEnd_CFAck , 0xF,1,ieee_802_11_frame_type_Control},\
00178 { ieee_802_11_frame_subtype_Data , 0xF,3,ieee_802_11_frame_type_Data},\
00179 { ieee_802_11_frame_subtype_Data_CFAck , 0xF,3,ieee_802_11_frame_type_Data},\
00180 { ieee_802_11_frame_subtype_Data_CF_Poll 0xF,3,ieee_802_11_frame_type_Data},\
00181 { ieee_802_11_frame_subtype_Data_CF_AckCF_Poll, 0xF,3,ieee_802_11_frame_type_Data},\
00182 { ieee_802_11_frame_subtype_NullFunction 0xF,1,ieee_802_11_frame_type_Data},\
00183 { ieee_802_11_frame_subtype_CF_Ack , 0xF,1,ieee_802_11_frame_type_Data},\
00184 { ieee_802_11_frame_subtype_CF_Poll , 0xF,1,ieee_802_11_frame_type_Data},\
00185 { ieee_802_11_frame_subtype_CF_AckCF_Poll, 0xF,1,ieee_802_11_frame_type_Data},\
00186 { 0,0,NULL}\
00187 }
00188
00189 #define IEEE802_11_FC_LEN 2
00190
00191 #define T_MGMT 0x0
00192 #define T_CTRL 0x1
00193 #define T_DATA 0x2
00194 #define T_RESV 0x3
00195
00196 #define ST_ASSOC_REQUEST 0x0
00197 #define ST_ASSOC_RESPONSE 0x1
00198 #define ST_REASSOC_REQUEST 0x2
00199 #define ST_REASSOC_RESPONSE 0x3
00200 #define ST_PROBE_REQUEST 0x4
00201 #define ST_PROBE_RESPONSE 0x5
00202
00203
00204 #define ST_BEACON 0x8
00205 #define ST_ATIM 0x9
00206 #define ST_DISASSOC 0xA
00207 #define ST_AUTH 0xB
00208 #define ST_DEAUTH 0xC
00209
00210
00211
00212
00213
00214 #define CTRL_PS_POLL 0xA
00215 #define CTRL_RTS 0xB
00216 #define CTRL_CTS 0xC
00217 #define CTRL_ACK 0xD
00218 #define CTRL_CF_END 0xE
00219 #define CTRL_END_ACK 0xF
00220
00221
00222
00223
00224 #define FC_VERSION(fc) ((fc) & 0x3)
00225 #define FC_TYPE(fc) (((fc) >> 2) & 0x3)
00226 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
00227 #define FC_TO_DS(fc) ((fc) & 0x0100)
00228 #define FC_FROM_DS(fc) ((fc) & 0x0200)
00229 #define FC_MORE_FLAG(fc) ((fc) & 0x0400)
00230 #define FC_RETRY(fc) ((fc) & 0x0800)
00231 #define FC_POWER_MGMT(fc) ((fc) & 0x1000)
00232 #define FC_MORE_DATA(fc) ((fc) & 0x2000)
00233 #define FC_WEP(fc) ((fc) & 0x4000)
00234 #define FC_ORDER(fc) ((fc) & 0x8000)
00235
00236
00237 struct ieee_802_11_mgmt_header {
00238 u_int16_t fc;
00239 u_int16_t duration;
00240 u_int8_t da[6];
00241 u_int8_t sa[6];
00242 u_int8_t bssid[6];
00243 u_int16_t seq_ctrl;
00244 };
00245
00246
00247 struct ieee_802_11_data_header {
00248 u_int16_t fc;
00249 u_int16_t duration;
00250 u_int8_t mac1[6];
00251 u_int8_t mac2[6];
00252 u_int8_t mac3[6];
00253 u_int16_t SeqCtl;
00254 u_int8_t mac4[6];
00255
00256
00257 };
00258
00259 struct ieee_802_11_control_header {
00260 u_int16_t fc;
00261 u_int16_t duration;
00262 u_int8_t mac1[6];
00263 u_int8_t mac2[6];
00264 u_int8_t mac3[6];
00265 u_int16_t SeqCtl;
00266 u_int8_t mac4[6];
00267
00268
00269 };
00270
00271 #define CAPABILITY_ESS(cap) ((cap) & 0x0001)
00272 #define CAPABILITY_IBSS(cap) ((cap) & 0x0002)
00273 #define CAPABILITY_CFP(cap) ((cap) & 0x0004)
00274 #define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008)
00275 #define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010)
00276
00277 struct ssid_t {
00278 u_int8_t element_id;
00279 u_int8_t length;
00280 u_char ssid[33];
00281 };
00282
00283
00284 struct rates_t {
00285 u_int8_t element_id;
00286 u_int8_t length;
00287 u_int8_t rate[8];
00288 };
00289
00290
00291 struct challenge_t {
00292 u_int8_t element_id;
00293 u_int8_t length;
00294 u_int8_t text[254];
00295 };
00296
00297
00298 struct fh_t {
00299 u_int8_t element_id;
00300 u_int8_t length;
00301 u_int16_t dwell_time;
00302 u_int8_t hop_set;
00303 u_int8_t hop_pattern;
00304 u_int8_t hop_index;
00305 };
00306
00307
00308 struct ds_t {
00309 u_int8_t element_id;
00310 u_int8_t length;
00311 u_int8_t channel;
00312 };
00313
00314
00315 struct cf_t {
00316 u_int8_t element_id;
00317 u_int8_t length;
00318 u_int8_t count;
00319 u_int8_t period;
00320 u_int16_t max_duration;
00321 u_int16_t dur_remaing;
00322 };
00323
00324
00325 struct tim_t {
00326 u_int8_t element_id;
00327 u_int8_t length;
00328 u_int8_t count;
00329 u_int8_t period;
00330 u_int8_t bitmap_control;
00331 u_int8_t bitmap[251];
00332 };
00333
00334
00335 struct ibss_t {
00336 u_int8_t element_id;
00337 u_int8_t length;
00338 u_int16_t atim_window;
00339 };
00340
00341
00342 #define E_SSID 0
00343 #define E_RATES 1
00344 #define E_FH 2
00345 #define E_DS 3
00346 #define E_CF 4
00347 #define E_TIM 5
00348 #define E_IBSS 6
00349 #define E_CHALLENGE 16
00350 #define E_CISCO 133
00351
00352
00353 struct ieee_802_11_mgmt_body {
00354 u_int8_t timestamp[8];
00355 u_int16_t beacon_interval;
00356
00357
00358
00359
00360
00361
00362
00363
00364 u_int16_t capability_info;
00365
00366
00367
00368
00369
00370
00371 };
00372
00373
00374 struct val_80211 {
00375 unsigned int did;
00376 unsigned short status, len;
00377 unsigned int data;
00378 };
00379
00380
00381 struct prism_hdr {
00382 unsigned int msgcode, msglen;
00383 char devname[16];
00384 struct val_80211 hosttime, mactime, channel, rssi, sq, signal,
00385 noise, rate, istx, frmlen;
00386 };
00387
00388 struct ieee_802_11_data_body {
00389
00390 };
00391
00392 struct ieee_802_11_control_body {
00393
00394 };
00395
00396 struct ctrl_rts_t {
00397 u_int16_t fc;
00398 u_int16_t duration;
00399 u_int8_t ra[6];
00400 u_int8_t ta[6];
00401 u_int8_t fcs[4];
00402 };
00403
00404 #define CTRL_RTS_LEN (2+2+6+6+4)
00405
00406 struct ctrl_cts_t {
00407 u_int16_t fc;
00408 u_int16_t duration;
00409 u_int8_t ra[6];
00410 u_int8_t fcs[4];
00411 };
00412
00413 #define CTRL_CTS_LEN (2+2+6+4)
00414
00415 struct ctrl_ack_t {
00416 u_int16_t fc;
00417 u_int16_t duration;
00418 u_int8_t ra[6];
00419 u_int8_t fcs[4];
00420 };
00421
00422 #define CTRL_ACK_LEN (2+2+6+4)
00423
00424 struct ctrl_ps_poll_t {
00425 u_int16_t fc;
00426 u_int16_t aid;
00427 u_int8_t bssid[6];
00428 u_int8_t ta[6];
00429 u_int8_t fcs[4];
00430 };
00431
00432 #define CTRL_PS_POLL_LEN (2+2+6+6+4)
00433
00434 struct ctrl_end_t {
00435 u_int16_t fc;
00436 u_int16_t duration;
00437 u_int8_t ra[6];
00438 u_int8_t bssid[6];
00439 u_int8_t fcs[4];
00440 };
00441
00442 #define CTRL_END_LEN (2+2+6+6+4)
00443
00444 struct ctrl_end_ack_t {
00445 u_int16_t fc;
00446 u_int16_t duration;
00447 u_int8_t ra[6];
00448 u_int8_t bssid[6];
00449 u_int8_t fcs[4];
00450 };
00451
00452 #define CTRL_END_ACK_LEN (2+2+6+6+4)
00453
00454 #define IV_IV(iv) ((iv) & 0xFFFFFF)
00455 #define IV_PAD(iv) (((iv) >> 24) & 0x3F)
00456 #define IV_KEYID(iv) (((iv) >> 30) & 0x03)
00457
00458
00459 #endif