3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2004-2011 Marcel Holtmann <marcel@holtmann.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 #define CSR_U8(frm) (p_get_u8(frm))
37 #define CSR_U16(frm) (btohs(htons(p_get_u16(frm))))
38 #define CSR_U32(frm) ((CSR_U16(frm) << 16) + CSR_U16(frm))
39 #define CSR_S16(frm) (btohs(htons(p_get_u16(frm))))
41 static char *type2str(uint16_t type)
55 static inline void valueless_dump(int level, char *str, struct frame *frm)
61 static inline void complex_dump(int level, char *str, struct frame *frm)
69 static inline void bool_dump(int level, char *str, struct frame *frm)
76 printf("%s: value %s (%d)\n", str, value ? "TRUE" : "FALSE", value);
79 static inline void int8_dump(int level, char *str, struct frame *frm)
86 printf("%s: value %d (0x%2.2x)\n", str, value, value);
89 static inline void int16_dump(int level, char *str, struct frame *frm)
96 printf("%s: value %d (0x%2.2x)\n", str, value, value);
99 static inline void uint16_dump(int level, char *str, struct frame *frm)
103 value = CSR_U16(frm);
105 p_indent(level, frm);
106 printf("%s: value %d (0x%4.4x)\n", str, value, value);
109 static inline void uint32_dump(int level, char *str, struct frame *frm)
113 value = CSR_U32(frm);
115 p_indent(level, frm);
116 printf("%s: value %d (0x%4.4x)\n", str, value, value);
119 static inline void bdaddr_dump(int level, char *str, struct frame *frm)
123 p_ba2str(frm->ptr, addr);
125 p_indent(level, frm);
126 printf("%s: bdaddr %s\n", str, addr);
129 static inline void features_dump(int level, char *str, struct frame *frm)
131 unsigned char features[8];
134 memcpy(features, frm->ptr, 8);
136 p_indent(level, frm);
137 printf("%s: features", str);
138 for (i = 0; i < 8; i++)
139 printf(" 0x%02x", features[i]);
143 static inline void commands_dump(int level, char *str, struct frame *frm)
145 unsigned char commands[64];
148 memcpy(commands, frm->ptr, frm->len);
150 p_indent(level, frm);
151 printf("%s: commands", str);
152 for (i = 0; i < frm->len; i++)
153 printf(" 0x%02x", commands[i]);
157 static inline void handle_length_dump(int level, char *str, struct frame *frm)
159 uint16_t handle, length;
161 handle = CSR_U16(frm);
162 length = CSR_U16(frm);
164 p_indent(level, frm);
165 printf("%s: handle %d length %d\n", str, handle, length);
168 static inline void handle_clock_dump(int level, char *str, struct frame *frm)
173 handle = CSR_U16(frm);
174 clock = CSR_U32(frm);
176 p_indent(level, frm);
177 printf("%s: handle %d clock 0x%4.4x\n", str, handle, clock);
180 static inline void radiotest_dump(int level, char *str, struct frame *frm)
184 testid = CSR_U16(frm);
186 p_indent(level, frm);
187 printf("%s: test id %d\n", str, testid);
189 raw_dump(level, frm);
192 static inline void psmemtype_dump(int level, char *str, struct frame *frm)
194 uint16_t store, type;
196 store = CSR_U16(frm);
199 p_indent(level, frm);
200 printf("%s: store 0x%4.4x type %d\n", str, store, type);
203 static inline void psnext_dump(int level, char *str, struct frame *frm)
205 uint16_t key, stores, next;
208 stores = CSR_U16(frm);
211 p_indent(level, frm);
212 printf("%s: key 0x%4.4x stores 0x%4.4x next 0x%4.4x\n", str, key, stores, next);
215 static inline void pssize_dump(int level, char *str, struct frame *frm)
217 uint16_t key, length;
220 length = CSR_U16(frm);
222 p_indent(level, frm);
223 printf("%s: key 0x%4.4x %s 0x%4.4x\n", str, key,
224 frm->in ? "len" : "stores", length);
227 static inline void psstores_dump(int level, char *str, struct frame *frm)
229 uint16_t key, stores;
232 stores = CSR_U16(frm);
234 p_indent(level, frm);
235 printf("%s: key 0x%4.4x stores 0x%4.4x\n", str, key, stores);
238 static inline void pskey_dump(int level, struct frame *frm)
240 uint16_t key, length, stores;
243 length = CSR_U16(frm);
244 stores = CSR_U16(frm);
246 p_indent(level, frm);
247 printf("PSKEY: key 0x%4.4x len %d stores 0x%4.4x\n", key, length, stores);
251 bdaddr_dump(level + 1, "BDADDR", frm);
254 uint16_dump(level + 1, "COUNTRYCODE", frm);
257 uint32_dump(level + 1, "CLASSOFDEVICE", frm);
260 uint16_dump(level + 1, "DEVICE_DRIFT", frm);
263 uint16_dump(level + 1, "DEVICE_JITTER", frm);
266 uint16_dump(level + 1, "MAX_ACLS", frm);
269 uint16_dump(level + 1, "MAX_SCOS", frm);
272 uint16_dump(level + 1, "MAX_REMOTE_MASTERS", frm);
275 uint16_dump(level + 1, "ENC_KEY_LMIN", frm);
278 uint16_dump(level + 1, "ENC_KEY_LMAX", frm);
281 features_dump(level + 1, "LOCAL_SUPPORTED_FEATURES", frm);
284 commands_dump(level + 1, "LOCAL_SUPPORTED_COMMANDS", frm);
287 uint16_dump(level + 1, "HCI_LMP_LOCAL_VERSION", frm);
290 uint16_dump(level + 1, "LMP_REMOTE_VERSION", frm);
293 bool_dump(level + 1, "HOSTIO_USE_HCI_EXTN", frm);
296 bool_dump(level + 1, "HOSTIO_MAP_SCO_PCM", frm);
299 uint16_dump(level + 1, "UART_BAUDRATE", frm);
302 uint16_dump(level + 1, "ANA_FTRIM", frm);
305 uint16_dump(level + 1, "HOST_INTERFACE", frm);
308 uint16_dump(level + 1, "ANA_FREQ", frm);
311 uint16_dump(level + 1, "USB_VENDOR_ID", frm);
314 uint16_dump(level + 1, "USB_PRODUCT_ID", frm);
317 uint16_dump(level + 1, "USB_DFU_PRODUCT_ID", frm);
320 int16_dump(level + 1, "INITIAL_BOOTMODE", frm);
323 raw_dump(level + 1, frm);
328 static inline void bccmd_dump(int level, struct frame *frm)
330 uint16_t type, length, seqno, varid, status;
333 length = CSR_U16(frm);
334 seqno = CSR_U16(frm);
335 varid = CSR_U16(frm);
336 status = CSR_U16(frm);
338 p_indent(level, frm);
339 printf("BCCMD: %s: len %d seqno %d varid 0x%4.4x status %d\n",
340 type2str(type), length, seqno, varid, status);
342 if (!(parser.flags & DUMP_VERBOSE)) {
343 raw_dump(level + 1, frm);
349 valueless_dump(level + 1, "PS_CLR_ALL", frm);
352 valueless_dump(level + 1, "PS_FACTORY_SET", frm);
355 uint16_dump(level + 1, "PS_CLR_ALL_STORES", frm);
358 uint16_dump(level + 1, "BC01_STATUS", frm);
361 uint16_dump(level + 1, "BUILDID", frm);
364 uint16_dump(level + 1, "CHIPVER", frm);
367 uint16_dump(level + 1, "CHIPREV", frm);
370 uint16_dump(level + 1, "INTERFACE_VERSION", frm);
373 uint16_dump(level + 1, "RAND", frm);
376 uint16_dump(level + 1, "MAX_CRYPT_KEY_LENGTH", frm);
379 uint16_dump(level + 1, "E2_APP_SIZE", frm);
382 uint16_dump(level + 1, "CHIPANAREV", frm);
385 uint16_dump(level + 1, "BUILDID_LOADER", frm);
388 uint32_dump(level + 1, "BT_CLOCK", frm);
391 psnext_dump(level + 1, "PS_NEXT", frm);
394 pssize_dump(level + 1, "PS_SIZE", frm);
397 handle_length_dump(level + 1, "CRYPT_KEY_LENGTH", frm);
400 handle_clock_dump(level + 1, "PICONET_INSTANCE", frm);
403 complex_dump(level + 1, "GET_CLR_EVT", frm);
406 complex_dump(level + 1, "GET_NEXT_BUILDDEF", frm);
409 complex_dump(level + 1, "E2_DEVICE", frm);
412 complex_dump(level + 1, "E2_APP_DATA", frm);
415 psmemtype_dump(level + 1, "PS_MEMORY_TYPE", frm);
418 complex_dump(level + 1, "READ_BUILD_NAME", frm);
421 valueless_dump(level + 1, "COLD_RESET", frm);
424 valueless_dump(level + 1, "WARM_RESET", frm);
427 valueless_dump(level + 1, "COLD_HALT", frm);
430 valueless_dump(level + 1, "WARM_HALT", frm);
433 valueless_dump(level + 1, "INIT_BT_STACK", frm);
436 valueless_dump(level + 1, "ACTIVATE_BT_STACK", frm);
439 valueless_dump(level + 1, "ENABLE_TX", frm);
442 valueless_dump(level + 1, "DISABLE_TX", frm);
445 valueless_dump(level + 1, "RECAL", frm);
448 valueless_dump(level + 1, "PS_FACTORY_RESTORE", frm);
451 valueless_dump(level + 1, "PS_FACTORY_RESTORE_ALL", frm);
454 valueless_dump(level + 1, "PS_DEFRAG_RESET", frm);
457 valueless_dump(level + 1, "HOPPING_ON", frm);
460 valueless_dump(level + 1, "CANCEL_PAGE", frm);
463 uint16_dump(level + 1, "PS_CLR", frm);
466 uint16_dump(level + 1, "MAP_SCO_PCM", frm);
469 uint16_dump(level + 1, "SINGLE_CHAN", frm);
472 radiotest_dump(level + 1, "RADIOTEST", frm);
475 psstores_dump(level + 1, "PS_CLR_STORES", frm);
478 valueless_dump(level + 1, "NO_VARIABLE", frm);
481 uint16_dump(level + 1, "CONFIG_UART", frm);
484 uint16_dump(level + 1, "PANIC_ARG", frm);
487 uint16_dump(level + 1, "FAULT_ARG", frm);
490 int8_dump(level + 1, "MAX_TX_POWER", frm);
493 int8_dump(level + 1, "DEFAULT_TX_POWER", frm);
496 pskey_dump(level + 1, frm);
499 raw_dump(level + 1, frm);
504 static char *cid2str(uint8_t cid)
506 switch (cid & 0x3f) {
508 return "BCSP Internal";
518 return "HCI Cmd/Evt";
544 static char *frag2str(uint8_t frag)
546 switch (frag & 0xc0) {
548 return " middle fragment";
550 return " first fragment";
552 return " last fragment";
558 void csr_dump(int level, struct frame *frm)
560 uint8_t desc, cid, type;
561 uint16_t handle, master, addr;
569 bccmd_dump(level, frm);
575 if (!p_filter(FILT_LMP)) {
578 frm->handle = ((uint8_t *) frm->ptr)[17];
581 lmp_dump(level, frm);
584 frm->handle = ((uint8_t *) frm->ptr)[17];
587 lmp_dump(level, frm);
590 handle = CSR_U16(frm);
591 master = CSR_U16(frm);
593 p_indent(level, frm);
594 printf("FHS: handle %d addr %d (%s)\n", handle,
595 addr, master ? "master" : "slave");
598 p_ba2str((bdaddr_t *) frm->ptr, addr);
599 p_indent(level + 1, frm);
600 printf("bdaddr %s class "
601 "0x%2.2x%2.2x%2.2x\n", addr,
602 ((uint8_t *) frm->ptr)[8],
603 ((uint8_t *) frm->ptr)[7],
604 ((uint8_t *) frm->ptr)[6]);
608 p_indent(level, frm);
609 printf("LMP(r): duplicate (same SEQN)\n");
614 p_indent(level, frm);
615 printf("CSR: Debug (type 0x%2.2x)\n", type);
616 raw_dump(level, frm);
620 p_indent(level, frm);
621 printf("CSR: %s (channel %d)%s\n", cid2str(cid), cid, frag2str(desc));
622 raw_dump(level, frm);