• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params, 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 }