1 /*
2  * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef __BLUFI_INT_H__
8 #define __BLUFI_INT_H__
9 
10 #include "btc/btc_task.h"
11 #include "esp_blufi_api.h"
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 #if (BLUFI_INCLUDED == TRUE)
18 
19 #define BTC_BLUFI_GREAT_VER   0x01  //Version + Subversion
20 #define BTC_BLUFI_SUB_VER     0x03  //Version + Subversion
21 #define BTC_BLUFI_VERSION     ((BTC_BLUFI_GREAT_VER<<8)|BTC_BLUFI_SUB_VER)  //Version + Subversion
22 
23 typedef UINT8 tGATT_IF;
24 /* service engine control block */
25 typedef struct {
26     /* Protocol reference */
27     tGATT_IF                gatt_if;
28     UINT8                   srvc_inst;
29     UINT16                  handle_srvc;
30     UINT16                  handle_char_p2e;
31     UINT16                  handle_char_e2p;
32     UINT16                  handle_descr_e2p;
33     UINT16                  conn_id;
34     BOOLEAN                 is_connected;
35     BD_ADDR                 remote_bda;
36     UINT32                  trans_id;
37     UINT8                   congest;
38     UINT16                  frag_size;
39 // Deprecated: This macro will be removed in the future
40 #define BLUFI_PREPAIR_BUF_MAX_SIZE 1024
41 #define BLUFI_PREPARE_BUF_MAX_SIZE 1024
42     uint8_t                 *prepare_buf;
43     int                     prepare_len;
44     /* Control reference */
45     esp_blufi_callbacks_t   *cbs;
46     BOOLEAN                 enabled;
47     uint8_t                 send_seq;
48     uint8_t                 recv_seq;
49     uint8_t                 sec_mode;
50     uint8_t                 *aggr_buf;
51     uint16_t                 total_len;
52     uint16_t                offset;
53 } tBLUFI_ENV;
54 
55 /* BLUFI protocol */
56 struct blufi_hdr{
57     uint8_t type;
58     uint8_t fc;
59     uint8_t seq;
60     uint8_t data_len;
61     uint8_t data[0];
62 };
63 typedef struct blufi_hdr blufi_hd_t;
64 
65 struct blufi_frag_hdr {
66     uint8_t type;
67     uint8_t fc;
68     uint8_t seq;
69     uint8_t data_len;
70     uint16_t total_len;
71     uint8_t content[0];
72 };
73 typedef struct blufi_frag_hdr blufi_frag_hdr_t;
74 
75 #if GATT_DYNAMIC_MEMORY == FALSE
76 extern tBLUFI_ENV blufi_env;
77 #else
78 extern tBLUFI_ENV *blufi_env_ptr;
79 #define blufi_env (*blufi_env_ptr)
80 #endif
81 
82 #define BLUFI_DATA_SEC_MODE_CHECK_MASK  0x01
83 #define BLUFI_DATA_SEC_MODE_ENC_MASK    0x02
84 #define BLUFI_CTRL_SEC_MODE_CHECK_MASK  0x10
85 #define BLUFI_CTRL_SEC_MODE_ENC_MASK    0x20
86 #define BLUFI_MAX_DATA_LEN              255
87 
88 // packet type
89 #define BLUFI_TYPE_MASK         0x03
90 #define BLUFI_TYPE_SHIFT        0
91 #define BLUFI_SUBTYPE_MASK      0xFC
92 #define BLUFI_SUBTYPE_SHIFT     2
93 
94 #define BLUFI_GET_TYPE(type)    ((type) & BLUFI_TYPE_MASK)
95 #define BLUFI_GET_SUBTYPE(type) (((type) & BLUFI_SUBTYPE_MASK) >>BLUFI_SUBTYPE_SHIFT)
96 #define BLUFI_BUILD_TYPE(type, subtype) (((type) & BLUFI_TYPE_MASK) | ((subtype)<<BLUFI_SUBTYPE_SHIFT))
97 
98 #define BLUFI_TYPE_CTRL                                 0x0
99 #define BLUFI_TYPE_CTRL_SUBTYPE_ACK                     0x00
100 #define BLUFI_TYPE_CTRL_SUBTYPE_SET_SEC_MODE            0x01
101 #define BLUFI_TYPE_CTRL_SUBTYPE_SET_WIFI_OPMODE         0x02
102 #define BLUFI_TYPE_CTRL_SUBTYPE_CONN_TO_AP              0x03
103 #define BLUFI_TYPE_CTRL_SUBTYPE_DISCONN_FROM_AP         0x04
104 #define BLUFI_TYPE_CTRL_SUBTYPE_GET_WIFI_STATUS         0x05
105 #define BLUFI_TYPE_CTRL_SUBTYPE_DEAUTHENTICATE_STA      0x06
106 #define BLUFI_TYPE_CTRL_SUBTYPE_GET_VERSION             0x07
107 #define BLUFI_TYPE_CTRL_SUBTYPE_DISCONNECT_BLE          0x08
108 #define BLUFI_TYPE_CTRL_SUBTYPE_GET_WIFI_LIST           0x09
109 
110 #define BLUFI_TYPE_DATA                                 0x1
111 #define BLUFI_TYPE_DATA_SUBTYPE_NEG                     0x00
112 #define BLUFI_TYPE_DATA_SUBTYPE_STA_BSSID               0x01
113 #define BLUFI_TYPE_DATA_SUBTYPE_STA_SSID                0x02
114 #define BLUFI_TYPE_DATA_SUBTYPE_STA_PASSWD              0x03
115 #define BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_SSID             0x04
116 #define BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_PASSWD           0x05
117 #define BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_MAX_CONN_NUM     0x06
118 #define BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_AUTH_MODE        0x07
119 #define BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_CHANNEL          0x08
120 #define BLUFI_TYPE_DATA_SUBTYPE_USERNAME                0x09
121 #define BLUFI_TYPE_DATA_SUBTYPE_CA                      0x0a
122 #define BLUFI_TYPE_DATA_SUBTYPE_CLIENT_CERT             0x0b
123 #define BLUFI_TYPE_DATA_SUBTYPE_SERVER_CERT             0x0c
124 #define BLUFI_TYPE_DATA_SUBTYPE_CLIENT_PRIV_KEY         0x0d
125 #define BLUFI_TYPE_DATA_SUBTYPE_SERVER_PRIV_KEY         0x0e
126 #define BLUFI_TYPE_DATA_SUBTYPE_WIFI_REP                0x0f
127 #define BLUFI_TYPE_DATA_SUBTYPE_REPLY_VERSION           0x10
128 #define BLUFI_TYPE_DATA_SUBTYPE_WIFI_LIST               0x11
129 #define BLUFI_TYPE_DATA_SUBTYPE_ERROR_INFO              0x12
130 #define BLUFI_TYPE_DATA_SUBTYPE_CUSTOM_DATA             0x13
131 #define BLUFI_TYPE_DATA_SUBTYPE_STA_MAX_CONN_RETRY      0x14
132 #define BLUFI_TYPE_DATA_SUBTYPE_STA_CONN_END_REASON     0x15
133 #define BLUFI_TYPE_DATA_SUBTYPE_STA_CONN_RSSI           0x16
134 #define BLUFI_TYPE_IS_CTRL(type)        (BLUFI_GET_TYPE((type)) == BLUFI_TYPE_CTRL)
135 #define BLUFI_TYPE_IS_DATA(type)        (BLUFI_GET_TYPE((type)) == BLUFI_TYPE_DATA)
136 
137 #define BLUFI_TYPE_IS_CTRL_ACK(type)                 (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_ACK)
138 #define BLUFI_TYPE_IS_CTRL_START_NEG(type)           (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_START_NEG)
139 #define BLUFI_TYPE_IS_CTRL_STOP_NEG(type)            (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_STOP_NEG)
140 #define BLUFI_TYPE_IS_CTRL_SET_WIFI_OPMODE(type)     (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_SET_WIFI_OPMODE)
141 #define BLUFI_TYPE_IS_CTRL_CONN_WIFI(type)           (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_CONN_TO_AP)
142 #define BLUFI_TYPE_IS_CTRL_DISCONN_WIFI(type)        (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_DISCONN_FROM_AP)
143 #define BLUFI_TYPE_IS_CTRL_GET_WIFI_STATUS(type)     (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_GET_WIFI_STATUS)
144 #define BLUFI_TYPE_IS_CTRL_DEAUTHENTICATE_STA(type)  (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_DEAUTHENTICATE_STA)
145 #define BLUFI_TYPE_IS_CTRL_GET_VERSION(type)         (BLUFI_TYPE_IS_CTRL((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_CTRL_SUBTYPE_GET_VERSION)
146 
147 #define BLUFI_TYPE_IS_DATA_NEG(type)                 (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_NEG)
148 #define BLUFI_TYPE_IS_DATA_STA_BSSID(type)           (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_STA_BSSID)
149 #define BLUFI_TYPE_IS_DATA_STA_SSID(type)            (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_STA_SSID)
150 #define BLUFI_TYPE_IS_DATA_STA_PASSWD(type)          (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_STA_PASSWD)
151 #define BLUFI_TYPE_IS_DATA_SOFTAP_SSID(type)         (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_SSID)
152 #define BLUFI_TYPE_IS_DATA_SOFTAP_PASSWD(type)       (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_PASSWD)
153 #define BLUFI_TYPE_IS_DATA_SOFTAP_MAX_CONN_NUM(type) (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_MAX_CONN_NUM)
154 #define BLUFI_TYPE_IS_DATA_SOFTAP_AUTH_MODE(type)    (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_AUTH_MODE)
155 #define BLUFI_TYPE_IS_DATA_SOFTAP_CHANNEL(type)      (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SOFTAP_CHANNEL)
156 #define BLUFI_TYPE_IS_DATA_USERNAME(type)            (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_USERNAME)
157 #define BLUFI_TYPE_IS_DATA_CA(type)                  (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_CA)
158 #define BLUFI_TYPE_IS_DATA_CLEINT_CERT(type)         (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_CLIENT_CERT)
159 #define BLUFI_TYPE_IS_DATA_SERVER_CERT(type)         (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SERVER_CERT)
160 #define BLUFI_TYPE_IS_DATA_CLIENT_PRIV_KEY(type)     (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_CLIENT_PRIV_KEY)
161 #define BLUFI_TYPE_IS_DATA_SERVER_PRIV_KEY(type)     (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_SERVER_PRIV_KEY)
162 #define BLUFI_TYPE_IS_DATA_ERROR_INFO(type)          (BLUFI_TYPE_IS_DATA((type)) && BLUFI_GET_SUBTYPE((type)) == BLUFI_TYPE_DATA_SUBTYPE_ERROR_INFO)
163 
164 // packet frame control
165 #define BLUFI_FC_ENC_MASK       0x01
166 #define BLUFI_FC_CHECK_MASK     0x02
167 #define BLUFI_FC_DIR_MASK       0x04
168 #define BLUFI_FC_REQ_ACK_MASK   0x08
169 #define BLUFI_FC_FRAG_MASK      0x10
170 
171 #define BLUFI_FC_ENC            0x01
172 #define BLUFI_FC_CHECK          0x02
173 #define BLUFI_FC_DIR_P2E        0x00
174 #define BLUFI_FC_DIR_E2P        0x04
175 #define BLUFI_FC_REQ_ACK        0x08
176 #define BLUFI_FC_FRAG           0x10
177 
178 #define BLUFI_FC_IS_ENC(fc)       ((fc) & BLUFI_FC_ENC_MASK)
179 #define BLUFI_FC_IS_CHECK(fc)     ((fc) & BLUFI_FC_CHECK_MASK)
180 #define BLUFI_FC_IS_DIR_P2E(fc)   ((fc) & BLUFI_FC_DIR_P2E_MASK)
181 #define BLUFI_FC_IS_DIR_E2P(fc)   (!((fc) & BLUFI_DIR_P2E_MASK))
182 #define BLUFI_FC_IS_REQ_ACK(fc)   ((fc) & BLUFI_FC_REQ_ACK_MASK)
183 #define BLUFI_FC_IS_FRAG(fc)      ((fc) & BLUFI_FC_FRAG_MASK)
184 
185 /* default GATT MTU size over LE link
186 */
187 #define GATT_DEF_BLE_MTU_SIZE               23
188 /* BLUFI HEADER + TOTAL(REMAIN) LENGTH + CRC + L2CAP RESERVED */
189 #define BLUFI_MTU_RESERVED_SIZE     (sizeof(struct blufi_hdr) + 2 + 2 + 3)
190 #define BLUFI_FRAG_DATA_DEFAULT_LEN (GATT_DEF_BLE_MTU_SIZE - BLUFI_MTU_RESERVED_SIZE)
191 
192 //function declare
193 void btc_blufi_protocol_handler(uint8_t type, uint8_t *data, int len);
194 
195 void btc_blufi_send_encap(uint8_t type, uint8_t *data, int data_len);
196 
197 void btc_blufi_set_callbacks(esp_blufi_callbacks_t *callbacks);
198 
199 void btc_blufi_cb_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src);
200 
201 void btc_blufi_cb_deep_free(btc_msg_t *msg);
202 
203 #endif ///BLUFI_INCLUDED == TRUE
204 
205 #ifdef __cplusplus
206 }
207 #endif
208 
209 #endif  /* __BLUFI_INT_H__ */
210