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