All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.