xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_hs_dbg.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 #include <stdint.h>
20*042d53a7SEvalZero #include <stdio.h>
21*042d53a7SEvalZero #include <assert.h>
22*042d53a7SEvalZero #include <string.h>
23*042d53a7SEvalZero #include "os/os.h"
24*042d53a7SEvalZero #include "nimble/hci_common.h"
25*042d53a7SEvalZero #include "nimble/ble_hci_trans.h"
26*042d53a7SEvalZero #include "host/ble_monitor.h"
27*042d53a7SEvalZero #include "ble_hs_priv.h"
28*042d53a7SEvalZero 
29*042d53a7SEvalZero static void
ble_hs_dbg_le_event_disp(uint8_t subev,uint8_t len,uint8_t * evdata)30*042d53a7SEvalZero ble_hs_dbg_le_event_disp(uint8_t subev, uint8_t len, uint8_t *evdata)
31*042d53a7SEvalZero {
32*042d53a7SEvalZero     int8_t rssi;
33*042d53a7SEvalZero     uint8_t advlen;
34*042d53a7SEvalZero     uint8_t status;
35*042d53a7SEvalZero     int i;
36*042d53a7SEvalZero     int imax;
37*042d53a7SEvalZero     uint8_t *dptr;
38*042d53a7SEvalZero     char *adv_ptr;
39*042d53a7SEvalZero     char adv_data_buf[32];
40*042d53a7SEvalZero 
41*042d53a7SEvalZero     switch (subev) {
42*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE:
43*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_CONN_COMPLETE:
44*042d53a7SEvalZero         status = evdata[0];
45*042d53a7SEvalZero         if (status == BLE_ERR_SUCCESS) {
46*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE connection complete. handle=%u role=%u "
47*042d53a7SEvalZero                               "paddrtype=%u addr=%x.%x.%x.%x.%x.%x ",
48*042d53a7SEvalZero                        get_le16(evdata + 1), evdata[3], evdata[4],
49*042d53a7SEvalZero                        evdata[10], evdata[9], evdata[8], evdata[7],
50*042d53a7SEvalZero                        evdata[6], evdata[5]);
51*042d53a7SEvalZero 
52*042d53a7SEvalZero             evdata += 11;
53*042d53a7SEvalZero             if (subev == BLE_HCI_LE_SUBEV_ENH_CONN_COMPLETE) {
54*042d53a7SEvalZero                 BLE_HS_LOG(DEBUG, "local_rpa=%x.%x.%x.%x.%x.%x "
55*042d53a7SEvalZero                                    "peer_rpa=%x.%x.%x.%x.%x.%x ",
56*042d53a7SEvalZero                            evdata[5], evdata[4], evdata[3], evdata[2],
57*042d53a7SEvalZero                            evdata[1], evdata[0],
58*042d53a7SEvalZero                            evdata[11], evdata[10], evdata[9], evdata[8],
59*042d53a7SEvalZero                            evdata[7], evdata[6]);
60*042d53a7SEvalZero 
61*042d53a7SEvalZero                 evdata += 12;
62*042d53a7SEvalZero             }
63*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "itvl=%u latency=%u spvn_tmo=%u mca=%u\n",
64*042d53a7SEvalZero                        get_le16(evdata), get_le16(evdata + 2),
65*042d53a7SEvalZero                        get_le16(evdata + 4), evdata[6]);
66*042d53a7SEvalZero         } else {
67*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE connection complete. FAIL (status=%u)\n",
68*042d53a7SEvalZero                        status);
69*042d53a7SEvalZero         }
70*042d53a7SEvalZero         break;
71*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_ADV_RPT:
72*042d53a7SEvalZero         advlen = evdata[9];
73*042d53a7SEvalZero         rssi = evdata[10 + advlen];
74*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE advertising report. len=%u num=%u evtype=%u "
75*042d53a7SEvalZero                           "addrtype=%u addr=%x.%x.%x.%x.%x.%x advlen=%u "
76*042d53a7SEvalZero                           "rssi=%d\n", len, evdata[0], evdata[1], evdata[2],
77*042d53a7SEvalZero                    evdata[8], evdata[7], evdata[6], evdata[5],
78*042d53a7SEvalZero                    evdata[4], evdata[3], advlen, rssi);
79*042d53a7SEvalZero         if (advlen) {
80*042d53a7SEvalZero             dptr = &evdata[10];
81*042d53a7SEvalZero             while (advlen > 0) {
82*042d53a7SEvalZero                 memset(adv_data_buf, 0, 32);
83*042d53a7SEvalZero                 imax = advlen;
84*042d53a7SEvalZero                 if (imax > 8) {
85*042d53a7SEvalZero                     imax = 8;
86*042d53a7SEvalZero                 }
87*042d53a7SEvalZero                 adv_ptr = &adv_data_buf[0];
88*042d53a7SEvalZero                 for (i = 0; i < imax; ++i) {
89*042d53a7SEvalZero                     snprintf(adv_ptr, 4, "%02x ", *dptr);
90*042d53a7SEvalZero                     adv_ptr += 3;
91*042d53a7SEvalZero                     ++dptr;
92*042d53a7SEvalZero                 }
93*042d53a7SEvalZero                 advlen -= imax;
94*042d53a7SEvalZero                 BLE_HS_LOG(DEBUG, "%s\n", adv_data_buf);
95*042d53a7SEvalZero             }
96*042d53a7SEvalZero         }
97*042d53a7SEvalZero         break;
98*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE:
99*042d53a7SEvalZero         status = evdata[0];
100*042d53a7SEvalZero         if (status == BLE_ERR_SUCCESS) {
101*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE Connection Update Complete. handle=%u "
102*042d53a7SEvalZero                               "itvl=%u latency=%u timeout=%u\n",
103*042d53a7SEvalZero                        get_le16(evdata + 1), get_le16(evdata + 3),
104*042d53a7SEvalZero                        get_le16(evdata + 5), get_le16(evdata + 7));
105*042d53a7SEvalZero         } else {
106*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE Connection Update Complete. FAIL "
107*042d53a7SEvalZero                               "(status=%u)\n", status);
108*042d53a7SEvalZero         }
109*042d53a7SEvalZero         break;
110*042d53a7SEvalZero 
111*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_DATA_LEN_CHG:
112*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Data Length Change. handle=%u max_tx_bytes=%u "
113*042d53a7SEvalZero                           "max_tx_time=%u max_rx_bytes=%u max_rx_time=%u\n",
114*042d53a7SEvalZero                    get_le16(evdata), get_le16(evdata + 2),
115*042d53a7SEvalZero                    get_le16(evdata + 4), get_le16(evdata + 6),
116*042d53a7SEvalZero                    get_le16(evdata + 8));
117*042d53a7SEvalZero         break;
118*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ:
119*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Remote Connection Parameter Request. handle=%u "
120*042d53a7SEvalZero                           "min_itvl=%u max_itvl=%u latency=%u timeout=%u\n",
121*042d53a7SEvalZero                    get_le16(evdata), get_le16(evdata + 2),
122*042d53a7SEvalZero                    get_le16(evdata + 4), get_le16(evdata + 6),
123*042d53a7SEvalZero                    get_le16(evdata + 8));
124*042d53a7SEvalZero         break;
125*042d53a7SEvalZero 
126*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT:
127*042d53a7SEvalZero         status = evdata[0];
128*042d53a7SEvalZero         if (status == BLE_ERR_SUCCESS) {
129*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE Remote Used Features. handle=%u feat=",
130*042d53a7SEvalZero                        get_le16(evdata + 1));
131*042d53a7SEvalZero             for (i = 0; i < BLE_HCI_RD_LOC_SUPP_FEAT_RSPLEN; ++i) {
132*042d53a7SEvalZero                 BLE_HS_LOG(DEBUG, "%02x ", evdata[3 + i]);
133*042d53a7SEvalZero             }
134*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "\n");
135*042d53a7SEvalZero         } else {
136*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE Remote Used Features. FAIL (status=%u)\n",
137*042d53a7SEvalZero                        status);
138*042d53a7SEvalZero         }
139*042d53a7SEvalZero         break;
140*042d53a7SEvalZero 
141*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_LT_KEY_REQ:
142*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "LE LTK Req. handle=%u rand=%lx%lx encdiv=%u\n",
143*042d53a7SEvalZero                        get_le16(evdata), get_le32(evdata + 6),
144*042d53a7SEvalZero                        get_le32(evdata + 2), get_le16(evdata + 10));
145*042d53a7SEvalZero         break;
146*042d53a7SEvalZero 
147*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE:
148*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "PHY update. handle=%u tx=%u rx=%u\n",
149*042d53a7SEvalZero                        get_le16(evdata + 1), evdata[3], evdata[4]);
150*042d53a7SEvalZero         break;
151*042d53a7SEvalZero 
152*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_DIRECT_ADV_RPT:
153*042d53a7SEvalZero     {
154*042d53a7SEvalZero         struct hci_le_subev_direct_adv_rpt *data = (void *) evdata;
155*042d53a7SEvalZero         struct hci_le_subev_direct_adv_rpt_param *params = data->params;
156*042d53a7SEvalZero 
157*042d53a7SEvalZero         if (len < sizeof(*data) ||
158*042d53a7SEvalZero                 len < sizeof(*data) + data->num_reports * sizeof(*params)) {
159*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Directed Advertising Report "
160*042d53a7SEvalZero                        "len=%u\n", len);
161*042d53a7SEvalZero             break;
162*042d53a7SEvalZero         }
163*042d53a7SEvalZero 
164*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Directed Advertising Report len=%u "
165*042d53a7SEvalZero                    "num=0x%02x ", len, data->num_reports);
166*042d53a7SEvalZero 
167*042d53a7SEvalZero         for (i = 0; i < data->num_reports; i++) {
168*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "[%d]={evttype=0x%02x}\n", i, params->evt_type);
169*042d53a7SEvalZero             params += 1;
170*042d53a7SEvalZero         }
171*042d53a7SEvalZero         break;
172*042d53a7SEvalZero     }
173*042d53a7SEvalZero 
174*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_RD_LOC_P256_PUBKEY:
175*042d53a7SEvalZero     {
176*042d53a7SEvalZero         struct hci_le_subev_rd_loc_p256_pubkey *data = (void *) evdata;
177*042d53a7SEvalZero 
178*042d53a7SEvalZero         if (len != sizeof(*data)) {
179*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Read Local P-256 Public Key "
180*042d53a7SEvalZero                        "Complete Event len=%u\n", len);
181*042d53a7SEvalZero             break;
182*042d53a7SEvalZero         }
183*042d53a7SEvalZero 
184*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Read Local P-256 Public Key Complete "
185*042d53a7SEvalZero                    "len=%u status=0x%02x", len, data->status);
186*042d53a7SEvalZero         break;
187*042d53a7SEvalZero     }
188*042d53a7SEvalZero 
189*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_GEN_DHKEY_COMPLETE:
190*042d53a7SEvalZero     {
191*042d53a7SEvalZero         struct hci_le_subev_gen_dhkey_complete *data = (void *) evdata;
192*042d53a7SEvalZero 
193*042d53a7SEvalZero         if (len != sizeof(*data)) {
194*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Generate DHKey Complete "
195*042d53a7SEvalZero                        "len=%u\n", len);
196*042d53a7SEvalZero             break;
197*042d53a7SEvalZero         }
198*042d53a7SEvalZero 
199*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Generate DHKey Complete Event len=%u "
200*042d53a7SEvalZero                    "status=0x%02x", len, data->status);
201*042d53a7SEvalZero         break;
202*042d53a7SEvalZero     }
203*042d53a7SEvalZero 
204*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV)
205*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_EXT_ADV_RPT:
206*042d53a7SEvalZero     {
207*042d53a7SEvalZero         struct hci_le_subev_ext_adv_rpt *data = (void *) evdata;
208*042d53a7SEvalZero         struct hci_ext_adv_report_param *params;
209*042d53a7SEvalZero 
210*042d53a7SEvalZero         if (len < sizeof(*data) + sizeof(*params)) {
211*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Extended Advertising Report "
212*042d53a7SEvalZero                        "len=%u\n", len);
213*042d53a7SEvalZero             break;
214*042d53a7SEvalZero         }
215*042d53a7SEvalZero 
216*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Extended Advertising Report len=%u num=0x%02x ",
217*042d53a7SEvalZero                    len, data->num_reports);
218*042d53a7SEvalZero 
219*042d53a7SEvalZero         for (i = 0, dptr = &evdata[1]; i < data->num_reports;  i++) {
220*042d53a7SEvalZero             params = (void *) dptr;
221*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "[%d]={evttype=0x%04x advlen=%u}\n",
222*042d53a7SEvalZero                        i, le16toh(params->evt_type), params->adv_data_len);
223*042d53a7SEvalZero             dptr += sizeof(*params) + params->adv_data_len;
224*042d53a7SEvalZero         }
225*042d53a7SEvalZero         break;
226*042d53a7SEvalZero     }
227*042d53a7SEvalZero 
228*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_PER_ADV_SYNC_ESTAB:
229*042d53a7SEvalZero     {
230*042d53a7SEvalZero         struct hci_le_subev_per_adv_sync_estab *data = (void *) evdata;
231*042d53a7SEvalZero 
232*042d53a7SEvalZero         if (len != sizeof(*data)) {
233*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Periodic Advertising Sync "
234*042d53a7SEvalZero                        "Established len=%u\n", len);
235*042d53a7SEvalZero             break;
236*042d53a7SEvalZero         }
237*042d53a7SEvalZero 
238*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Periodic Advertising Sync Established "
239*042d53a7SEvalZero                    "len=%u status=0x%02x handle=0x%04x", len, data->status,
240*042d53a7SEvalZero                    le16toh(data->sync_handle));
241*042d53a7SEvalZero         break;
242*042d53a7SEvalZero     }
243*042d53a7SEvalZero 
244*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_PER_ADV_RPT:
245*042d53a7SEvalZero     {
246*042d53a7SEvalZero         struct hci_le_subev_per_adv_rpt *data = (void *) evdata;
247*042d53a7SEvalZero 
248*042d53a7SEvalZero         if (len < sizeof(*data) || len != sizeof(*data) + data->data_length) {
249*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Periodic Advertising Report "
250*042d53a7SEvalZero                     "len=%u\n", len);
251*042d53a7SEvalZero             break;
252*042d53a7SEvalZero         }
253*042d53a7SEvalZero 
254*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Periodic Advertising Report "
255*042d53a7SEvalZero                    "len=%u handle=0x%04x data_status=0x%02x data_len=0x%02x",
256*042d53a7SEvalZero                    len, le16toh(data->sync_handle), data->data_status,
257*042d53a7SEvalZero                    data->data_length);
258*042d53a7SEvalZero         break;
259*042d53a7SEvalZero     }
260*042d53a7SEvalZero 
261*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_PER_ADV_SYNC_LOST:
262*042d53a7SEvalZero     {
263*042d53a7SEvalZero         struct hci_le_subev_per_adv_sync_lost *data = (void *) evdata;
264*042d53a7SEvalZero 
265*042d53a7SEvalZero         if (len != sizeof(*data)) {
266*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Periodic Advertising Sync Lost "
267*042d53a7SEvalZero                        "len=%u\n", len);
268*042d53a7SEvalZero             break;
269*042d53a7SEvalZero         }
270*042d53a7SEvalZero 
271*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Periodic Advertising Sync Lost "
272*042d53a7SEvalZero                    "len=%u handle=0x%04x", len, le16toh(data->sync_handle));
273*042d53a7SEvalZero         break;
274*042d53a7SEvalZero     }
275*042d53a7SEvalZero 
276*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_SCAN_TIMEOUT:
277*042d53a7SEvalZero         if (len) {
278*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Scan Timeout len=%u", len);
279*042d53a7SEvalZero             break;
280*042d53a7SEvalZero         }
281*042d53a7SEvalZero 
282*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Scan Timeout Event len=%u", len);
283*042d53a7SEvalZero         break;
284*042d53a7SEvalZero 
285*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED:
286*042d53a7SEvalZero     {
287*042d53a7SEvalZero         struct hci_le_subev_adv_set_terminated *data = (void *) evdata;
288*042d53a7SEvalZero 
289*042d53a7SEvalZero         if (len != sizeof(*data)) {
290*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Advertising Set Terminated "
291*042d53a7SEvalZero                        "len=%u\n", len);
292*042d53a7SEvalZero             break;
293*042d53a7SEvalZero         }
294*042d53a7SEvalZero 
295*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Advertising Set Terminated len=%u "
296*042d53a7SEvalZero                    "status=0x%02x adv_handle=0x%02x conn_handle=0x%04x "
297*042d53a7SEvalZero                    "num_compl_ext_adv_ev=0x%02x", len, data->adv_handle,
298*042d53a7SEvalZero                    le16toh(data->conn_handle), data->num_compl_ext_adv_ev);
299*042d53a7SEvalZero         break;
300*042d53a7SEvalZero     }
301*042d53a7SEvalZero 
302*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD:
303*042d53a7SEvalZero     {
304*042d53a7SEvalZero         struct hci_le_subev_scan_req_rcvd *data = (void *) evdata;
305*042d53a7SEvalZero 
306*042d53a7SEvalZero         if (len != sizeof(*data)) {
307*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Scan Request Received "
308*042d53a7SEvalZero                        "len=%u\n", len);
309*042d53a7SEvalZero             break;
310*042d53a7SEvalZero         }
311*042d53a7SEvalZero 
312*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Scan Request Received len=%u "
313*042d53a7SEvalZero                    "adv_handle=0x%02x", len, data->adv_handle);
314*042d53a7SEvalZero         break;
315*042d53a7SEvalZero     }
316*042d53a7SEvalZero #endif /* MYNEWT_VAL(BLE_EXT_ADV) */
317*042d53a7SEvalZero 
318*042d53a7SEvalZero     case BLE_HCI_LE_SUBEV_CHAN_SEL_ALG:
319*042d53a7SEvalZero     {
320*042d53a7SEvalZero         struct hci_le_subev_chan_sel_alg *data = (void *) evdata;
321*042d53a7SEvalZero 
322*042d53a7SEvalZero         if (len != sizeof(*data)) {
323*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "Corrupted LE Channel Selection Algorithm "
324*042d53a7SEvalZero                        "len=%u\n", len);
325*042d53a7SEvalZero             break;
326*042d53a7SEvalZero         }
327*042d53a7SEvalZero 
328*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Channel Selection Algorithm len=%u "
329*042d53a7SEvalZero                    "conn_handle=0x%04x chan_sel_alg=0x%02x", len,
330*042d53a7SEvalZero                    le16toh(data->conn_handle), data->chan_sel_alg);
331*042d53a7SEvalZero         break;
332*042d53a7SEvalZero     }
333*042d53a7SEvalZero 
334*042d53a7SEvalZero     default:
335*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "LE Meta SubEvent op=0x%02x\n", subev);
336*042d53a7SEvalZero         break;
337*042d53a7SEvalZero     }
338*042d53a7SEvalZero }
339*042d53a7SEvalZero 
340*042d53a7SEvalZero /**
341*042d53a7SEvalZero  * Display a disconnection complete command.
342*042d53a7SEvalZero  *
343*042d53a7SEvalZero  *
344*042d53a7SEvalZero  * @param evdata
345*042d53a7SEvalZero  * @param len
346*042d53a7SEvalZero  */
347*042d53a7SEvalZero static void
ble_hs_dbg_disconn_comp_disp(uint8_t * evdata,uint8_t len)348*042d53a7SEvalZero ble_hs_dbg_disconn_comp_disp(uint8_t *evdata, uint8_t len)
349*042d53a7SEvalZero {
350*042d53a7SEvalZero     uint8_t status;
351*042d53a7SEvalZero     uint8_t reason;
352*042d53a7SEvalZero     uint16_t handle;
353*042d53a7SEvalZero 
354*042d53a7SEvalZero     status = evdata[0];
355*042d53a7SEvalZero     handle = get_le16(evdata + 1);
356*042d53a7SEvalZero     /* Ignore reason if status is not success */
357*042d53a7SEvalZero     if (status != BLE_ERR_SUCCESS) {
358*042d53a7SEvalZero         reason = 0;
359*042d53a7SEvalZero     } else {
360*042d53a7SEvalZero         reason = evdata[3];
361*042d53a7SEvalZero     }
362*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Disconnection Complete: status=%u handle=%u "
363*042d53a7SEvalZero                       "reason=%u\n", status, handle, reason);
364*042d53a7SEvalZero }
365*042d53a7SEvalZero 
366*042d53a7SEvalZero /**
367*042d53a7SEvalZero  * Display an encryption change event or encryption key refresh event
368*042d53a7SEvalZero  *
369*042d53a7SEvalZero  * @param evdata
370*042d53a7SEvalZero  * @param len
371*042d53a7SEvalZero  */
372*042d53a7SEvalZero static void
ble_hs_dbg_encrypt_chg_disp(uint8_t * evdata,uint8_t len)373*042d53a7SEvalZero ble_hs_dbg_encrypt_chg_disp(uint8_t *evdata, uint8_t len)
374*042d53a7SEvalZero {
375*042d53a7SEvalZero     uint8_t status;
376*042d53a7SEvalZero     uint8_t enabled;
377*042d53a7SEvalZero     uint16_t handle;
378*042d53a7SEvalZero 
379*042d53a7SEvalZero     status = evdata[0];
380*042d53a7SEvalZero     handle = get_le16(evdata + 1);
381*042d53a7SEvalZero 
382*042d53a7SEvalZero     /* Ignore reason if status is not success */
383*042d53a7SEvalZero     if (status != BLE_ERR_SUCCESS) {
384*042d53a7SEvalZero         enabled = 0;
385*042d53a7SEvalZero     } else {
386*042d53a7SEvalZero         enabled = evdata[3];
387*042d53a7SEvalZero     }
388*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Encrypt change: status=%u handle=%u state=%u\n",
389*042d53a7SEvalZero                status, handle, enabled);
390*042d53a7SEvalZero }
391*042d53a7SEvalZero 
392*042d53a7SEvalZero /**
393*042d53a7SEvalZero  * Display an encryption encryption key refresh event
394*042d53a7SEvalZero  *
395*042d53a7SEvalZero  * @param evdata
396*042d53a7SEvalZero  * @param len
397*042d53a7SEvalZero  */
398*042d53a7SEvalZero static void
ble_hs_dbg_encrypt_refresh_disp(uint8_t * evdata,uint8_t len)399*042d53a7SEvalZero ble_hs_dbg_encrypt_refresh_disp(uint8_t *evdata, uint8_t len)
400*042d53a7SEvalZero {
401*042d53a7SEvalZero     uint8_t status;
402*042d53a7SEvalZero     uint16_t handle;
403*042d53a7SEvalZero 
404*042d53a7SEvalZero     status = evdata[0];
405*042d53a7SEvalZero     handle = get_le16(evdata + 1);
406*042d53a7SEvalZero 
407*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Encrypt key refresh: status=%u handle=%u\n",
408*042d53a7SEvalZero                status, handle);
409*042d53a7SEvalZero }
410*042d53a7SEvalZero 
411*042d53a7SEvalZero /**
412*042d53a7SEvalZero  * Display a version information event
413*042d53a7SEvalZero  *
414*042d53a7SEvalZero  * @param evdata
415*042d53a7SEvalZero  * @param len
416*042d53a7SEvalZero  */
417*042d53a7SEvalZero static void
ble_hs_dbg_rd_rem_ver_disp(uint8_t * evdata,uint8_t len)418*042d53a7SEvalZero ble_hs_dbg_rd_rem_ver_disp(uint8_t *evdata, uint8_t len)
419*042d53a7SEvalZero {
420*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Remote Version Info: status=%u handle=%u vers_nr=%u "
421*042d53a7SEvalZero                       "compid=%u subver=%u\n",
422*042d53a7SEvalZero                evdata[0], get_le16(evdata + 1), evdata[3],
423*042d53a7SEvalZero                get_le16(evdata + 4), get_le16(evdata + 6));
424*042d53a7SEvalZero }
425*042d53a7SEvalZero 
426*042d53a7SEvalZero /**
427*042d53a7SEvalZero  * Display the number of completed packets event
428*042d53a7SEvalZero  *
429*042d53a7SEvalZero  * @param evdata
430*042d53a7SEvalZero  * @param len
431*042d53a7SEvalZero  */
432*042d53a7SEvalZero static void
ble_hs_dbg_num_comp_pkts_disp(uint8_t * evdata,uint8_t len)433*042d53a7SEvalZero ble_hs_dbg_num_comp_pkts_disp(uint8_t *evdata, uint8_t len)
434*042d53a7SEvalZero {
435*042d53a7SEvalZero     uint8_t handles;
436*042d53a7SEvalZero     uint8_t *handle_ptr;
437*042d53a7SEvalZero     uint16_t handle;
438*042d53a7SEvalZero     uint16_t pkts;
439*042d53a7SEvalZero 
440*042d53a7SEvalZero     handles = evdata[0];
441*042d53a7SEvalZero     if (len != ((handles * 4) + 1)) {
442*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "ERR: Number of Completed Packets bad length: "
443*042d53a7SEvalZero                           "num_handles=%u len=%u\n", handles, len);
444*042d53a7SEvalZero         return;
445*042d53a7SEvalZero 
446*042d53a7SEvalZero     }
447*042d53a7SEvalZero 
448*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Number of Completed Packets: num_handles=%u\n",
449*042d53a7SEvalZero                handles);
450*042d53a7SEvalZero     if (handles) {
451*042d53a7SEvalZero         handle_ptr = evdata + 1;
452*042d53a7SEvalZero         while (handles) {
453*042d53a7SEvalZero             handle = get_le16(handle_ptr);
454*042d53a7SEvalZero             pkts = get_le16(handle_ptr + 2);
455*042d53a7SEvalZero             handle_ptr += 4;
456*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "handle:%u pkts:%u\n", handle, pkts);
457*042d53a7SEvalZero             --handles;
458*042d53a7SEvalZero         }
459*042d53a7SEvalZero     }
460*042d53a7SEvalZero }
461*042d53a7SEvalZero 
462*042d53a7SEvalZero /**
463*042d53a7SEvalZero  * Display the authenticated payload timeout event
464*042d53a7SEvalZero  *
465*042d53a7SEvalZero  * @param evdata
466*042d53a7SEvalZero  * @param len
467*042d53a7SEvalZero  */
468*042d53a7SEvalZero static void
ble_hs_dbg_auth_pyld_tmo_disp(uint8_t * evdata,uint8_t len)469*042d53a7SEvalZero ble_hs_dbg_auth_pyld_tmo_disp(uint8_t *evdata, uint8_t len)
470*042d53a7SEvalZero {
471*042d53a7SEvalZero     uint16_t handle;
472*042d53a7SEvalZero 
473*042d53a7SEvalZero     if (len != sizeof(uint16_t)) {
474*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "ERR: AuthPyldTmoEvent bad length %u\n", len);
475*042d53a7SEvalZero         return;
476*042d53a7SEvalZero 
477*042d53a7SEvalZero     }
478*042d53a7SEvalZero 
479*042d53a7SEvalZero     handle = get_le16(evdata);
480*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "AuthPyldTmo: handle=%u\n", handle);
481*042d53a7SEvalZero }
482*042d53a7SEvalZero 
483*042d53a7SEvalZero 
484*042d53a7SEvalZero static void
ble_hs_dbg_cmd_comp_info_params(uint8_t status,uint8_t ocf,uint8_t * evdata)485*042d53a7SEvalZero ble_hs_dbg_cmd_comp_info_params(uint8_t status, uint8_t ocf, uint8_t *evdata)
486*042d53a7SEvalZero {
487*042d53a7SEvalZero     int i;
488*042d53a7SEvalZero     uint8_t *dptr;
489*042d53a7SEvalZero 
490*042d53a7SEvalZero     if (status != BLE_ERR_SUCCESS) {
491*042d53a7SEvalZero         return;
492*042d53a7SEvalZero     }
493*042d53a7SEvalZero 
494*042d53a7SEvalZero     switch (ocf) {
495*042d53a7SEvalZero     case BLE_HCI_OCF_IP_RD_LOCAL_VER:
496*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "hci_ver=%u hci_rev=%u lmp_ver=%u mfrg=%u "
497*042d53a7SEvalZero                           "lmp_subver=%u",
498*042d53a7SEvalZero                    evdata[0], get_le16(evdata + 1), evdata[3],
499*042d53a7SEvalZero                    get_le16(evdata + 4), get_le16(evdata + 6));
500*042d53a7SEvalZero         break;
501*042d53a7SEvalZero     case BLE_HCI_OCF_IP_RD_LOC_SUPP_CMD:
502*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "supp_cmds=");
503*042d53a7SEvalZero         dptr = evdata;
504*042d53a7SEvalZero         for (i = 0; i < 8; ++i) {
505*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:",
506*042d53a7SEvalZero                        dptr[0], dptr[1], dptr[2], dptr[3],
507*042d53a7SEvalZero                        dptr[4], dptr[5], dptr[6], dptr[7]);
508*042d53a7SEvalZero             dptr += 8;
509*042d53a7SEvalZero         }
510*042d53a7SEvalZero         break;
511*042d53a7SEvalZero     case BLE_HCI_OCF_IP_RD_LOC_SUPP_FEAT:
512*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "supp_feat=0x%lx%08lx",
513*042d53a7SEvalZero                    get_le32(evdata + 4), get_le32(evdata));
514*042d53a7SEvalZero         break;
515*042d53a7SEvalZero     case BLE_HCI_OCF_IP_RD_BD_ADDR:
516*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "bd_addr=%x:%x:%x:%x:%x:%x",
517*042d53a7SEvalZero                    evdata[5], evdata[4], evdata[3],
518*042d53a7SEvalZero                    evdata[2], evdata[1], evdata[0]);
519*042d53a7SEvalZero         break;
520*042d53a7SEvalZero     default:
521*042d53a7SEvalZero         break;
522*042d53a7SEvalZero     }
523*042d53a7SEvalZero }
524*042d53a7SEvalZero 
525*042d53a7SEvalZero static void
ble_hs_dbg_cmd_complete_disp(uint8_t * evdata,uint8_t len)526*042d53a7SEvalZero ble_hs_dbg_cmd_complete_disp(uint8_t *evdata, uint8_t len)
527*042d53a7SEvalZero {
528*042d53a7SEvalZero     uint8_t cmd_pkts;
529*042d53a7SEvalZero     uint8_t ogf;
530*042d53a7SEvalZero     uint8_t ocf;
531*042d53a7SEvalZero     uint8_t status;
532*042d53a7SEvalZero     uint16_t opcode;
533*042d53a7SEvalZero 
534*042d53a7SEvalZero     if (len < 3) {
535*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "Invalid command complete: len=%d "
536*042d53a7SEvalZero                           "(expected >= 3)", len);
537*042d53a7SEvalZero         goto done;
538*042d53a7SEvalZero     }
539*042d53a7SEvalZero 
540*042d53a7SEvalZero     cmd_pkts = evdata[0];
541*042d53a7SEvalZero     opcode = get_le16(evdata + 1);
542*042d53a7SEvalZero     ogf = BLE_HCI_OGF(opcode);
543*042d53a7SEvalZero     ocf = BLE_HCI_OCF(opcode);
544*042d53a7SEvalZero 
545*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Command complete: cmd_pkts=%u ogf=0x%x ocf=0x%x",
546*042d53a7SEvalZero                cmd_pkts, ogf, ocf);
547*042d53a7SEvalZero 
548*042d53a7SEvalZero     if (len == 3) {
549*042d53a7SEvalZero         goto done;
550*042d53a7SEvalZero     }
551*042d53a7SEvalZero 
552*042d53a7SEvalZero     status = evdata[3];
553*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, " status=%u ", status);
554*042d53a7SEvalZero 
555*042d53a7SEvalZero     /* Move past header and status */
556*042d53a7SEvalZero     evdata += 4;
557*042d53a7SEvalZero 
558*042d53a7SEvalZero     /* Display parameters based on command. */
559*042d53a7SEvalZero     switch (ogf) {
560*042d53a7SEvalZero     case BLE_HCI_OGF_INFO_PARAMS:
561*042d53a7SEvalZero         ble_hs_dbg_cmd_comp_info_params(status, ocf, evdata);
562*042d53a7SEvalZero         break;
563*042d53a7SEvalZero     case BLE_HCI_OGF_STATUS_PARAMS:
564*042d53a7SEvalZero         switch (ocf) {
565*042d53a7SEvalZero         case BLE_HCI_OCF_RD_RSSI:
566*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "handle=%u rssi=%d", get_le16(evdata),
567*042d53a7SEvalZero                        (int8_t)evdata[2]);
568*042d53a7SEvalZero             break;
569*042d53a7SEvalZero         default:
570*042d53a7SEvalZero             break;
571*042d53a7SEvalZero         }
572*042d53a7SEvalZero         break;
573*042d53a7SEvalZero     case BLE_HCI_OGF_LE:
574*042d53a7SEvalZero         switch (ocf) {
575*042d53a7SEvalZero         case BLE_HCI_OCF_LE_RD_CHAN_MAP:
576*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "handle=%u chanmap=%x.%x.%x.%x.%x",
577*042d53a7SEvalZero                        get_le16(evdata), evdata[2], evdata[3], evdata[4],
578*042d53a7SEvalZero                        evdata[5], evdata[6]);
579*042d53a7SEvalZero             break;
580*042d53a7SEvalZero         case BLE_HCI_OCF_LE_RD_MAX_DATA_LEN:
581*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "txoct=%u txtime=%u rxoct=%u rxtime=%u",
582*042d53a7SEvalZero                        get_le16(evdata), get_le16(evdata + 2),
583*042d53a7SEvalZero                        get_le16(evdata + 4), get_le16(evdata + 6));
584*042d53a7SEvalZero             break;
585*042d53a7SEvalZero         case BLE_HCI_OCF_LE_RD_SUPP_STATES:
586*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "states=0x%lx%08lx", get_le32(evdata + 4),
587*042d53a7SEvalZero                        get_le32(evdata));
588*042d53a7SEvalZero             break;
589*042d53a7SEvalZero         case BLE_HCI_OCF_LE_ENCRYPT:
590*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "encdata=0x%02x%02x%02x%02x%02x%02x%02x%02x",
591*042d53a7SEvalZero                        evdata[15], evdata[14], evdata[13], evdata[12],
592*042d53a7SEvalZero                        evdata[11], evdata[10], evdata[9], evdata[8]);
593*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "%02x%02x%02x%02x%02x%02x%02x%02x",
594*042d53a7SEvalZero                        evdata[7], evdata[6], evdata[5], evdata[4],
595*042d53a7SEvalZero                        evdata[3], evdata[2], evdata[1], evdata[0]);
596*042d53a7SEvalZero 
597*042d53a7SEvalZero             break;
598*042d53a7SEvalZero         case BLE_HCI_OCF_LE_RAND:
599*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "rand=0x%02x%02x%02x%02x%02x%02x%02x%02x",
600*042d53a7SEvalZero                        evdata[0], evdata[1], evdata[2], evdata[3],
601*042d53a7SEvalZero                        evdata[4], evdata[5], evdata[6], evdata[7]);
602*042d53a7SEvalZero             break;
603*042d53a7SEvalZero         case BLE_HCI_OCF_LE_RD_SUGG_DEF_DATA_LEN:
604*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "txoct=%u txtime=%u", get_le16(evdata),
605*042d53a7SEvalZero                        get_le16(evdata + 2));
606*042d53a7SEvalZero             break;
607*042d53a7SEvalZero         case BLE_HCI_OCF_LE_LT_KEY_REQ_REPLY:
608*042d53a7SEvalZero         case BLE_HCI_OCF_LE_LT_KEY_REQ_NEG_REPLY:
609*042d53a7SEvalZero         case BLE_HCI_OCF_LE_SET_DATA_LEN:
610*042d53a7SEvalZero             BLE_HS_LOG(DEBUG, "handle=%u", get_le16(evdata));
611*042d53a7SEvalZero             break;
612*042d53a7SEvalZero         default:
613*042d53a7SEvalZero             break;
614*042d53a7SEvalZero         }
615*042d53a7SEvalZero         break;
616*042d53a7SEvalZero     default:
617*042d53a7SEvalZero         break;
618*042d53a7SEvalZero     }
619*042d53a7SEvalZero 
620*042d53a7SEvalZero done:
621*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "\n");
622*042d53a7SEvalZero }
623*042d53a7SEvalZero 
624*042d53a7SEvalZero static void
ble_hs_dbg_cmd_status_disp(uint8_t * evdata,uint8_t len)625*042d53a7SEvalZero ble_hs_dbg_cmd_status_disp(uint8_t *evdata, uint8_t len)
626*042d53a7SEvalZero {
627*042d53a7SEvalZero     uint8_t ogf;
628*042d53a7SEvalZero     uint8_t ocf;
629*042d53a7SEvalZero     uint16_t opcode;
630*042d53a7SEvalZero 
631*042d53a7SEvalZero     opcode = get_le16(evdata + 2);
632*042d53a7SEvalZero     ogf = BLE_HCI_OGF(opcode);
633*042d53a7SEvalZero     ocf = BLE_HCI_OCF(opcode);
634*042d53a7SEvalZero 
635*042d53a7SEvalZero     BLE_HS_LOG(DEBUG, "Command Status: status=%u cmd_pkts=%u ocf=0x%x "
636*042d53a7SEvalZero                       "ogf=0x%x\n", evdata[0], evdata[1], ocf, ogf);
637*042d53a7SEvalZero }
638*042d53a7SEvalZero 
639*042d53a7SEvalZero void
ble_hs_dbg_event_disp(uint8_t * evbuf)640*042d53a7SEvalZero ble_hs_dbg_event_disp(uint8_t *evbuf)
641*042d53a7SEvalZero {
642*042d53a7SEvalZero #if MYNEWT_VAL(LOG_LEVEL) > LOG_LEVEL_DEBUG || BLE_MONITOR
643*042d53a7SEvalZero     return;
644*042d53a7SEvalZero #endif
645*042d53a7SEvalZero 
646*042d53a7SEvalZero     uint8_t *evdata;
647*042d53a7SEvalZero     uint8_t evcode;
648*042d53a7SEvalZero     uint8_t len;
649*042d53a7SEvalZero 
650*042d53a7SEvalZero     /* Extract event code and length; move pointer to event parameter data */
651*042d53a7SEvalZero     evcode = evbuf[0];
652*042d53a7SEvalZero     len = evbuf[1];
653*042d53a7SEvalZero     evdata = evbuf + BLE_HCI_EVENT_HDR_LEN;
654*042d53a7SEvalZero 
655*042d53a7SEvalZero     switch (evcode) {
656*042d53a7SEvalZero     case BLE_HCI_EVCODE_DISCONN_CMP:
657*042d53a7SEvalZero         ble_hs_dbg_disconn_comp_disp(evdata, len);
658*042d53a7SEvalZero         break;
659*042d53a7SEvalZero     case BLE_HCI_EVCODE_ENC_KEY_REFRESH:
660*042d53a7SEvalZero         ble_hs_dbg_encrypt_refresh_disp(evdata, len);
661*042d53a7SEvalZero         break;
662*042d53a7SEvalZero     case BLE_HCI_EVCODE_ENCRYPT_CHG:
663*042d53a7SEvalZero         ble_hs_dbg_encrypt_chg_disp(evdata, len);
664*042d53a7SEvalZero         break;
665*042d53a7SEvalZero     case BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP:
666*042d53a7SEvalZero         ble_hs_dbg_rd_rem_ver_disp(evdata, len);
667*042d53a7SEvalZero         break;
668*042d53a7SEvalZero     case BLE_HCI_EVCODE_COMMAND_COMPLETE:
669*042d53a7SEvalZero         ble_hs_dbg_cmd_complete_disp(evdata, len);
670*042d53a7SEvalZero         break;
671*042d53a7SEvalZero     case BLE_HCI_EVCODE_COMMAND_STATUS:
672*042d53a7SEvalZero         ble_hs_dbg_cmd_status_disp(evdata, len);
673*042d53a7SEvalZero         break;
674*042d53a7SEvalZero     case BLE_HCI_EVCODE_NUM_COMP_PKTS:
675*042d53a7SEvalZero         ble_hs_dbg_num_comp_pkts_disp(evdata, len);
676*042d53a7SEvalZero         break;
677*042d53a7SEvalZero     case BLE_HCI_EVCODE_LE_META:
678*042d53a7SEvalZero         ble_hs_dbg_le_event_disp(evdata[0], len-1, evdata + 1);
679*042d53a7SEvalZero         break;
680*042d53a7SEvalZero     case BLE_HCI_EVCODE_AUTH_PYLD_TMO:
681*042d53a7SEvalZero         ble_hs_dbg_auth_pyld_tmo_disp(evdata, len);
682*042d53a7SEvalZero         break;
683*042d53a7SEvalZero     default:
684*042d53a7SEvalZero         BLE_HS_LOG(DEBUG, "Unknown event 0x%x len=%u\n", evcode, len);
685*042d53a7SEvalZero         break;
686*042d53a7SEvalZero     }
687*042d53a7SEvalZero }
688*042d53a7SEvalZero 
689*042d53a7SEvalZero void
ble_hs_dbg_set_sync_state(uint8_t sync_state)690*042d53a7SEvalZero ble_hs_dbg_set_sync_state(uint8_t sync_state)
691*042d53a7SEvalZero {
692*042d53a7SEvalZero     ble_hs_sync_state = sync_state;
693*042d53a7SEvalZero }
694