xref: /nrf52832-nimble/packages/NimBLE-latest/apps/ext_advertiser/src/ext_advertiser.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 <assert.h>
21*042d53a7SEvalZero #include <string.h>
22*042d53a7SEvalZero #include <stdio.h>
23*042d53a7SEvalZero #include <errno.h>
24*042d53a7SEvalZero 
25*042d53a7SEvalZero #include "nimble/npl_shell.h"
26*042d53a7SEvalZero #include "config/config.h"
27*042d53a7SEvalZero #include "nimble/ble.h"
28*042d53a7SEvalZero #include "host/ble_hs.h"
29*042d53a7SEvalZero #include "host/util/util.h"
30*042d53a7SEvalZero 
31*042d53a7SEvalZero #include"patterns.h"
32*042d53a7SEvalZero 
33*042d53a7SEvalZero static uint8_t id_addr_type;
34*042d53a7SEvalZero 
35*042d53a7SEvalZero static void start_legacy_duration(uint8_t pattern, bool configure);
36*042d53a7SEvalZero static void start_ext_max_events(uint8_t pattern, bool configure);
37*042d53a7SEvalZero 
38*042d53a7SEvalZero static int
start_ext_max_events_gap_event(struct ble_gap_event * event,void * arg)39*042d53a7SEvalZero start_ext_max_events_gap_event(struct ble_gap_event *event, void *arg)
40*042d53a7SEvalZero {
41*042d53a7SEvalZero     static uint8_t pattern = 1;
42*042d53a7SEvalZero 
43*042d53a7SEvalZero     switch (event->type) {
44*042d53a7SEvalZero     case BLE_GAP_EVENT_ADV_COMPLETE:
45*042d53a7SEvalZero         break;
46*042d53a7SEvalZero     default:
47*042d53a7SEvalZero         assert(0);
48*042d53a7SEvalZero         return 0;
49*042d53a7SEvalZero     }
50*042d53a7SEvalZero 
51*042d53a7SEvalZero     assert(event->adv_complete.instance == 4);
52*042d53a7SEvalZero     assert(event->adv_complete.reason == BLE_HS_ETIMEOUT);
53*042d53a7SEvalZero     assert(event->adv_complete.num_ext_adv_events == 10);
54*042d53a7SEvalZero 
55*042d53a7SEvalZero     console_printf("instance %u terminated\n", event->adv_complete.instance);
56*042d53a7SEvalZero 
57*042d53a7SEvalZero     pattern++;
58*042d53a7SEvalZero 
59*042d53a7SEvalZero     start_ext_max_events(pattern, false);
60*042d53a7SEvalZero 
61*042d53a7SEvalZero     return 0;
62*042d53a7SEvalZero }
63*042d53a7SEvalZero 
64*042d53a7SEvalZero /* Starts advertising instance with 100 max events and changing adv data pattern
65*042d53a7SEvalZero  * and SID.
66*042d53a7SEvalZero  */
67*042d53a7SEvalZero static void
start_ext_max_events(uint8_t pattern,bool configure)68*042d53a7SEvalZero start_ext_max_events(uint8_t pattern, bool configure)
69*042d53a7SEvalZero {
70*042d53a7SEvalZero     struct ble_gap_ext_adv_params params;
71*042d53a7SEvalZero     static uint8_t adv_data[600];
72*042d53a7SEvalZero     struct os_mbuf *data;
73*042d53a7SEvalZero     uint8_t instance = 4;
74*042d53a7SEvalZero     ble_addr_t addr;
75*042d53a7SEvalZero     int events = 10;
76*042d53a7SEvalZero     int rc;
77*042d53a7SEvalZero 
78*042d53a7SEvalZero     if (configure) {
79*042d53a7SEvalZero         /* use defaults for non-set params */
80*042d53a7SEvalZero         memset (&params, 0, sizeof(params));
81*042d53a7SEvalZero 
82*042d53a7SEvalZero         /* advertise using random addr */
83*042d53a7SEvalZero         params.own_addr_type = BLE_OWN_ADDR_RANDOM;
84*042d53a7SEvalZero 
85*042d53a7SEvalZero         params.primary_phy = BLE_HCI_LE_PHY_1M;
86*042d53a7SEvalZero         params.secondary_phy = BLE_HCI_LE_PHY_1M;
87*042d53a7SEvalZero         params.tx_power = 127;
88*042d53a7SEvalZero         params.sid = pattern % 16;
89*042d53a7SEvalZero 
90*042d53a7SEvalZero         /* allow larger interval, 400 * 0.625ms with 100 events will give up to
91*042d53a7SEvalZero          * ~2.5 seconds for instance
92*042d53a7SEvalZero          */
93*042d53a7SEvalZero         params.itvl_min = BLE_GAP_ADV_FAST_INTERVAL1_MIN;
94*042d53a7SEvalZero         params.itvl_max = 400;
95*042d53a7SEvalZero 
96*042d53a7SEvalZero         /* configure instance 0 */
97*042d53a7SEvalZero         rc = ble_gap_ext_adv_configure(instance, &params, NULL,
98*042d53a7SEvalZero                                         start_ext_max_events_gap_event, NULL);
99*042d53a7SEvalZero         assert (rc == 0);
100*042d53a7SEvalZero 
101*042d53a7SEvalZero         /* set random (NRPA) address for instance */
102*042d53a7SEvalZero         rc = ble_hs_id_gen_rnd(1, &addr);
103*042d53a7SEvalZero         assert (rc == 0);
104*042d53a7SEvalZero 
105*042d53a7SEvalZero         rc = ble_gap_ext_adv_set_addr(instance, &addr );
106*042d53a7SEvalZero         assert (rc == 0);
107*042d53a7SEvalZero     }
108*042d53a7SEvalZero 
109*042d53a7SEvalZero     /* in this case both advertising data and scan response is allowed, but
110*042d53a7SEvalZero      * both are limited to 31 bytes each
111*042d53a7SEvalZero      */
112*042d53a7SEvalZero 
113*042d53a7SEvalZero     /* get mbuf for adv data */
114*042d53a7SEvalZero     data = os_msys_get_pkthdr(600, 0);
115*042d53a7SEvalZero     assert(data);
116*042d53a7SEvalZero 
117*042d53a7SEvalZero     memset(adv_data, pattern, sizeof(adv_data));
118*042d53a7SEvalZero 
119*042d53a7SEvalZero     /* fill mbuf with adv data */
120*042d53a7SEvalZero     rc = os_mbuf_append(data, adv_data, 600);
121*042d53a7SEvalZero     assert(rc == 0);
122*042d53a7SEvalZero 
123*042d53a7SEvalZero    rc = ble_gap_ext_adv_set_data(instance, data);
124*042d53a7SEvalZero    assert (rc == 0);
125*042d53a7SEvalZero 
126*042d53a7SEvalZero    /* start advertising */
127*042d53a7SEvalZero     rc = ble_gap_ext_adv_start(instance, 0, events);
128*042d53a7SEvalZero     assert (rc == 0);
129*042d53a7SEvalZero 
130*042d53a7SEvalZero     console_printf("instance %u started (PDUs with max events %d)\n",
131*042d53a7SEvalZero                                                             instance, events);
132*042d53a7SEvalZero }
133*042d53a7SEvalZero 
134*042d53a7SEvalZero static int
start_legacy_duration_gap_event(struct ble_gap_event * event,void * arg)135*042d53a7SEvalZero start_legacy_duration_gap_event(struct ble_gap_event *event, void *arg)
136*042d53a7SEvalZero {
137*042d53a7SEvalZero     static uint8_t pattern = 1;
138*042d53a7SEvalZero 
139*042d53a7SEvalZero     switch (event->type) {
140*042d53a7SEvalZero     case BLE_GAP_EVENT_ADV_COMPLETE:
141*042d53a7SEvalZero         break;
142*042d53a7SEvalZero     default:
143*042d53a7SEvalZero         assert(0);
144*042d53a7SEvalZero         return 0;
145*042d53a7SEvalZero     }
146*042d53a7SEvalZero 
147*042d53a7SEvalZero     assert(event->adv_complete.instance == 3);
148*042d53a7SEvalZero     assert(event->adv_complete.reason == BLE_HS_ETIMEOUT);
149*042d53a7SEvalZero 
150*042d53a7SEvalZero     console_printf("instance %u terminated\n", event->adv_complete.instance);
151*042d53a7SEvalZero 
152*042d53a7SEvalZero     pattern++;
153*042d53a7SEvalZero 
154*042d53a7SEvalZero     start_legacy_duration(pattern, false);
155*042d53a7SEvalZero 
156*042d53a7SEvalZero     return 0;
157*042d53a7SEvalZero }
158*042d53a7SEvalZero 
159*042d53a7SEvalZero /* Starts advertising instance with 5sec timeout and changing adv data pattern
160*042d53a7SEvalZero  * and SID.
161*042d53a7SEvalZero  */
162*042d53a7SEvalZero static void
start_legacy_duration(uint8_t pattern,bool configure)163*042d53a7SEvalZero start_legacy_duration(uint8_t pattern, bool configure)
164*042d53a7SEvalZero {
165*042d53a7SEvalZero     struct ble_gap_ext_adv_params params;
166*042d53a7SEvalZero     uint8_t adv_data[31];
167*042d53a7SEvalZero     struct os_mbuf *data;
168*042d53a7SEvalZero     uint8_t instance = 3;
169*042d53a7SEvalZero     ble_addr_t addr;
170*042d53a7SEvalZero     int duration = 500; /* 5seconds, 10ms units */
171*042d53a7SEvalZero     int rc;
172*042d53a7SEvalZero 
173*042d53a7SEvalZero     if (configure) {
174*042d53a7SEvalZero         /* use defaults for non-set params */
175*042d53a7SEvalZero         memset (&params, 0, sizeof(params));
176*042d53a7SEvalZero 
177*042d53a7SEvalZero         /* enable advertising using legacy PDUs */
178*042d53a7SEvalZero         params.legacy_pdu = 1;
179*042d53a7SEvalZero 
180*042d53a7SEvalZero         /* advertise using random addr */
181*042d53a7SEvalZero         params.own_addr_type = BLE_OWN_ADDR_RANDOM;
182*042d53a7SEvalZero 
183*042d53a7SEvalZero         params.primary_phy = BLE_HCI_LE_PHY_1M;
184*042d53a7SEvalZero         params.secondary_phy = BLE_HCI_LE_PHY_1M;
185*042d53a7SEvalZero         params.tx_power = 127;
186*042d53a7SEvalZero         params.sid = pattern % 16;
187*042d53a7SEvalZero 
188*042d53a7SEvalZero         /* configure instance 0 */
189*042d53a7SEvalZero         rc = ble_gap_ext_adv_configure(instance, &params, NULL,
190*042d53a7SEvalZero                                         start_legacy_duration_gap_event, NULL);
191*042d53a7SEvalZero         assert (rc == 0);
192*042d53a7SEvalZero 
193*042d53a7SEvalZero         /* set random (NRPA) address for instance */
194*042d53a7SEvalZero         rc = ble_hs_id_gen_rnd(1, &addr);
195*042d53a7SEvalZero         assert (rc == 0);
196*042d53a7SEvalZero 
197*042d53a7SEvalZero         rc = ble_gap_ext_adv_set_addr(instance, &addr );
198*042d53a7SEvalZero         assert (rc == 0);
199*042d53a7SEvalZero     }
200*042d53a7SEvalZero 
201*042d53a7SEvalZero     /* in this case both advertising data and scan response is allowed, but
202*042d53a7SEvalZero      * both are limited to 31 bytes each
203*042d53a7SEvalZero      */
204*042d53a7SEvalZero 
205*042d53a7SEvalZero     /* get mbuf for adv data */
206*042d53a7SEvalZero     data = os_msys_get_pkthdr(31, 0);
207*042d53a7SEvalZero     assert(data);
208*042d53a7SEvalZero 
209*042d53a7SEvalZero     memset(adv_data, pattern, sizeof(adv_data));
210*042d53a7SEvalZero 
211*042d53a7SEvalZero     /* fill mbuf with adv data */
212*042d53a7SEvalZero     rc = os_mbuf_append(data, adv_data, 31);
213*042d53a7SEvalZero     assert(rc == 0);
214*042d53a7SEvalZero 
215*042d53a7SEvalZero    rc = ble_gap_ext_adv_set_data(instance, data);
216*042d53a7SEvalZero    assert (rc == 0);
217*042d53a7SEvalZero 
218*042d53a7SEvalZero    /* start advertising */
219*042d53a7SEvalZero     rc = ble_gap_ext_adv_start(instance, duration, 0);
220*042d53a7SEvalZero     assert (rc == 0);
221*042d53a7SEvalZero 
222*042d53a7SEvalZero     console_printf("instance %u started (legacy PDUs with duration %d)\n",
223*042d53a7SEvalZero                                                             instance, duration);
224*042d53a7SEvalZero }
225*042d53a7SEvalZero 
226*042d53a7SEvalZero /* this is simple non-connectable scannable instance using legacy PUDs that
227*042d53a7SEvalZero  * runs forever
228*042d53a7SEvalZero  */
229*042d53a7SEvalZero static void
start_scannable_legacy_ext(void)230*042d53a7SEvalZero start_scannable_legacy_ext(void)
231*042d53a7SEvalZero {
232*042d53a7SEvalZero     struct ble_gap_ext_adv_params params;
233*042d53a7SEvalZero     struct os_mbuf *data;
234*042d53a7SEvalZero     uint8_t instance = 2;
235*042d53a7SEvalZero     ble_addr_t addr;
236*042d53a7SEvalZero     int rc;
237*042d53a7SEvalZero 
238*042d53a7SEvalZero     /* use defaults for non-set params */
239*042d53a7SEvalZero     memset (&params, 0, sizeof(params));
240*042d53a7SEvalZero 
241*042d53a7SEvalZero     /* enable scannable advertising using legacy PDUs */
242*042d53a7SEvalZero     params.scannable = 1;
243*042d53a7SEvalZero     params.legacy_pdu = 1;
244*042d53a7SEvalZero 
245*042d53a7SEvalZero     /* advertise using random addr */
246*042d53a7SEvalZero     params.own_addr_type = BLE_OWN_ADDR_RANDOM;
247*042d53a7SEvalZero 
248*042d53a7SEvalZero     params.primary_phy = BLE_HCI_LE_PHY_1M;
249*042d53a7SEvalZero     params.secondary_phy = BLE_HCI_LE_PHY_1M;
250*042d53a7SEvalZero     params.tx_power = 127;
251*042d53a7SEvalZero     params.sid = 2;
252*042d53a7SEvalZero 
253*042d53a7SEvalZero     /* configure instance 0 */
254*042d53a7SEvalZero     rc = ble_gap_ext_adv_configure(instance, &params, NULL, NULL, NULL);
255*042d53a7SEvalZero     assert (rc == 0);
256*042d53a7SEvalZero 
257*042d53a7SEvalZero     /* set random (NRPA) address for instance */
258*042d53a7SEvalZero     rc = ble_hs_id_gen_rnd(1, &addr);
259*042d53a7SEvalZero     assert (rc == 0);
260*042d53a7SEvalZero 
261*042d53a7SEvalZero     rc = ble_gap_ext_adv_set_addr(instance, &addr );
262*042d53a7SEvalZero     assert (rc == 0);
263*042d53a7SEvalZero 
264*042d53a7SEvalZero     /* in this case both advertising data and scan response is allowed, but
265*042d53a7SEvalZero      * both are limited to 31 bytes each
266*042d53a7SEvalZero      */
267*042d53a7SEvalZero 
268*042d53a7SEvalZero     /* get mbuf for adv data */
269*042d53a7SEvalZero     data = os_msys_get_pkthdr(31, 0);
270*042d53a7SEvalZero     assert(data);
271*042d53a7SEvalZero 
272*042d53a7SEvalZero     /* fill mbuf with adv data */
273*042d53a7SEvalZero     rc = os_mbuf_append(data, ext_adv_pattern_1, 31);
274*042d53a7SEvalZero     assert(rc == 0);
275*042d53a7SEvalZero 
276*042d53a7SEvalZero    rc = ble_gap_ext_adv_set_data(instance, data);
277*042d53a7SEvalZero    assert (rc == 0);
278*042d53a7SEvalZero 
279*042d53a7SEvalZero     /* get mbuf for scan rsp data */
280*042d53a7SEvalZero     data = os_msys_get_pkthdr(31, 0);
281*042d53a7SEvalZero     assert(data);
282*042d53a7SEvalZero 
283*042d53a7SEvalZero     /* fill mbuf with scan rsp data */
284*042d53a7SEvalZero     rc = os_mbuf_append(data, ext_adv_pattern_1 + 31, 31);
285*042d53a7SEvalZero     assert(rc == 0);
286*042d53a7SEvalZero 
287*042d53a7SEvalZero    rc = ble_gap_ext_adv_rsp_set_data(instance, data);
288*042d53a7SEvalZero    assert (rc == 0);
289*042d53a7SEvalZero 
290*042d53a7SEvalZero    /* start advertising */
291*042d53a7SEvalZero     rc = ble_gap_ext_adv_start(instance, 0, 0);
292*042d53a7SEvalZero     assert (rc == 0);
293*042d53a7SEvalZero 
294*042d53a7SEvalZero     console_printf("instance %u started (scannable legacy PDUs)\n", instance);
295*042d53a7SEvalZero }
296*042d53a7SEvalZero 
297*042d53a7SEvalZero static int
scannable_ext_gap_event(struct ble_gap_event * event,void * arg)298*042d53a7SEvalZero scannable_ext_gap_event(struct ble_gap_event *event, void *arg)
299*042d53a7SEvalZero {
300*042d53a7SEvalZero     switch (event->type) {
301*042d53a7SEvalZero     default:
302*042d53a7SEvalZero         break;
303*042d53a7SEvalZero     }
304*042d53a7SEvalZero 
305*042d53a7SEvalZero     return 0;
306*042d53a7SEvalZero }
307*042d53a7SEvalZero 
308*042d53a7SEvalZero /* this is simple scannable instance that runs forever
309*042d53a7SEvalZero  * TODO Get scan request notifications.
310*042d53a7SEvalZero  */
311*042d53a7SEvalZero static void
start_scannable_ext(void)312*042d53a7SEvalZero start_scannable_ext(void)
313*042d53a7SEvalZero {
314*042d53a7SEvalZero     struct ble_gap_ext_adv_params params;
315*042d53a7SEvalZero     struct os_mbuf *data;
316*042d53a7SEvalZero     uint8_t instance = 1;
317*042d53a7SEvalZero     ble_addr_t addr;
318*042d53a7SEvalZero     int rc;
319*042d53a7SEvalZero 
320*042d53a7SEvalZero     /* use defaults for non-set params */
321*042d53a7SEvalZero     memset (&params, 0, sizeof(params));
322*042d53a7SEvalZero 
323*042d53a7SEvalZero     /* enable scannable advertising */
324*042d53a7SEvalZero     params.scannable = 1;
325*042d53a7SEvalZero 
326*042d53a7SEvalZero     /* enable scan request notification */
327*042d53a7SEvalZero     params.scan_req_notif = 1;
328*042d53a7SEvalZero 
329*042d53a7SEvalZero     /* advertise using random addr */
330*042d53a7SEvalZero     params.own_addr_type = BLE_OWN_ADDR_RANDOM;
331*042d53a7SEvalZero 
332*042d53a7SEvalZero     params.primary_phy = BLE_HCI_LE_PHY_1M;
333*042d53a7SEvalZero     params.secondary_phy = BLE_HCI_LE_PHY_1M;
334*042d53a7SEvalZero     params.tx_power = 127;
335*042d53a7SEvalZero     params.sid = 1;
336*042d53a7SEvalZero 
337*042d53a7SEvalZero     /* configure instance 0 */
338*042d53a7SEvalZero     rc = ble_gap_ext_adv_configure(instance, &params, NULL,
339*042d53a7SEvalZero                                    scannable_ext_gap_event, NULL);
340*042d53a7SEvalZero     assert (rc == 0);
341*042d53a7SEvalZero 
342*042d53a7SEvalZero     /* set random (NRPA) address for instance */
343*042d53a7SEvalZero     rc = ble_hs_id_gen_rnd(1, &addr);
344*042d53a7SEvalZero     assert (rc == 0);
345*042d53a7SEvalZero 
346*042d53a7SEvalZero     rc = ble_gap_ext_adv_set_addr(instance, &addr );
347*042d53a7SEvalZero     assert (rc == 0);
348*042d53a7SEvalZero 
349*042d53a7SEvalZero     /* in this case only scan response is allowed */
350*042d53a7SEvalZero 
351*042d53a7SEvalZero     /* get mbuf for scan rsp data */
352*042d53a7SEvalZero     data = os_msys_get_pkthdr(sizeof(ext_adv_pattern_1), 0);
353*042d53a7SEvalZero     assert(data);
354*042d53a7SEvalZero 
355*042d53a7SEvalZero     /* fill mbuf with scan rsp data */
356*042d53a7SEvalZero     rc = os_mbuf_append(data, ext_adv_pattern_1, sizeof(ext_adv_pattern_1));
357*042d53a7SEvalZero     assert(rc == 0);
358*042d53a7SEvalZero 
359*042d53a7SEvalZero    rc = ble_gap_ext_adv_rsp_set_data(instance, data);
360*042d53a7SEvalZero    assert (rc == 0);
361*042d53a7SEvalZero 
362*042d53a7SEvalZero    /* start advertising */
363*042d53a7SEvalZero     rc = ble_gap_ext_adv_start(instance, 0, 0);
364*042d53a7SEvalZero     assert (rc == 0);
365*042d53a7SEvalZero 
366*042d53a7SEvalZero     console_printf("instance %u started (scannable)\n", instance);
367*042d53a7SEvalZero }
368*042d53a7SEvalZero 
369*042d53a7SEvalZero /* this is simple non-connectable instance that runs forever */
370*042d53a7SEvalZero static void
start_non_connectable_ext(void)371*042d53a7SEvalZero start_non_connectable_ext(void)
372*042d53a7SEvalZero {
373*042d53a7SEvalZero     struct ble_gap_ext_adv_params params;
374*042d53a7SEvalZero     struct os_mbuf *data;
375*042d53a7SEvalZero     uint8_t instance = 0;
376*042d53a7SEvalZero     int rc;
377*042d53a7SEvalZero 
378*042d53a7SEvalZero     /* use defaults for non-set params */
379*042d53a7SEvalZero     memset (&params, 0, sizeof(params));
380*042d53a7SEvalZero 
381*042d53a7SEvalZero     /* advertise using ID addr */
382*042d53a7SEvalZero     params.own_addr_type = id_addr_type;
383*042d53a7SEvalZero 
384*042d53a7SEvalZero     params.primary_phy = BLE_HCI_LE_PHY_1M;
385*042d53a7SEvalZero     params.secondary_phy = BLE_HCI_LE_PHY_1M;
386*042d53a7SEvalZero     params.tx_power = 127;
387*042d53a7SEvalZero     params.sid = 0;
388*042d53a7SEvalZero 
389*042d53a7SEvalZero     /* configure instance */
390*042d53a7SEvalZero     rc = ble_gap_ext_adv_configure(instance, &params, NULL, NULL, NULL);
391*042d53a7SEvalZero     assert (rc == 0);
392*042d53a7SEvalZero 
393*042d53a7SEvalZero     /* in this case only advertisign data is allowed */
394*042d53a7SEvalZero 
395*042d53a7SEvalZero     /* get mbuf for adv data */
396*042d53a7SEvalZero     data = os_msys_get_pkthdr(sizeof(ext_adv_pattern_1), 0);
397*042d53a7SEvalZero     assert(data);
398*042d53a7SEvalZero 
399*042d53a7SEvalZero     /* fill mbuf with adv data */
400*042d53a7SEvalZero     rc = os_mbuf_append(data, ext_adv_pattern_1, sizeof(ext_adv_pattern_1));
401*042d53a7SEvalZero     assert(rc == 0);
402*042d53a7SEvalZero 
403*042d53a7SEvalZero    rc = ble_gap_ext_adv_set_data(instance, data);
404*042d53a7SEvalZero    assert (rc == 0);
405*042d53a7SEvalZero 
406*042d53a7SEvalZero    /* start advertising */
407*042d53a7SEvalZero     rc = ble_gap_ext_adv_start(instance, 0, 0);
408*042d53a7SEvalZero     assert (rc == 0);
409*042d53a7SEvalZero 
410*042d53a7SEvalZero     console_printf("instance %u started (non-con non-scan)\n", instance);
411*042d53a7SEvalZero }
412*042d53a7SEvalZero 
413*042d53a7SEvalZero static void
on_sync(void)414*042d53a7SEvalZero on_sync(void)
415*042d53a7SEvalZero {
416*042d53a7SEvalZero     int rc;
417*042d53a7SEvalZero 
418*042d53a7SEvalZero     console_printf("Synced, starting advertising\n");
419*042d53a7SEvalZero 
420*042d53a7SEvalZero     /* Make sure we have proper identity address set (public preferred) */
421*042d53a7SEvalZero     rc = ble_hs_util_ensure_addr(0);
422*042d53a7SEvalZero     assert(rc == 0);
423*042d53a7SEvalZero 
424*042d53a7SEvalZero     /* configure global address */
425*042d53a7SEvalZero     rc = ble_hs_id_infer_auto(0, &id_addr_type);
426*042d53a7SEvalZero     assert(rc == 0);
427*042d53a7SEvalZero 
428*042d53a7SEvalZero     start_non_connectable_ext();
429*042d53a7SEvalZero 
430*042d53a7SEvalZero     start_scannable_ext();
431*042d53a7SEvalZero 
432*042d53a7SEvalZero     start_scannable_legacy_ext();
433*042d53a7SEvalZero 
434*042d53a7SEvalZero     start_legacy_duration(0, true);
435*042d53a7SEvalZero 
436*042d53a7SEvalZero     start_ext_max_events(0, true);
437*042d53a7SEvalZero }
438*042d53a7SEvalZero 
439*042d53a7SEvalZero /*
440*042d53a7SEvalZero  * main
441*042d53a7SEvalZero  *
442*042d53a7SEvalZero  * The main task for the project. This function initializes the packages,
443*042d53a7SEvalZero  * then starts serving events from default event queue.
444*042d53a7SEvalZero  *
445*042d53a7SEvalZero  * @return int NOTE: this function should never return!
446*042d53a7SEvalZero  */
ext_advertiser_entry(void)447*042d53a7SEvalZero int ext_advertiser_entry(void)
448*042d53a7SEvalZero {
449*042d53a7SEvalZero     console_printf("Extended Advertising sample application\n");
450*042d53a7SEvalZero 
451*042d53a7SEvalZero     /* Set sync callback */
452*042d53a7SEvalZero     ble_hs_cfg.sync_cb = on_sync;
453*042d53a7SEvalZero 
454*042d53a7SEvalZero     /* startup bluetooth host stack*/
455*042d53a7SEvalZero     ble_hs_thread_startup();
456*042d53a7SEvalZero 
457*042d53a7SEvalZero     return 0;
458*042d53a7SEvalZero }
459*042d53a7SEvalZero MSH_CMD_EXPORT_ALIAS(ext_advertiser_entry, ext_advertiser, "bluetooth external advertiser sample");
460