mgmt: Add support for discovering event
diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index 0d6523f..925b5ad 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -525,3 +525,11 @@
 Controller Index	<controller id>
 Event Parameters	Address (6 Octets)
 			Name (249 Octets)
+
+
+Discovering Event
+=================
+
+Event Code		0x00014
+Controller Index	<controller id>
+Event Parameters	Discovering (1 Octet)
diff --git a/lib/mgmt.h b/lib/mgmt.h
index ec3985c..f45321c 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -291,3 +291,5 @@
 	bdaddr_t bdaddr;
 	uint8_t name[MGMT_MAX_NAME_LENGTH];
 } __packed;
+
+#define MGMT_EV_DISCOVERING		0x0014
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index f366c8b..042afc5 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -1316,6 +1316,42 @@
 	btd_event_remote_name(&info->bdaddr, &ev->bdaddr, 0, (char *) ev->name);
 }
 
+static void mgmt_discovering(int sk, uint16_t index, void *buf, size_t len)
+{
+	struct mgmt_mode *ev = buf;
+	struct controller_info *info;
+	struct btd_adapter *adapter;
+	int state;
+
+	if (len < sizeof(*ev)) {
+		error("Too small discovering event");
+		return;
+	}
+
+	DBG("Controller %u discovering %u", index, ev->val);
+
+	if (index > max_index) {
+		error("Unexpected index %u in discovering event", index);
+		return;
+	}
+
+	info = &controllers[index];
+
+	adapter = manager_find_adapter(&info->bdaddr);
+	if (!adapter)
+		return;
+
+	state = adapter_get_state(adapter);
+
+	if (ev->val) {
+		if (!(state & (STATE_STDINQ | STATE_LE_SCAN | STATE_PINQ)))
+			state |= STATE_PINQ;
+	} else
+		state &= ~(STATE_STDINQ | STATE_PINQ);
+
+	adapter_set_state(adapter, state);
+}
+
 static gboolean mgmt_event(GIOChannel *io, GIOCondition cond, gpointer user_data)
 {
 	char buf[MGMT_BUF_SIZE];
@@ -1417,6 +1453,9 @@
 	case MGMT_EV_REMOTE_NAME:
 		mgmt_remote_name(sk, index, buf + MGMT_HDR_SIZE, len);
 		break;
+	case MGMT_EV_DISCOVERING:
+		mgmt_discovering(sk, index, buf + MGMT_HDR_SIZE, len);
+		break;
 	default:
 		error("Unknown Management opcode %u (index %u)", opcode, index);
 		break;