1 /*
2 * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <stdint.h>
8
9 #include <string.h>
10 #include <stdbool.h>
11 #include <stdio.h>
12
13 #include "btc_blufi_prf.h"
14 #include "btc/btc_task.h"
15 #include "btc/btc_manage.h"
16
17 #include "blufi_int.h"
18
19 //#include "esp_wifi.h"
20 #if (BLUFI_INCLUDED == TRUE)
21
btc_blufi_protocol_handler(uint8_t type,uint8_t * data,int len)22 void btc_blufi_protocol_handler(uint8_t type, uint8_t *data, int len)
23 {
24 btc_msg_t msg;
25 esp_blufi_cb_param_t param;
26 uint8_t *output_data = NULL;
27 int output_len = 0;
28 bool need_free = false;
29
30 switch (BLUFI_GET_TYPE(type)) {
31 case BLUFI_TYPE_CTRL:
32 switch (BLUFI_GET_SUBTYPE(type)) {
33 case BLUFI_TYPE_CTRL_SUBTYPE_ACK:
34 /* TODO: check sequence */
35 break;
36 case BLUFI_TYPE_CTRL_SUBTYPE_SET_SEC_MODE:
37 blufi_env.sec_mode = data[0];
38 break;
39 case BLUFI_TYPE_CTRL_SUBTYPE_SET_WIFI_OPMODE:
40 msg.sig = BTC_SIG_API_CB;
41 msg.pid = BTC_PID_BLUFI;
42 msg.act = ESP_BLUFI_EVENT_SET_WIFI_OPMODE;
43 param.wifi_mode.op_mode = data[0];
44
45 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
46 break;
47 case BLUFI_TYPE_CTRL_SUBTYPE_CONN_TO_AP:
48 msg.sig = BTC_SIG_API_CB;
49 msg.pid = BTC_PID_BLUFI;
50 msg.act = ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP;
51
52 btc_transfer_context(&msg, NULL, 0, NULL, NULL);
53 break;
54 case BLUFI_TYPE_CTRL_SUBTYPE_DISCONN_FROM_AP:
55 msg.sig = BTC_SIG_API_CB;
56 msg.pid = BTC_PID_BLUFI;
57 msg.act = ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP;
58
59 btc_transfer_context(&msg, NULL, 0, NULL, NULL);
60 break;
61 case BLUFI_TYPE_CTRL_SUBTYPE_GET_WIFI_STATUS:
62 msg.sig = BTC_SIG_API_CB;
63 msg.pid = BTC_PID_BLUFI;
64 msg.act = ESP_BLUFI_EVENT_GET_WIFI_STATUS;
65
66 btc_transfer_context(&msg, NULL, 0, NULL, NULL);
67 break;
68 case BLUFI_TYPE_CTRL_SUBTYPE_DEAUTHENTICATE_STA:
69 msg.sig = BTC_SIG_API_CB;
70 msg.pid = BTC_PID_BLUFI;
71 msg.act = ESP_BLUFI_EVENT_DEAUTHENTICATE_STA;
72
73 btc_transfer_context(&msg, NULL, 0, NULL,NULL);
74 break;
75 case BLUFI_TYPE_CTRL_SUBTYPE_GET_VERSION: {
76 uint8_t type = BLUFI_BUILD_TYPE(BLUFI_TYPE_DATA, BLUFI_TYPE_DATA_SUBTYPE_REPLY_VERSION);
77 uint8_t data[2];
78
79 data[0] = BTC_BLUFI_GREAT_VER;
80 data[1] = BTC_BLUFI_SUB_VER;
81 btc_blufi_send_encap(type, &data[0], sizeof(data));
82 break;
83 }
84 case BLUFI_TYPE_CTRL_SUBTYPE_DISCONNECT_BLE:
85 msg.sig = BTC_SIG_API_CB;
86 msg.pid = BTC_PID_BLUFI;
87 msg.act = ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE;
88 btc_transfer_context(&msg, NULL, 0, NULL, NULL);
89 break;
90 case BLUFI_TYPE_CTRL_SUBTYPE_GET_WIFI_LIST:
91 msg.sig = BTC_SIG_API_CB;
92 msg.pid = BTC_PID_BLUFI;
93 msg.act = ESP_BLUFI_EVENT_GET_WIFI_LIST;
94 btc_transfer_context(&msg, NULL, 0, NULL, NULL);
95 break;
96 default:
97 BTC_TRACE_ERROR("%s Unkown Ctrl pkt %02x\n", __func__, type);
98 break;
99 }
100 break;
101 case BLUFI_TYPE_DATA:
102 switch (BLUFI_GET_SUBTYPE(type)) {
103 case BLUFI_TYPE_DATA_SUBTYPE_NEG:
104 if (blufi_env.cbs && blufi_env.cbs->negotiate_data_handler) {
105 blufi_env.cbs->negotiate_data_handler(data, len, &output_data, &output_len, &need_free);
106 }
107
108 if (output_data && output_len > 0) {
109 btc_blufi_send_encap(BLUFI_BUILD_TYPE(BLUFI_TYPE_DATA, BLUFI_TYPE_DATA_SUBTYPE_NEG),
110 output_data, output_len);
111 }
112 break;
113 case BLUFI_TYPE_DATA_SUBTYPE_STA_BSSID:
114 msg.sig = BTC_SIG_API_CB;
115 msg.pid = BTC_PID_BLUFI;
116 msg.act = ESP_BLUFI_EVENT_RECV_STA_BSSID;
117 memcpy(param.sta_bssid.bssid, &data[0], 6);
118
119 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
120 break;
121 case BLUFI_TYPE_DATA_SUBTYPE_STA_SSID:
122 msg.sig = BTC_SIG_API_CB;
123 msg.pid = BTC_PID_BLUFI;
124 msg.act = ESP_BLUFI_EVENT_RECV_STA_SSID;
125 param.sta_ssid.ssid = &data[0];
126 param.sta_ssid.ssid_len = len;
127
128 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
129 break;
130 case BLUFI_TYPE_DATA_SUBTYPE_STA_PASSWD:
131 msg.sig = BTC_SIG_API_CB;
132 msg.pid = BTC_PID_BLUFI;
133 msg.act = ESP_BLUFI_EVENT_RECV_STA_PASSWD;
134 param.sta_passwd.passwd = &data[0];
135 param.sta_passwd.passwd_len = len;
136
137 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
138 break;
139 case BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_SSID:
140 msg.sig = BTC_SIG_API_CB;
141 msg.pid = BTC_PID_BLUFI;
142 msg.act = ESP_BLUFI_EVENT_RECV_SOFTAP_SSID;
143 param.softap_ssid.ssid = &data[0];
144 param.softap_ssid.ssid_len = len;
145
146 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
147 break;
148 case BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_PASSWD:
149 msg.sig = BTC_SIG_API_CB;
150 msg.pid = BTC_PID_BLUFI;
151 msg.act = ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD;
152 param.softap_passwd.passwd = &data[0];
153 param.softap_passwd.passwd_len = len;
154
155 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
156 break;
157 case BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_MAX_CONN_NUM:
158 msg.sig = BTC_SIG_API_CB;
159 msg.pid = BTC_PID_BLUFI;
160 msg.act = ESP_BLUFI_EVENT_RECV_SOFTAP_MAX_CONN_NUM;
161 param.softap_max_conn_num.max_conn_num = data[0];
162
163 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
164 break;
165 case BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_AUTH_MODE:
166 msg.sig = BTC_SIG_API_CB;
167 msg.pid = BTC_PID_BLUFI;
168 msg.act = ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE;
169 param.softap_auth_mode.auth_mode = data[0];
170
171 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
172 break;
173 case BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_CHANNEL:
174 msg.sig = BTC_SIG_API_CB;
175 msg.pid = BTC_PID_BLUFI;
176 msg.act = ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL;
177 param.softap_channel.channel = data[0];
178
179 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
180 break;
181 case BLUFI_TYPE_DATA_SUBTYPE_USERNAME:
182 msg.sig = BTC_SIG_API_CB;
183 msg.pid = BTC_PID_BLUFI;
184 msg.act = ESP_BLUFI_EVENT_RECV_USERNAME;
185 param.username.name = &data[0];
186 param.username.name_len = len;
187
188 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
189 break;
190 case BLUFI_TYPE_DATA_SUBTYPE_CA:
191 msg.sig = BTC_SIG_API_CB;
192 msg.pid = BTC_PID_BLUFI;
193 msg.act = ESP_BLUFI_EVENT_RECV_CA_CERT;
194 param.ca.cert = &data[0];
195 param.ca.cert_len = len;
196
197 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
198 break;
199 case BLUFI_TYPE_DATA_SUBTYPE_CLIENT_CERT:
200 msg.sig = BTC_SIG_API_CB;
201 msg.pid = BTC_PID_BLUFI;
202 msg.act = ESP_BLUFI_EVENT_RECV_CLIENT_CERT;
203 param.client_cert.cert = &data[0];
204 param.client_cert.cert_len = len;
205
206 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
207 break;
208 case BLUFI_TYPE_DATA_SUBTYPE_SERVER_CERT:
209 msg.sig = BTC_SIG_API_CB;
210 msg.pid = BTC_PID_BLUFI;
211 msg.act = ESP_BLUFI_EVENT_RECV_SERVER_CERT;
212 param.client_cert.cert = &data[0];
213 param.client_cert.cert_len = len;
214
215 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
216 break;
217 case BLUFI_TYPE_DATA_SUBTYPE_CLIENT_PRIV_KEY:
218 msg.sig = BTC_SIG_API_CB;
219 msg.pid = BTC_PID_BLUFI;
220 msg.act = ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY;
221 param.client_pkey.pkey = &data[0];
222 param.client_pkey.pkey_len = len;
223
224 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
225 break;
226 case BLUFI_TYPE_DATA_SUBTYPE_SERVER_PRIV_KEY:
227 msg.sig = BTC_SIG_API_CB;
228 msg.pid = BTC_PID_BLUFI;
229 msg.act = ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY;
230 param.client_pkey.pkey = &data[0];
231 param.client_pkey.pkey_len = len;
232
233 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
234 break;
235 case BLUFI_TYPE_DATA_SUBTYPE_CUSTOM_DATA:
236 msg.sig = BTC_SIG_API_CB;
237 msg.pid = BTC_PID_BLUFI;
238 msg.act = ESP_BLUFI_EVENT_RECV_CUSTOM_DATA;
239 param.custom_data.data = &data[0];
240 param.custom_data.data_len = len;
241 btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy, btc_blufi_cb_deep_free);
242 break;
243 default:
244 BTC_TRACE_ERROR("%s Unkown Ctrl pkt %02x\n", __func__, type);
245 break;
246 }
247 break;
248 default:
249 break;
250 }
251 }
252
253 #endif ///BLUFI_INCLUDED == TRUE
254