diff --git a/plugins/hciops.c b/plugins/hciops.c
index 14c973f..dfd00b1 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
#include "manager.h"
#include "oob.h"
+#define DISCOV_HALTED 0
+#define DISCOV_INQ 1
+#define DISCOV_SCAN 2
+
static int child_pipe[2] = { -1, -1 };
static guint child_io_id = 0;
int8_t tx_power;
+ int discov_state;
+
uint32_t current_cod;
uint32_t wanted_cod;
uint32_t pending_cod;
GSList *connections;
} *devs = NULL;
+static inline int get_state(int index)
+{
+ struct dev_info *dev = &devs[index];
+
+ return dev->discov_state;
+}
+
+static void set_state(int index, int state)
+{
+ struct dev_info *dev = &devs[index];
+
+ if (dev->discov_state == state)
+ return;
+
+ dev->discov_state = state;
+
+ DBG("hci%d: new state %d", index, dev->discov_state);
+
+ switch (dev->discov_state) {
+ case DISCOV_HALTED:
+ break;
+ case DISCOV_INQ:
+ break;
+ case DISCOV_SCAN:
+ break;
+ }
+}
+
static int ignore_device(struct hci_dev_info *di)
{
return hci_test_bit(HCI_RAW, &di->flags) || di->type >> 4 != HCI_BREDR;
dev->registered = registered;
dev->already_up = already_up;
dev->io_capability = 0x03; /* No Input No Output */
+ dev->discov_state = DISCOV_HALTED;
return dev;
}
init_adapter(index);
}
+static inline void cs_inquiry_evt(int index, uint8_t status)
+{
+ if (status) {
+ error("Inquiry Failed with status 0x%02x", status);
+ return;
+ }
+
+ set_state(index, DISCOV_INQ);
+}
+
static inline void cmd_status(int index, void *ptr)
{
- struct dev_info *dev = &devs[index];
evt_cmd_status *evt = ptr;
uint16_t opcode = btohs(evt->opcode);
if (opcode == cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY))
- start_inquiry(&dev->bdaddr, evt->status, FALSE);
+ cs_inquiry_evt(index, evt->status);
}
static void read_scan_complete(int index, uint8_t status, void *ptr)
oob_read_local_data_complete(adapter, rp->hash, rp->randomizer);
}
+static inline void inquiry_complete_evt(int index, uint8_t status)
+{
+ if (status) {
+ error("Inquiry Failed with status 0x%02x", status);
+ return;
+ }
+
+ set_state(index, DISCOV_HALTED);
+}
+
+static inline void cc_inquiry_cancel(int index, uint8_t status)
+{
+ if (status) {
+ error("Inquiry Cancel Failed with status 0x%02x", status);
+ return;
+ }
+
+ set_state(index, DISCOV_HALTED);
+}
+
+static inline void cc_le_set_scan_enable(int index, uint8_t status)
+{
+ int state;
+
+ if (status) {
+ error("LE Set Scan Enable Failed with status 0x%02x", status);
+ return;
+ }
+
+ state = get_state(index);
+ if (state == DISCOV_SCAN)
+ set_state(index, DISCOV_HALTED);
+ else
+ set_state(index, DISCOV_SCAN);
+}
+
static inline void cmd_complete(int index, void *ptr)
{
struct dev_info *dev = &devs[index];
inquiry_complete(&dev->bdaddr, status, TRUE);
break;
case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
- inquiry_complete(&dev->bdaddr, status, FALSE);
+ cc_inquiry_cancel(index, status);
break;
case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_LE_HOST_SUPPORTED):
write_le_host_complete(index, status);
break;
case cmd_opcode_pack(OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE):
- btd_event_le_set_scan_enable_complete(&dev->bdaddr, status);
+ cc_le_set_scan_enable(index, status);
break;
case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
if (!status)
case EVT_INQUIRY_COMPLETE:
evt = (evt_cmd_status *) ptr;
- inquiry_complete(&dev->bdaddr, evt->status, FALSE);
+ inquiry_complete_evt(index, evt->status);
break;
case EVT_INQUIRY_RESULT: