1 /*
2 * Copyright (c) 2021 WinnerMicro Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 /*
17 * INCLUDE FILES
18 ****************************************************************************************
19 */
20
21 #include <string.h>
22 #include <stdio.h>
23 #include <stdint.h>
24 #include <stdbool.h>
25
26 #include "ohos_bt_gatt.h"
27 #include "ohos_bt_gatt_server.h"
28 #include "ohos_bt_gatt_client.h"
29
30 #include "host/ble_hs.h"
31 #include "host/util/util.h"
32
33 #include "wm_ble.h"
34 #include "wm_bt_def.h"
35 #include "ble_util.h"
36 #include "nble_server.h"
37
38 /*
39 * GLOBAL VARIABLE DEFINITIONS
40 ****************************************************************************************
41 */
42
43 static volatile tls_bt_state_t bt_adapter_state = WM_BT_STATE_OFF;
44 static volatile bool ble_system_state_on = false;
45
46 /* back up the structure function pointer */
47 static BtGattClientCallbacks *gattc_struct_func_ptr_cb = NULL;
48 static BtGattServerCallbacks *gatts_struct_func_ptr_cb = NULL;
49 static BtGattCallbacks *gap_func_ptr_cb = NULL;
50
51 static StartAdvRawData g_adv_raw_data;
52 static BleAdvParams g_adv_param;
53 static uint16_t g_conn_handle;
54
55 typedef enum {
56 WM_BT_SYSTEM_ACTION_IDLE,
57 WM_BT_SYSTEM_ACTION_ENABLING,
58 WM_BT_SYSTEM_ACTION_DISABLING
59 } bt_system_action_t;
60 static volatile bt_system_action_t bt_system_action = WM_BT_SYSTEM_ACTION_IDLE;
61
62 /*
63 * LOCAL FUNCTION DECLARATIONS
64 ****************************************************************************************
65 */
66
67 static void on_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg);
68 static int gap_event(struct ble_gap_event *event, void *arg);
69
70 /*
71 * LOCAL FUNCTION DEFINITIONS
72 ****************************************************************************************
73 */
74
app_adapter_state_changed_callback(tls_bt_state_t status)75 static void app_adapter_state_changed_callback(tls_bt_state_t status)
76 {
77 BLE_IF_DEBUG("adapter status = %s\r\n", status == WM_BT_STATE_ON ? "bt_state_on" : "bt_state_off");
78
79 bt_adapter_state = status;
80
81 #if (TLS_CONFIG_BLE == CFG_ON)
82
83 if (status == WM_BT_STATE_ON) {
84 BLE_IF_PRINTF("init base application\r\n");
85 ble_server_init();
86 } else {
87 BLE_IF_PRINTF("deinit base application\r\n");
88 }
89 #endif
90 }
91
on_sync(void)92 static void on_sync(void)
93 {
94 /* Make sure we have proper identity address set (public preferred) */
95 app_adapter_state_changed_callback(WM_BT_STATE_ON);
96 }
on_reset(int reason)97 static void on_reset(int reason)
98 {
99 BLE_IF_DEBUG("Resetting state; reason=%d\r\n", reason);
100 app_adapter_state_changed_callback(WM_BT_STATE_OFF);
101 }
102
on_svr_register_cb(struct ble_gatt_register_ctxt * ctxt,void * arg)103 static void on_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
104 {
105 BtUuid btuuid;
106 char buf[BLE_UUID_STR_LEN];
107 uint16_t server_if;
108 uint16_t service_handle;
109
110 switch (ctxt->op) {
111 case BLE_GATT_REGISTER_OP_SVC:
112 ble_server_retrieve_id_by_uuid(ctxt->svc.svc_def->uuid, &server_if);
113 BLE_IF_DEBUG("service,uuid16 %s handle=%d (%04X), server_if=%d\r\n", \
114 ble_uuid_to_str(ctxt->svc.svc_def->uuid, buf), ctxt->svc.handle, ctxt->svc.handle, server_if);
115 ble_server_update_svc_handle(ctxt->svc.svc_def->uuid, ctxt->svc.handle);
116 if (gatts_struct_func_ptr_cb) {
117 btuuid.uuidLen = ctxt->svc.svc_def->uuid->type;
118 ble_uuid_flat(ctxt->svc.svc_def->uuid, buf);
119 btuuid.uuid = buf;
120 if (gatts_struct_func_ptr_cb->serviceAddCb) {
121 gatts_struct_func_ptr_cb->serviceAddCb(0, server_if, &btuuid, ctxt->svc.handle);
122 }
123 }
124 break;
125
126 case BLE_GATT_REGISTER_OP_CHR:
127 service_handle = (uint16_t)*(uint16_t *)ctxt->chr.chr_def->arg;
128 ble_server_retrieve_id_by_service_id(service_handle, &server_if);
129 BLE_IF_DEBUG("charact,uuid16 %s arg %d def_handle=%d (%04X) val_handle=%d (%04X), \
130 svc_handle=%d, server_if=%d, arg=0x%08x\r\n",
131 ble_uuid_to_str(ctxt->chr.chr_def->uuid, buf),
132 (int)ctxt->chr.chr_def->arg,
133 ctxt->chr.def_handle, ctxt->chr.def_handle,
134 ctxt->chr.val_handle, ctxt->chr.val_handle, service_handle, server_if, (int)ctxt->chr.chr_def->arg);
135
136 if (gatts_struct_func_ptr_cb) {
137 btuuid.uuidLen = ctxt->chr.chr_def->uuid->type;
138 ble_uuid_flat(ctxt->chr.chr_def->uuid, buf);
139 btuuid.uuid = buf;
140 if (gatts_struct_func_ptr_cb->characteristicAddCb) {
141 gatts_struct_func_ptr_cb->characteristicAddCb(0, server_if, &btuuid , \
142 service_handle, ctxt->chr.val_handle);
143 }
144 }
145
146 break;
147
148 case BLE_GATT_REGISTER_OP_DSC:
149 service_handle = (uint16_t)*(uint16_t *)ctxt->dsc.dsc_def->arg;
150 ble_server_retrieve_id_by_service_id(service_handle, &server_if);
151 BLE_IF_DEBUG("descrip, uuid16 %s arg %d handle=%d (%04X) svc_handle=%d, server_if=%d\r\n",
152 ble_uuid_to_str(ctxt->dsc.dsc_def->uuid, buf),
153 (int)ctxt->dsc.dsc_def->arg,
154 ctxt->dsc.handle, ctxt->dsc.handle, service_handle, server_if);
155 if (gatts_struct_func_ptr_cb) {
156 btuuid.uuidLen = ctxt->dsc.dsc_def->uuid->type;
157 ble_uuid_flat(ctxt->dsc.dsc_def->uuid, buf);
158 btuuid.uuid = buf;
159 if (gatts_struct_func_ptr_cb->descriptorAddCb) {
160 gatts_struct_func_ptr_cb->descriptorAddCb(0, server_if, &btuuid , \
161 service_handle, ctxt->dsc.handle);
162 }
163 }
164 break;
165 }
166 return;
167 }
168
conn_param_update_cb(uint16_t conn_handle,int status,void * arg)169 static void conn_param_update_cb(uint16_t conn_handle, int status, void *arg)
170 {
171 BLE_IF_DEBUG("conn param update complete; conn_handle=%d status=%d\n", conn_handle, status);
172 }
173
ble_server_conn_param_update_slave(void)174 static void ble_server_conn_param_update_slave(void)
175 {
176 int rc;
177 struct ble_l2cap_sig_update_params params;
178
179 params.itvl_min = 26; // 26:byte alignment
180 params.itvl_max = 42; // 42:byte alignment
181 params.slave_latency = 0;
182 params.timeout_multiplier = 500; // 500:byte alignment
183 rc = ble_l2cap_sig_update(g_conn_handle, ¶ms, conn_param_update_cb, NULL);
184 BLE_IF_DEBUG("ble_l2cap_sig_update, rc=%d\n", rc);
185 }
ble_server_start_adv(void)186 static int ble_server_start_adv(void)
187 {
188 int rc;
189 uint8_t own_addr_type;
190 ble_addr_t peer_addr;
191
192 BLE_IF_DEBUG("\r\n BleStartAdvEx enter: caller addr=0x%x, self task=%s, \
193 bt_adapter_state=%d, bt_system_action=%d\r\n", \
194 __builtin_return_address(0), LOS_CurTaskNameGet(), bt_adapter_state, bt_system_action);
195
196 if (bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) \
197 return OHOS_BT_STATUS_NOT_READY;
198
199 struct ble_gap_adv_params adv_params;
200
201 /* Figure out address to use while advertising (no privacy for now) */
202 rc = ble_hs_id_infer_auto(0, &own_addr_type);
203 if (rc != 0) {
204 BLE_IF_PRINTF("error determining address type; rc=%d\r\n", rc);
205 return rc;
206 }
207 /* set adv parameters */
208 memset_s(&adv_params, sizeof(&adv_params), 0, sizeof(adv_params));
209
210 adv_params.itvl_max = g_adv_param.maxInterval;
211 adv_params.itvl_min = g_adv_param.minInterval;
212 adv_params.channel_map = g_adv_param.channelMap;
213 adv_params.filter_policy = g_adv_param.advFilterPolicy;
214
215 switch (g_adv_param.advType) {
216 case OHOS_BLE_ADV_IND:
217 adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
218 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
219 break;
220 case OHOS_BLE_ADV_NONCONN_IND:
221 adv_params.conn_mode = BLE_GAP_CONN_MODE_NON;
222 adv_params.disc_mode = BLE_GAP_DISC_MODE_NON;
223 break;
224 case OHOS_BLE_ADV_SCAN_IND:
225 adv_params.conn_mode = BLE_GAP_CONN_MODE_NON;
226 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; // LTD same as GEN;
227 break;
228 case OHOS_BLE_ADV_DIRECT_IND_HIGH:
229 adv_params.high_duty_cycle = 1;
230 case OHOS_BLE_ADV_DIRECT_IND_LOW:
231 adv_params.conn_mode = BLE_GAP_CONN_MODE_DIR;
232 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
233 break;
234 }
235
236 peer_addr.type = g_adv_param.peerAddrType;
237 memcpy_s(&peer_addr.val[0], sizeof(&peer_addr.val), &g_adv_param.peerAddr.addr[0], 6); // 6:size
238
239 BLE_IF_DEBUG("Starting advertising\r\n");
240
241 /* As own address type we use hard-coded value, because we generate
242 NRPA and by definition it's random */
243 /* NOTE: own_addr_type, we actually used, not specified by param->ownaddType */
244 rc = ble_gap_adv_start(own_addr_type, &peer_addr, g_adv_param.duration?g_adv_param.duration:BLE_HS_FOREVER,
245 &adv_params, gap_event, NULL);
246 if (rc) {
247 BLE_IF_PRINTF("Starting advertising failed, rc=%d\r\n", rc);
248 }
249
250 return OHOS_BT_STATUS_SUCCESS;
251 }
252
gap_event(struct ble_gap_event * event,void * arg)253 static int gap_event(struct ble_gap_event *event, void *arg)
254 {
255 int rc;
256 struct ble_gap_conn_desc desc;
257 BdAddr bdaddr;
258
259 BLE_IF_DEBUG("%s, event->type=%s(%d)\r\n", __FUNCTION__, tls_bt_gap_evt_2_str(event->type), event->type);
260
261 if (gatts_struct_func_ptr_cb == NULL) return 0;
262
263 switch (event->type) {
264 case BLE_GAP_EVENT_CONNECT:
265 BLE_IF_DEBUG("connected handle=%d, status=%d\r\n", event->connect.conn_handle, event->connect.status);
266 if (event->connect.status == 0) {
267 rc = ble_gap_conn_find(event->connect.conn_handle, &desc);
268 assert(rc == 0);
269 memcpy_s(bdaddr.addr, sizeof(bdaddr.addr), desc.peer_id_addr.val, 6); // 6:size
270 g_conn_handle = event->connect.conn_handle;
271 /* see nble_server.c ble_server_gap_event will handle this callback */
272 if (gatts_struct_func_ptr_cb->connectServerCb) {
273 gatts_struct_func_ptr_cb->connectServerCb(event->connect.conn_handle, 0, &bdaddr);
274 }
275 /* 200 ticks later, perform l2cap level connect param update */
276 }
277 if (event->connect.status != 0) {
278 /* Connection failed; resume advertising. */
279 ble_server_start_adv();
280 }
281 break;
282 case BLE_GAP_EVENT_DISCONNECT:
283 BLE_IF_DEBUG("disconnect reason=%d\r\n", event->disconnect.reason);
284
285 memcpy_s(bdaddr.addr, sizeof(bdaddr.addr), event->disconnect.conn.peer_id_addr.val, 6); // 6:size
286 /* see nble_server.c ble_server_gap_event will handle this callback */
287 if (gatts_struct_func_ptr_cb->disconnectServerCb) {
288 gatts_struct_func_ptr_cb->disconnectServerCb(event->disconnect.conn.conn_handle, 0, &bdaddr);
289 }
290
291 if (event->disconnect.reason == 534) { // 534:hci error code: 0x16 + 0x200 = 534
292 // local host terminate the connection;
293 } else {
294 ble_server_start_adv();
295 }
296 break;
297 case BLE_GAP_EVENT_NOTIFY_TX:
298 if (event->notify_tx.status == BLE_HS_EDONE) {
299 // Note, the first param conn__handle, conn_id??? all servcie share one conn_id, so it is not proper
300 if (gatts_struct_func_ptr_cb->indicationSentCb) {
301 gatts_struct_func_ptr_cb->indicationSentCb(event->notify_tx.conn_handle, 0);
302 }
303 } else {
304 /* Application will handle other cases */
305 }
306 break;
307 case BLE_GAP_EVENT_SUBSCRIBE:
308 BLE_IF_DEBUG("subscribe indicate(%d,%d),attr_handle=%d\r\n", \
309 event->subscribe.prev_indicate, event->subscribe.cur_indicate, event->subscribe.attr_handle);
310 if (event->subscribe.cur_indicate || event->subscribe.cur_notify) {
311 ble_server_conn_param_update_slave();
312 }
313 break;
314 case BLE_GAP_EVENT_MTU:
315 BLE_IF_DEBUG("mtu changed to(%d)\r\n", event->mtu.value);
316 if (gatts_struct_func_ptr_cb->mtuChangeCb) {
317 gatts_struct_func_ptr_cb->mtuChangeCb(event->mtu.conn_handle, event->mtu.value);
318 }
319 break;
320 case BLE_GAP_EVENT_REPEAT_PAIRING:
321 /* We already have a bond with the peer, but it is attempting to
322 * establish a new secure link. This app sacrifices security for
323 * convenience: just throw away the old bond and accept the new link.
324 */
325 /* Delete the old bond. */
326 rc = ble_gap_conn_find(event->repeat_pairing.conn_handle, &desc);
327 assert(rc == 0);
328 ble_store_util_delete_peer(&desc.peer_id_addr);
329
330 return BLE_GAP_REPEAT_PAIRING_RETRY;
331
332 case BLE_GAP_EVENT_PASSKEY_ACTION:
333 return 0;
334 case BLE_GAP_EVENT_ADV_COMPLETE:
335 if (gap_func_ptr_cb && gap_func_ptr_cb->advDisableCb) \
336 gap_func_ptr_cb->advDisableCb(0, event->adv_complete.reason);
337 return 0;
338 case BLE_GAP_EVENT_ENC_CHANGE:
339 {
340 rc = ble_gap_conn_find(event->enc_change.conn_handle, &desc);
341 assert(rc == 0);
342 memcpy_s(bdaddr.addr, sizeof(bdaddr.addr), desc.peer_id_addr.val, 6); // 6:size
343 if (gap_func_ptr_cb && gap_func_ptr_cb->securityRespondCb)gap_func_ptr_cb->securityRespondCb(&bdaddr);
344 return 0;
345 }
346 default:
347 break;
348 }
349
350 return 0;
351 }
352
353 /*
354 * EXPORTED FUNCTION DEFINITIONS
355 ****************************************************************************************
356 */
357
InitBtStack(void)358 int InitBtStack(void)
359 {
360 return OHOS_BT_STATUS_UNSUPPORTED;
361 }
362
EnableBtStack(void)363 int EnableBtStack(void)
364 {
365 BLE_IF_DEBUG("\r\n EnableBtStack enter: caller addr=0x%x\r\n", __builtin_return_address(0));
366
367 if (bt_adapter_state == WM_BT_STATE_ON) {
368 return OHOS_BT_STATUS_SUCCESS;
369 }
370
371 if (bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) return OHOS_BT_STATUS_BUSY;
372 bt_system_action = WM_BT_SYSTEM_ACTION_ENABLING;
373
374 memset_s(&ble_hs_cfg, sizeof(&ble_hs_cfg), 0, sizeof(ble_hs_cfg));
375
376 /* * Security manager settings. */
377 ble_hs_cfg.sm_io_cap = MYNEWT_VAL(BLE_SM_IO_CAP),
378 ble_hs_cfg.sm_oob_data_flag = MYNEWT_VAL(BLE_SM_OOB_DATA_FLAG),
379 ble_hs_cfg.sm_bonding = MYNEWT_VAL(BLE_SM_BONDING),
380 ble_hs_cfg.sm_mitm = MYNEWT_VAL(BLE_SM_MITM),
381 ble_hs_cfg.sm_sc = MYNEWT_VAL(BLE_SM_SC),
382 ble_hs_cfg.sm_keypress = MYNEWT_VAL(BLE_SM_KEYPRESS),
383 ble_hs_cfg.sm_our_key_dist = MYNEWT_VAL(BLE_SM_OUR_KEY_DIST),
384 ble_hs_cfg.sm_their_key_dist = MYNEWT_VAL(BLE_SM_THEIR_KEY_DIST),
385
386 ble_hs_cfg.sync_cb = on_sync;
387 ble_hs_cfg.reset_cb = on_reset;
388 ble_hs_cfg.shutdown_cb = on_reset; /* same callback as on_reset */
389 ble_hs_cfg.gatts_register_cb = on_svr_register_cb;
390 ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
391
392 /* Initialize all packages. */
393 nimble_port_init();
394
395 /* Application levels code entry */
396
397 /* Initialize the vuart interface and enable controller */
398 ble_hci_vuart_init(0xFF);
399
400 /* As the last thing, process events from default event queue. */
401 tls_nimble_start();
402
403 while (bt_adapter_state != WM_BT_STATE_ON) {
404 tls_os_time_delay(100); // 100:time unit
405 }
406
407 bt_system_action = WM_BT_SYSTEM_ACTION_IDLE;
408 BLE_IF_DEBUG("\r\n EnableBtStack exit\r\n");
409 return OHOS_BT_STATUS_SUCCESS;
410 }
411
DisableBtStack(void)412 int DisableBtStack(void)
413 {
414 int rc = 0;
415
416 BLE_IF_DEBUG("\r\n DisableBtStack enter: caller addr=0x%x, self task=%s\r\n", \
417 __builtin_return_address(0), LOS_CurTaskNameGet());
418
419 if (bt_adapter_state == WM_BT_STATE_OFF) {
420 BLE_IF_DEBUG("\r\n DisableBtStack exit because of BLE_HS_EALREADY \r\n");
421 return OHOS_BT_STATUS_DONE;
422 }
423
424 if (bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) return BLE_HS_EBUSY;
425
426 bt_system_action = WM_BT_SYSTEM_ACTION_DISABLING;
427
428 /* Stop hs system */
429 rc = nimble_port_stop();
430 assert(rc == 0);
431
432 /* Stop controller and free vuart resource */
433 rc = ble_hci_vuart_deinit();
434 assert(rc == 0);
435
436 /* Free hs system resource */
437 nimble_port_deinit();
438
439 /* Free task stack ptr and free hs task */
440 tls_nimble_stop();
441
442 /* Application levels resource cleanup */
443 while (bt_adapter_state == WM_BT_STATE_ON) {
444 tls_os_time_delay(10); // 10:time unit
445 }
446
447 bt_system_action = WM_BT_SYSTEM_ACTION_IDLE;
448
449 BLE_IF_DEBUG("\r\n DisableBtStack exit\r\n");
450
451 return OHOS_BT_STATUS_SUCCESS;
452 }
453
SetDeviceName(const char * name,unsigned int len)454 int SetDeviceName(const char *name, unsigned int len)
455 {
456 int rc;
457
458 rc = ble_svc_gap_device_name_set(name);
459 if (rc == 0) {
460 return OHOS_BT_STATUS_SUCCESS;
461 } else {
462 return OHOS_BT_STATUS_FAIL;
463 }
464 }
465
BleStopAdv(int advId)466 int BleStopAdv(int advId)
467 {
468 int rc;
469 BLE_IF_DEBUG("\r\n BleStopAdv enter: caller addr=0x%x, self task=%s,bt_adapter_state=%d, bt_system_action=%d\r\n",
470 __builtin_return_address(0), LOS_CurTaskNameGet(), bt_adapter_state, bt_system_action);
471 (void)advId;
472
473 if (bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) \
474 return OHOS_BT_STATUS_NOT_READY;
475
476 rc = ble_gap_adv_stop();
477 if (rc != 0) {
478 BLE_IF_DEBUG("\r\n BleStopAdv exit, rc=%d\r\n", rc);
479
480 return OHOS_BT_STATUS_FAIL;
481 }
482
483 return OHOS_BT_STATUS_SUCCESS;
484 }
485
BleGattcRegister(BtUuid appUuid)486 int BleGattcRegister(BtUuid appUuid)
487 {
488 (void)appUuid;
489
490 return OHOS_BT_STATUS_UNSUPPORTED;
491 }
492
BleGattcUnRegister(int clientId)493 int BleGattcUnRegister(int clientId)
494 {
495 (void)clientId;
496
497 return OHOS_BT_STATUS_UNSUPPORTED;
498 }
499
BleSetSecurityIoCap(BleIoCapMode mode)500 int BleSetSecurityIoCap(BleIoCapMode mode)
501 {
502 BLE_IF_DEBUG("BleSetSecurityIoCap, BleIoCapMode=%d\r\n", mode);
503
504 ble_hs_cfg.sm_io_cap = mode;
505
506 return OHOS_BT_STATUS_SUCCESS;
507 }
508
BleSetSecurityAuthReq(BleAuthReqMode mode)509 int BleSetSecurityAuthReq(BleAuthReqMode mode)
510 {
511 BLE_IF_DEBUG("BleSetSecurityAuthReq, BleAuthReqMode=%d\r\n", mode);
512
513 if ((mode&OHOS_BLE_AUTH_BOND) || (mode&OHOS_BLE_AUTH_REQ_SC_BOND) || (mode&OHOS_BLE_AUTH_REQ_SC_MITM_BOND)) {
514 ble_hs_cfg.sm_bonding = 1;
515 } else {
516 }
517
518 if ((mode&OHOS_BLE_AUTH_REQ_MITM) || (mode&OHOS_BLE_AUTH_REQ_SC_MITM) || (mode&OHOS_BLE_AUTH_REQ_SC_MITM_BOND)) {
519 ble_hs_cfg.sm_mitm = 1;
520 } else {
521 ble_hs_cfg.sm_mitm = 0;
522 }
523
524 if ((mode&OHOS_BLE_AUTH_REQ_SC_ONLY) || (mode&OHOS_BLE_AUTH_REQ_SC_BOND) || (mode&OHOS_BLE_AUTH_REQ_SC_MITM) || \
525 (mode&OHOS_BLE_AUTH_REQ_SC_MITM_BOND)) {
526 ble_hs_cfg.sm_sc = 1;
527 } else {
528 }
529
530 return OHOS_BT_STATUS_SUCCESS;
531 }
532
BleGattSecurityRsp(BdAddr bdAddr,bool accept)533 int BleGattSecurityRsp(BdAddr bdAddr, bool accept)
534 {
535 (void)bdAddr;
536
537 BLE_IF_DEBUG("BleGattSecurityRsp, accept=%hhu\r\n", accept);
538 return OHOS_BT_STATUS_SUCCESS;
539 }
540
BleGattsDisconnect(int serverId,BdAddr bdAddr,int connId)541 int BleGattsDisconnect(int serverId, BdAddr bdAddr, int connId)
542 {
543 int rc;
544 (void)serverId;
545 (void)bdAddr;
546
547 rc = ble_gap_terminate(connId, BLE_ERR_REM_USER_CONN_TERM);
548 if (!rc) {
549 return OHOS_BT_STATUS_SUCCESS;
550 } else {
551 return OHOS_BT_STATUS_FAIL;
552 }
553 }
554
BleGattsSetEncryption(BdAddr bdAddr,BleSecAct secAct)555 int BleGattsSetEncryption(BdAddr bdAddr, BleSecAct secAct)
556 {
557 int rc;
558 (void)bdAddr;
559
560 BLE_IF_DEBUG("BleGattsSetEncryption, secAct=%d\r\n", secAct);
561
562 rc = ble_gap_security_initiate(g_conn_handle);
563 if (!rc) {
564 return OHOS_BT_STATUS_SUCCESS;
565 } else {
566 return OHOS_BT_STATUS_FAIL;
567 }
568 }
569
BleGattsRegister(BtUuid appUuid)570 int BleGattsRegister(BtUuid appUuid)
571 {
572 (void)appUuid;
573
574 return OHOS_BT_STATUS_UNSUPPORTED;
575 }
576
BleGattsUnRegister(int serverId)577 int BleGattsUnRegister(int serverId)
578 {
579 (void)serverId;
580
581 return OHOS_BT_STATUS_UNSUPPORTED;
582 }
583
BleGattsAddService(int serverId,BtUuid srvcUuid,bool isPrimary,int number)584 int BleGattsAddService(int serverId, BtUuid srvcUuid, bool isPrimary, int number)
585 {
586 (void)serverId;
587 (void)srvcUuid;
588 (void)isPrimary;
589 (void)number;
590
591 return OHOS_BT_STATUS_UNSUPPORTED;
592 }
593
BleGattsDeleteService(int serverId,int srvcHandle)594 int BleGattsDeleteService(int serverId, int srvcHandle)
595 {
596 (void)serverId;
597 (void)srvcHandle;
598
599 return OHOS_BT_STATUS_UNSUPPORTED;
600 }
601
BleGattsAddCharacteristic(int serverId,int srvcHandle,BtUuid characUuid,int properties,int permissions)602 int BleGattsAddCharacteristic(int serverId, int srvcHandle, BtUuid characUuid,
603 int properties, int permissions)
604 {
605 (void)serverId;
606 (void)srvcHandle;
607 (void)characUuid;
608 (void)permissions;
609 (void)properties;
610
611 return OHOS_BT_STATUS_UNSUPPORTED;
612 }
613
BleGattsAddDescriptor(int serverId,int srvcHandle,BtUuid descUuid,int permissions)614 int BleGattsAddDescriptor(int serverId, int srvcHandle, BtUuid descUuid, int permissions)
615 {
616 (void)serverId;
617 (void)srvcHandle;
618 (void)descUuid;
619 (void)permissions;
620
621 return OHOS_BT_STATUS_UNSUPPORTED;
622 }
623
BleGattsStartService(int serverId,int srvcHandle)624 int BleGattsStartService(int serverId, int srvcHandle)
625 {
626 (void)serverId;
627 (void)srvcHandle;
628
629 return OHOS_BT_STATUS_UNSUPPORTED;
630 }
631
BleGattsStopService(int serverId,int srvcHandle)632 int BleGattsStopService(int serverId, int srvcHandle)
633 {
634 (void)serverId;
635 (void)srvcHandle;
636
637 return OHOS_BT_STATUS_UNSUPPORTED;
638 }
639
BleGattsSendResponse(int serverId,GattsSendRspParam * param)640 int BleGattsSendResponse(int serverId, GattsSendRspParam *param)
641 {
642 (void)serverId;
643 (void)param;
644
645 return OHOS_BT_STATUS_UNSUPPORTED;
646 }
647
BleGattsSendIndication(int serverId,GattsSendIndParam * param)648 int BleGattsSendIndication(int serverId, GattsSendIndParam *param)
649 {
650 int rc;
651 struct os_mbuf *om;
652 (void)serverId;
653
654 BLE_IF_DEBUG("Indicate to app:conn_id[%d],attr_handle[%d],data_length[%d]\r\n", \
655 param->connectId, param->attrHandle, param->valueLen);
656 if (param->valueLen<=0 || param->value== NULL) {
657 return OHOS_BT_STATUS_PARM_INVALID;
658 }
659
660 om = ble_hs_mbuf_from_flat(param->value, param->valueLen);
661 if (!om) {
662 return OHOS_BT_STATUS_NOMEM;
663 }
664
665 if (param->confirm) {
666 rc = ble_gattc_indicate_custom(param->connectId, param->attrHandle, om);
667 } else {
668 rc = ble_gattc_notify_custom(param->connectId, param->attrHandle, om);
669 }
670
671 if (rc == 0) {
672 rc = OHOS_BT_STATUS_SUCCESS;
673 } else {
674 rc = OHOS_BT_STATUS_UNHANDLED;
675 }
676
677 return rc;
678 }
679
ReadBtMacAddr(unsigned char * mac,unsigned int len)680 int ReadBtMacAddr(unsigned char *mac, unsigned int len)
681 {
682 if (len != 6) { // 6:byte alignment
683 return OHOS_BT_STATUS_PARM_INVALID;
684 }
685
686 tls_get_bt_mac_addr(mac);
687
688 return OHOS_BT_STATUS_SUCCESS;
689 }
690
BleGattcRegisterCallbacks(BtGattClientCallbacks * func)691 int BleGattcRegisterCallbacks(BtGattClientCallbacks *func)
692 {
693 (void)func;
694 return OHOS_BT_STATUS_SUCCESS;
695 }
696
BleGattsRegisterCallbacks(BtGattServerCallbacks * func)697 int BleGattsRegisterCallbacks(BtGattServerCallbacks *func)
698 {
699 gatts_struct_func_ptr_cb = func;
700
701 return OHOS_BT_STATUS_SUCCESS;
702 }
703
BleGattRegisterCallbacks(BtGattCallbacks * func)704 int BleGattRegisterCallbacks(BtGattCallbacks *func)
705 {
706 gap_func_ptr_cb = func;
707
708 return OHOS_BT_STATUS_SUCCESS;
709 }
710
BleStartAdvEx(int * advId,const StartAdvRawData rawData,BleAdvParams advParam)711 int BleStartAdvEx(int *advId, const StartAdvRawData rawData, BleAdvParams advParam)
712 {
713 (void)advId;
714 int rc;
715 uint8_t own_addr_type;
716 ble_addr_t peer_addr;
717
718 BLE_IF_DEBUG("\r\n BleStartAdvEx enter: caller addr=0x%x, self task=%s,\
719 bt_adapter_state=%d, bt_system_action=%d\r\n", \
720 __builtin_return_address(0), LOS_CurTaskNameGet(), \
721 bt_adapter_state, bt_system_action);
722
723 if (bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) \
724 return OHOS_BT_STATUS_NOT_READY;
725
726 // first back up the adv information;
727 g_adv_raw_data = rawData;
728 g_adv_param = advParam;
729
730 struct ble_gap_adv_params adv_params;
731
732 if (rawData.advDataLen) {
733 rc = ble_gap_adv_set_data(rawData.advData, rawData.advDataLen);
734 assert(rc == 0);
735 }
736
737 if (rawData.rspDataLen) {
738 rc = ble_gap_adv_rsp_set_data(rawData.rspData, rawData.rspDataLen);
739 assert(rc == 0);
740 }
741
742 /* Figure out address to use while advertising (no privacy for now) */
743 rc = ble_hs_id_infer_auto(0, &own_addr_type);
744 if (rc != 0) {
745 BLE_IF_PRINTF("error determining address type; rc=%d\r\n", rc);
746 return rc;
747 }
748 /* set adv parameters */
749 memset_s(&adv_params, sizeof(&adv_params), 0, sizeof(adv_params));
750
751 adv_params.itvl_max = advParam.maxInterval;
752 adv_params.itvl_min = advParam.minInterval;
753 adv_params.channel_map = advParam.channelMap;
754 adv_params.filter_policy = advParam.advFilterPolicy;
755
756 switch (advParam.advType) {
757 case OHOS_BLE_ADV_IND:
758 adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
759 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
760 break;
761 case OHOS_BLE_ADV_NONCONN_IND:
762 adv_params.conn_mode = BLE_GAP_CONN_MODE_NON;
763 adv_params.disc_mode = BLE_GAP_DISC_MODE_NON;
764 break;
765 case OHOS_BLE_ADV_SCAN_IND:
766 adv_params.conn_mode = BLE_GAP_CONN_MODE_NON;
767 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; // LTD same as GEN;
768 break;
769 case OHOS_BLE_ADV_DIRECT_IND_HIGH:
770 adv_params.high_duty_cycle = 1;
771 case OHOS_BLE_ADV_DIRECT_IND_LOW:
772 adv_params.conn_mode = BLE_GAP_CONN_MODE_DIR;
773 adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
774 break;
775 }
776
777 peer_addr.type = advParam.peerAddrType;
778 memcpy_s(&peer_addr.val[0], sizeof(&peer_addr.val), &advParam.peerAddr.addr[0], 6);
779
780 BLE_IF_DEBUG("Starting advertising\r\n");
781
782 /* As own address type we use hard-coded value, because we generate
783 NRPA and by definition it's random */
784 /* NOTE: own_addr_type, we actually used, not specified by param->ownaddType */
785 rc = ble_gap_adv_start(own_addr_type, &peer_addr, advParam.duration?advParam.duration:BLE_HS_FOREVER,
786 &adv_params, gap_event, NULL);
787 if (rc) {
788 BLE_IF_PRINTF("Starting advertising failed, rc=%d\r\n", rc);
789 }
790
791 return OHOS_BT_STATUS_SUCCESS;
792 }
793
BleGattsStartServiceEx(int * srvcHandle,BleGattService * srvcInfo)794 int BleGattsStartServiceEx(int *srvcHandle, BleGattService *srvcInfo)
795 {
796 int rc = 0;
797 int server_if = 0;
798 int adv_active = 0;
799 uint16_t service_handle_r = 0;
800
801 if (bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) \
802 return OHOS_BT_STATUS_NOT_READY;
803
804 BLE_IF_DEBUG("BleGattsStartServiceEx\r\n");
805 adv_active = ble_gap_adv_active();
806 if (adv_active) {
807 rc = ble_gap_adv_stop();
808 }
809
810 rc = ble_gatts_reset();
811 if (rc != 0) {
812 BLE_IF_PRINTF("!!!BleGattsStartServiceEx failed!!! rc=%d\r\n", rc);
813 return rc;
814 }
815
816 server_if = ble_server_alloc(srvcInfo);
817 *srvcHandle = server_if;
818
819 ble_server_start_service();
820
821 if (adv_active) {
822 ble_server_start_adv();
823 }
824
825 // report servcie startcb
826 if (gatts_struct_func_ptr_cb) {
827 if (gatts_struct_func_ptr_cb->serviceStartCb) {
828 ble_server_retrieve_service_handle_by_server_id(server_if, &service_handle_r);
829 gatts_struct_func_ptr_cb->serviceStartCb(0 /* Always success */, server_if, service_handle_r);
830 }
831 }
832
833 BLE_IF_DEBUG("ble server alloc return=%d\r\n", server_if);
834 return OHOS_BT_STATUS_SUCCESS;
835 }
836
BleGattsStopServiceEx(int srvcHandle)837 int BleGattsStopServiceEx(int srvcHandle)
838 {
839 uint16_t service_handle_r = 0;
840
841 if (bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE) \
842 return OHOS_BT_STATUS_NOT_READY;
843
844 ble_gap_adv_stop();
845
846 ble_server_free(srvcHandle);
847
848 if (gatts_struct_func_ptr_cb) {
849 if (gatts_struct_func_ptr_cb->serviceStopCb) {
850 ble_server_retrieve_service_handle_by_server_id(srvcHandle /* actually, this is server_if */, \
851 &service_handle_r);
852 gatts_struct_func_ptr_cb->serviceStopCb(0 /* Always success */, srvcHandle /* server_if */, \
853 service_handle_r);
854 }
855 }
856 return OHOS_BT_STATUS_SUCCESS;
857 }