* [PATCH v2 3/6] monitor: Filter duplicated advertisements
@ 2017-07-19 13:09 Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon Luiz Augusto von Dentz
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2017-07-19 13:09 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This reduces the verbosity and give a precise picture of how unique
each report is.
---
monitor/packet.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git a/monitor/packet.c b/monitor/packet.c
index cc24165..4ed0faa 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -42,7 +42,9 @@
#include "lib/hci.h"
#include "lib/hci_lib.h"
+#include "src/shared/mainloop.h"
#include "src/shared/util.h"
+#include "src/shared/queue.h"
#include "src/shared/btsnoop.h"
#include "display.h"
#include "bt.h"
@@ -100,6 +102,9 @@
#define COLOR_PHY_PACKET COLOR_BLUE
+#define ADV_TIMEOUT 3000
+#define ADV_MAX_CACHE 100
+
static time_t time_offset = ((time_t) -1);
static int priority_level = BTSNOOP_PRIORITY_INFO;
static unsigned long filter_mask = 0;
@@ -267,11 +272,20 @@ void packet_select_index(uint16_t index)
#define MAX_INDEX 16
+struct adv_data {
+ struct bt_hci_evt_le_adv_report evt;
+ void *data;
+ size_t frame;
+ int timeout;
+ struct queue *cache;
+};
+
struct index_data {
uint8_t type;
uint8_t bdaddr[6];
uint16_t manufacturer;
size_t frame;
+ struct queue *adv_cache;
};
static struct index_data index_list[MAX_INDEX];
@@ -8587,12 +8601,86 @@ static void le_conn_complete_evt(const void *data, uint8_t size)
assign_handle(le16_to_cpu(evt->handle), 0x01);
}
+static void adv_free(void *data)
+{
+ struct adv_data *adv = data;
+
+ free(adv->data);
+ free(adv);
+}
+
+static bool match_adv(const void *data, const void *user_data)
+{
+ const struct adv_data *adv = data;
+ const struct bt_hci_evt_le_adv_report *evt = user_data;
+
+ if (memcmp(&adv->evt, evt, sizeof(*evt)))
+ return false;
+
+ return memcmp(adv->data, evt->data, evt->data_len) == 0;
+}
+
+static void adv_timeout(int id, void *data)
+{
+ struct adv_data *adv = data;
+
+ /* Remove from check (adv is freed after returning) */
+ queue_remove(adv->cache, adv);
+
+ mainloop_remove_timeout(adv->timeout);
+}
+
static void le_adv_report_evt(const void *data, uint8_t size)
{
const struct bt_hci_evt_le_adv_report *evt = data;
+ struct index_data *idata = &index_list[index_current];
+ struct adv_data *match;
+ struct adv_data *adv;
uint8_t evt_len;
int8_t *rssi;
+ if (!idata->adv_cache)
+ idata->adv_cache = queue_new();
+
+ adv = queue_remove_if(idata->adv_cache, match_adv, (void *) evt);
+ if (adv) {
+ /* Update cache and modify expire timeout */
+ if (mainloop_modify_timeout(adv->timeout, ADV_TIMEOUT) < 0) {
+ mainloop_remove_timeout(adv->timeout);
+ adv->timeout = mainloop_add_timeout(ADV_TIMEOUT,
+ adv_timeout, adv,
+ adv_free);
+ }
+ queue_push_head(idata->adv_cache, adv);
+ print_field("Duplicate of #%zu", adv->frame);
+ size = 0;
+ goto rssi;
+ }
+
+ match = new0(struct adv_data, 1);
+ match->evt = *evt;
+
+ match->data = malloc(evt->data_len);
+ memcpy(match->data, evt->data, evt->data_len);
+
+ match->cache = idata->adv_cache;
+ match->frame = idata->frame;
+ match->timeout = mainloop_add_timeout(ADV_TIMEOUT, adv_timeout, match,
+ adv_free);
+ if (match->timeout <= 0) {
+ print_field("Cannot cache: %s (%d)", strerror(-match->timeout),
+ match->timeout);
+ adv_free(match);
+ goto print;
+ }
+
+ queue_push_head(idata->adv_cache, match);
+
+ if (queue_length(idata->adv_cache) > ADV_MAX_CACHE)
+ queue_remove(idata->adv_cache,
+ queue_peek_tail(idata->adv_cache));
+
+print:
print_num_reports(evt->num_reports);
report:
@@ -8602,6 +8690,7 @@ report:
print_field("Data length: %d", evt->data_len);
print_eir(evt->data, evt->data_len, true);
+rssi:
rssi = (int8_t *) (evt->data + evt->data_len);
print_rssi(*rssi);
--
2.9.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon
2017-07-19 13:09 [PATCH v2 3/6] monitor: Filter duplicated advertisements Luiz Augusto von Dentz
@ 2017-07-19 13:09 ` Luiz Augusto von Dentz
2017-07-19 17:47 ` Marcel Holtmann
2017-07-19 13:09 ` [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data Luiz Augusto von Dentz
2 siblings, 1 reply; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2017-07-19 13:09 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds basic decoding for Mesh Beacon packets such as:
> HCI Event: LE Meta Event (0x3e) plen 37
LE Advertising Report (0x02)
Num reports: 1
Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
Address type: Random (0x01)
Address: 36:47:34:FC:63:DA (Non-Resolvable)
Data length: 25
Mesh Beacon: 00dddd0000000000000000000000000000000000000000
Unprovisioned Device Beacon (0x00)
Device UUID: 00dddd00000000000000000000000000
OOB Information: 0x0000
URI Hash: 0x0000
RSSI: -28 dBm (0xe4)
< HCI Command: LE Set Advertising Data (0x08|0x0008) plen 32
Length: 24
Mesh Beacon: 0100c7005d732329eadf000000003e60e50797ef6d5c
Secure Network Beacon (0x01)
Flags: 0x01
Network Id: 00c7005d732329ea
IV Index: 0xdf000000
Authentication Value: 003e60e50797ef6d
---
monitor/packet.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/monitor/packet.c b/monitor/packet.c
index 4ed0faa..51ba7b2 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3513,6 +3513,82 @@ static const struct {
{ }
};
+static const struct {
+ uint8_t bit;
+ const char *str;
+} mesh_oob_table[] = {
+ { 0, "Other" },
+ { 1, "Eletronic / URI" },
+ { 2, "2D machine-readable code" },
+ { 3, "Bar code" },
+ { 4, "Near Field Communication (NFC)" },
+ { 5, "Number" },
+ { 6, "String" },
+ { 11, "On box" },
+ { 12, "Inside box" },
+ { 13, "On piece of paper" },
+ { 14, "Inside manual" },
+ { 14, "On Device" },
+ { }
+};
+
+static void print_mesh_beacon(const uint8_t *data, uint8_t len)
+{
+ uint16_t oob;
+ int i;
+
+ if (len < 1)
+ return;
+
+ switch (data[0]) {
+ case 0x00:
+ print_field(" Unprovisioned Device Beacon (0x00)");
+ if (len < 18) {
+ packet_hexdump(data + 1, len - 1);
+ break;
+ }
+
+ print_hex_field(" Device UUID", data, 16);
+
+ oob = get_be16(&data[16]);
+ print_field(" OOB Information: 0x%4.4x", oob);
+
+ for (i = 0; mesh_oob_table[i].str; i++) {
+ if (oob & (1 << mesh_oob_table[i].bit))
+ print_field(" %s", mesh_oob_table[i].str);
+ }
+
+ if (len < 22) {
+ packet_hexdump(data + 18, len - 18);
+ break;
+ }
+
+ print_field(" URI Hash: 0x%4.4x", get_be32(&data[18]));
+ break;
+ case 0x01:
+ print_field(" Secure Network Beacon (0x01)");
+ if (len < 21) {
+ packet_hexdump(data + 1, len - 1);
+ break;
+ }
+
+ print_field(" Flags: 0x%2.2x", data[0]);
+
+ if (data[0] & 0x01)
+ print_field(" Key Refresh");
+
+ if (data[0] & 0x02)
+ print_field(" IV Update");
+
+ print_hex_field(" Network Id", &data[1], 8);
+ print_field(" IV Index: 0x%08x", get_be32(&data[9]));
+ print_hex_field(" Authentication Value", &data[13], 8);
+ break;
+ default:
+ packet_hexdump(data, len);
+ }
+}
+
static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
{
uint16_t len = 0;
@@ -3747,6 +3823,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
case BT_EIR_MESH_BEACON:
print_hex_field("Mesh Beacon", data, data_len);
+ print_mesh_beacon(data, data_len);
break;
case BT_EIR_MANUFACTURER_DATA:
--
2.9.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning
2017-07-19 13:09 [PATCH v2 3/6] monitor: Filter duplicated advertisements Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon Luiz Augusto von Dentz
@ 2017-07-19 13:09 ` Luiz Augusto von Dentz
2017-07-19 17:49 ` Marcel Holtmann
2017-07-19 13:09 ` [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data Luiz Augusto von Dentz
2 siblings, 1 reply; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2017-07-19 13:09 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds basic decoding for Mesh Provisioning packets such as:
< HCI Command: LE Set Advertising Data (0x08|0x0008) plen 32
Length: 24
Mesh Provision: 024874cb0003dddd0000000000000000000000000000
Link ID: 0x024874cb
Transaction Number: 0
Provisioning Bearer Control (0x03)
Link Open (0x00)
Device UUID: 03dddd00000000000000000000000000
> HCI Event: LE Meta Event (0x3e) plen 20
LE Advertising Report (0x02)
Num reports: 1
Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
Address type: Random (0x01)
Address: 34:11:85:DC:41:39 (Non-Resolvable)
Data length: 8
Mesh Provision: 024874cb0007
Link ID: 0x024874cb
Transaction Number: 0
Provisioning Bearer Control (0x03)
Link Ack (0x01)
RSSI: -28 dBm (0xe4)
---
monitor/packet.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/monitor/packet.c b/monitor/packet.c
index 51ba7b2..2df97fa 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3589,6 +3589,82 @@ static void print_mesh_beacon(const uint8_t *data, uint8_t len)
}
}
+static void print_mesh_prov(const uint8_t *data, uint8_t len)
+{
+ if (len < 6)
+ return;
+
+ print_field(" Link ID: 0x%08x", get_be32(&data[0]));
+ print_field(" Transaction Number: %u", data[4]);
+
+ data += 5;
+ len -= 5;
+
+ switch (data[0] & 0x03) {
+ case 0x00:
+ print_field(" Transaction Start (0x00)");
+ if (len < 5) {
+ packet_hexdump(data + 1, len - 1);
+ return;
+ }
+ print_field(" SeqN: %u", data[0] & 0xfc >> 2);
+ print_field(" TotalLength: %u", get_be16(&data[1]));
+ print_field(" FCS: 0x%2.2x", data[3]);
+ print_hex_field(" Data", &data[4], len - 4);
+ break;
+ case 0x01:
+ print_field(" Transaction Acknowledgment (0x01)");
+ break;
+ case 0x02:
+ print_field(" Transaction Continuation (0x02)");
+ print_field(" SegmentIndex: %u", data[0] >> 2);
+ print_hex_field(" Data", &data[1], len - 1);
+ break;
+ case 0x03:
+ print_field(" Provisioning Bearer Control (0x03)");
+ switch (data[0] >> 2) {
+ case 0x00:
+ print_field(" Link Open (0x00)");
+ if (len < 17) {
+ packet_hexdump(data + 1, len - 1);
+ break;
+ }
+ print_hex_field(" Device UUID", data, 16);
+ break;
+ case 0x01:
+ print_field(" Link Ack (0x01)");
+ break;
+ case 0x02:
+ print_field(" Link Close (0x02)");
+ if (len < 2) {
+ packet_hexdump(data + 1, len - 1);
+ break;
+ }
+
+ switch (data[1]) {
+ case 0x00:
+ print_field(" Reason: Success (0x00)");
+ break;
+ case 0x01:
+ print_field(" Reason: Timeout (0x01)");
+ break;
+ case 0x02:
+ print_field(" Reason: Fail (0x02)");
+ break;
+ default:
+ print_field(" Reason: Unrecognized (0x%2.2x)",
+ data[1]);
+ }
+ break;
+ default:
+ packet_hexdump(data + 1, len - 1);
+ }
+ break;
+ default:
+ packet_hexdump(data, len);
+ }
+}
+
static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
{
uint16_t len = 0;
@@ -3819,6 +3895,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
case BT_EIR_MESH_PROV:
print_hex_field("Mesh Provisioning", data, data_len);
+ print_mesh_prov(data, data_len);
break;
case BT_EIR_MESH_BEACON:
--
2.9.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data
2017-07-19 13:09 [PATCH v2 3/6] monitor: Filter duplicated advertisements Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning Luiz Augusto von Dentz
@ 2017-07-19 13:09 ` Luiz Augusto von Dentz
2017-07-19 17:50 ` Marcel Holtmann
2 siblings, 1 reply; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2017-07-19 13:09 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds basic decoding for Mesh Data packets such as:
> HCI Event: LE Meta Event (0x3e) plen 43
LE Advertising Report (0x02)
Num reports: 1
Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
Address type: Random (0x01)
Address: 29:3C:CE:85:C7:3D (Non-Resolvable)
Data length: 31
Mesh Data: 37cb3a2bdfca0783b10833cfbdc9e691b0d58b2dada00269181477c901
IV: 1
NID: 0x1b
RSSI: -28 dBm (0xe4)
---
monitor/packet.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/monitor/packet.c b/monitor/packet.c
index 2df97fa..efb03bb 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3665,6 +3665,15 @@ static void print_mesh_prov(const uint8_t *data, uint8_t len)
}
}
+static void print_mesh_data(const uint8_t *data, uint8_t len)
+{
+ if (len < 1)
+ return;
+
+ print_field(" IV: %u", data[0] & 0x01);
+ print_field(" NID: 0x%2.2x", data[0] & 0xfe);
+}
+
static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
{
uint16_t len = 0;
@@ -3891,6 +3900,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
case BT_EIR_MESH_DATA:
print_hex_field("Mesh Data", data, data_len);
+ print_mesh_data(data, data_len);
break;
case BT_EIR_MESH_PROV:
--
2.9.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon
2017-07-19 13:09 ` [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon Luiz Augusto von Dentz
@ 2017-07-19 17:47 ` Marcel Holtmann
0 siblings, 0 replies; 7+ messages in thread
From: Marcel Holtmann @ 2017-07-19 17:47 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
> This adds basic decoding for Mesh Beacon packets such as:
>
>> HCI Event: LE Meta Event (0x3e) plen 37
> LE Advertising Report (0x02)
> Num reports: 1
> Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
> Address type: Random (0x01)
> Address: 36:47:34:FC:63:DA (Non-Resolvable)
> Data length: 25
> Mesh Beacon: 00dddd0000000000000000000000000000000000000000
> Unprovisioned Device Beacon (0x00)
> Device UUID: 00dddd00000000000000000000000000
> OOB Information: 0x0000
> URI Hash: 0x0000
> RSSI: -28 dBm (0xe4)
>
> < HCI Command: LE Set Advertising Data (0x08|0x0008) plen 32
> Length: 24
> Mesh Beacon: 0100c7005d732329eadf000000003e60e50797ef6d5c
> Secure Network Beacon (0x01)
> Flags: 0x01
> Network Id: 00c7005d732329ea
> IV Index: 0xdf000000
> Authentication Value: 003e60e50797ef6d
> ---
> monitor/packet.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
>
> diff --git a/monitor/packet.c b/monitor/packet.c
> index 4ed0faa..51ba7b2 100644
> --- a/monitor/packet.c
> +++ b/monitor/packet.c
> @@ -3513,6 +3513,82 @@ static const struct {
> { }
> };
>
> +static const struct {
> + uint8_t bit;
> + const char *str;
> +} mesh_oob_table[] = {
> + { 0, "Other" },
> + { 1, "Eletronic / URI" },
Electronic.
> + { 2, "2D machine-readable code" },
> + { 3, "Bar code" },
> + { 4, "Near Field Communication (NFC)" },
> + { 5, "Number" },
> + { 6, "String" },
> + { 11, "On box" },
> + { 12, "Inside box" },
> + { 13, "On piece of paper" },
> + { 14, "Inside manual" },
> + { 14, "On Device" },
On device.
> + { }
> +};
> +
> +static void print_mesh_beacon(const uint8_t *data, uint8_t len)
> +{
> + uint16_t oob;
> + int i;
> +
> + if (len < 1)
> + return;
> +
> + switch (data[0]) {
> + case 0x00:
> + print_field(" Unprovisioned Device Beacon (0x00)");
> + if (len < 18) {
> + packet_hexdump(data + 1, len - 1);
> + break;
> + }
> +
> + print_hex_field(" Device UUID", data, 16);
> +
> + oob = get_be16(&data[16]);
> + print_field(" OOB Information: 0x%4.4x", oob);
> +
> + for (i = 0; mesh_oob_table[i].str; i++) {
> + if (oob & (1 << mesh_oob_table[i].bit))
> + print_field(" %s", mesh_oob_table[i].str);
> + }
> +
> + if (len < 22) {
> + packet_hexdump(data + 18, len - 18);
> + break;
> + }
> +
> + print_field(" URI Hash: 0x%4.4x", get_be32(&data[18]));
I would also packet_hexdump here in case there are any leftovers. We want to see if there are eventually malformed packets.
> + break;
> + case 0x01:
> + print_field(" Secure Network Beacon (0x01)");
> + if (len < 21) {
> + packet_hexdump(data + 1, len - 1);
> + break;
> + }
I think that beacons are fixed size.
> +
> + print_field(" Flags: 0x%2.2x", data[0]);
> +
> + if (data[0] & 0x01)
> + print_field(" Key Refresh");
> +
> + if (data[0] & 0x02)
> + print_field(" IV Update");
> +
> + print_hex_field(" Network Id", &data[1], 8);
> + print_field(" IV Index: 0x%08x", get_be32(&data[9]));
> + print_hex_field(" Authentication Value", &data[13], 8);
> + break;
If you want to allow decoding of longer packets, then packet_hexdump at the end.
> + default:
> + packet_hexdump(data, len);
break;
> + }
> +}
> +
> static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
> {
> uint16_t len = 0;
> @@ -3747,6 +3823,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
>
> case BT_EIR_MESH_BEACON:
> print_hex_field("Mesh Beacon", data, data_len);
Why not move that into print_mesh_beacon.
> + print_mesh_beacon(data, data_len);
> break;
>
> case BT_EIR_MANUFACTURER_DATA:
Regards
Marcel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning
2017-07-19 13:09 ` [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning Luiz Augusto von Dentz
@ 2017-07-19 17:49 ` Marcel Holtmann
0 siblings, 0 replies; 7+ messages in thread
From: Marcel Holtmann @ 2017-07-19 17:49 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
> This adds basic decoding for Mesh Provisioning packets such as:
>
> < HCI Command: LE Set Advertising Data (0x08|0x0008) plen 32
> Length: 24
> Mesh Provision: 024874cb0003dddd0000000000000000000000000000
> Link ID: 0x024874cb
> Transaction Number: 0
> Provisioning Bearer Control (0x03)
> Link Open (0x00)
> Device UUID: 03dddd00000000000000000000000000
>
>> HCI Event: LE Meta Event (0x3e) plen 20
> LE Advertising Report (0x02)
> Num reports: 1
> Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
> Address type: Random (0x01)
> Address: 34:11:85:DC:41:39 (Non-Resolvable)
> Data length: 8
> Mesh Provision: 024874cb0007
> Link ID: 0x024874cb
> Transaction Number: 0
> Provisioning Bearer Control (0x03)
> Link Ack (0x01)
> RSSI: -28 dBm (0xe4)
> ---
> monitor/packet.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
>
> diff --git a/monitor/packet.c b/monitor/packet.c
> index 51ba7b2..2df97fa 100644
> --- a/monitor/packet.c
> +++ b/monitor/packet.c
> @@ -3589,6 +3589,82 @@ static void print_mesh_beacon(const uint8_t *data, uint8_t len)
> }
> }
>
> +static void print_mesh_prov(const uint8_t *data, uint8_t len)
> +{
> + if (len < 6)
> + return;
> +
> + print_field(" Link ID: 0x%08x", get_be32(&data[0]));
> + print_field(" Transaction Number: %u", data[4]);
> +
> + data += 5;
> + len -= 5;
> +
> + switch (data[0] & 0x03) {
> + case 0x00:
> + print_field(" Transaction Start (0x00)");
> + if (len < 5) {
> + packet_hexdump(data + 1, len - 1);
> + return;
> + }
> + print_field(" SeqN: %u", data[0] & 0xfc >> 2);
(data[0] & 0xfc) >> 2 for clarity.
> + print_field(" TotalLength: %u", get_be16(&data[1]));
data + 1. The &data[1] syntax is complicated.
> + print_field(" FCS: 0x%2.2x", data[3]);
> + print_hex_field(" Data", &data[4], len - 4);
data + 4
Same comments as the other patch, just packet_hexdump in case of leftovers.
> + break;
> + case 0x01:
> + print_field(" Transaction Acknowledgment (0x01)");
> + break;
> + case 0x02:
> + print_field(" Transaction Continuation (0x02)");
> + print_field(" SegmentIndex: %u", data[0] >> 2);
> + print_hex_field(" Data", &data[1], len - 1);
> + break;
> + case 0x03:
> + print_field(" Provisioning Bearer Control (0x03)");
> + switch (data[0] >> 2) {
> + case 0x00:
> + print_field(" Link Open (0x00)");
> + if (len < 17) {
> + packet_hexdump(data + 1, len - 1);
> + break;
> + }
> + print_hex_field(" Device UUID", data, 16);
> + break;
> + case 0x01:
> + print_field(" Link Ack (0x01)");
> + break;
> + case 0x02:
> + print_field(" Link Close (0x02)");
> + if (len < 2) {
> + packet_hexdump(data + 1, len - 1);
> + break;
> + }
> +
> + switch (data[1]) {
> + case 0x00:
> + print_field(" Reason: Success (0x00)");
> + break;
> + case 0x01:
> + print_field(" Reason: Timeout (0x01)");
> + break;
> + case 0x02:
> + print_field(" Reason: Fail (0x02)");
> + break;
> + default:
> + print_field(" Reason: Unrecognized (0x%2.2x)",
> + data[1]);
> + }
> + break;
> + default:
> + packet_hexdump(data + 1, len - 1);
break;
> + }
> + break;
> + default:
> + packet_hexdump(data, len);
break;
> + }
> +}
> +
> static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
> {
> uint16_t len = 0;
> @@ -3819,6 +3895,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
>
> case BT_EIR_MESH_PROV:
> print_hex_field("Mesh Provisioning", data, data_len);
Move that into print_mesh_prov.
> + print_mesh_prov(data, data_len);
> break;
>
> case BT_EIR_MESH_BEACON:
Regards
Marcel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data
2017-07-19 13:09 ` [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data Luiz Augusto von Dentz
@ 2017-07-19 17:50 ` Marcel Holtmann
0 siblings, 0 replies; 7+ messages in thread
From: Marcel Holtmann @ 2017-07-19 17:50 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hi Luiz,
> This adds basic decoding for Mesh Data packets such as:
>
>> HCI Event: LE Meta Event (0x3e) plen 43
> LE Advertising Report (0x02)
> Num reports: 1
> Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
> Address type: Random (0x01)
> Address: 29:3C:CE:85:C7:3D (Non-Resolvable)
> Data length: 31
> Mesh Data: 37cb3a2bdfca0783b10833cfbdc9e691b0d58b2dada00269181477c901
> IV: 1
> NID: 0x1b
> RSSI: -28 dBm (0xe4)
> ---
> monitor/packet.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/monitor/packet.c b/monitor/packet.c
> index 2df97fa..efb03bb 100644
> --- a/monitor/packet.c
> +++ b/monitor/packet.c
> @@ -3665,6 +3665,15 @@ static void print_mesh_prov(const uint8_t *data, uint8_t len)
> }
> }
>
> +static void print_mesh_data(const uint8_t *data, uint8_t len)
> +{
> + if (len < 1)
> + return;
> +
> + print_field(" IV: %u", data[0] & 0x01);
> + print_field(" NID: 0x%2.2x", data[0] & 0xfe);
> +}
> +
> static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
> {
> uint16_t len = 0;
> @@ -3891,6 +3900,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
>
> case BT_EIR_MESH_DATA:
> print_hex_field("Mesh Data", data, data_len);
Move into print_mesh_data.
> + print_mesh_data(data, data_len);
> break;
Regards
Marcel
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-07-19 17:50 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-19 13:09 [PATCH v2 3/6] monitor: Filter duplicated advertisements Luiz Augusto von Dentz
2017-07-19 13:09 ` [PATCH v2 4/6] monitor: Add basic decoding for Mesh Beacon Luiz Augusto von Dentz
2017-07-19 17:47 ` Marcel Holtmann
2017-07-19 13:09 ` [PATCH v2 5/6] monitor: Add basic decoding for Mesh Provisioning Luiz Augusto von Dentz
2017-07-19 17:49 ` Marcel Holtmann
2017-07-19 13:09 ` [PATCH v2 6/6] monitor: Add basic decoding for Mesh Data Luiz Augusto von Dentz
2017-07-19 17:50 ` Marcel Holtmann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.