1*042d53a7SEvalZero /*
2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file
4*042d53a7SEvalZero * distributed with this work for additional information
5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file
6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at
9*042d53a7SEvalZero *
10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero *
12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero * software distributed under the License is distributed on an
14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero * KIND, either express or implied. See the License for the
16*042d53a7SEvalZero * specific language governing permissions and limitations
17*042d53a7SEvalZero * under the License.
18*042d53a7SEvalZero */
19*042d53a7SEvalZero
20*042d53a7SEvalZero #include "mesh/glue.h"
21*042d53a7SEvalZero #include "adv.h"
22*042d53a7SEvalZero #ifndef MYNEWT
23*042d53a7SEvalZero #include "nimble/nimble_port.h"
24*042d53a7SEvalZero #endif
25*042d53a7SEvalZero
26*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_SETTINGS)
27*042d53a7SEvalZero #include "base64/base64.h"
28*042d53a7SEvalZero #endif
29*042d53a7SEvalZero
30*042d53a7SEvalZero #define BT_DBG_ENABLED (MYNEWT_VAL(BLE_MESH_DEBUG))
31*042d53a7SEvalZero
32*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV)
33*042d53a7SEvalZero #define BT_MESH_ADV_INST (MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES))
34*042d53a7SEvalZero
35*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_PROXY)
36*042d53a7SEvalZero /* Note that BLE_MULTI_ADV_INSTANCES contains number of additional instances.
37*042d53a7SEvalZero * Instance 0 is always there
38*042d53a7SEvalZero */
39*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) < 1
40*042d53a7SEvalZero #error "Mesh needs at least BLE_MULTI_ADV_INSTANCES set to 1"
41*042d53a7SEvalZero #endif
42*042d53a7SEvalZero #define BT_MESH_ADV_GATT_INST (MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) - 1)
43*042d53a7SEvalZero #endif /* BLE_MESH_PROXY */
44*042d53a7SEvalZero #endif /* BLE_EXT_ADV */
45*042d53a7SEvalZero
46*042d53a7SEvalZero extern u8_t g_mesh_addr_type;
47*042d53a7SEvalZero
48*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV)
49*042d53a7SEvalZero /* Store configuration for different bearers */
50*042d53a7SEvalZero #define BT_MESH_ADV_IDX (0)
51*042d53a7SEvalZero #define BT_MESH_GATT_IDX (1)
52*042d53a7SEvalZero static struct ble_gap_adv_params ble_adv_cur_conf[2];
53*042d53a7SEvalZero #endif
54*042d53a7SEvalZero
55*042d53a7SEvalZero const char *
bt_hex(const void * buf,size_t len)56*042d53a7SEvalZero bt_hex(const void *buf, size_t len)
57*042d53a7SEvalZero {
58*042d53a7SEvalZero static const char hex[] = "0123456789abcdef";
59*042d53a7SEvalZero static char hexbufs[4][137];
60*042d53a7SEvalZero static u8_t curbuf;
61*042d53a7SEvalZero const u8_t *b = buf;
62*042d53a7SEvalZero char *str;
63*042d53a7SEvalZero int i;
64*042d53a7SEvalZero
65*042d53a7SEvalZero str = hexbufs[curbuf++];
66*042d53a7SEvalZero curbuf %= ARRAY_SIZE(hexbufs);
67*042d53a7SEvalZero
68*042d53a7SEvalZero len = min(len, (sizeof(hexbufs[0]) - 1) / 2);
69*042d53a7SEvalZero
70*042d53a7SEvalZero for (i = 0; i < len; i++) {
71*042d53a7SEvalZero str[i * 2] = hex[b[i] >> 4];
72*042d53a7SEvalZero str[i * 2 + 1] = hex[b[i] & 0xf];
73*042d53a7SEvalZero }
74*042d53a7SEvalZero
75*042d53a7SEvalZero str[i * 2] = '\0';
76*042d53a7SEvalZero
77*042d53a7SEvalZero return str;
78*042d53a7SEvalZero }
79*042d53a7SEvalZero
80*042d53a7SEvalZero void
net_buf_put(struct ble_npl_eventq * fifo,struct os_mbuf * om)81*042d53a7SEvalZero net_buf_put(struct ble_npl_eventq *fifo, struct os_mbuf *om)
82*042d53a7SEvalZero {
83*042d53a7SEvalZero struct ble_npl_event *ev;
84*042d53a7SEvalZero
85*042d53a7SEvalZero assert(OS_MBUF_IS_PKTHDR(om));
86*042d53a7SEvalZero ev = &BT_MESH_ADV(om)->ev;
87*042d53a7SEvalZero assert(ev);
88*042d53a7SEvalZero assert(ble_npl_event_get_arg(ev));
89*042d53a7SEvalZero
90*042d53a7SEvalZero ble_npl_eventq_put(fifo, ev);
91*042d53a7SEvalZero }
92*042d53a7SEvalZero
93*042d53a7SEvalZero void *
net_buf_ref(struct os_mbuf * om)94*042d53a7SEvalZero net_buf_ref(struct os_mbuf *om)
95*042d53a7SEvalZero {
96*042d53a7SEvalZero struct bt_mesh_adv *adv;
97*042d53a7SEvalZero
98*042d53a7SEvalZero /* For bufs with header we count refs*/
99*042d53a7SEvalZero if (OS_MBUF_USRHDR_LEN(om) == 0) {
100*042d53a7SEvalZero return om;
101*042d53a7SEvalZero }
102*042d53a7SEvalZero
103*042d53a7SEvalZero adv = BT_MESH_ADV(om);
104*042d53a7SEvalZero adv->ref_cnt++;
105*042d53a7SEvalZero
106*042d53a7SEvalZero return om;
107*042d53a7SEvalZero }
108*042d53a7SEvalZero
109*042d53a7SEvalZero void
net_buf_unref(struct os_mbuf * om)110*042d53a7SEvalZero net_buf_unref(struct os_mbuf *om)
111*042d53a7SEvalZero {
112*042d53a7SEvalZero struct bt_mesh_adv *adv;
113*042d53a7SEvalZero
114*042d53a7SEvalZero /* For bufs with header we count refs*/
115*042d53a7SEvalZero if (OS_MBUF_USRHDR_LEN(om) == 0) {
116*042d53a7SEvalZero goto free;
117*042d53a7SEvalZero }
118*042d53a7SEvalZero
119*042d53a7SEvalZero adv = BT_MESH_ADV(om);
120*042d53a7SEvalZero if (--adv->ref_cnt > 0) {
121*042d53a7SEvalZero return;
122*042d53a7SEvalZero }
123*042d53a7SEvalZero
124*042d53a7SEvalZero free:
125*042d53a7SEvalZero os_mbuf_free_chain(om);
126*042d53a7SEvalZero }
127*042d53a7SEvalZero
128*042d53a7SEvalZero int
bt_encrypt_be(const uint8_t * key,const uint8_t * plaintext,uint8_t * enc_data)129*042d53a7SEvalZero bt_encrypt_be(const uint8_t *key, const uint8_t *plaintext, uint8_t *enc_data)
130*042d53a7SEvalZero {
131*042d53a7SEvalZero struct tc_aes_key_sched_struct s;
132*042d53a7SEvalZero
133*042d53a7SEvalZero if (tc_aes128_set_encrypt_key(&s, key) == TC_CRYPTO_FAIL) {
134*042d53a7SEvalZero return BLE_HS_EUNKNOWN;
135*042d53a7SEvalZero }
136*042d53a7SEvalZero
137*042d53a7SEvalZero if (tc_aes_encrypt(enc_data, plaintext, &s) == TC_CRYPTO_FAIL) {
138*042d53a7SEvalZero return BLE_HS_EUNKNOWN;
139*042d53a7SEvalZero }
140*042d53a7SEvalZero
141*042d53a7SEvalZero return 0;
142*042d53a7SEvalZero }
143*042d53a7SEvalZero
144*042d53a7SEvalZero uint16_t
net_buf_simple_pull_le16(struct os_mbuf * om)145*042d53a7SEvalZero net_buf_simple_pull_le16(struct os_mbuf *om)
146*042d53a7SEvalZero {
147*042d53a7SEvalZero uint16_t val;
148*042d53a7SEvalZero struct os_mbuf *old = om;
149*042d53a7SEvalZero
150*042d53a7SEvalZero om = os_mbuf_pullup(om, sizeof(val));
151*042d53a7SEvalZero assert(om == old);
152*042d53a7SEvalZero val = get_le16(om->om_data);
153*042d53a7SEvalZero os_mbuf_adj(om, sizeof(val));
154*042d53a7SEvalZero
155*042d53a7SEvalZero return val;
156*042d53a7SEvalZero }
157*042d53a7SEvalZero
158*042d53a7SEvalZero uint16_t
net_buf_simple_pull_be16(struct os_mbuf * om)159*042d53a7SEvalZero net_buf_simple_pull_be16(struct os_mbuf *om)
160*042d53a7SEvalZero {
161*042d53a7SEvalZero uint16_t val;
162*042d53a7SEvalZero struct os_mbuf *old = om;
163*042d53a7SEvalZero
164*042d53a7SEvalZero om = os_mbuf_pullup(om, sizeof(val));
165*042d53a7SEvalZero assert(om == old);
166*042d53a7SEvalZero val = get_be16(om->om_data);
167*042d53a7SEvalZero os_mbuf_adj(om, sizeof(val));
168*042d53a7SEvalZero
169*042d53a7SEvalZero return val;
170*042d53a7SEvalZero }
171*042d53a7SEvalZero
172*042d53a7SEvalZero uint32_t
net_buf_simple_pull_be32(struct os_mbuf * om)173*042d53a7SEvalZero net_buf_simple_pull_be32(struct os_mbuf *om)
174*042d53a7SEvalZero {
175*042d53a7SEvalZero uint32_t val;
176*042d53a7SEvalZero struct os_mbuf *old = om;
177*042d53a7SEvalZero
178*042d53a7SEvalZero om = os_mbuf_pullup(om, sizeof(val));
179*042d53a7SEvalZero assert(om == old);
180*042d53a7SEvalZero val = get_be32(om->om_data);
181*042d53a7SEvalZero os_mbuf_adj(om, sizeof(val));
182*042d53a7SEvalZero
183*042d53a7SEvalZero return val;
184*042d53a7SEvalZero }
185*042d53a7SEvalZero
186*042d53a7SEvalZero uint32_t
net_buf_simple_pull_le32(struct os_mbuf * om)187*042d53a7SEvalZero net_buf_simple_pull_le32(struct os_mbuf *om)
188*042d53a7SEvalZero {
189*042d53a7SEvalZero uint32_t val;
190*042d53a7SEvalZero struct os_mbuf *old = om;
191*042d53a7SEvalZero
192*042d53a7SEvalZero om = os_mbuf_pullup(om, sizeof(val));
193*042d53a7SEvalZero assert(om == old);
194*042d53a7SEvalZero val = get_le32(om->om_data);
195*042d53a7SEvalZero os_mbuf_adj(om, sizeof(val));
196*042d53a7SEvalZero
197*042d53a7SEvalZero return val;
198*042d53a7SEvalZero }
199*042d53a7SEvalZero
200*042d53a7SEvalZero uint8_t
net_buf_simple_pull_u8(struct os_mbuf * om)201*042d53a7SEvalZero net_buf_simple_pull_u8(struct os_mbuf *om)
202*042d53a7SEvalZero {
203*042d53a7SEvalZero uint8_t val;
204*042d53a7SEvalZero struct os_mbuf *old = om;
205*042d53a7SEvalZero
206*042d53a7SEvalZero om = os_mbuf_pullup(om, sizeof(val));
207*042d53a7SEvalZero assert(om == old);
208*042d53a7SEvalZero val = om->om_data[0];
209*042d53a7SEvalZero os_mbuf_adj(om, 1);
210*042d53a7SEvalZero
211*042d53a7SEvalZero return val;
212*042d53a7SEvalZero }
213*042d53a7SEvalZero
214*042d53a7SEvalZero void
net_buf_simple_add_le16(struct os_mbuf * om,uint16_t val)215*042d53a7SEvalZero net_buf_simple_add_le16(struct os_mbuf *om, uint16_t val)
216*042d53a7SEvalZero {
217*042d53a7SEvalZero val = htole16(val);
218*042d53a7SEvalZero os_mbuf_append(om, &val, sizeof(val));
219*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
220*042d53a7SEvalZero }
221*042d53a7SEvalZero
222*042d53a7SEvalZero void
net_buf_simple_add_be16(struct os_mbuf * om,uint16_t val)223*042d53a7SEvalZero net_buf_simple_add_be16(struct os_mbuf *om, uint16_t val)
224*042d53a7SEvalZero {
225*042d53a7SEvalZero val = htobe16(val);
226*042d53a7SEvalZero os_mbuf_append(om, &val, sizeof(val));
227*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
228*042d53a7SEvalZero }
229*042d53a7SEvalZero
230*042d53a7SEvalZero void
net_buf_simple_add_be32(struct os_mbuf * om,uint32_t val)231*042d53a7SEvalZero net_buf_simple_add_be32(struct os_mbuf *om, uint32_t val)
232*042d53a7SEvalZero {
233*042d53a7SEvalZero val = htobe32(val);
234*042d53a7SEvalZero os_mbuf_append(om, &val, sizeof(val));
235*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
236*042d53a7SEvalZero }
237*042d53a7SEvalZero
238*042d53a7SEvalZero void
net_buf_simple_add_le32(struct os_mbuf * om,uint32_t val)239*042d53a7SEvalZero net_buf_simple_add_le32(struct os_mbuf *om, uint32_t val)
240*042d53a7SEvalZero {
241*042d53a7SEvalZero val = htole32(val);
242*042d53a7SEvalZero os_mbuf_append(om, &val, sizeof(val));
243*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
244*042d53a7SEvalZero }
245*042d53a7SEvalZero
246*042d53a7SEvalZero void
net_buf_simple_add_u8(struct os_mbuf * om,uint8_t val)247*042d53a7SEvalZero net_buf_simple_add_u8(struct os_mbuf *om, uint8_t val)
248*042d53a7SEvalZero {
249*042d53a7SEvalZero os_mbuf_append(om, &val, 1);
250*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
251*042d53a7SEvalZero }
252*042d53a7SEvalZero
253*042d53a7SEvalZero void
net_buf_simple_push_le16(struct os_mbuf * om,uint16_t val)254*042d53a7SEvalZero net_buf_simple_push_le16(struct os_mbuf *om, uint16_t val)
255*042d53a7SEvalZero {
256*042d53a7SEvalZero uint8_t headroom = om->om_data - &om->om_databuf[om->om_pkthdr_len];
257*042d53a7SEvalZero
258*042d53a7SEvalZero assert(headroom >= 2);
259*042d53a7SEvalZero om->om_data -= 2;
260*042d53a7SEvalZero put_le16(om->om_data, val);
261*042d53a7SEvalZero om->om_len += 2;
262*042d53a7SEvalZero
263*042d53a7SEvalZero if (om->om_pkthdr_len) {
264*042d53a7SEvalZero OS_MBUF_PKTHDR(om)->omp_len += 2;
265*042d53a7SEvalZero }
266*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
267*042d53a7SEvalZero }
268*042d53a7SEvalZero
269*042d53a7SEvalZero void
net_buf_simple_push_be16(struct os_mbuf * om,uint16_t val)270*042d53a7SEvalZero net_buf_simple_push_be16(struct os_mbuf *om, uint16_t val)
271*042d53a7SEvalZero {
272*042d53a7SEvalZero uint8_t headroom = om->om_data - &om->om_databuf[om->om_pkthdr_len];
273*042d53a7SEvalZero
274*042d53a7SEvalZero assert(headroom >= 2);
275*042d53a7SEvalZero om->om_data -= 2;
276*042d53a7SEvalZero put_be16(om->om_data, val);
277*042d53a7SEvalZero om->om_len += 2;
278*042d53a7SEvalZero
279*042d53a7SEvalZero if (om->om_pkthdr_len) {
280*042d53a7SEvalZero OS_MBUF_PKTHDR(om)->omp_len += 2;
281*042d53a7SEvalZero }
282*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
283*042d53a7SEvalZero }
284*042d53a7SEvalZero
285*042d53a7SEvalZero void
net_buf_simple_push_u8(struct os_mbuf * om,uint8_t val)286*042d53a7SEvalZero net_buf_simple_push_u8(struct os_mbuf *om, uint8_t val)
287*042d53a7SEvalZero {
288*042d53a7SEvalZero uint8_t headroom = om->om_data - &om->om_databuf[om->om_pkthdr_len];
289*042d53a7SEvalZero
290*042d53a7SEvalZero assert(headroom >= 1);
291*042d53a7SEvalZero om->om_data -= 1;
292*042d53a7SEvalZero om->om_data[0] = val;
293*042d53a7SEvalZero om->om_len += 1;
294*042d53a7SEvalZero
295*042d53a7SEvalZero if (om->om_pkthdr_len) {
296*042d53a7SEvalZero OS_MBUF_PKTHDR(om)->omp_len += 1;
297*042d53a7SEvalZero }
298*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
299*042d53a7SEvalZero }
300*042d53a7SEvalZero
301*042d53a7SEvalZero void
net_buf_add_zeros(struct os_mbuf * om,uint8_t len)302*042d53a7SEvalZero net_buf_add_zeros(struct os_mbuf *om, uint8_t len)
303*042d53a7SEvalZero {
304*042d53a7SEvalZero uint8_t z[len];
305*042d53a7SEvalZero int rc;
306*042d53a7SEvalZero
307*042d53a7SEvalZero memset(z, 0, len);
308*042d53a7SEvalZero
309*042d53a7SEvalZero rc = os_mbuf_append(om, z, len);
310*042d53a7SEvalZero if(rc) {
311*042d53a7SEvalZero assert(0);
312*042d53a7SEvalZero }
313*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
314*042d53a7SEvalZero }
315*042d53a7SEvalZero
316*042d53a7SEvalZero void *
net_buf_simple_pull(struct os_mbuf * om,uint8_t len)317*042d53a7SEvalZero net_buf_simple_pull(struct os_mbuf *om, uint8_t len)
318*042d53a7SEvalZero {
319*042d53a7SEvalZero os_mbuf_adj(om, len);
320*042d53a7SEvalZero return om->om_data;
321*042d53a7SEvalZero }
322*042d53a7SEvalZero
323*042d53a7SEvalZero void*
net_buf_simple_add(struct os_mbuf * om,uint8_t len)324*042d53a7SEvalZero net_buf_simple_add(struct os_mbuf *om, uint8_t len)
325*042d53a7SEvalZero {
326*042d53a7SEvalZero void * tmp;
327*042d53a7SEvalZero
328*042d53a7SEvalZero tmp = os_mbuf_extend(om, len);
329*042d53a7SEvalZero ASSERT_NOT_CHAIN(om);
330*042d53a7SEvalZero
331*042d53a7SEvalZero return tmp;
332*042d53a7SEvalZero }
333*042d53a7SEvalZero
334*042d53a7SEvalZero bool
k_fifo_is_empty(struct ble_npl_eventq * q)335*042d53a7SEvalZero k_fifo_is_empty(struct ble_npl_eventq *q)
336*042d53a7SEvalZero {
337*042d53a7SEvalZero return ble_npl_eventq_is_empty(q);
338*042d53a7SEvalZero }
339*042d53a7SEvalZero
net_buf_get(struct ble_npl_eventq * fifo,s32_t t)340*042d53a7SEvalZero void * net_buf_get(struct ble_npl_eventq *fifo, s32_t t)
341*042d53a7SEvalZero {
342*042d53a7SEvalZero struct ble_npl_event *ev = ble_npl_eventq_get(fifo, 0);
343*042d53a7SEvalZero
344*042d53a7SEvalZero if (ev) {
345*042d53a7SEvalZero return ble_npl_event_get_arg(ev);
346*042d53a7SEvalZero }
347*042d53a7SEvalZero
348*042d53a7SEvalZero return NULL;
349*042d53a7SEvalZero }
350*042d53a7SEvalZero
351*042d53a7SEvalZero uint8_t *
net_buf_simple_push(struct os_mbuf * om,uint8_t len)352*042d53a7SEvalZero net_buf_simple_push(struct os_mbuf *om, uint8_t len)
353*042d53a7SEvalZero {
354*042d53a7SEvalZero uint8_t headroom = om->om_data - &om->om_databuf[om->om_pkthdr_len];
355*042d53a7SEvalZero
356*042d53a7SEvalZero assert(headroom >= len);
357*042d53a7SEvalZero om->om_data -= len;
358*042d53a7SEvalZero om->om_len += len;
359*042d53a7SEvalZero
360*042d53a7SEvalZero return om->om_data;
361*042d53a7SEvalZero }
362*042d53a7SEvalZero
363*042d53a7SEvalZero void
net_buf_reserve(struct os_mbuf * om,size_t reserve)364*042d53a7SEvalZero net_buf_reserve(struct os_mbuf *om, size_t reserve)
365*042d53a7SEvalZero {
366*042d53a7SEvalZero /* We need reserve to be done on fresh buf */
367*042d53a7SEvalZero assert(om->om_len == 0);
368*042d53a7SEvalZero om->om_data += reserve;
369*042d53a7SEvalZero }
370*042d53a7SEvalZero
371*042d53a7SEvalZero void
k_work_init(struct ble_npl_callout * work,ble_npl_event_fn handler)372*042d53a7SEvalZero k_work_init(struct ble_npl_callout *work, ble_npl_event_fn handler)
373*042d53a7SEvalZero {
374*042d53a7SEvalZero #ifndef MYNEWT
375*042d53a7SEvalZero ble_npl_callout_init(work, nimble_port_get_dflt_eventq(), handler, NULL);
376*042d53a7SEvalZero #else
377*042d53a7SEvalZero ble_npl_callout_init(work, ble_npl_eventq_dflt_get(), handler, NULL);
378*042d53a7SEvalZero #endif
379*042d53a7SEvalZero }
380*042d53a7SEvalZero
381*042d53a7SEvalZero void
k_delayed_work_init(struct k_delayed_work * w,ble_npl_event_fn * f)382*042d53a7SEvalZero k_delayed_work_init(struct k_delayed_work *w, ble_npl_event_fn *f)
383*042d53a7SEvalZero {
384*042d53a7SEvalZero #ifndef MYNEWT
385*042d53a7SEvalZero ble_npl_callout_init(&w->work, nimble_port_get_dflt_eventq(), f, NULL);
386*042d53a7SEvalZero #else
387*042d53a7SEvalZero ble_npl_callout_init(&w->work, ble_npl_eventq_dflt_get(), f, NULL);
388*042d53a7SEvalZero #endif
389*042d53a7SEvalZero }
390*042d53a7SEvalZero
391*042d53a7SEvalZero void
k_delayed_work_cancel(struct k_delayed_work * w)392*042d53a7SEvalZero k_delayed_work_cancel(struct k_delayed_work *w)
393*042d53a7SEvalZero {
394*042d53a7SEvalZero ble_npl_callout_stop(&w->work);
395*042d53a7SEvalZero }
396*042d53a7SEvalZero
397*042d53a7SEvalZero void
k_delayed_work_submit(struct k_delayed_work * w,uint32_t ms)398*042d53a7SEvalZero k_delayed_work_submit(struct k_delayed_work *w, uint32_t ms)
399*042d53a7SEvalZero {
400*042d53a7SEvalZero uint32_t ticks;
401*042d53a7SEvalZero
402*042d53a7SEvalZero if (ble_npl_time_ms_to_ticks(ms, &ticks) != 0) {
403*042d53a7SEvalZero assert(0);
404*042d53a7SEvalZero }
405*042d53a7SEvalZero ble_npl_callout_reset(&w->work, ticks);
406*042d53a7SEvalZero }
407*042d53a7SEvalZero
408*042d53a7SEvalZero void
k_work_submit(struct ble_npl_callout * w)409*042d53a7SEvalZero k_work_submit(struct ble_npl_callout *w)
410*042d53a7SEvalZero {
411*042d53a7SEvalZero ble_npl_callout_reset(w, 0);
412*042d53a7SEvalZero }
413*042d53a7SEvalZero
414*042d53a7SEvalZero void
k_work_add_arg(struct ble_npl_callout * w,void * arg)415*042d53a7SEvalZero k_work_add_arg(struct ble_npl_callout *w, void *arg)
416*042d53a7SEvalZero {
417*042d53a7SEvalZero ble_npl_callout_set_arg(w, arg);
418*042d53a7SEvalZero }
419*042d53a7SEvalZero
420*042d53a7SEvalZero void
k_delayed_work_add_arg(struct k_delayed_work * w,void * arg)421*042d53a7SEvalZero k_delayed_work_add_arg(struct k_delayed_work *w, void *arg)
422*042d53a7SEvalZero {
423*042d53a7SEvalZero k_work_add_arg(&w->work, arg);
424*042d53a7SEvalZero }
425*042d53a7SEvalZero
426*042d53a7SEvalZero uint32_t
k_delayed_work_remaining_get(struct k_delayed_work * w)427*042d53a7SEvalZero k_delayed_work_remaining_get (struct k_delayed_work *w)
428*042d53a7SEvalZero {
429*042d53a7SEvalZero int sr;
430*042d53a7SEvalZero ble_npl_time_t t;
431*042d53a7SEvalZero
432*042d53a7SEvalZero OS_ENTER_CRITICAL(sr);
433*042d53a7SEvalZero
434*042d53a7SEvalZero t = ble_npl_callout_remaining_ticks(&w->work, ble_npl_time_get());
435*042d53a7SEvalZero
436*042d53a7SEvalZero OS_EXIT_CRITICAL(sr);
437*042d53a7SEvalZero
438*042d53a7SEvalZero return ble_npl_time_ticks_to_ms32(t);
439*042d53a7SEvalZero }
440*042d53a7SEvalZero
k_uptime_get(void)441*042d53a7SEvalZero int64_t k_uptime_get(void)
442*042d53a7SEvalZero {
443*042d53a7SEvalZero /* We should return ms */
444*042d53a7SEvalZero return ble_npl_time_ticks_to_ms32(ble_npl_time_get());
445*042d53a7SEvalZero }
446*042d53a7SEvalZero
k_uptime_get_32(void)447*042d53a7SEvalZero u32_t k_uptime_get_32(void)
448*042d53a7SEvalZero {
449*042d53a7SEvalZero return k_uptime_get();
450*042d53a7SEvalZero }
451*042d53a7SEvalZero
k_sleep(int32_t duration)452*042d53a7SEvalZero void k_sleep(int32_t duration)
453*042d53a7SEvalZero {
454*042d53a7SEvalZero uint32_t ticks;
455*042d53a7SEvalZero
456*042d53a7SEvalZero ticks = ble_npl_time_ms_to_ticks32(duration);
457*042d53a7SEvalZero
458*042d53a7SEvalZero ble_npl_time_delay(ticks);
459*042d53a7SEvalZero }
460*042d53a7SEvalZero
461*042d53a7SEvalZero static uint8_t pub[64];
462*042d53a7SEvalZero static uint8_t priv[32];
463*042d53a7SEvalZero static bool has_pub = false;
464*042d53a7SEvalZero
465*042d53a7SEvalZero int
bt_dh_key_gen(const u8_t remote_pk[64],bt_dh_key_cb_t cb)466*042d53a7SEvalZero bt_dh_key_gen(const u8_t remote_pk[64], bt_dh_key_cb_t cb)
467*042d53a7SEvalZero {
468*042d53a7SEvalZero uint8_t dh[32];
469*042d53a7SEvalZero
470*042d53a7SEvalZero if (ble_sm_alg_gen_dhkey((uint8_t *)&remote_pk[0], (uint8_t *)&remote_pk[32],
471*042d53a7SEvalZero priv, dh)) {
472*042d53a7SEvalZero return -1;
473*042d53a7SEvalZero }
474*042d53a7SEvalZero
475*042d53a7SEvalZero cb(dh);
476*042d53a7SEvalZero return 0;
477*042d53a7SEvalZero }
478*042d53a7SEvalZero
479*042d53a7SEvalZero int
bt_rand(void * buf,size_t len)480*042d53a7SEvalZero bt_rand(void *buf, size_t len)
481*042d53a7SEvalZero {
482*042d53a7SEvalZero int rc;
483*042d53a7SEvalZero rc = ble_hs_hci_util_rand(buf, len);
484*042d53a7SEvalZero if (rc != 0) {
485*042d53a7SEvalZero return -1;
486*042d53a7SEvalZero }
487*042d53a7SEvalZero
488*042d53a7SEvalZero return 0;
489*042d53a7SEvalZero }
490*042d53a7SEvalZero
491*042d53a7SEvalZero int
bt_pub_key_gen(struct bt_pub_key_cb * new_cb)492*042d53a7SEvalZero bt_pub_key_gen(struct bt_pub_key_cb *new_cb)
493*042d53a7SEvalZero {
494*042d53a7SEvalZero
495*042d53a7SEvalZero if (ble_sm_alg_gen_key_pair(pub, priv)) {
496*042d53a7SEvalZero assert(0);
497*042d53a7SEvalZero return -1;
498*042d53a7SEvalZero }
499*042d53a7SEvalZero
500*042d53a7SEvalZero new_cb->func(pub);
501*042d53a7SEvalZero has_pub = true;
502*042d53a7SEvalZero
503*042d53a7SEvalZero return 0;
504*042d53a7SEvalZero }
505*042d53a7SEvalZero
506*042d53a7SEvalZero uint8_t *
bt_pub_key_get(void)507*042d53a7SEvalZero bt_pub_key_get(void)
508*042d53a7SEvalZero {
509*042d53a7SEvalZero if (!has_pub) {
510*042d53a7SEvalZero return NULL;
511*042d53a7SEvalZero }
512*042d53a7SEvalZero
513*042d53a7SEvalZero return pub;
514*042d53a7SEvalZero }
515*042d53a7SEvalZero
516*042d53a7SEvalZero static int
set_ad(const struct bt_data * ad,size_t ad_len,u8_t * buf,u8_t * buf_len)517*042d53a7SEvalZero set_ad(const struct bt_data *ad, size_t ad_len, u8_t *buf, u8_t *buf_len)
518*042d53a7SEvalZero {
519*042d53a7SEvalZero int i;
520*042d53a7SEvalZero
521*042d53a7SEvalZero for (i = 0; i < ad_len; i++) {
522*042d53a7SEvalZero buf[(*buf_len)++] = ad[i].data_len + 1;
523*042d53a7SEvalZero buf[(*buf_len)++] = ad[i].type;
524*042d53a7SEvalZero
525*042d53a7SEvalZero memcpy(&buf[*buf_len], ad[i].data,
526*042d53a7SEvalZero ad[i].data_len);
527*042d53a7SEvalZero *buf_len += ad[i].data_len;
528*042d53a7SEvalZero }
529*042d53a7SEvalZero
530*042d53a7SEvalZero return 0;
531*042d53a7SEvalZero }
532*042d53a7SEvalZero
533*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV)
534*042d53a7SEvalZero static void
ble_adv_copy_to_ext_param(struct ble_gap_ext_adv_params * ext_param,const struct ble_gap_adv_params * param)535*042d53a7SEvalZero ble_adv_copy_to_ext_param(struct ble_gap_ext_adv_params *ext_param,
536*042d53a7SEvalZero const struct ble_gap_adv_params *param)
537*042d53a7SEvalZero {
538*042d53a7SEvalZero memset(ext_param, 0, sizeof(*ext_param));
539*042d53a7SEvalZero
540*042d53a7SEvalZero ext_param->legacy_pdu = 1;
541*042d53a7SEvalZero
542*042d53a7SEvalZero if (param->conn_mode != BLE_GAP_CONN_MODE_NON) {
543*042d53a7SEvalZero ext_param->connectable = 1;
544*042d53a7SEvalZero ext_param->scannable = 1;
545*042d53a7SEvalZero }
546*042d53a7SEvalZero
547*042d53a7SEvalZero ext_param->itvl_max = param->itvl_max;
548*042d53a7SEvalZero ext_param->itvl_min = param->itvl_min;
549*042d53a7SEvalZero ext_param->channel_map = param->channel_map;
550*042d53a7SEvalZero ext_param->high_duty_directed = param->high_duty_cycle;
551*042d53a7SEvalZero ext_param->own_addr_type = g_mesh_addr_type;
552*042d53a7SEvalZero }
553*042d53a7SEvalZero
554*042d53a7SEvalZero static int
ble_adv_conf_adv_instance(const struct ble_gap_adv_params * param,int * instance)555*042d53a7SEvalZero ble_adv_conf_adv_instance(const struct ble_gap_adv_params *param, int *instance)
556*042d53a7SEvalZero {
557*042d53a7SEvalZero struct ble_gap_ext_adv_params ext_params;
558*042d53a7SEvalZero struct ble_gap_adv_params *cur_conf;
559*042d53a7SEvalZero int err = 0;
560*042d53a7SEvalZero
561*042d53a7SEvalZero if (param->conn_mode == BLE_GAP_CONN_MODE_NON) {
562*042d53a7SEvalZero *instance = BT_MESH_ADV_INST;
563*042d53a7SEvalZero cur_conf = &ble_adv_cur_conf[BT_MESH_ADV_IDX];
564*042d53a7SEvalZero } else {
565*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_PROXY)
566*042d53a7SEvalZero *instance = BT_MESH_ADV_GATT_INST;
567*042d53a7SEvalZero cur_conf = &ble_adv_cur_conf[BT_MESH_GATT_IDX];
568*042d53a7SEvalZero #else
569*042d53a7SEvalZero assert(0);
570*042d53a7SEvalZero #endif
571*042d53a7SEvalZero }
572*042d53a7SEvalZero
573*042d53a7SEvalZero /* Checking interval max as it has to be in place if instance was configured
574*042d53a7SEvalZero * before.
575*042d53a7SEvalZero */
576*042d53a7SEvalZero if (cur_conf->itvl_max == 0) {
577*042d53a7SEvalZero goto configure;
578*042d53a7SEvalZero }
579*042d53a7SEvalZero
580*042d53a7SEvalZero if (memcmp(param, cur_conf, sizeof(*cur_conf)) == 0) {
581*042d53a7SEvalZero /* Same parameters - skip reconfiguring */
582*042d53a7SEvalZero goto done;
583*042d53a7SEvalZero }
584*042d53a7SEvalZero
585*042d53a7SEvalZero ble_gap_ext_adv_stop(*instance);
586*042d53a7SEvalZero err = ble_gap_ext_adv_remove(*instance);
587*042d53a7SEvalZero if (err) {
588*042d53a7SEvalZero assert(0);
589*042d53a7SEvalZero goto done;
590*042d53a7SEvalZero }
591*042d53a7SEvalZero
592*042d53a7SEvalZero configure:
593*042d53a7SEvalZero ble_adv_copy_to_ext_param(&ext_params, param);
594*042d53a7SEvalZero
595*042d53a7SEvalZero err = ble_gap_ext_adv_configure(*instance, &ext_params, 0,
596*042d53a7SEvalZero ble_adv_gap_mesh_cb, NULL);
597*042d53a7SEvalZero if (!err) {
598*042d53a7SEvalZero memcpy(cur_conf, param, sizeof(*cur_conf));
599*042d53a7SEvalZero }
600*042d53a7SEvalZero
601*042d53a7SEvalZero done:
602*042d53a7SEvalZero return err;
603*042d53a7SEvalZero }
604*042d53a7SEvalZero
605*042d53a7SEvalZero int
bt_le_adv_start(const struct ble_gap_adv_params * param,const struct bt_data * ad,size_t ad_len,const struct bt_data * sd,size_t sd_len)606*042d53a7SEvalZero bt_le_adv_start(const struct ble_gap_adv_params *param,
607*042d53a7SEvalZero const struct bt_data *ad, size_t ad_len,
608*042d53a7SEvalZero const struct bt_data *sd, size_t sd_len)
609*042d53a7SEvalZero {
610*042d53a7SEvalZero struct os_mbuf *data;
611*042d53a7SEvalZero int instance;
612*042d53a7SEvalZero int err;
613*042d53a7SEvalZero uint8_t buf[BLE_HS_ADV_MAX_SZ];
614*042d53a7SEvalZero uint8_t buf_len = 0;
615*042d53a7SEvalZero
616*042d53a7SEvalZero err = ble_adv_conf_adv_instance(param, &instance);
617*042d53a7SEvalZero if (err) {
618*042d53a7SEvalZero return err;
619*042d53a7SEvalZero }
620*042d53a7SEvalZero
621*042d53a7SEvalZero if (ad_len > 0) {
622*042d53a7SEvalZero err = set_ad(ad, ad_len, buf, &buf_len);
623*042d53a7SEvalZero if (err) {
624*042d53a7SEvalZero return err;
625*042d53a7SEvalZero }
626*042d53a7SEvalZero
627*042d53a7SEvalZero /* For now let's use msys pool. We are not putting more then legacy */
628*042d53a7SEvalZero data = os_msys_get_pkthdr(BLE_HS_ADV_MAX_SZ, 0);
629*042d53a7SEvalZero if (!data) {
630*042d53a7SEvalZero return OS_ENOMEM;
631*042d53a7SEvalZero }
632*042d53a7SEvalZero
633*042d53a7SEvalZero err = os_mbuf_append(data, buf, buf_len);
634*042d53a7SEvalZero if (err) {
635*042d53a7SEvalZero goto error;
636*042d53a7SEvalZero }
637*042d53a7SEvalZero
638*042d53a7SEvalZero err = ble_gap_ext_adv_set_data(instance, data);
639*042d53a7SEvalZero if (err) {
640*042d53a7SEvalZero return err;
641*042d53a7SEvalZero }
642*042d53a7SEvalZero
643*042d53a7SEvalZero data = NULL;
644*042d53a7SEvalZero }
645*042d53a7SEvalZero
646*042d53a7SEvalZero if (sd_len > 0) {
647*042d53a7SEvalZero buf_len = 0;
648*042d53a7SEvalZero
649*042d53a7SEvalZero err = set_ad(sd, sd_len, buf, &buf_len);
650*042d53a7SEvalZero if (err) {
651*042d53a7SEvalZero return err;
652*042d53a7SEvalZero }
653*042d53a7SEvalZero
654*042d53a7SEvalZero /* For now let's use msys pool. We are not putting more then legace*/
655*042d53a7SEvalZero data = os_msys_get_pkthdr(BLE_HS_ADV_MAX_SZ, 0);
656*042d53a7SEvalZero if (!data) {
657*042d53a7SEvalZero return OS_ENOMEM;
658*042d53a7SEvalZero }
659*042d53a7SEvalZero
660*042d53a7SEvalZero err = os_mbuf_append(data, buf, buf_len);
661*042d53a7SEvalZero if (err) {
662*042d53a7SEvalZero goto error;
663*042d53a7SEvalZero }
664*042d53a7SEvalZero
665*042d53a7SEvalZero err = ble_gap_ext_adv_rsp_set_data(instance, data);
666*042d53a7SEvalZero if (err) {
667*042d53a7SEvalZero goto error;
668*042d53a7SEvalZero }
669*042d53a7SEvalZero }
670*042d53a7SEvalZero
671*042d53a7SEvalZero /*TODO: We could use duration and max events in the future */
672*042d53a7SEvalZero err = ble_gap_ext_adv_start(instance, 0, 0);
673*042d53a7SEvalZero return err;
674*042d53a7SEvalZero
675*042d53a7SEvalZero error:
676*042d53a7SEvalZero if (data) {
677*042d53a7SEvalZero os_mbuf_free_chain(data);
678*042d53a7SEvalZero }
679*042d53a7SEvalZero
680*042d53a7SEvalZero return err;
681*042d53a7SEvalZero }
682*042d53a7SEvalZero
bt_le_adv_stop(bool proxy)683*042d53a7SEvalZero int bt_le_adv_stop(bool proxy)
684*042d53a7SEvalZero {
685*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_PROXY)
686*042d53a7SEvalZero int rc;
687*042d53a7SEvalZero
688*042d53a7SEvalZero if (proxy) {
689*042d53a7SEvalZero rc = ble_gap_ext_adv_stop(BT_MESH_ADV_GATT_INST);
690*042d53a7SEvalZero } else {
691*042d53a7SEvalZero rc = ble_gap_ext_adv_stop(BT_MESH_ADV_INST);
692*042d53a7SEvalZero }
693*042d53a7SEvalZero
694*042d53a7SEvalZero return rc;
695*042d53a7SEvalZero #else
696*042d53a7SEvalZero return ble_gap_ext_adv_stop(BT_MESH_ADV_INST);
697*042d53a7SEvalZero #endif
698*042d53a7SEvalZero }
699*042d53a7SEvalZero
700*042d53a7SEvalZero #else
701*042d53a7SEvalZero
702*042d53a7SEvalZero int
bt_le_adv_start(const struct ble_gap_adv_params * param,const struct bt_data * ad,size_t ad_len,const struct bt_data * sd,size_t sd_len)703*042d53a7SEvalZero bt_le_adv_start(const struct ble_gap_adv_params *param,
704*042d53a7SEvalZero const struct bt_data *ad, size_t ad_len,
705*042d53a7SEvalZero const struct bt_data *sd, size_t sd_len)
706*042d53a7SEvalZero {
707*042d53a7SEvalZero uint8_t buf[BLE_HS_ADV_MAX_SZ];
708*042d53a7SEvalZero uint8_t buf_len = 0;
709*042d53a7SEvalZero int err;
710*042d53a7SEvalZero
711*042d53a7SEvalZero err = set_ad(ad, ad_len, buf, &buf_len);
712*042d53a7SEvalZero if (err) {
713*042d53a7SEvalZero return err;
714*042d53a7SEvalZero }
715*042d53a7SEvalZero
716*042d53a7SEvalZero err = ble_gap_adv_set_data(buf, buf_len);
717*042d53a7SEvalZero if (err != 0) {
718*042d53a7SEvalZero return err;
719*042d53a7SEvalZero }
720*042d53a7SEvalZero
721*042d53a7SEvalZero if (sd) {
722*042d53a7SEvalZero buf_len = 0;
723*042d53a7SEvalZero
724*042d53a7SEvalZero err = set_ad(sd, sd_len, buf, &buf_len);
725*042d53a7SEvalZero if (err) {
726*042d53a7SEvalZero BT_ERR("Advertising failed: err %d", err);
727*042d53a7SEvalZero return err;
728*042d53a7SEvalZero }
729*042d53a7SEvalZero
730*042d53a7SEvalZero err = ble_gap_adv_rsp_set_data(buf, buf_len);
731*042d53a7SEvalZero if (err != 0) {
732*042d53a7SEvalZero BT_ERR("Advertising failed: err %d", err);
733*042d53a7SEvalZero return err;
734*042d53a7SEvalZero }
735*042d53a7SEvalZero }
736*042d53a7SEvalZero
737*042d53a7SEvalZero err = ble_gap_adv_start(g_mesh_addr_type, NULL, BLE_HS_FOREVER, param,
738*042d53a7SEvalZero NULL, NULL);
739*042d53a7SEvalZero if (err) {
740*042d53a7SEvalZero BT_ERR("Advertising failed: err %d", err);
741*042d53a7SEvalZero return err;
742*042d53a7SEvalZero }
743*042d53a7SEvalZero
744*042d53a7SEvalZero return 0;
745*042d53a7SEvalZero }
746*042d53a7SEvalZero
bt_le_adv_stop(bool proxy)747*042d53a7SEvalZero int bt_le_adv_stop(bool proxy)
748*042d53a7SEvalZero {
749*042d53a7SEvalZero return ble_gap_adv_stop();
750*042d53a7SEvalZero }
751*042d53a7SEvalZero
752*042d53a7SEvalZero #endif
753*042d53a7SEvalZero
754*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_PROXY)
755*042d53a7SEvalZero int bt_mesh_proxy_svcs_register(void);
756*042d53a7SEvalZero #endif
757*042d53a7SEvalZero
758*042d53a7SEvalZero void
bt_mesh_register_gatt(void)759*042d53a7SEvalZero bt_mesh_register_gatt(void)
760*042d53a7SEvalZero {
761*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_PROXY)
762*042d53a7SEvalZero bt_mesh_proxy_svcs_register();
763*042d53a7SEvalZero #endif
764*042d53a7SEvalZero }
765*042d53a7SEvalZero
net_buf_slist_init(struct net_buf_slist_t * list)766*042d53a7SEvalZero void net_buf_slist_init(struct net_buf_slist_t *list)
767*042d53a7SEvalZero {
768*042d53a7SEvalZero STAILQ_INIT(list);
769*042d53a7SEvalZero }
770*042d53a7SEvalZero
net_buf_slist_is_empty(struct net_buf_slist_t * list)771*042d53a7SEvalZero bool net_buf_slist_is_empty(struct net_buf_slist_t *list)
772*042d53a7SEvalZero {
773*042d53a7SEvalZero return STAILQ_EMPTY(list);
774*042d53a7SEvalZero }
775*042d53a7SEvalZero
net_buf_slist_peek_head(struct net_buf_slist_t * list)776*042d53a7SEvalZero struct os_mbuf *net_buf_slist_peek_head(struct net_buf_slist_t *list)
777*042d53a7SEvalZero {
778*042d53a7SEvalZero struct os_mbuf_pkthdr *pkthdr;
779*042d53a7SEvalZero
780*042d53a7SEvalZero /* Get mbuf pointer from packet header pointer */
781*042d53a7SEvalZero pkthdr = STAILQ_FIRST(list);
782*042d53a7SEvalZero if (!pkthdr) {
783*042d53a7SEvalZero return NULL;
784*042d53a7SEvalZero }
785*042d53a7SEvalZero
786*042d53a7SEvalZero return OS_MBUF_PKTHDR_TO_MBUF(pkthdr);
787*042d53a7SEvalZero }
788*042d53a7SEvalZero
net_buf_slist_peek_next(struct os_mbuf * buf)789*042d53a7SEvalZero struct os_mbuf *net_buf_slist_peek_next(struct os_mbuf *buf)
790*042d53a7SEvalZero {
791*042d53a7SEvalZero struct os_mbuf_pkthdr *pkthdr;
792*042d53a7SEvalZero
793*042d53a7SEvalZero /* Get mbuf pointer from packet header pointer */
794*042d53a7SEvalZero pkthdr = OS_MBUF_PKTHDR(buf);
795*042d53a7SEvalZero pkthdr = STAILQ_NEXT(pkthdr, omp_next);
796*042d53a7SEvalZero if (!pkthdr) {
797*042d53a7SEvalZero return NULL;
798*042d53a7SEvalZero }
799*042d53a7SEvalZero
800*042d53a7SEvalZero return OS_MBUF_PKTHDR_TO_MBUF(pkthdr);
801*042d53a7SEvalZero }
802*042d53a7SEvalZero
net_buf_slist_get(struct net_buf_slist_t * list)803*042d53a7SEvalZero struct os_mbuf *net_buf_slist_get(struct net_buf_slist_t *list)
804*042d53a7SEvalZero {
805*042d53a7SEvalZero os_sr_t sr;
806*042d53a7SEvalZero struct os_mbuf *m;
807*042d53a7SEvalZero
808*042d53a7SEvalZero m = net_buf_slist_peek_head(list);
809*042d53a7SEvalZero if (!m) {
810*042d53a7SEvalZero return NULL;
811*042d53a7SEvalZero }
812*042d53a7SEvalZero
813*042d53a7SEvalZero /* Remove from queue */
814*042d53a7SEvalZero OS_ENTER_CRITICAL(sr);
815*042d53a7SEvalZero STAILQ_REMOVE_HEAD(list, omp_next);
816*042d53a7SEvalZero OS_EXIT_CRITICAL(sr);
817*042d53a7SEvalZero return m;
818*042d53a7SEvalZero }
819*042d53a7SEvalZero
net_buf_slist_put(struct net_buf_slist_t * list,struct os_mbuf * buf)820*042d53a7SEvalZero void net_buf_slist_put(struct net_buf_slist_t *list, struct os_mbuf *buf)
821*042d53a7SEvalZero {
822*042d53a7SEvalZero struct os_mbuf_pkthdr *pkthdr;
823*042d53a7SEvalZero
824*042d53a7SEvalZero pkthdr = OS_MBUF_PKTHDR(buf);
825*042d53a7SEvalZero STAILQ_INSERT_TAIL(list, pkthdr, omp_next);
826*042d53a7SEvalZero }
827*042d53a7SEvalZero
net_buf_slist_remove(struct net_buf_slist_t * list,struct os_mbuf * prev,struct os_mbuf * cur)828*042d53a7SEvalZero void net_buf_slist_remove(struct net_buf_slist_t *list, struct os_mbuf *prev,
829*042d53a7SEvalZero struct os_mbuf *cur)
830*042d53a7SEvalZero {
831*042d53a7SEvalZero struct os_mbuf_pkthdr *pkthdr, *cur_pkthdr;
832*042d53a7SEvalZero
833*042d53a7SEvalZero cur_pkthdr = OS_MBUF_PKTHDR(cur);
834*042d53a7SEvalZero
835*042d53a7SEvalZero STAILQ_FOREACH(pkthdr, list, omp_next) {
836*042d53a7SEvalZero if (cur_pkthdr == pkthdr) {
837*042d53a7SEvalZero STAILQ_REMOVE(list, cur_pkthdr, os_mbuf_pkthdr, omp_next);
838*042d53a7SEvalZero break;
839*042d53a7SEvalZero }
840*042d53a7SEvalZero }
841*042d53a7SEvalZero }
842*042d53a7SEvalZero
net_buf_slist_merge_slist(struct net_buf_slist_t * list,struct net_buf_slist_t * list_to_append)843*042d53a7SEvalZero void net_buf_slist_merge_slist(struct net_buf_slist_t *list,
844*042d53a7SEvalZero struct net_buf_slist_t *list_to_append)
845*042d53a7SEvalZero {
846*042d53a7SEvalZero struct os_mbuf_pkthdr *pkthdr;
847*042d53a7SEvalZero
848*042d53a7SEvalZero STAILQ_FOREACH(pkthdr, list_to_append, omp_next) {
849*042d53a7SEvalZero STAILQ_INSERT_TAIL(list, pkthdr, omp_next);
850*042d53a7SEvalZero }
851*042d53a7SEvalZero
852*042d53a7SEvalZero STAILQ_INIT(list);
853*042d53a7SEvalZero }
854*042d53a7SEvalZero
855*042d53a7SEvalZero #if MYNEWT_VAL(BLE_MESH_SETTINGS)
856*042d53a7SEvalZero
settings_bytes_from_str(char * val_str,void * vp,int * len)857*042d53a7SEvalZero int settings_bytes_from_str(char *val_str, void *vp, int *len)
858*042d53a7SEvalZero {
859*042d53a7SEvalZero *len = base64_decode(val_str, vp);
860*042d53a7SEvalZero return 0;
861*042d53a7SEvalZero }
862*042d53a7SEvalZero
settings_str_from_bytes(void * vp,int vp_len,char * buf,int buf_len)863*042d53a7SEvalZero char *settings_str_from_bytes(void *vp, int vp_len, char *buf, int buf_len)
864*042d53a7SEvalZero {
865*042d53a7SEvalZero if (BASE64_ENCODE_SIZE(vp_len) > buf_len) {
866*042d53a7SEvalZero return NULL;
867*042d53a7SEvalZero }
868*042d53a7SEvalZero
869*042d53a7SEvalZero base64_encode(vp, vp_len, buf, 1);
870*042d53a7SEvalZero
871*042d53a7SEvalZero return buf;
872*042d53a7SEvalZero }
873*042d53a7SEvalZero
874*042d53a7SEvalZero #endif /* MYNEWT_VAL(BLE_MESH_SETTINGS) */
875*042d53a7SEvalZero
876