1 /*
2 * Copyright (c) 2025 Arduino SA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #ifndef ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_UTIL_H_
8 #define ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_UTIL_H_
9
esp_hosted_mac_to_str(const uint8_t * mac_bytes,uint8_t * mac_str)10 static inline void esp_hosted_mac_to_str(const uint8_t *mac_bytes, uint8_t *mac_str)
11 {
12 static const char *hex = "0123456789ABCDEF";
13
14 for (int i = 0; i < 6; i++) {
15 *mac_str++ = hex[(mac_bytes[i] >> 4) & 0x0F];
16 *mac_str++ = hex[mac_bytes[i] & 0x0F];
17 if (i < 5) {
18 *mac_str++ = ':';
19 }
20 }
21 }
22
esp_hosted_str_to_mac(const uint8_t * mac_str,uint8_t * mac_bytes)23 static inline void esp_hosted_str_to_mac(const uint8_t *mac_str, uint8_t *mac_bytes)
24 {
25 uint8_t byte = 0;
26
27 for (int i = 0; i < ESP_HOSTED_MAC_STR_LEN; i++) {
28 char c = mac_str[i];
29
30 if (c >= '0' && c <= '9') {
31 byte = (byte << 4) | (c - '0');
32 } else if (c >= 'a' && c <= 'f') {
33 byte = (byte << 4) | (c - 'a' + 10);
34 } else if (c >= 'A' && c <= 'F') {
35 byte = (byte << 4) | (c - 'A' + 10);
36 }
37 if (c == ':' || (i + 1) == ESP_HOSTED_MAC_STR_LEN) {
38 *mac_bytes++ = byte;
39 byte = 0;
40 }
41 }
42 }
43
esp_hosted_prot_to_sec(Ctrl_WifiSecProt sec_prot)44 static inline enum wifi_security_type esp_hosted_prot_to_sec(Ctrl_WifiSecProt sec_prot)
45 {
46 switch (sec_prot) {
47 case Ctrl_WifiSecProt_Open:
48 return WIFI_SECURITY_TYPE_NONE;
49 case Ctrl_WifiSecProt_WEP:
50 return WIFI_SECURITY_TYPE_WEP;
51 case Ctrl_WifiSecProt_WPA_PSK:
52 return WIFI_SECURITY_TYPE_WPA_PSK;
53 case Ctrl_WifiSecProt_WPA2_PSK:
54 return WIFI_SECURITY_TYPE_PSK;
55 case Ctrl_WifiSecProt_WPA2_ENTERPRISE:
56 return WIFI_SECURITY_TYPE_EAP;
57 case Ctrl_WifiSecProt_WPA3_PSK:
58 return WIFI_SECURITY_TYPE_SAE;
59 case Ctrl_WifiSecProt_WPA2_WPA3_PSK:
60 case Ctrl_WifiSecProt_WPA_WPA2_PSK:
61 return WIFI_SECURITY_TYPE_WPA_AUTO_PERSONAL;
62 default:
63 return WIFI_SECURITY_TYPE_UNKNOWN;
64 }
65 }
66
esp_hosted_sec_to_prot(enum wifi_security_type sec_type)67 static inline Ctrl_WifiSecProt esp_hosted_sec_to_prot(enum wifi_security_type sec_type)
68 {
69 switch (sec_type) {
70 case WIFI_SECURITY_TYPE_NONE:
71 return Ctrl_WifiSecProt_Open;
72 case WIFI_SECURITY_TYPE_WEP:
73 return Ctrl_WifiSecProt_WEP;
74 case WIFI_SECURITY_TYPE_WPA_PSK:
75 return Ctrl_WifiSecProt_WPA_PSK;
76 case WIFI_SECURITY_TYPE_PSK:
77 return Ctrl_WifiSecProt_WPA2_PSK;
78 case WIFI_SECURITY_TYPE_EAP:
79 return Ctrl_WifiSecProt_WPA2_ENTERPRISE;
80 case WIFI_SECURITY_TYPE_SAE:
81 return Ctrl_WifiSecProt_WPA3_PSK;
82 case WIFI_SECURITY_TYPE_WPA_AUTO_PERSONAL:
83 return Ctrl_WifiSecProt_WPA2_WPA3_PSK;
84 default:
85 return -1;
86 }
87 }
88
esp_hosted_ctrl_response(CtrlMsg * ctrl_msg)89 static inline int esp_hosted_ctrl_response(CtrlMsg *ctrl_msg)
90 {
91 /* Response values are located at a different offsets. */
92 switch (ctrl_msg->msg_id) {
93 case CtrlMsgId_Resp_GetMacAddress:
94 return ctrl_msg->resp_get_mac_address.resp;
95 case CtrlMsgId_Resp_SetMacAddress:
96 return ctrl_msg->resp_set_mac_address.resp;
97 case CtrlMsgId_Resp_GetWifiMode:
98 return ctrl_msg->resp_get_wifi_mode.resp;
99 case CtrlMsgId_Resp_SetWifiMode:
100 return ctrl_msg->resp_set_wifi_mode.resp;
101 case CtrlMsgId_Resp_GetAPScanList:
102 return ctrl_msg->resp_scan_ap_list.resp;
103 case CtrlMsgId_Resp_GetAPConfig:
104 return ctrl_msg->resp_get_ap_config.resp;
105 case CtrlMsgId_Resp_ConnectAP:
106 return ctrl_msg->resp_connect_ap.resp;
107 case CtrlMsgId_Resp_DisconnectAP:
108 return ctrl_msg->resp_disconnect_ap.resp;
109 case CtrlMsgId_Resp_GetSoftAPConfig:
110 return ctrl_msg->resp_get_softap_config.resp;
111 case CtrlMsgId_Resp_SetSoftAPVendorSpecificIE:
112 return ctrl_msg->resp_set_softap_vendor_specific_ie.resp;
113 case CtrlMsgId_Resp_StartSoftAP:
114 return ctrl_msg->resp_start_softap.resp;
115 case CtrlMsgId_Resp_GetSoftAPConnectedSTAList:
116 return ctrl_msg->resp_softap_connected_stas_list.resp;
117 case CtrlMsgId_Resp_StopSoftAP:
118 return ctrl_msg->resp_stop_softap.resp;
119 case CtrlMsgId_Resp_SetPowerSaveMode:
120 return ctrl_msg->resp_set_power_save_mode.resp;
121 case CtrlMsgId_Resp_GetPowerSaveMode:
122 return ctrl_msg->resp_get_power_save_mode.resp;
123 case CtrlMsgId_Resp_OTABegin:
124 return ctrl_msg->resp_ota_begin.resp;
125 case CtrlMsgId_Resp_OTAWrite:
126 return ctrl_msg->resp_ota_write.resp;
127 case CtrlMsgId_Resp_OTAEnd:
128 return ctrl_msg->resp_ota_end.resp;
129 case CtrlMsgId_Resp_SetWifiMaxTxPower:
130 return ctrl_msg->resp_set_wifi_max_tx_power.resp;
131 case CtrlMsgId_Resp_GetWifiCurrTxPower:
132 return ctrl_msg->resp_get_wifi_curr_tx_power.resp;
133 case CtrlMsgId_Resp_ConfigHeartbeat:
134 return ctrl_msg->resp_config_heartbeat.resp;
135 default:
136 return -1;
137 }
138 }
139
140 #if CONFIG_WIFI_ESP_HOSTED_DEBUG
esp_hosted_frame_dump(esp_frame_t * frame)141 static void esp_hosted_frame_dump(esp_frame_t *frame)
142 {
143 static const char *const if_strs[] = {"STA", "AP", "SERIAL", "HCI", "PRIV", "TEST"};
144
145 if (frame->if_type > ESP_HOSTED_MAX_IF) {
146 return;
147 }
148 LOG_DBG("esp header: if %s_IF length %d offset %d checksum %d seq %d flags %x",
149 if_strs[frame->if_type], frame->len, frame->offset, frame->checksum, frame->seq_num,
150 frame->flags);
151
152 if (frame->if_type == ESP_HOSTED_SERIAL_IF) {
153 LOG_DBG("tlv header: ep_type %d ep_length %d ep_value %.8s data_type %d "
154 "data_length %d",
155 frame->ep_type, frame->ep_length, frame->ep_value, frame->data_type,
156 frame->data_length);
157 }
158 }
159 #endif
160
esp_hosted_frame_checksum(esp_frame_t * frame)161 static inline uint16_t esp_hosted_frame_checksum(esp_frame_t *frame)
162 {
163 uint16_t checksum = 0;
164 uint8_t *buf = (uint8_t *)frame;
165
166 frame->checksum = 0;
167 for (size_t i = 0; i < (frame->len + ESP_FRAME_HEADER_SIZE); i++) {
168 checksum += buf[i];
169 }
170
171 return checksum;
172 }
173
174 #endif /* ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_UTIL_H_ */
175