From c2d728f6e8795adb6a5104373e480790829c3523 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 7 Oct 2015 23:44:25 +0200 Subject: [PATCH] monitor: Decode LMP preferred rate indication --- monitor/bt.h | 5 ++++ monitor/lmp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/monitor/bt.h b/monitor/bt.h index 5024e57f0..d06101f0a 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -166,6 +166,11 @@ struct bt_lmp_start_encryption_req { #define BT_LMP_AUTO_RATE 35 +#define BT_LMP_PREFERRED_RATE 36 +struct bt_lmp_preferred_rate { + uint8_t rate; +} __attribute__ ((packed)); + #define BT_LMP_VERSION_REQ 37 struct bt_lmp_version_req { uint8_t version; diff --git a/monitor/lmp.c b/monitor/lmp.c index f85b4d871..bbb7a067b 100644 --- a/monitor/lmp.c +++ b/monitor/lmp.c @@ -172,6 +172,67 @@ static void auto_rate(const void *data, uint8_t size) { } +static void preferred_rate(const void *data, uint8_t size) +{ + const struct bt_lmp_preferred_rate *pdu = data; + const char *str; + + str = (pdu->rate & 0x01) ? "do not use FEC" : "use FEC"; + + print_field("Basic data rate: %s (0x%02x)", str, pdu->rate & 0x01); + + switch ((pdu->rate & 0x06) >> 1) { + case 0: + str = "No packet-size preference available"; + break; + case 1: + str = "use 1-slot packets"; + break; + case 2: + str = "use 3-slot packets"; + break; + case 3: + str = "use 5-slot packets"; + break; + } + + print_field("Basic data rate: %s (0x%02x)", str, pdu->rate & 0x06); + + switch ((pdu->rate & 0x11) >> 3) { + case 0: + str = "use DM1 packets"; + break; + case 1: + str = "use 2 Mb/s packets"; + break; + case 2: + str = "use 3 MB/s packets"; + break; + case 3: + str = "reserved"; + break; + } + + print_field("Enhanced data rate: %s (0x%2.2x)", str, pdu->rate & 0x11); + + switch ((pdu->rate & 0x60) >> 5) { + case 0: + str = "No packet-size preference available"; + break; + case 1: + str = "use 1-slot packets"; + break; + case 2: + str = "use 3-slot packets"; + break; + case 3: + str = "use 5-slot packets"; + break; + } + + print_field("Enhanced data rate: %s (0x%2.2x)", str, pdu->rate & 0x60); +} + static void version_req(const void *data, uint8_t size) { const struct bt_lmp_version_req *pdu = data; @@ -681,7 +742,7 @@ static const struct lmp_data lmp_table[] = { { 33, "LMP_max_power", max_power, 0, true }, { 34, "LMP_min_power", min_power, 0, true }, { 35, "LMP_auto_rate", auto_rate, 0, true }, - { 36, "LMP_preferred_rate" }, + { 36, "LMP_preferred_rate", preferred_rate, 1, true }, { 37, "LMP_version_req", version_req, 5, true }, { 38, "LMP_version_res", version_res, 5, true }, { 39, "LMP_features_req", features_req, 8, true }, -- 2.47.3