* [PATCH BlueZ v1] monitor: Make eir and ad print hexdump
@ 2026-01-16 20:26 Luiz Augusto von Dentz
2026-01-16 21:20 ` [BlueZ,v1] " bluez.test.bot
2026-01-19 16:10 ` [PATCH BlueZ v1] " patchwork-bot+bluetooth
0 siblings, 2 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2026-01-16 20:26 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This makes eir and ad print an hexdump so user are able to identify
if there is text encoded into them.
---
monitor/display.h | 51 ++++++++++++++++++++-----
monitor/packet.c | 96 ++++++++++++++++-------------------------------
2 files changed, 75 insertions(+), 72 deletions(-)
diff --git a/monitor/display.h b/monitor/display.h
index ee076448cc31..5f83a9a18273 100644
--- a/monitor/display.h
+++ b/monitor/display.h
@@ -11,6 +11,7 @@
#include <stdbool.h>
#include <inttypes.h>
+#include <ctype.h>
bool use_color(void);
@@ -76,18 +77,50 @@ static inline uint64_t print_bitfield(int indent, uint64_t val,
return mask;
}
+static inline void print_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';
+ print_text(COLOR_WHITE, "%s", 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';
+ print_text(COLOR_WHITE, "%s", str);
+ }
+}
+
static inline void print_hex_field(const char *label, const uint8_t *data,
uint8_t len)
{
- char str[len * 2 + 1];
- uint8_t i;
-
- str[0] = '\0';
-
- for (i = 0; i < len; i++)
- sprintf(str + (i * 2), "%2.2x", data[i]);
-
- print_field("%s[%u]: %s", label, len, str);
+ print_field("%s[%u]:", label, len);
+ print_hexdump(data, len);
}
void set_default_pager_num_columns(int num_columns);
diff --git a/monitor/packet.c b/monitor/packet.c
index 807d32e9b447..3ba33f8f3afa 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3933,13 +3933,16 @@ static void print_transport_data(const uint8_t *data, uint8_t len)
print_hex_field(" Data", data + 3, len - 3);
}
-static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
+static void print_eir(const char *label, const uint8_t *eir, uint8_t eir_len,
+ bool le)
{
uint16_t len = 0;
if (eir_len == 0)
return;
+ print_hex_field(label, eir, eir_len);
+
while (len < eir_len - 1) {
uint8_t field_len = eir[0];
const uint8_t *data = &eir[2];
@@ -4221,7 +4224,7 @@ void packet_print_rssi(const char *label, int8_t rssi)
void packet_print_ad(const void *data, uint8_t size)
{
- print_eir(data, size, true);
+ print_eir("Advertising Data", data, size, true);
}
struct broadcast_message {
@@ -4273,41 +4276,7 @@ static void print_3d_broadcast(const void *data, uint8_t size)
void packet_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';
- print_text(COLOR_WHITE, "%s", 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';
- print_text(COLOR_WHITE, "%s", str);
- }
+ print_hexdump(buf, len);
}
void packet_control(struct timeval *tv, struct ucred *cred,
@@ -6042,7 +6011,7 @@ static void read_ext_inquiry_response_rsp(uint16_t index, const void *data,
print_status(rsp->status);
print_fec(rsp->fec);
- print_eir(rsp->data, sizeof(rsp->data), false);
+ print_eir("EIR", rsp->data, sizeof(rsp->data), false);
}
static void write_ext_inquiry_response_cmd(uint16_t index, const void *data,
@@ -6051,7 +6020,7 @@ static void write_ext_inquiry_response_cmd(uint16_t index, const void *data,
const struct bt_hci_cmd_write_ext_inquiry_response *cmd = data;
print_fec(cmd->fec);
- print_eir(cmd->data, sizeof(cmd->data), false);
+ print_eir("EIR", cmd->data, sizeof(cmd->data), false);
}
static void refresh_encrypt_key_cmd(uint16_t index, const void *data,
@@ -7240,7 +7209,7 @@ static void le_set_adv_data_cmd(uint16_t index, const void *data, uint8_t size)
const struct bt_hci_cmd_le_set_adv_data *cmd = data;
print_field("Length: %d", cmd->len);
- print_eir(cmd->data, cmd->len, true);
+ packet_print_ad(cmd->data, cmd->len);
}
static void le_set_scan_rsp_data_cmd(uint16_t index, const void *data,
@@ -7249,7 +7218,7 @@ static void le_set_scan_rsp_data_cmd(uint16_t index, const void *data,
const struct bt_hci_cmd_le_set_scan_rsp_data *cmd = data;
print_field("Length: %d", cmd->len);
- print_eir(cmd->data, cmd->len, true);
+ print_eir("Scan Response", cmd->data, cmd->len, true);
}
static void le_set_adv_enable_cmd(uint16_t index, const void *data,
@@ -8071,7 +8040,7 @@ static void le_set_ext_adv_data_cmd(uint16_t index, const void *data,
print_field("Fragment preference: %s (0x%2.2x)", str,
cmd->fragment_preference);
- print_field("Data length: 0x%2.2x", cmd->data_len);
+ print_field("Data length: %u", cmd->data_len);
packet_print_ad(cmd->data, size - sizeof(*cmd));
}
@@ -8120,7 +8089,7 @@ static void le_set_ext_scan_rsp_data_cmd(uint16_t index, const void *data,
print_field("Fragment preference: %s (0x%2.2x)", str,
cmd->fragment_preference);
- print_field("Data length: 0x%2.2x", cmd->data_len);
+ print_field("Data length: %u", cmd->data_len);
packet_print_ad(cmd->data, size - sizeof(*cmd));
}
@@ -8233,8 +8202,8 @@ static void le_set_pa_data_cmd(uint16_t index, const void *data, uint8_t size)
}
print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
- print_field("Data length: 0x%2.2x", cmd->data_len);
- print_eir(cmd->data, cmd->data_len, true);
+ print_field("Data length: %u", cmd->data_len);
+ print_eir("Data", cmd->data, size - sizeof(*cmd), true);
}
static void le_set_pa_enable_cmd(uint16_t index, const void *data, uint8_t size)
@@ -11619,7 +11588,7 @@ static void ext_inquiry_result_evt(struct timeval *tv, uint16_t index,
print_dev_class(evt->dev_class);
print_clock_offset(evt->clock_offset);
print_rssi(evt->rssi);
- print_eir(evt->data, sizeof(evt->data), false);
+ print_eir("EIR", evt->data, sizeof(evt->data), false);
}
static void encrypt_key_refresh_complete_evt(struct timeval *tv, uint16_t index,
@@ -12025,8 +11994,8 @@ report:
print_adv_event_type("Event type", evt->event_type);
print_peer_addr_type("Address type", evt->addr_type);
print_addr("Address", evt->addr, evt->addr_type);
- print_field("Data length: %d", evt->data_len);
- print_eir(evt->data, evt->data_len, true);
+ print_field("Data length: %u", evt->data_len);
+ packet_print_ad(evt->data, evt->data_len);
rssi = (int8_t *) (evt->data + evt->data_len);
print_rssi(*rssi);
@@ -12345,10 +12314,9 @@ static void le_ext_adv_report_evt(struct timeval *tv, uint16_t index,
report->direct_addr_type);
print_addr(" Direct address", report->direct_addr,
report->direct_addr_type);
- print_field(" Data length: 0x%2.2x", report->data_len);
+ print_field(" Data length: %u", report->data_len);
data += sizeof(struct bt_hci_le_ext_adv_report);
- packet_hexdump(data, report->data_len);
- print_eir(data, report->data_len, true);
+ packet_print_ad(data, report->data_len);
data += report->data_len;
}
}
@@ -12431,8 +12399,8 @@ static void le_pa_report_evt(struct timeval *tv, uint16_t index,
}
print_field("Data status: %s%s%s", color_on, str, COLOR_OFF);
- print_field("Data length: 0x%2.2x", evt->data_len);
- print_eir(evt->data, evt->data_len, true);
+ print_field("Data length: %u", evt->data_len);
+ print_eir("Data", evt->data, evt->data_len, true);
}
static void le_pa_sync_lost_evt(struct timeval *tv, uint16_t index,
@@ -15784,7 +15752,7 @@ static void mgmt_read_local_oob_ext_data_rsp(const void *data, uint16_t size)
mgmt_print_address_type(type);
print_field("Data length: %u", data_len);
- print_eir(data + 3, size - 3, true);
+ print_eir("Data", data + 3, size - 3, true);
}
static void mgmt_read_advertising_features_rsp(const void *data, uint16_t size)
@@ -15828,9 +15796,10 @@ static void mgmt_add_advertising_cmd(const void *data, uint16_t size)
print_field("Duration: %u", duration);
print_field("Timeout: %u", timeout);
print_field("Advertising data length: %u", adv_data_len);
- print_eir(data + 11, adv_data_len, false);
+ packet_print_ad(data + 11, adv_data_len);
print_field("Scan response length: %u", scan_rsp_len);
- print_eir(data + 11 + adv_data_len, scan_rsp_len, false);
+ print_eir("Scan response", data + 11 + adv_data_len, scan_rsp_len,
+ false);
}
static void mgmt_add_advertising_rsp(const void *data, uint16_t size)
@@ -15904,7 +15873,7 @@ static void mgmt_read_ext_controller_info_rsp(const void *data, uint16_t size)
mgmt_print_settings("Supported settings", supported_settings);
mgmt_print_settings("Current settings", current_settings);
print_field("Data length: %u", data_len);
- print_eir(data + 19, size - 19, false);
+ print_eir("Data", data + 19, size - 19, false);
}
static void mgmt_set_apperance_cmd(const void *data, uint16_t size)
@@ -16189,9 +16158,10 @@ static void mgmt_add_ext_adv_data_cmd(const void *data, uint16_t size)
print_field("Instance: %u", instance);
print_field("Advertising data length: %u", adv_data_len);
- print_eir(data + 3, adv_data_len, false);
+ packet_print_ad(data + 3, adv_data_len);
print_field("Scan response length: %u", scan_rsp_len);
- print_eir(data + 3 + adv_data_len, scan_rsp_len, false);
+ print_eir("Scan Response", data + 3 + adv_data_len, scan_rsp_len,
+ false);
}
static void mgmt_add_ext_adv_data_rsp(const void *data, uint16_t size)
@@ -16872,7 +16842,7 @@ static void mgmt_device_connected_evt(const void *data, uint16_t size)
mgmt_print_address(data, address_type);
mgmt_print_device_flags(flags);
print_field("Data length: %u", data_len);
- print_eir(data + 13, size - 13, false);
+ print_eir("Data", data + 13, size - 13, false);
}
static void mgmt_device_disconnected_evt(const void *data, uint16_t size)
@@ -16966,7 +16936,7 @@ static void mgmt_device_found_evt(const void *data, uint16_t size)
print_rssi(rssi);
mgmt_print_device_flags(flags);
print_field("Data length: %u", data_len);
- print_eir(data + 14, size - 14, false);
+ print_eir("Data", data + 14, size - 14, false);
}
static void mgmt_discovering_evt(const void *data, uint16_t size)
@@ -17081,7 +17051,7 @@ static void mgmt_local_oob_ext_data_updated_evt(const void *data, uint16_t size)
mgmt_print_address_type(type);
print_field("Data length: %u", data_len);
- print_eir(data + 3, size - 3, true);
+ print_eir("Data", data + 3, size - 3, true);
}
static void mgmt_advertising_added_evt(const void *data, uint16_t size)
@@ -17103,7 +17073,7 @@ static void mgmt_ext_controller_info_changed_evt(const void *data, uint16_t size
uint16_t data_len = get_le16(data);
print_field("Data length: %u", data_len);
- print_eir(data + 2, size - 2, false);
+ print_eir("Data", data + 2, size - 2, false);
}
static void mgmt_phy_changed_evt(const void *data, uint16_t size)
--
2.52.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* RE: [BlueZ,v1] monitor: Make eir and ad print hexdump
2026-01-16 20:26 [PATCH BlueZ v1] monitor: Make eir and ad print hexdump Luiz Augusto von Dentz
@ 2026-01-16 21:20 ` bluez.test.bot
2026-01-19 16:10 ` [PATCH BlueZ v1] " patchwork-bot+bluetooth
1 sibling, 0 replies; 3+ messages in thread
From: bluez.test.bot @ 2026-01-16 21:20 UTC (permalink / raw)
To: linux-bluetooth, luiz.dentz
[-- Attachment #1: Type: text/plain, Size: 1588 bytes --]
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=1043515
---Test result---
Test Summary:
CheckPatch PENDING 0.33 seconds
GitLint PENDING 0.41 seconds
BuildEll PASS 20.07 seconds
BluezMake PASS 649.03 seconds
MakeCheck PASS 18.13 seconds
MakeDistcheck PASS 242.17 seconds
CheckValgrind PASS 290.27 seconds
CheckSmatch WARNING 351.25 seconds
bluezmakeextell PASS 185.75 seconds
IncrementalBuild PENDING 0.40 seconds
ScanBuild PASS 1034.02 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: CheckSmatch - WARNING
Desc: Run smatch tool with source
Output:
monitor/packet.c:1933:26: warning: Variable length array is used.monitor/packet.c: note: in included file:monitor/bt.h:3866:52: warning: array of flexible structuresmonitor/bt.h:3854:40: warning: array of flexible structures
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH BlueZ v1] monitor: Make eir and ad print hexdump
2026-01-16 20:26 [PATCH BlueZ v1] monitor: Make eir and ad print hexdump Luiz Augusto von Dentz
2026-01-16 21:20 ` [BlueZ,v1] " bluez.test.bot
@ 2026-01-19 16:10 ` patchwork-bot+bluetooth
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+bluetooth @ 2026-01-19 16:10 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hello:
This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Fri, 16 Jan 2026 15:26:14 -0500 you wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This makes eir and ad print an hexdump so user are able to identify
> if there is text encoded into them.
> ---
> monitor/display.h | 51 ++++++++++++++++++++-----
> monitor/packet.c | 96 ++++++++++++++++-------------------------------
> 2 files changed, 75 insertions(+), 72 deletions(-)
Here is the summary with links:
- [BlueZ,v1] monitor: Make eir and ad print hexdump
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=6a9117531e39
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-19 16:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-16 20:26 [PATCH BlueZ v1] monitor: Make eir and ad print hexdump Luiz Augusto von Dentz
2026-01-16 21:20 ` [BlueZ,v1] " bluez.test.bot
2026-01-19 16:10 ` [PATCH BlueZ v1] " patchwork-bot+bluetooth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox