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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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, &param, 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