summaryrefslogtreecommitdiff
path: root/monitor
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-05-11 15:14:39 +0300
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-07-21 14:31:59 +0300
commitad0cdbc1e9438095f396138026769b4d41db489f (patch)
treeb77407639fe1ef060f8a946ea3577996938e35fd /monitor
parent0ba12681f3e4731308939cc39f7dc1a7d97c9b80 (diff)
downloadbluez-ad0cdbc1e9438095f396138026769b4d41db489f.tar.gz
monitor: Add basic decoding for Mesh Provisioning
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)
Diffstat (limited to 'monitor')
-rw-r--r--monitor/packet.c93
1 files changed, 92 insertions, 1 deletions
diff --git a/monitor/packet.c b/monitor/packet.c
index d766a7a82..d0164009c 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3581,6 +3581,97 @@ static void print_mesh_beacon(const uint8_t *data, uint8_t len)
}
}
+static void print_mesh_prov(const uint8_t *data, uint8_t len)
+{
+ print_hex_field("Mesh Provisioning", data, len);
+
+ if (len < 6) {
+ packet_hexdump(data, len);
+ return;
+ }
+
+ print_field(" Link ID: 0x%08x", get_be32(data));
+ 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);
+ packet_hexdump(data + 5, len - 5);
+ break;
+ case 0x01:
+ print_field(" Transaction Acknowledgment (0x01)");
+ packet_hexdump(data + 1, len - 1);
+ break;
+ case 0x02:
+ print_field(" Transaction Continuation (0x02)");
+ print_field(" SegmentIndex: %u", data[0] >> 2);
+ if (len < 2) {
+ packet_hexdump(data + 1, len - 1);
+ return;
+ }
+ print_hex_field(" Data", data + 1, len - 1);
+ packet_hexdump(data + 2, len - 2);
+ 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]);
+ }
+ packet_hexdump(data + 2, len - 2);
+ break;
+ default:
+ packet_hexdump(data + 1, len - 1);
+ break;
+ }
+ break;
+ default:
+ print_field(" Invalid Command (0x%02x)", data[0]);
+ packet_hexdump(data, len);
+ break;
+ }
+}
+
static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
{
uint16_t len = 0;
@@ -3810,7 +3901,7 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
break;
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: