Changeset 1dcc0b9 in mainline for uspace/lib/ieee80211/include
- Timestamp:
- 2015-04-06T10:47:51Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d7dadcb4
- Parents:
- 59fa7ab
- Location:
- uspace/lib/ieee80211/include
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ieee80211/include/ieee80211.h
r59fa7ab r1dcc0b9 57 57 #define IEEE80211_CHANNEL_GAP 5 58 58 59 /* Max AMPDU factor. */ 60 #define IEEE80211_MAX_AMPDU_FACTOR 13 61 62 /* Max passphrase length in WPA/WPA2 protocols. */ 63 #define IEEE80211_WPA_MAX_PASSWORD_LENGTH 64 64 65 /** IEEE 802.11 b/g supported data rates in units of 500 kb/s. */ 66 static const uint8_t ieee80211bg_data_rates[] = { 67 2, 4, 11, 12, 18, 22, 24, 36, 48, 72, 96, 108 68 }; 69 59 70 /** Device operating modes. */ 60 71 typedef enum { … … 65 76 } ieee80211_operating_mode_t; 66 77 78 /** Key flags. */ 79 typedef enum { 80 IEEE80211_KEY_FLAG_TYPE_PAIRWISE = 0x01, 81 IEEE80211_KEY_FLAG_TYPE_GROUP = 0x02 82 } ieee80211_key_flags_t; 83 84 /** Key config structure. */ 85 typedef struct { 86 uint8_t id; 87 uint8_t flags; 88 ieee80211_security_suite_t suite; 89 uint8_t data[32]; 90 } ieee80211_key_config_t; 91 67 92 /** IEEE 802.11 callback functions. */ 68 93 typedef struct { … … 109 134 */ 110 135 int (*set_freq)(struct ieee80211_dev *, uint16_t); 136 137 /** 138 * Callback to inform device about BSSID change. 139 * 140 * @param ieee80211_dev Pointer to IEEE 802.11 device structure. 141 * 142 * @return EOK if succeed, negative error code otherwise. 143 */ 144 int (*bssid_change)(struct ieee80211_dev *); 145 146 /** 147 * Callback to setup encryption key in IEEE 802.11 device. 148 * 149 * @param ieee80211_dev Pointer to IEEE 802.11 device structure. 150 * @param key_conf Key config structure. 151 * @param insert True to insert this key to device, false to remove it. 152 * 153 * @return EOK if succeed, negative error code otherwise. 154 */ 155 int (*key_config)(struct ieee80211_dev *, 156 ieee80211_key_config_t *key_conf, bool); 111 157 } ieee80211_ops_t; 112 158 … … 124 170 void *specific); 125 171 extern ddf_dev_t *ieee80211_get_ddf_dev(ieee80211_dev_t* ieee80211_dev); 126 extern ieee80211_operating_mode_t ieee80211_query_current_op_mode(ieee80211_dev_t *ieee80211_dev); 172 extern ieee80211_operating_mode_t 173 ieee80211_query_current_op_mode(ieee80211_dev_t *ieee80211_dev); 127 174 extern uint16_t ieee80211_query_current_freq(ieee80211_dev_t *ieee80211_dev); 175 extern void ieee80211_query_bssid(ieee80211_dev_t* ieee80211_dev, 176 nic_address_t *bssid); 177 extern bool ieee80211_is_connected(ieee80211_dev_t* ieee80211_dev); 128 178 extern void ieee80211_report_current_op_mode(ieee80211_dev_t *ieee80211_dev, 129 179 ieee80211_operating_mode_t op_mode); 130 180 extern void ieee80211_report_current_freq(ieee80211_dev_t *ieee80211_dev, 131 181 uint16_t freq); 182 extern uint16_t ieee80211_get_aid(ieee80211_dev_t* ieee80211_dev); 183 extern int ieee80211_get_security_suite(ieee80211_dev_t* ieee80211_dev); 184 extern bool ieee80211_is_ready(ieee80211_dev_t* ieee80211_dev); 185 extern void ieee80211_set_ready(ieee80211_dev_t* ieee80211_dev, bool ready); 186 extern bool ieee80211_query_using_key(ieee80211_dev_t* ieee80211_dev); 187 extern void ieee80211_setup_key_confirm(ieee80211_dev_t* ieee80211_dev, 188 bool using_key); 132 189 133 190 extern bool ieee80211_is_data_frame(uint16_t frame_ctrl); … … 135 192 extern bool ieee80211_is_beacon_frame(uint16_t frame_ctrl); 136 193 extern bool ieee80211_is_probe_response_frame(uint16_t frame_ctrl); 194 extern bool ieee80211_is_auth_frame(uint16_t frame_ctrl); 195 extern bool ieee80211_is_assoc_response_frame(uint16_t frame_ctrl); 137 196 138 197 /* Worker functions. */ -
uspace/lib/ieee80211/include/ieee80211_iface_impl.h
r59fa7ab r1dcc0b9 45 45 46 46 extern int ieee80211_get_scan_results_impl(ddf_fun_t *fun, 47 ieee80211_scan_results_t *results); 48 extern int ieee80211_connect_impl(ddf_fun_t *fun, char *ssid, char *password); 47 ieee80211_scan_results_t *results, bool now); 48 extern int ieee80211_connect_impl(ddf_fun_t *fun, char *ssid_start, 49 char *password); 50 extern int ieee80211_disconnect_impl(ddf_fun_t *fun); 49 51 50 52 #endif /* LIB_IEEE80211_IFACE_IMPL_H */ -
uspace/lib/ieee80211/include/ieee80211_impl.h
r59fa7ab r1dcc0b9 43 43 44 44 extern int ieee80211_start_impl(ieee80211_dev_t *ieee80211_dev); 45 extern int ieee80211_tx_handler_impl(ieee80211_dev_t *ieee80211_dev, void *buffer, 46 size_t buffer_size); 47 extern int ieee80211_set_freq_impl(ieee80211_dev_t *ieee80211_dev, uint16_t freq); 45 extern int ieee80211_tx_handler_impl(ieee80211_dev_t *ieee80211_dev, 46 void *buffer, size_t buffer_size); 47 extern int ieee80211_set_freq_impl(ieee80211_dev_t *ieee80211_dev, 48 uint16_t freq); 49 extern int ieee80211_bssid_change_impl(ieee80211_dev_t *ieee80211_dev); 50 extern int ieee80211_key_config_impl(ieee80211_dev_t *ieee80211_dev, 51 ieee80211_key_config_t *key_conf, bool insert); 48 52 extern int ieee80211_scan_impl(ieee80211_dev_t *ieee80211_dev); 53 extern int ieee80211_prf(uint8_t *key, uint8_t *data, uint8_t *hash, 54 hash_func_t hash_sel); 55 extern int ieee80211_aes_key_unwrap(uint8_t *kek, uint8_t *data, 56 size_t data_size, uint8_t *output); 57 extern int rnd_sequence(uint8_t *sequence, size_t length); 58 extern uint8_t *min_sequence(uint8_t *seq1, uint8_t *seq2, size_t size); 59 extern uint8_t *max_sequence(uint8_t *seq1, uint8_t *seq2, size_t size); 49 60 50 61 #endif /* LIB_IEEE80211_IMPL_H */ -
uspace/lib/ieee80211/include/ieee80211_private.h
r59fa7ab r1dcc0b9 40 40 #define LIBNET_IEEE80211_PRIVATE_H 41 41 42 #include <fibril_synch.h> 42 43 #include <byteorder.h> 43 44 #include <ddf/driver.h> … … 46 47 #include <ieee80211/ieee80211.h> 47 48 #include "ieee80211.h" 49 50 /* Timeout in us for waiting to authentication/association response. */ 51 #define AUTH_TIMEOUT 200000 52 53 /* Timeout in us for waiting to finish 4-way handshake process. */ 54 #define HANDSHAKE_TIMEOUT 3000000 55 56 /* Max period to rerun scan. */ 57 #define MAX_SCAN_SPAN_SEC 30 58 59 /* Max time to keep scan result. */ 60 #define MAX_KEEP_SCAN_SPAN_SEC 120 61 62 /* Security bit in capability info field. */ 63 #define CAP_SECURITY 0x10 64 65 /* Protocol type used in EAPOL frames. */ 66 #define ETH_TYPE_PAE 0x888E 67 68 /* WPA OUI used in vendor specific IE. */ 69 #define WPA_OUI 0x0050F201 70 71 /* GTK OUI used in vendor specific IE. */ 72 #define GTK_OUI 0x000FAC01 73 74 /* Max PTK key length. */ 75 #define MAX_PTK_LENGTH 64 76 77 /* Max GTK key length. */ 78 #define MAX_GTK_LENGTH 64 79 80 /* KEK offset inside PTK. */ 81 #define KEK_OFFSET 16 82 83 /* TK offset inside PTK. */ 84 #define TK_OFFSET 32 85 86 /* Length of CCMP header we need to reserve. */ 87 #define IEEE80211_CCMP_HEADER_LENGTH 8 88 89 /* 90 * Length of data to be encrypted by PRF function: 91 * NONCE + SNONCE (2 * 32) + DEST_MAC + SOURCE_MAC (2 * ETH_ADDR) 92 */ 93 #define PRF_CRYPT_DATA_LENGTH 2*32 + 2*ETH_ADDR 94 95 /** IEEE 802.11 PTK key length. */ 96 typedef enum { 97 IEEE80211_PTK_CCMP_LENGTH = 48, 98 IEEE80211_PTK_TKIP_LENGTH = 64 99 } ieee80211_ptk_length_t; 100 101 /** IEEE 802.11 GTK key length. */ 102 typedef enum { 103 IEEE80211_GTK_CCMP_LENGTH = 16, 104 IEEE80211_GTK_TKIP_LENGTH = 32 105 } ieee80211_gtk_length_t; 48 106 49 107 /** IEEE 802.11 frame types. */ … … 55 113 } ieee80211_frame_type_t; 56 114 57 /** IEEE 802.11 frame subtypes. */115 /** IEEE 802.11 management frame subtypes. */ 58 116 typedef enum { 59 117 IEEE80211_MGMT_ASSOC_REQ_FRAME = 0x00, … … 64 122 IEEE80211_MGMT_PROBE_RESP_FRAME = 0x50, 65 123 IEEE80211_MGMT_BEACON_FRAME = 0x80, 66 IEEE80211_MGMT_DI ASSOC_FRAME = 0xA0,124 IEEE80211_MGMT_DISASSOC_FRAME = 0xA0, 67 125 IEEE80211_MGMT_AUTH_FRAME = 0xB0, 68 126 IEEE80211_MGMT_DEAUTH_FRAME = 0xC0, 69 } ieee80211_frame_subtype_t; 127 } ieee80211_frame_mgmt_subtype_t; 128 129 /** IEEE 802.11 data frame subtypes. */ 130 typedef enum { 131 IEEE80211_DATA_DATA_FRAME = 0x0000, 132 IEEE80211_DATA_QOS_FRAME = 0x0080 133 } ieee80211_frame_data_subtype_t; 70 134 71 135 /** IEEE 802.11 frame control value masks. */ … … 73 137 IEEE80211_FRAME_CTRL_FRAME_TYPE = 0x000C, 74 138 IEEE80211_FRAME_CTRL_FRAME_SUBTYPE = 0x00F0, 75 } ieee80211_frame_control_mask_t; 139 IEEE80211_FRAME_CTRL_PROTECTED = 0x4000 140 } ieee80211_frame_ctrl_mask_t; 141 142 /** IEEE 802.11 frame control DS field values. */ 143 typedef enum { 144 IEEE80211_FRAME_CTRL_TODS = 0x0100, 145 IEEE80211_FRAME_CTRL_FROMDS = 0x0200 146 } ieee80211_frame_ctrl_ds_t; 147 148 /** IEEE 802.11 authentication cipher suites values. */ 149 typedef enum { 150 IEEE80211_AUTH_CIPHER_TKIP = 0x02, 151 IEEE80211_AUTH_CIPHER_CCMP = 0x04 152 } ieee80211_auth_cipher_type_t; 153 154 /** IEEE 802.11 AKM suites values. */ 155 typedef enum { 156 IEEE80211_AUTH_AKM_8021X = 0x01, 157 IEEE80211_AUTH_AKM_PSK = 0x02 158 } ieee80211_auth_akm_type_t; 159 160 typedef enum { 161 IEEE80211_EAPOL_START = 0x1, 162 IEEE80211_EAPOL_KEY = 0x3 163 } ieee80211_eapol_frame_type_t; 164 165 typedef enum { 166 IEEE80211_EAPOL_KEY_KEYINFO_KEYTYPE = 0x0008, 167 IEEE80211_EAPOL_KEY_KEYINFO_INSTALL = 0x0040, 168 IEEE80211_EAPOL_KEY_KEYINFO_ACK = 0x0080, 169 IEEE80211_EAPOL_KEY_KEYINFO_MIC = 0x0100, 170 IEEE80211_EAPOL_KEY_KEYINFO_SECURE = 0x0200, 171 IEEE80211_EAPOL_KEY_KEYINFO_ENCDATA = 0x1000 172 } ieee80211_eapol_key_keyinfo_t; 76 173 77 174 /** IEEE 802.11 information element types. */ … … 80 177 IEEE80211_RATES_IE = 1, /**< Supported data rates. */ 81 178 IEEE80211_CHANNEL_IE = 3, /**< Current channel number. */ 82 IEEE80211_EXT_RATES_IE = 50 /**< Extended data rates. */ 179 IEEE80211_CHALLENGE_IE = 16, /**< Challenge text. */ 180 IEEE80211_RSN_IE = 48, /**< RSN. */ 181 IEEE80211_EXT_RATES_IE = 50, /**< Extended data rates. */ 182 IEEE80211_VENDOR_IE = 221 /**< Vendor specific IE. */ 83 183 } ieee80211_ie_type_t; 184 185 /** IEEE 802.11 authentication phases. */ 186 typedef enum { 187 IEEE80211_AUTH_DISCONNECTED, 188 IEEE80211_AUTH_AUTHENTICATED, 189 IEEE80211_AUTH_ASSOCIATED 190 } ieee80211_auth_phase_t; 191 192 /** Link with scan result info. */ 193 typedef struct { 194 link_t link; 195 time_t last_beacon; 196 ieee80211_scan_result_t scan_result; 197 uint8_t rsn_copy[256]; 198 size_t rsn_copy_len; 199 } ieee80211_scan_result_link_t; 200 201 /** List of scan results info. */ 202 typedef struct { 203 list_t list; 204 time_t last_scan; 205 fibril_mutex_t scan_mutex; 206 size_t size; 207 } ieee80211_scan_result_list_t; 208 209 /** BSSID info. */ 210 typedef struct { 211 uint16_t aid; 212 char password[IEEE80211_WPA_MAX_PASSWORD_LENGTH]; 213 uint8_t ptk[MAX_PTK_LENGTH]; 214 uint8_t gtk[MAX_GTK_LENGTH]; 215 ieee80211_scan_result_link_t *res_link; 216 } ieee80211_bssid_info_t; 84 217 85 218 /** IEEE 802.11 WiFi device structure. */ … … 103 236 ieee80211_operating_mode_t current_op_mode; 104 237 238 /** Info about BSSID we are connected to. */ 239 ieee80211_bssid_info_t bssid_info; 240 241 /** 242 * Flag indicating that data traffic is encrypted by HW key 243 * that is set up in device. 244 */ 245 bool using_hw_key; 246 105 247 /** BSSIDs we listen to. */ 106 248 nic_address_t bssid_mask; 107 249 108 250 /** List of APs in neighborhood. */ 109 ieee80211_scan_results_t ap_list; 110 111 /* TODO: Probably to be removed later - nic.open function is now 112 * executed multiple times, have to find out reason and fix it. 113 */ 251 ieee80211_scan_result_list_t ap_list; 252 253 /** Current sequence number used in data frames. */ 254 uint16_t sequence_number; 255 256 /** Current authentication phase. */ 257 ieee80211_auth_phase_t current_auth_phase; 258 259 /** General purpose guard. */ 260 fibril_mutex_t gen_mutex; 261 262 /** General purpose condition variable. */ 263 fibril_condvar_t gen_cond; 264 265 /** Indicates whether device is fully initialized. */ 266 bool ready; 267 114 268 /** Indicates whether driver has already started. */ 115 269 bool started; 116 270 }; 271 272 /** IEEE 802.3 (ethernet) header. */ 273 typedef struct { 274 uint8_t dest_addr[ETH_ADDR]; 275 uint8_t src_addr[ETH_ADDR]; 276 uint16_t proto; /**< Big Endian value! */ 277 } __attribute__((packed)) __attribute__ ((aligned(2))) 278 eth_header_t; 117 279 118 280 /** IEEE 802.11 management header structure. */ … … 124 286 uint8_t bssid[ETH_ADDR]; 125 287 uint16_t seq_ctrl; /**< Little Endian value! */ 126 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_mgmt_header_t; 288 } __attribute__((packed)) __attribute__ ((aligned(2))) 289 ieee80211_mgmt_header_t; 127 290 128 291 /** IEEE 802.11 data header structure. */ … … 134 297 uint8_t address3[ETH_ADDR]; 135 298 uint16_t seq_ctrl; /**< Little Endian value! */ 136 uint8_t address4[ETH_ADDR]; 137 uint16_t qos_ctrl; /**< Little Endian value! */ 138 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_data_header_t; 299 } __attribute__((packed)) __attribute__ ((aligned(2))) 300 ieee80211_data_header_t; 139 301 140 302 /** IEEE 802.11 information element header. */ … … 142 304 uint8_t element_id; 143 305 uint8_t length; 144 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_ie_header_t; 306 } __attribute__((packed)) __attribute__ ((aligned(2))) 307 ieee80211_ie_header_t; 145 308 146 309 /** IEEE 802.11 authentication frame body. */ … … 149 312 uint16_t auth_trans_no; /**< Little Endian value! */ 150 313 uint16_t status; /**< Little Endian value! */ 151 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_auth_body_t; 314 } __attribute__((packed)) __attribute__ ((aligned(2))) 315 ieee80211_auth_body_t; 316 317 /** IEEE 802.11 deauthentication frame body. */ 318 typedef struct { 319 uint16_t reason; /**< Little Endian value! */ 320 } __attribute__((packed)) __attribute__ ((aligned(2))) 321 ieee80211_deauth_body_t; 322 323 /** IEEE 802.11 association request frame body. */ 324 typedef struct { 325 uint16_t capability; /**< Little Endian value! */ 326 uint16_t listen_interval; /**< Little Endian value! */ 327 } __attribute__((packed)) __attribute__ ((aligned(2))) 328 ieee80211_assoc_req_body_t; 329 330 /** IEEE 802.11 association response frame body. */ 331 typedef struct { 332 uint16_t capability; /**< Little Endian value! */ 333 uint16_t status; /**< Little Endian value! */ 334 uint16_t aid; /**< Little Endian value! */ 335 } __attribute__((packed)) __attribute__ ((aligned(2))) 336 ieee80211_assoc_resp_body_t; 152 337 153 338 /** IEEE 802.11 beacon frame body start. */ 154 339 typedef struct { 155 340 uint8_t timestamp[8]; 156 uint16_t beacon_interval; 157 uint16_t capability; 158 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_beacon_start_t; 159 160 extern int ieee80211_probe_request(ieee80211_dev_t *ieee80211_dev); 161 extern int ieee80211_probe_auth(ieee80211_dev_t *ieee80211_dev); 341 uint16_t beacon_interval; /**< Little Endian value! */ 342 uint16_t capability; /**< Little Endian value! */ 343 } __attribute__((packed)) __attribute__ ((aligned(2))) 344 ieee80211_beacon_start_t; 345 346 /** IEEE 802.11i EAPOL-Key frame format. */ 347 typedef struct { 348 uint8_t proto_version; 349 uint8_t packet_type; 350 uint16_t body_length; /**< Big Endian value! */ 351 uint8_t descriptor_type; 352 uint16_t key_info; /**< Big Endian value! */ 353 uint16_t key_length; /**< Big Endian value! */ 354 uint8_t key_replay_counter[8]; 355 uint8_t key_nonce[32]; 356 uint8_t eapol_key_iv[16]; 357 uint8_t key_rsc[8]; 358 uint8_t reserved[8]; 359 uint8_t key_mic[16]; 360 uint16_t key_data_length; /**< Big Endian value! */ 361 } __attribute__((packed)) ieee80211_eapol_key_frame_t; 362 363 #define ieee80211_scan_result_list_foreach(results, iter) \ 364 list_foreach((results).list, link, ieee80211_scan_result_link_t, (iter)) 365 366 static inline void ieee80211_scan_result_list_init( 367 ieee80211_scan_result_list_t *results) 368 { 369 list_initialize(&results->list); 370 fibril_mutex_initialize(&results->scan_mutex); 371 } 372 373 static inline void ieee80211_scan_result_list_remove( 374 ieee80211_scan_result_list_t *results, 375 ieee80211_scan_result_link_t *result) 376 { 377 list_remove(&result->link); 378 results->size--; 379 } 380 381 static inline void ieee80211_scan_result_list_append( 382 ieee80211_scan_result_list_t *results, 383 ieee80211_scan_result_link_t *result) 384 { 385 list_append(&result->link, &results->list); 386 results->size++; 387 } 388 389 extern int ieee80211_probe_request(ieee80211_dev_t *ieee80211_dev, 390 char *ssid); 391 extern int ieee80211_authenticate(ieee80211_dev_t *ieee80211_dev); 392 extern int ieee80211_associate(ieee80211_dev_t *ieee80211_dev, 393 char *password); 394 extern int ieee80211_deauthenticate(ieee80211_dev_t *ieee80211_dev); 162 395 163 396 #endif /* LIBN_IEEE80211_H */
Note:
See TracChangeset
for help on using the changeset viewer.