Diff between 1479b279a016a515aee4fc7fc79fc7bcb229b4cb and 32d740d87970fa476644aeea267663ea3c74644a

Changed Files

File Additions Deletions Status
monitor/bt.h +14 -0 modified
monitor/ll.c +24 -0 modified
monitor/packet.c +5 -0 modified
monitor/packet.h +1 -0 modified

Full Patch

diff --git a/monitor/bt.h b/monitor/bt.h
index 9ca3e7c..1c753b6 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 34dddcb..4d65d18 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 b4da665..ceed853 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 154a08e..2990b79 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);