diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2017-05-11 15:14:39 +0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2017-07-21 14:31:59 +0300 |
commit | ad0cdbc1e9438095f396138026769b4d41db489f (patch) | |
tree | b77407639fe1ef060f8a946ea3577996938e35fd /monitor | |
parent | 0ba12681f3e4731308939cc39f7dc1a7d97c9b80 (diff) | |
download | bluez-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.c | 93 |
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: |