xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/mesh/src/glue.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
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