Implement support for management powered event
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index 5e87cb6..34421ee 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -173,3 +173,10 @@
Event Code 0x0005
Event Parameters Controller_Index (2 Octets)
+
+Controller Powered Event
+========================
+
+Event Code 0x0006
+Event Parameters Controller_Index (2 Octets)
+ Powered (1 Octet)
diff --git a/lib/mgmt.h b/lib/mgmt.h
index 70cf4b6..46bc73f 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -96,3 +96,9 @@
struct mgmt_ev_index_removed {
uint16_t index;
} __packed;
+
+#define MGMT_EV_POWERED 0x0006
+struct mgmt_ev_powered {
+ uint16_t index;
+ uint8_t powered;
+} __packed;
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 05317b7..a7117fa 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -171,6 +171,28 @@
remove_controller(index);
}
+static void mgmt_powered(int sk, void *buf, size_t len)
+{
+ struct mgmt_ev_powered *ev = buf;
+ uint16_t index;
+
+ if (len < sizeof(*ev)) {
+ error("Too small powered event");
+ return;
+ }
+
+ index = btohs(bt_get_unaligned(&ev->index));
+
+ if (index > max_index) {
+ DBG("Ignoring powered event for unknown controller %u", index);
+ return;
+ }
+
+ controllers[index].enabled = ev->powered;
+
+ DBG("Controller %u powered %s", index, ev->powered ? "on" : "off");
+}
+
static void read_index_list_complete(int sk, void *buf, size_t len)
{
struct mgmt_rp_read_index_list *rp = buf;
@@ -364,6 +386,9 @@
case MGMT_EV_INDEX_REMOVED:
mgmt_index_removed(sk, buf + MGMT_HDR_SIZE, len);
break;
+ case MGMT_EV_POWERED:
+ mgmt_powered(sk, buf + MGMT_HDR_SIZE, len);
+ break;
default:
error("Unknown Management opcode %u", opcode);
break;