Diff between 38c5dcc9a83c18ad7f6e971b91a34118a7105f7c and 57a43ed48e2603de3951ad3d8310d4062b06ebf3

Changed Files

File Additions Deletions Status
emulator/vhci.c +20 -1 modified

Full Patch

diff --git a/emulator/vhci.c b/emulator/vhci.c
index 1d198e4..d32d5e5 100644
--- a/emulator/vhci.c
+++ b/emulator/vhci.c
@@ -33,6 +33,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+
 #include "monitor/mainloop.h"
 #include "monitor/bt.h"
 #include "btdev.h"
@@ -93,20 +96,27 @@ struct vhci *vhci_open(enum vhci_type type)
 {
 	struct vhci *vhci;
 	enum btdev_type uninitialized_var(btdev_type);
+	unsigned char uninitialized_var(ctrl_type);
+	unsigned char setup_cmd[2];
 	static uint8_t id = 0x23;
 
 	switch (type) {
 	case VHCI_TYPE_BREDRLE:
 		btdev_type = BTDEV_TYPE_BREDRLE;
+		ctrl_type = HCI_BREDR;
 		break;
 	case VHCI_TYPE_BREDR:
 		btdev_type = BTDEV_TYPE_BREDR;
+		ctrl_type = HCI_BREDR;
 		break;
 	case VHCI_TYPE_LE:
 		btdev_type = BTDEV_TYPE_LE;
+		ctrl_type = HCI_BREDR;
 		break;
 	case VHCI_TYPE_AMP:
-		return NULL;
+		btdev_type = BTDEV_TYPE_AMP;
+		ctrl_type = HCI_AMP;
+		break;
 	}
 
 	vhci = malloc(sizeof(*vhci));
@@ -122,6 +132,15 @@ struct vhci *vhci_open(enum vhci_type type)
 		return NULL;
 	}
 
+	setup_cmd[0] = HCI_VENDOR_PKT;
+	setup_cmd[1] = ctrl_type;
+
+	if (write(vhci->fd, setup_cmd, sizeof(setup_cmd)) < 0) {
+		close(vhci->fd);
+		free(vhci);
+		return NULL;
+	}
+
 	vhci->btdev = btdev_create(btdev_type, id++);
 	if (!vhci->btdev) {
 		close(vhci->fd);