From 32d740d87970fa476644aeea267663ea3c74644a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 30 Oct 2025 14:59:22 -0400 Subject: [PATCH] monitor: Add decoding support for LL_FEATURE_EXT_{REQ,RSP} This adds support for LL_FEATURE_EXT_{REQ,RSP} which is used to exchange LL Features. --- monitor/bt.h | 14 ++++++++++++++ monitor/ll.c | 24 ++++++++++++++++++++++++ monitor/packet.c | 5 +++++ monitor/packet.h | 1 + 4 files changed, 44 insertions(+) diff --git a/monitor/bt.h b/monitor/bt.h index 9ca3e7c88..1c753b694 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -239,6 +239,20 @@ struct bt_ll_cis_term_ind { uint8_t reason; } __attribute__ ((packed)); +#define BT_LL_FEATURE_EXT_REQ 0x2b +struct bt_ll_feature_ext_req { + uint8_t max_page; + uint8_t page; + uint8_t features[24]; +} __attribute__ ((packed)); + +#define BT_LL_FEATURE_EXT_RSP 0x2c +struct bt_ll_feature_ext_rsp { + uint8_t max_page; + uint8_t page; + uint8_t features[24]; +} __attribute__ ((packed)); + #define LMP_ESC4(x) ((127 << 8) | (x)) #define BT_LMP_NAME_REQ 1 diff --git a/monitor/ll.c b/monitor/ll.c index 34dddcb0b..4d65d183f 100644 --- a/monitor/ll.c +++ b/monitor/ll.c @@ -741,6 +741,24 @@ static void cis_term_ind(const void *data, uint8_t size) packet_print_error("Reason", ind->reason); } +static void feature_ext_req(const void *data, uint8_t size) +{ + const struct bt_ll_feature_ext_req *req = data; + + print_field("Max page: %u", req->max_page); + print_field("Page: %u", req->page); + packet_print_features_ext_ll(req->page, req->features); +} + +static void feature_ext_rsp(const void *data, uint8_t size) +{ + const struct bt_ll_feature_ext_req *rsp = data; + + print_field("Max page: %u", rsp->max_page); + print_field("Page: %u", rsp->page); + packet_print_features_ext_ll(rsp->page, rsp->features); +} + struct llcp_data { uint8_t opcode; const char *str; @@ -790,6 +808,12 @@ static const struct llcp_data llcp_table[] = { { BT_LL_CIS_TERMINATE_IND, "LL_CIS_TERMINATE_IND", cis_term_ind, sizeof(struct bt_ll_cis_term_ind), true }, + { BT_LL_FEATURE_REQ, "LL_FEATURE_EXT_REQ", feature_ext_req, + sizeof(struct bt_ll_feature_ext_req), + true }, + { BT_LL_CIS_RSP, "LL_FEATURE_EXT_RSP", feature_ext_rsp, + sizeof(struct bt_ll_feature_ext_rsp), + true }, { } }; diff --git a/monitor/packet.c b/monitor/packet.c index b4da6653f..ceed85318 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -2918,6 +2918,11 @@ void packet_print_features_ll(const uint8_t *features) print_features(0, features, 0x01); } +void packet_print_features_ext_ll(uint8_t page, const uint8_t *features) +{ + print_features(page, features, 0x01); +} + void packet_print_features_msft(const uint8_t *features) { print_features(0, features, 0xf0); diff --git a/monitor/packet.h b/monitor/packet.h index 154a08efa..2990b795b 100644 --- a/monitor/packet.h +++ b/monitor/packet.h @@ -78,6 +78,7 @@ void packet_print_rssi(const char *label, int8_t rssi); void packet_print_ad(const void *data, uint8_t size); void packet_print_features_lmp(const uint8_t *features, uint8_t page); void packet_print_features_ll(const uint8_t *features); +void packet_print_features_ext_ll(uint8_t page, const uint8_t *features); void packet_print_features_msft(const uint8_t *features); void packet_print_channel_map_lmp(const uint8_t *map); void packet_print_channel_map_ll(const uint8_t *map); -- 2.47.3