1*042d53a7SEvalZero /* Bluetooth Mesh */
2*042d53a7SEvalZero
3*042d53a7SEvalZero /*
4*042d53a7SEvalZero * Copyright (c) 2017 Intel Corporation
5*042d53a7SEvalZero *
6*042d53a7SEvalZero * SPDX-License-Identifier: Apache-2.0
7*042d53a7SEvalZero */
8*042d53a7SEvalZero
9*042d53a7SEvalZero #include <stdbool.h>
10*042d53a7SEvalZero #include <errno.h>
11*042d53a7SEvalZero
12*042d53a7SEvalZero #include "os/os_mbuf.h"
13*042d53a7SEvalZero #include "mesh/mesh.h"
14*042d53a7SEvalZero
15*042d53a7SEvalZero #include "syscfg/syscfg.h"
16*042d53a7SEvalZero #define BT_DBG_ENABLED (MYNEWT_VAL(BLE_MESH_DEBUG))
17*042d53a7SEvalZero #include "host/ble_hs_log.h"
18*042d53a7SEvalZero
19*042d53a7SEvalZero #include "adv.h"
20*042d53a7SEvalZero #include "prov.h"
21*042d53a7SEvalZero #include "net.h"
22*042d53a7SEvalZero #include "beacon.h"
23*042d53a7SEvalZero #include "lpn.h"
24*042d53a7SEvalZero #include "friend.h"
25*042d53a7SEvalZero #include "transport.h"
26*042d53a7SEvalZero #include "access.h"
27*042d53a7SEvalZero #include "foundation.h"
28*042d53a7SEvalZero #include "proxy.h"
29*042d53a7SEvalZero #include "shell.h"
30*042d53a7SEvalZero #include "mesh_priv.h"
31*042d53a7SEvalZero #include "settings.h"
32*042d53a7SEvalZero
33*042d53a7SEvalZero u8_t g_mesh_addr_type;
34*042d53a7SEvalZero
bt_mesh_provision(const u8_t net_key[16],u16_t net_idx,u8_t flags,u32_t iv_index,u16_t addr,const u8_t dev_key[16])35*042d53a7SEvalZero int bt_mesh_provision(const u8_t net_key[16], u16_t net_idx,
36*042d53a7SEvalZero u8_t flags, u32_t iv_index, u16_t addr,
37*042d53a7SEvalZero const u8_t dev_key[16])
38*042d53a7SEvalZero {
39*042d53a7SEvalZero int err;
40*042d53a7SEvalZero
41*042d53a7SEvalZero BT_INFO("Primary Element: 0x%04x", addr);
42*042d53a7SEvalZero BT_DBG("net_idx 0x%04x flags 0x%02x iv_index 0x%04x",
43*042d53a7SEvalZero net_idx, flags, iv_index);
44*042d53a7SEvalZero
45*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_PB_GATT))) {
46*042d53a7SEvalZero bt_mesh_proxy_prov_disable();
47*042d53a7SEvalZero }
48*042d53a7SEvalZero
49*042d53a7SEvalZero err = bt_mesh_net_create(net_idx, flags, net_key, iv_index);
50*042d53a7SEvalZero if (err) {
51*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_PB_GATT))) {
52*042d53a7SEvalZero bt_mesh_proxy_prov_enable();
53*042d53a7SEvalZero }
54*042d53a7SEvalZero
55*042d53a7SEvalZero return err;
56*042d53a7SEvalZero }
57*042d53a7SEvalZero
58*042d53a7SEvalZero bt_mesh.seq = 0;
59*042d53a7SEvalZero
60*042d53a7SEvalZero bt_mesh_comp_provision(addr);
61*042d53a7SEvalZero
62*042d53a7SEvalZero memcpy(bt_mesh.dev_key, dev_key, 16);
63*042d53a7SEvalZero
64*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
65*042d53a7SEvalZero BT_DBG("Storing network information persistently");
66*042d53a7SEvalZero bt_mesh_store_net();
67*042d53a7SEvalZero bt_mesh_store_subnet(&bt_mesh.sub[0]);
68*042d53a7SEvalZero bt_mesh_store_iv(false);
69*042d53a7SEvalZero }
70*042d53a7SEvalZero
71*042d53a7SEvalZero bt_mesh_net_start();
72*042d53a7SEvalZero
73*042d53a7SEvalZero return 0;
74*042d53a7SEvalZero }
75*042d53a7SEvalZero
bt_mesh_reset(void)76*042d53a7SEvalZero void bt_mesh_reset(void)
77*042d53a7SEvalZero {
78*042d53a7SEvalZero if (!bt_mesh.valid) {
79*042d53a7SEvalZero return;
80*042d53a7SEvalZero }
81*042d53a7SEvalZero
82*042d53a7SEvalZero bt_mesh.iv_index = 0;
83*042d53a7SEvalZero bt_mesh.seq = 0;
84*042d53a7SEvalZero bt_mesh.iv_update = 0;
85*042d53a7SEvalZero bt_mesh.pending_update = 0;
86*042d53a7SEvalZero bt_mesh.valid = 0;
87*042d53a7SEvalZero bt_mesh.ivu_duration = 0;
88*042d53a7SEvalZero bt_mesh.ivu_initiator = 0;
89*042d53a7SEvalZero
90*042d53a7SEvalZero k_delayed_work_cancel(&bt_mesh.ivu_timer);
91*042d53a7SEvalZero
92*042d53a7SEvalZero bt_mesh_cfg_reset();
93*042d53a7SEvalZero
94*042d53a7SEvalZero bt_mesh_rx_reset();
95*042d53a7SEvalZero bt_mesh_tx_reset();
96*042d53a7SEvalZero
97*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_LOW_POWER))) {
98*042d53a7SEvalZero bt_mesh_lpn_disable(true);
99*042d53a7SEvalZero }
100*042d53a7SEvalZero
101*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_FRIEND))) {
102*042d53a7SEvalZero bt_mesh_friend_clear_net_idx(BT_MESH_KEY_ANY);
103*042d53a7SEvalZero }
104*042d53a7SEvalZero
105*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_GATT_PROXY))) {
106*042d53a7SEvalZero bt_mesh_proxy_gatt_disable();
107*042d53a7SEvalZero }
108*042d53a7SEvalZero
109*042d53a7SEvalZero if ((MYNEWT_VAL(BLE_MESH_PB_GATT))) {
110*042d53a7SEvalZero bt_mesh_proxy_prov_enable();
111*042d53a7SEvalZero }
112*042d53a7SEvalZero
113*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
114*042d53a7SEvalZero bt_mesh_clear_net();
115*042d53a7SEvalZero }
116*042d53a7SEvalZero
117*042d53a7SEvalZero memset(bt_mesh.dev_key, 0, sizeof(bt_mesh.dev_key));
118*042d53a7SEvalZero
119*042d53a7SEvalZero bt_mesh_scan_disable();
120*042d53a7SEvalZero bt_mesh_beacon_disable();
121*042d53a7SEvalZero
122*042d53a7SEvalZero bt_mesh_comp_unprovision();
123*042d53a7SEvalZero
124*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_MESH_PROV)) {
125*042d53a7SEvalZero bt_mesh_prov_reset();
126*042d53a7SEvalZero }
127*042d53a7SEvalZero }
128*042d53a7SEvalZero
bt_mesh_is_provisioned(void)129*042d53a7SEvalZero bool bt_mesh_is_provisioned(void)
130*042d53a7SEvalZero {
131*042d53a7SEvalZero return bt_mesh.valid;
132*042d53a7SEvalZero }
133*042d53a7SEvalZero
bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers)134*042d53a7SEvalZero int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers)
135*042d53a7SEvalZero {
136*042d53a7SEvalZero if (bt_mesh_is_provisioned()) {
137*042d53a7SEvalZero return -EALREADY;
138*042d53a7SEvalZero }
139*042d53a7SEvalZero
140*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
141*042d53a7SEvalZero (bearers & BT_MESH_PROV_ADV)) {
142*042d53a7SEvalZero /* Make sure we're scanning for provisioning inviations */
143*042d53a7SEvalZero bt_mesh_scan_enable();
144*042d53a7SEvalZero /* Enable unprovisioned beacon sending */
145*042d53a7SEvalZero bt_mesh_beacon_enable();
146*042d53a7SEvalZero }
147*042d53a7SEvalZero
148*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
149*042d53a7SEvalZero (bearers & BT_MESH_PROV_GATT)) {
150*042d53a7SEvalZero bt_mesh_proxy_prov_enable();
151*042d53a7SEvalZero bt_mesh_adv_update();
152*042d53a7SEvalZero }
153*042d53a7SEvalZero
154*042d53a7SEvalZero return 0;
155*042d53a7SEvalZero }
156*042d53a7SEvalZero
bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers)157*042d53a7SEvalZero int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers)
158*042d53a7SEvalZero {
159*042d53a7SEvalZero if (bt_mesh_is_provisioned()) {
160*042d53a7SEvalZero return -EALREADY;
161*042d53a7SEvalZero }
162*042d53a7SEvalZero
163*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
164*042d53a7SEvalZero (bearers & BT_MESH_PROV_ADV)) {
165*042d53a7SEvalZero bt_mesh_beacon_disable();
166*042d53a7SEvalZero bt_mesh_scan_disable();
167*042d53a7SEvalZero }
168*042d53a7SEvalZero
169*042d53a7SEvalZero if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
170*042d53a7SEvalZero (bearers & BT_MESH_PROV_GATT)) {
171*042d53a7SEvalZero bt_mesh_proxy_prov_disable();
172*042d53a7SEvalZero bt_mesh_adv_update();
173*042d53a7SEvalZero }
174*042d53a7SEvalZero
175*042d53a7SEvalZero return 0;
176*042d53a7SEvalZero }
177*042d53a7SEvalZero
bt_mesh_gap_event(struct ble_gap_event * event,void * arg)178*042d53a7SEvalZero static int bt_mesh_gap_event(struct ble_gap_event *event, void *arg)
179*042d53a7SEvalZero {
180*042d53a7SEvalZero ble_adv_gap_mesh_cb(event, arg);
181*042d53a7SEvalZero
182*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PROXY))
183*042d53a7SEvalZero ble_mesh_proxy_gap_event(event, arg);
184*042d53a7SEvalZero #endif
185*042d53a7SEvalZero
186*042d53a7SEvalZero return 0;
187*042d53a7SEvalZero }
188*042d53a7SEvalZero
bt_mesh_init(uint8_t own_addr_type,const struct bt_mesh_prov * prov,const struct bt_mesh_comp * comp)189*042d53a7SEvalZero int bt_mesh_init(uint8_t own_addr_type, const struct bt_mesh_prov *prov,
190*042d53a7SEvalZero const struct bt_mesh_comp *comp)
191*042d53a7SEvalZero {
192*042d53a7SEvalZero int err;
193*042d53a7SEvalZero
194*042d53a7SEvalZero g_mesh_addr_type = own_addr_type;
195*042d53a7SEvalZero
196*042d53a7SEvalZero /* initialize SM alg ECC subsystem (it is used directly from mesh code) */
197*042d53a7SEvalZero ble_sm_alg_ecc_init();
198*042d53a7SEvalZero
199*042d53a7SEvalZero err = bt_mesh_comp_register(comp);
200*042d53a7SEvalZero if (err) {
201*042d53a7SEvalZero return err;
202*042d53a7SEvalZero }
203*042d53a7SEvalZero
204*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PROV))
205*042d53a7SEvalZero err = bt_mesh_prov_init(prov);
206*042d53a7SEvalZero if (err) {
207*042d53a7SEvalZero return err;
208*042d53a7SEvalZero }
209*042d53a7SEvalZero #endif
210*042d53a7SEvalZero
211*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PROXY))
212*042d53a7SEvalZero bt_mesh_proxy_init();
213*042d53a7SEvalZero #endif
214*042d53a7SEvalZero
215*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PROV))
216*042d53a7SEvalZero /* Need this to proper link.rx.buf allocation */
217*042d53a7SEvalZero bt_mesh_prov_reset_link();
218*042d53a7SEvalZero #endif
219*042d53a7SEvalZero
220*042d53a7SEvalZero bt_mesh_net_init();
221*042d53a7SEvalZero bt_mesh_trans_init();
222*042d53a7SEvalZero bt_mesh_beacon_init();
223*042d53a7SEvalZero bt_mesh_adv_init();
224*042d53a7SEvalZero
225*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PB_ADV))
226*042d53a7SEvalZero /* Make sure we're scanning for provisioning inviations */
227*042d53a7SEvalZero bt_mesh_scan_enable();
228*042d53a7SEvalZero /* Enable unprovisioned beacon sending */
229*042d53a7SEvalZero
230*042d53a7SEvalZero bt_mesh_beacon_enable();
231*042d53a7SEvalZero #endif
232*042d53a7SEvalZero
233*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_PB_GATT))
234*042d53a7SEvalZero bt_mesh_proxy_prov_enable();
235*042d53a7SEvalZero #endif
236*042d53a7SEvalZero
237*042d53a7SEvalZero ble_gap_mesh_cb_register(bt_mesh_gap_event, NULL);
238*042d53a7SEvalZero
239*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_MESH_SETTINGS))
240*042d53a7SEvalZero bt_mesh_settings_init();
241*042d53a7SEvalZero #endif
242*042d53a7SEvalZero
243*042d53a7SEvalZero return 0;
244*042d53a7SEvalZero }
245