1 /* 2 * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef _ESP_WIFI_DRIVER_H_ 8 #define _ESP_WIFI_DRIVER_H_ 9 10 #include "esp_err.h" 11 #include "esp_wifi.h" 12 13 #if CONFIG_NEWLIB_NANO_FORMAT 14 #define TASK_STACK_SIZE_ADD 0 15 #else 16 #define TASK_STACK_SIZE_ADD 512 17 #endif 18 19 #define WPA2_TASK_STACK_SIZE (6144 + TASK_STACK_SIZE_ADD) 20 #define WPS_TASK_STACK_SIZE (12288 + TASK_STACK_SIZE_ADD) 21 22 enum wpa_alg{ 23 WIFI_WPA_ALG_NONE = 0, 24 WIFI_WPA_ALG_WEP40 = 1, 25 WIFI_WPA_ALG_TKIP = 2, 26 WIFI_WPA_ALG_CCMP = 3, 27 WIFI_WAPI_ALG_SMS4 = 4, 28 WIFI_WPA_ALG_WEP104 = 5, 29 WIFI_WPA_ALG_WEP = 6, 30 WIFI_WPA_ALG_IGTK = 7, 31 WIFI_WPA_ALG_PMK = 8, 32 WIFI_WPA_ALG_GCMP = 9, 33 }; 34 35 typedef enum { 36 WIFI_APPIE_PROBEREQ = 0, 37 WIFI_APPIE_ASSOC_REQ, 38 WIFI_APPIE_ASSOC_RESP, 39 WIFI_APPIE_WPA, 40 WIFI_APPIE_RSN, 41 WIFI_APPIE_WPS_PR, 42 WIFI_APPIE_WPS_AR, 43 WIFI_APPIE_MESH_QUICK, 44 WIFI_APPIE_FREQ_ERROR, 45 WIFI_APPIE_ESP_MANUFACTOR, 46 WIFI_APPIE_COUNTRY, 47 WIFI_APPIE_MAX, 48 } wifi_appie_t; 49 50 /* wifi_appie_t is in rom code and can't be changed anymore, use wifi_appie_ram_t for new app IEs */ 51 typedef enum { 52 WIFI_APPIE_RAM_BEACON = WIFI_APPIE_MAX, 53 WIFI_APPIE_RAM_PROBE_RSP, 54 WIFI_APPIE_RAM_STA_AUTH, 55 WIFI_APPIE_RAM_AP_AUTH, 56 WIFI_APPIE_RAM_MAX 57 } wifi_appie_ram_t; 58 59 enum { 60 /* this enum is in C2 ROM, do not change before WPA3_AUTH_OWE */ 61 NONE_AUTH = 0x01, 62 WPA_AUTH_UNSPEC = 0x02, 63 WPA_AUTH_PSK = 0x03, 64 WPA2_AUTH_ENT = 0x04, 65 WPA2_AUTH_PSK = 0x05, 66 WPA_AUTH_CCKM = 0x06, 67 WPA2_AUTH_CCKM = 0x07, 68 WPA2_AUTH_PSK_SHA256= 0x08, 69 WPA3_AUTH_PSK = 0x09, 70 WPA2_AUTH_ENT_SHA256= 0x0a, 71 WAPI_AUTH_PSK = 0x0b, 72 WAPI_AUTH_CERT = 0x0c, 73 WPA2_AUTH_ENT_SHA384_SUITE_B = 0x0d, 74 WPA2_AUTH_FT_PSK = 0x0e, 75 WPA3_AUTH_OWE = 0x0f, 76 /* this enum is in C2 ROM, do not change before WPA3_AUTH_OWE */ 77 WPA2_AUTH_INVALID 78 }; 79 80 typedef enum { 81 WPA2_ENT_EAP_STATE_NOT_START, 82 WPA2_ENT_EAP_STATE_IN_PROGRESS, 83 WPA2_ENT_EAP_STATE_SUCCESS, 84 WPA2_ENT_EAP_STATE_FAIL, 85 } wpa2_ent_eap_state_t; 86 87 struct wifi_appie { 88 uint16_t ie_len; 89 uint8_t ie_data[]; 90 }; 91 92 struct wifi_ssid { 93 int len; 94 uint8_t ssid[32]; 95 }; 96 97 struct wps_scan_ie { 98 uint8_t *bssid; 99 uint8_t chan; 100 uint16_t capinfo; 101 uint8_t *ssid; 102 uint8_t *wpa; 103 uint8_t *rsn; 104 uint8_t *wps; 105 }; 106 107 typedef struct { 108 int proto; 109 int pairwise_cipher; 110 int group_cipher; 111 int key_mgmt; 112 int capabilities; 113 size_t num_pmkid; 114 const u8 *pmkid; 115 int mgmt_group_cipher; 116 uint8_t rsnxe_capa; 117 } wifi_wpa_ie_t; 118 119 struct wpa_funcs { 120 bool (*wpa_sta_init)(void); 121 bool (*wpa_sta_deinit)(void); 122 int (*wpa_sta_connect)(uint8_t *bssid); 123 void (*wpa_sta_connected_cb)(uint8_t *bssid); 124 void (*wpa_sta_disconnected_cb)(uint8_t reason_code); 125 int (*wpa_sta_rx_eapol)(u8 *src_addr, u8 *buf, u32 len); 126 bool (*wpa_sta_in_4way_handshake)(void); 127 void *(*wpa_ap_init)(void); 128 bool (*wpa_ap_deinit)(void *data); 129 bool (*wpa_ap_join)(void **sm, u8 *bssid, u8 *wpa_ie, u8 wpa_ie_len, u8* rsnxe, u8 rsnxe_len, bool *pmf_enable, int subtype, uint8_t *pairwise_cipher); 130 bool (*wpa_ap_remove)(u8 *bssid); 131 uint8_t *(*wpa_ap_get_wpa_ie)(uint8_t *len); 132 bool (*wpa_ap_rx_eapol)(void *hapd_data, void *sm, u8 *data, size_t data_len); 133 void (*wpa_ap_get_peer_spp_msg)(void *sm, bool *spp_cap, bool *spp_req); 134 char *(*wpa_config_parse_string)(const char *value, size_t *len); 135 int (*wpa_parse_wpa_ie)(const u8 *wpa_ie, size_t wpa_ie_len, wifi_wpa_ie_t *data); 136 int (*wpa_config_bss)(u8 *bssid); 137 int (*wpa_michael_mic_failure)(u16 is_unicast); 138 uint8_t *(*wpa3_build_sae_msg)(uint8_t *bssid, uint32_t type, size_t *len); 139 int (*wpa3_parse_sae_msg)(uint8_t *buf, size_t len, uint32_t type, uint16_t status); 140 int (*wpa3_hostap_handle_auth)(uint8_t *buf, size_t len, uint32_t type, uint16_t status, uint8_t *bssid); 141 int (*wpa_sta_rx_mgmt)(u8 type, u8 *frame, size_t len, u8 *sender, int8_t rssi, u8 channel, u64 current_tsf); 142 void (*wpa_config_done)(void); 143 uint8_t *(*owe_build_dhie)(uint16_t group); 144 int (*owe_process_assoc_resp)(const u8 *rsn_ie, size_t rsn_len, const uint8_t *dh_ie, size_t dh_len); 145 void (*wpa_sta_clear_curr_pmksa)(void); 146 }; 147 148 struct wpa2_funcs { 149 int (*wpa2_sm_rx_eapol)(u8 *src_addr, u8 *buf, u32 len, u8 *bssid); 150 int (*wpa2_start)(void); 151 u8 (*wpa2_get_state)(void); 152 int (*wpa2_init)(void); 153 void (*wpa2_deinit)(void); 154 }; 155 156 struct wps_funcs { 157 bool (*wps_parse_scan_result)(struct wps_scan_ie *scan); 158 int (*wifi_station_wps_start)(void); 159 int (*wps_sm_rx_eapol)(u8 *src_addr, u8 *buf, u32 len); 160 int (*wps_start_pending)(void); 161 }; 162 163 typedef esp_err_t (*wifi_wpa2_fn_t)(void *); 164 typedef struct { 165 wifi_wpa2_fn_t fn; 166 void *param; 167 } wifi_wpa2_param_t; 168 169 #define IS_WPS_REGISTRAR(type) (((type)>WPS_TYPE_MAX)?(((type)<WPS_TYPE_MAX)?true:false):false) 170 #define IS_WPS_ENROLLEE(type) (((type)>WPS_TYPE_DISABLE)?(((type)<WPS_TYPE_MAX)?true:false):false) 171 172 typedef enum wps_status { 173 WPS_STATUS_DISABLE = 0, 174 WPS_STATUS_SCANNING, 175 WPS_STATUS_PENDING, 176 WPS_STATUS_SUCCESS, 177 WPS_STATUS_MAX, 178 } WPS_STATUS_t; 179 180 typedef void(*wifi_tx_cb_t)(void *); 181 typedef void(* eapol_txcb_t)(uint8_t *, size_t, bool); 182 typedef int (*wifi_ipc_fn_t)(void *); 183 typedef struct { 184 wifi_ipc_fn_t fn; 185 void *arg; 186 uint32_t arg_size; 187 } wifi_ipc_config_t; 188 189 #define WPA_IGTK_MAX_LEN 32 190 typedef struct { 191 uint8_t keyid[2]; 192 uint8_t pn[6]; 193 uint8_t igtk[WPA_IGTK_MAX_LEN]; 194 } wifi_wpa_igtk_t; 195 196 typedef struct { 197 #ifndef ETH_ALEN 198 #define ETH_ALEN 6 199 #endif 200 wifi_interface_t ifx; 201 uint8_t subtype; 202 uint32_t data_len; 203 uint8_t da[ETH_ALEN]; 204 uint8_t data[0]; 205 } wifi_mgmt_frm_req_t; 206 207 enum key_flag { 208 KEY_FLAG_MODIFY = BIT(0), 209 KEY_FLAG_DEFAULT = BIT(1), 210 KEY_FLAG_RX = BIT(2), 211 KEY_FLAG_TX = BIT(3), 212 KEY_FLAG_GROUP = BIT(4), 213 KEY_FLAG_PAIRWISE = BIT(5), 214 KEY_FLAG_PMK = BIT(6), 215 }; 216 217 uint8_t *esp_wifi_ap_get_prof_pmk_internal(void); 218 struct wifi_ssid *esp_wifi_ap_get_prof_ap_ssid_internal(void); 219 uint8_t esp_wifi_ap_get_prof_authmode_internal(void); 220 uint8_t esp_wifi_sta_get_prof_authmode_internal(void); 221 uint8_t *esp_wifi_ap_get_prof_password_internal(void); 222 struct wifi_ssid *esp_wifi_sta_get_prof_ssid_internal(void); 223 uint8_t esp_wifi_sta_get_reset_param_internal(void); 224 uint8_t esp_wifi_sta_get_pairwise_cipher_internal(void); 225 uint8_t esp_wifi_sta_get_group_cipher_internal(void); 226 bool esp_wifi_sta_prof_is_wpa_internal(void); 227 int esp_wifi_get_macaddr_internal(uint8_t if_index, uint8_t *macaddr); 228 int esp_wifi_set_appie_internal(uint8_t type, uint8_t *ie, uint16_t len, uint8_t flag); 229 int esp_wifi_unset_appie_internal(uint8_t type); 230 struct wifi_appie *esp_wifi_get_appie_internal(uint8_t type); 231 void *esp_wifi_get_hostap_private_internal(void); //1 232 uint8_t *esp_wifi_sta_get_prof_password_internal(void); 233 void esp_wifi_deauthenticate_internal(u8 reason_code); 234 uint16_t esp_wifi_get_spp_attrubute_internal(uint8_t ifx); 235 bool esp_wifi_sta_is_running_internal(void); 236 bool esp_wifi_auth_done_internal(void); 237 int esp_wifi_set_ap_key_internal(int alg, const u8 *addr, int idx, u8 *key, size_t key_len); 238 int esp_wifi_set_sta_key_internal(int alg, u8 *addr, int key_idx, int set_tx, 239 u8 *seq, size_t seq_len, u8 *key, size_t key_len, enum key_flag key_flag); 240 int esp_wifi_get_sta_key_internal(uint8_t *ifx, int *alg, u8 *addr, int *key_idx, 241 u8 *key, size_t key_len, enum key_flag key_flag); 242 bool esp_wifi_wpa_ptk_init_done_internal(uint8_t *mac); 243 uint8_t esp_wifi_sta_set_reset_param_internal(uint8_t reset_flag); 244 uint8_t esp_wifi_get_sta_gtk_index_internal(void); 245 int esp_wifi_register_tx_cb_internal(wifi_tx_cb_t fn, u8 id); 246 int esp_wifi_register_eapol_txdonecb_internal(eapol_txcb_t fn); 247 int esp_wifi_register_wpa_cb_internal(struct wpa_funcs *cb); 248 int esp_wifi_unregister_wpa_cb_internal(void); 249 int esp_wifi_get_assoc_bssid_internal(uint8_t *bssid); 250 bool esp_wifi_sta_is_ap_notify_completed_rsne_internal(void); 251 int esp_wifi_ap_deauth_internal(uint8_t *mac, uint32_t reason); 252 int esp_wifi_ipc_internal(wifi_ipc_config_t *cfg, bool sync); 253 int esp_wifi_register_wpa2_cb_internal(struct wpa2_funcs *cb); 254 int esp_wifi_unregister_wpa2_cb_internal(void); 255 bool esp_wifi_sta_prof_is_wpa2_internal(void); 256 bool esp_wifi_sta_prof_is_rsn_internal(void); 257 bool esp_wifi_sta_prof_is_wapi_internal(void); 258 esp_err_t esp_wifi_sta_wpa2_ent_disable_internal(wifi_wpa2_param_t *param); 259 esp_err_t esp_wifi_sta_wpa2_ent_enable_internal(wifi_wpa2_param_t *param); 260 esp_err_t esp_wifi_set_wpa2_ent_state_internal(wpa2_ent_eap_state_t state); 261 int esp_wifi_get_wps_type_internal(void); 262 int esp_wifi_set_wps_type_internal(uint32_t type); 263 int esp_wifi_get_wps_status_internal(void); 264 int esp_wifi_set_wps_status_internal(uint32_t status); 265 int esp_wifi_disarm_sta_connection_timer_internal(void); 266 bool esp_wifi_get_sniffer_internal(void); 267 int esp_wifi_set_wps_cb_internal(struct wps_funcs *wps_cb); 268 bool esp_wifi_enable_sta_privacy_internal(void); 269 uint8_t esp_wifi_get_user_init_flag_internal(void); 270 esp_err_t esp_wifi_internal_supplicant_header_md5_check(const char *md5); 271 int esp_wifi_sta_update_ap_info_internal(void); 272 uint8_t *esp_wifi_sta_get_ap_info_prof_pmk_internal(void); 273 esp_err_t esp_wifi_set_wps_start_flag_internal(bool start); 274 uint16_t esp_wifi_sta_pmf_enabled(void); 275 wifi_cipher_type_t esp_wifi_sta_get_mgmt_group_cipher(void); 276 int esp_wifi_set_igtk_internal(uint8_t if_index, const wifi_wpa_igtk_t *igtk); 277 esp_err_t esp_wifi_internal_issue_disconnect(uint8_t reason_code); 278 bool esp_wifi_skip_supp_pmkcaching(void); 279 bool esp_wifi_is_rm_enabled_internal(uint8_t if_index); 280 bool esp_wifi_is_btm_enabled_internal(uint8_t if_index); 281 esp_err_t esp_wifi_register_mgmt_frame_internal(uint32_t type, uint32_t subtype); 282 esp_err_t esp_wifi_send_mgmt_frm_internal(const wifi_mgmt_frm_req_t *req); 283 uint8_t esp_wifi_ap_get_prof_pairwise_cipher_internal(void); 284 esp_err_t esp_wifi_action_tx_req(uint8_t type, uint8_t channel, 285 uint32_t wait_time_ms, const wifi_action_tx_req_t *req); 286 esp_err_t esp_wifi_remain_on_channel(uint8_t ifx, uint8_t type, uint8_t channel, 287 uint32_t wait_time_ms, wifi_action_rx_cb_t rx_cb); 288 bool esp_wifi_is_mbo_enabled_internal(uint8_t if_index); 289 void esp_wifi_get_pmf_config_internal(wifi_pmf_config_t *pmf_cfg, uint8_t ifx); 290 bool esp_wifi_is_ft_enabled_internal(uint8_t if_index); 291 uint8_t esp_wifi_sta_get_config_sae_pk_internal(void); 292 void esp_wifi_sta_disable_sae_pk_internal(void); 293 void esp_wifi_sta_disable_wpa2_authmode_internal(void); 294 void esp_wifi_sta_disable_owe_trans_internal(void); 295 uint8_t esp_wifi_ap_get_max_sta_conn(void); 296 uint8_t esp_wifi_get_config_sae_pwe_h2e_internal(uint8_t ifx); 297 bool esp_wifi_ap_notify_node_sae_auth_done(uint8_t *mac); 298 bool esp_wifi_ap_is_sta_sae_reauth_node(uint8_t *mac); 299 uint8_t* esp_wifi_sta_get_sae_identifier_internal(void); 300 bool esp_wifi_eb_tx_status_success_internal(void *eb); 301 uint8_t* esp_wifi_sta_get_rsnxe(u8 *bssid); 302 esp_err_t esp_wifi_sta_connect_internal(const uint8_t *bssid); 303 void esp_wifi_enable_sae_pk_only_mode_internal(void); 304 305 #endif /* _ESP_WIFI_DRIVER_H_ */ 306