Message ID | 20201102191232.1848737-1-luiz.dentz@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2,01/11] emulator/btdev: Add debug support | expand |
Hi, On Mon, Nov 2, 2020 at 11:12 AM Luiz Augusto von Dentz <luiz.dentz@gmail.com> wrote: > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> > > This adds btdev_set_debug which can be used to debug internals of > btdev. > --- > emulator/btdev.c | 99 +++++++++++++++++++++++++----------------------- > emulator/btdev.h | 5 +++ > 2 files changed, 57 insertions(+), 47 deletions(-) > > diff --git a/emulator/btdev.c b/emulator/btdev.c > index ca87681a6..c89815b3e 100644 > --- a/emulator/btdev.c > +++ b/emulator/btdev.c > @@ -144,6 +144,10 @@ struct btdev { > uint8_t sync_train_service_data; > > uint16_t le_ext_adv_type; > + > + btdev_debug_func_t debug_callback; > + btdev_destroy_func_t debug_destroy; > + void *debug_data; > }; > > struct inquiry_data { > @@ -257,45 +261,6 @@ static inline struct btdev *find_btdev_by_bdaddr_type(const uint8_t *bdaddr, > return NULL; > } > > -static void hexdump(const unsigned char *buf, uint16_t len) > -{ > - static const char hexdigits[] = "0123456789abcdef"; > - char str[68]; > - uint16_t i; > - > - if (!len) > - return; > - > - for (i = 0; i < len; i++) { > - str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4]; > - str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf]; > - str[((i % 16) * 3) + 2] = ' '; > - str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.'; > - > - if ((i + 1) % 16 == 0) { > - str[47] = ' '; > - str[48] = ' '; > - str[65] = '\0'; > - printf("%-12c%s\n", ' ', str); > - str[0] = ' '; > - } > - } > - > - if (i % 16 > 0) { > - uint16_t j; > - for (j = (i % 16); j < 16; j++) { > - str[(j * 3) + 0] = ' '; > - str[(j * 3) + 1] = ' '; > - str[(j * 3) + 2] = ' '; > - str[j + 49] = ' '; > - } > - str[47] = ' '; > - str[48] = ' '; > - str[65] = '\0'; > - printf("%-12c%s\n", ' ', str); > - } > -} > - > static void get_bdaddr(uint16_t id, uint8_t index, uint8_t *bdaddr) > { > bdaddr[0] = id & 0xff; > @@ -768,6 +733,22 @@ void btdev_destroy(struct btdev *btdev) > free(btdev); > } > > +bool btdev_set_debug(struct btdev *btdev, btdev_debug_func_t callback, > + void *user_data, btdev_destroy_func_t destroy) > +{ > + if (!btdev) > + return false; > + > + if (btdev->debug_destroy) > + btdev->debug_destroy(btdev->debug_data); > + > + btdev->debug_callback = callback; > + btdev->debug_destroy = destroy; > + btdev->debug_data = user_data; > + > + return true; > +} > + > const uint8_t *btdev_get_bdaddr(struct btdev *btdev) > { > return btdev->bdaddr; > @@ -824,9 +805,20 @@ void btdev_set_send_handler(struct btdev *btdev, btdev_send_func handler, > static void send_packet(struct btdev *btdev, const struct iovec *iov, > int iovlen) > { > + int i; > + > if (!btdev->send_handler) > return; > > + for (i = 0; i < iovlen; i++) { > + if (!i) > + util_hexdump('<', iov[i].iov_base, iov[i].iov_len, > + btdev->debug_callback, btdev->debug_data); > + else > + util_hexdump(' ', iov[i].iov_base, iov[i].iov_len, > + btdev->debug_callback, btdev->debug_data); > + } > + > btdev->send_handler(iov, iovlen, btdev->send_data); > } > > @@ -837,6 +829,9 @@ static void send_event(struct btdev *btdev, uint8_t event, > struct iovec iov[3]; > uint8_t pkt = BT_H4_EVT_PKT; > > + util_debug(btdev->debug_callback, btdev->debug_data, > + "event 0x%02x", event); > + > iov[0].iov_base = &pkt; > iov[0].iov_len = sizeof(pkt); > > @@ -863,6 +858,9 @@ static void send_cmd(struct btdev *btdev, uint8_t evt, uint16_t opcode, > uint8_t pkt = BT_H4_EVT_PKT; > int i; > > + util_debug(btdev->debug_callback, btdev->debug_data, > + "event 0x%02x opcode 0x%04x", evt, opcode); > + > iov2[0].iov_base = &pkt; > iov2[0].iov_len = sizeof(pkt); > > @@ -921,6 +919,9 @@ static void le_meta_event(struct btdev *btdev, uint8_t event, > { > void *pkt_data; > > + util_debug(btdev->debug_callback, btdev->debug_data, > + "meta event 0x%02x", event); > + > pkt_data = alloca(1 + len); > if (!pkt_data) > return; > @@ -2089,7 +2090,6 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, > uint16_t type, bool is_scan_rsp) > { > struct __packed { > - uint8_t subevent; > uint8_t num_reports; > union { > struct bt_hci_le_ext_adv_report lear; > @@ -2097,8 +2097,6 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, > }; > } meta_event; > > - meta_event.subevent = BT_HCI_EVT_LE_EXT_ADV_REPORT; > - > memset(&meta_event.lear, 0, sizeof(meta_event.lear)); > meta_event.num_reports = 1; > meta_event.lear.event_type = cpu_to_le16(type); > @@ -2121,8 +2119,8 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, > meta_event.lear.data_len); > } > > - send_event(btdev, BT_HCI_EVT_LE_META_EVENT, &meta_event, > - 1 + 1 + 24 + meta_event.lear.data_len); > + le_meta_event(btdev, BT_HCI_EVT_LE_EXT_ADV_REPORT, &meta_event, > + 1 + 24 + meta_event.lear.data_len); > } > > static uint8_t get_adv_report_type(uint8_t adv_type) > @@ -3952,8 +3950,8 @@ static void default_cmd(struct btdev *btdev, uint16_t opcode, > return; > > unsupported: > - printf("Unsupported command 0x%4.4x\n", opcode); > - hexdump(data, len); > + util_debug(btdev->debug_callback, btdev->debug_data, > + "Unsupported command 0x%4.4x\n", opcode); > cmd_status(btdev, BT_HCI_ERR_UNKNOWN_COMMAND, opcode); > } > > @@ -4267,6 +4265,9 @@ static void process_cmd(struct btdev *btdev, const void *data, uint16_t len) > callback.data = data + sizeof(*hdr); > callback.len = hdr->plen; > > + util_debug(btdev->debug_callback, btdev->debug_data, > + "command 0x%04x", callback.opcode); > + > if (btdev->command_handler) > btdev->command_handler(callback.opcode, > callback.data, callback.len, > @@ -4331,6 +4332,9 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len) > if (len < 1) > return; > > + util_hexdump('>', data, len, btdev->debug_callback, > + btdev->debug_data); > + > pkt_type = ((const uint8_t *) data)[0]; > > switch (pkt_type) { > @@ -4348,7 +4352,8 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len) > send_iso(btdev->conn, data, len); > break; > default: > - printf("Unsupported packet 0x%2.2x\n", pkt_type); > + util_debug(btdev->debug_callback, btdev->debug_data, > + "Unsupported packet 0x%2.2x\n", pkt_type); > break; > } > } > diff --git a/emulator/btdev.h b/emulator/btdev.h > index 7cb265f1c..f7cba149a 100644 > --- a/emulator/btdev.h > +++ b/emulator/btdev.h > @@ -66,6 +66,11 @@ struct btdev; > struct btdev *btdev_create(enum btdev_type type, uint16_t id); > void btdev_destroy(struct btdev *btdev); > > +typedef void (*btdev_debug_func_t)(const char *str, void *user_data); > +typedef void (*btdev_destroy_func_t)(void *user_data); > +bool btdev_set_debug(struct btdev *btdev, btdev_debug_func_t callback, > + void *user_data, btdev_destroy_func_t destroy); > + > const uint8_t *btdev_get_bdaddr(struct btdev *btdev); > uint8_t *btdev_get_features(struct btdev *btdev); > > -- > 2.26.2 > Pushed. -- Luiz Augusto von Dentz
This is automated email and please do not reply to this email! Dear submitter, Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series: PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=375773 ---Test result--- ############################## Test: CheckPatch - PASS ############################## Test: CheckGitLint - PASS ############################## Test: CheckBuild - PASS ############################## Test: MakeCheck - PASS --- Regards, Linux Bluetooth
diff --git a/emulator/btdev.c b/emulator/btdev.c index ca87681a6..c89815b3e 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -144,6 +144,10 @@ struct btdev { uint8_t sync_train_service_data; uint16_t le_ext_adv_type; + + btdev_debug_func_t debug_callback; + btdev_destroy_func_t debug_destroy; + void *debug_data; }; struct inquiry_data { @@ -257,45 +261,6 @@ static inline struct btdev *find_btdev_by_bdaddr_type(const uint8_t *bdaddr, return NULL; } -static void hexdump(const unsigned char *buf, uint16_t len) -{ - static const char hexdigits[] = "0123456789abcdef"; - char str[68]; - uint16_t i; - - if (!len) - return; - - for (i = 0; i < len; i++) { - str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4]; - str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf]; - str[((i % 16) * 3) + 2] = ' '; - str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.'; - - if ((i + 1) % 16 == 0) { - str[47] = ' '; - str[48] = ' '; - str[65] = '\0'; - printf("%-12c%s\n", ' ', str); - str[0] = ' '; - } - } - - if (i % 16 > 0) { - uint16_t j; - for (j = (i % 16); j < 16; j++) { - str[(j * 3) + 0] = ' '; - str[(j * 3) + 1] = ' '; - str[(j * 3) + 2] = ' '; - str[j + 49] = ' '; - } - str[47] = ' '; - str[48] = ' '; - str[65] = '\0'; - printf("%-12c%s\n", ' ', str); - } -} - static void get_bdaddr(uint16_t id, uint8_t index, uint8_t *bdaddr) { bdaddr[0] = id & 0xff; @@ -768,6 +733,22 @@ void btdev_destroy(struct btdev *btdev) free(btdev); } +bool btdev_set_debug(struct btdev *btdev, btdev_debug_func_t callback, + void *user_data, btdev_destroy_func_t destroy) +{ + if (!btdev) + return false; + + if (btdev->debug_destroy) + btdev->debug_destroy(btdev->debug_data); + + btdev->debug_callback = callback; + btdev->debug_destroy = destroy; + btdev->debug_data = user_data; + + return true; +} + const uint8_t *btdev_get_bdaddr(struct btdev *btdev) { return btdev->bdaddr; @@ -824,9 +805,20 @@ void btdev_set_send_handler(struct btdev *btdev, btdev_send_func handler, static void send_packet(struct btdev *btdev, const struct iovec *iov, int iovlen) { + int i; + if (!btdev->send_handler) return; + for (i = 0; i < iovlen; i++) { + if (!i) + util_hexdump('<', iov[i].iov_base, iov[i].iov_len, + btdev->debug_callback, btdev->debug_data); + else + util_hexdump(' ', iov[i].iov_base, iov[i].iov_len, + btdev->debug_callback, btdev->debug_data); + } + btdev->send_handler(iov, iovlen, btdev->send_data); } @@ -837,6 +829,9 @@ static void send_event(struct btdev *btdev, uint8_t event, struct iovec iov[3]; uint8_t pkt = BT_H4_EVT_PKT; + util_debug(btdev->debug_callback, btdev->debug_data, + "event 0x%02x", event); + iov[0].iov_base = &pkt; iov[0].iov_len = sizeof(pkt); @@ -863,6 +858,9 @@ static void send_cmd(struct btdev *btdev, uint8_t evt, uint16_t opcode, uint8_t pkt = BT_H4_EVT_PKT; int i; + util_debug(btdev->debug_callback, btdev->debug_data, + "event 0x%02x opcode 0x%04x", evt, opcode); + iov2[0].iov_base = &pkt; iov2[0].iov_len = sizeof(pkt); @@ -921,6 +919,9 @@ static void le_meta_event(struct btdev *btdev, uint8_t event, { void *pkt_data; + util_debug(btdev->debug_callback, btdev->debug_data, + "meta event 0x%02x", event); + pkt_data = alloca(1 + len); if (!pkt_data) return; @@ -2089,7 +2090,6 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, uint16_t type, bool is_scan_rsp) { struct __packed { - uint8_t subevent; uint8_t num_reports; union { struct bt_hci_le_ext_adv_report lear; @@ -2097,8 +2097,6 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, }; } meta_event; - meta_event.subevent = BT_HCI_EVT_LE_EXT_ADV_REPORT; - memset(&meta_event.lear, 0, sizeof(meta_event.lear)); meta_event.num_reports = 1; meta_event.lear.event_type = cpu_to_le16(type); @@ -2121,8 +2119,8 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, meta_event.lear.data_len); } - send_event(btdev, BT_HCI_EVT_LE_META_EVENT, &meta_event, - 1 + 1 + 24 + meta_event.lear.data_len); + le_meta_event(btdev, BT_HCI_EVT_LE_EXT_ADV_REPORT, &meta_event, + 1 + 24 + meta_event.lear.data_len); } static uint8_t get_adv_report_type(uint8_t adv_type) @@ -3952,8 +3950,8 @@ static void default_cmd(struct btdev *btdev, uint16_t opcode, return; unsupported: - printf("Unsupported command 0x%4.4x\n", opcode); - hexdump(data, len); + util_debug(btdev->debug_callback, btdev->debug_data, + "Unsupported command 0x%4.4x\n", opcode); cmd_status(btdev, BT_HCI_ERR_UNKNOWN_COMMAND, opcode); } @@ -4267,6 +4265,9 @@ static void process_cmd(struct btdev *btdev, const void *data, uint16_t len) callback.data = data + sizeof(*hdr); callback.len = hdr->plen; + util_debug(btdev->debug_callback, btdev->debug_data, + "command 0x%04x", callback.opcode); + if (btdev->command_handler) btdev->command_handler(callback.opcode, callback.data, callback.len, @@ -4331,6 +4332,9 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len) if (len < 1) return; + util_hexdump('>', data, len, btdev->debug_callback, + btdev->debug_data); + pkt_type = ((const uint8_t *) data)[0]; switch (pkt_type) { @@ -4348,7 +4352,8 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len) send_iso(btdev->conn, data, len); break; default: - printf("Unsupported packet 0x%2.2x\n", pkt_type); + util_debug(btdev->debug_callback, btdev->debug_data, + "Unsupported packet 0x%2.2x\n", pkt_type); break; } } diff --git a/emulator/btdev.h b/emulator/btdev.h index 7cb265f1c..f7cba149a 100644 --- a/emulator/btdev.h +++ b/emulator/btdev.h @@ -66,6 +66,11 @@ struct btdev; struct btdev *btdev_create(enum btdev_type type, uint16_t id); void btdev_destroy(struct btdev *btdev); +typedef void (*btdev_debug_func_t)(const char *str, void *user_data); +typedef void (*btdev_destroy_func_t)(void *user_data); +bool btdev_set_debug(struct btdev *btdev, btdev_debug_func_t callback, + void *user_data, btdev_destroy_func_t destroy); + const uint8_t *btdev_get_bdaddr(struct btdev *btdev); uint8_t *btdev_get_features(struct btdev *btdev);
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This adds btdev_set_debug which can be used to debug internals of btdev. --- emulator/btdev.c | 99 +++++++++++++++++++++++++----------------------- emulator/btdev.h | 5 +++ 2 files changed, 57 insertions(+), 47 deletions(-)