Add basic parsing support for management events
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 951c97f..7cad0c3 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -51,11 +51,30 @@
 static int mgmt_sock = -1;
 static guint mgmt_watch = 0;
 
+static void mgmt_cmd_complete(int sk, void *buf, size_t len)
+{
+	DBG("");
+}
+
+static void mgmt_cmd_status(int sk, void *buf, size_t len)
+{
+	DBG("");
+}
+
+static void mgmt_controller_error(int sk, void *buf, size_t len)
+{
+	DBG("");
+}
+
 static gboolean mgmt_event(GIOChannel *io, GIOCondition cond, gpointer user_data)
 {
 	char buf[MGMT_BUF_SIZE];
+	struct hci_mgmt_hdr *hdr = (void *) buf;
 	int sk;
 	ssize_t ret;
+	uint16_t len, opcode;
+
+	DBG("cond %d", cond);
 
 	if (cond & G_IO_NVAL)
 		return FALSE;
@@ -76,6 +95,34 @@
 
 	DBG("Received %zd bytes from management socket", ret);
 
+	if (ret < HCI_MGMT_HDR_SIZE) {
+		error("Too small Management packet");
+		return TRUE;
+	}
+
+	opcode = btohs(bt_get_unaligned(&hdr->opcode));
+	len = btohs(bt_get_unaligned(&hdr->len));
+
+	if (ret != HCI_MGMT_HDR_SIZE + len) {
+		error("Packet length mismatch. ret %zd len %u", ret, len);
+		return TRUE;
+	}
+
+	switch (opcode) {
+	case HCI_MGMT_EV_CMD_COMPLETE:
+		mgmt_cmd_complete(sk, buf, ret);
+		break;
+	case HCI_MGMT_EV_CMD_STATUS:
+		mgmt_cmd_status(sk, buf, ret);
+		break;
+	case HCI_MGMT_EV_CONTROLLER_ERROR:
+		mgmt_controller_error(sk, buf, ret);
+		break;
+	default:
+		error("Unknown Management opcode %u", opcode);
+		break;
+	}
+
 	return TRUE;
 }