Simplify disconnect_addr helper function
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 62c6684..fad723c 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -536,51 +536,52 @@
/* Start of HCI event callbacks */
-static int disconnect_handle(int index, uint16_t handle, uint8_t reason)
+static int get_handle(int index, const bdaddr_t *bdaddr, uint16_t *handle)
{
struct dev_info *dev = &devs[index];
- disconnect_cp cp;
+ struct hci_conn_info_req *cr;
+ char addr[18];
+ int err;
- memset(&cp, 0, sizeof(cp)); cp.handle = htobs(handle);
- cp.reason = reason;
+ ba2str(bdaddr, addr);
+ DBG("hci%d dba %s", index, addr);
- if (hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_DISCONNECT,
- DISCONNECT_CP_SIZE, &cp) < 0)
- return -errno;
+ cr = g_malloc0(sizeof(*cr) + sizeof(struct hci_conn_info));
+ bacpy(&cr->bdaddr, bdaddr);
+ cr->type = ACL_LINK;
- return 0;
+ if (ioctl(dev->sk, HCIGETCONNINFO, (unsigned long) cr) < 0) {
+ err = -errno;
+ goto fail;
+ }
+
+ err = 0;
+ *handle = cr->conn_info->handle;
+
+fail:
+ g_free(cr);
+ return err;
}
static int disconnect_addr(int index, bdaddr_t *dba, uint8_t reason)
{
- struct dev_info *dev = &devs[index];
- struct hci_conn_list_req *cl;
- struct hci_conn_info *ci;
- int i, err;
+ disconnect_cp cp;
+ uint16_t handle;
+ int err;
- cl = g_malloc0(10 * sizeof(*ci) + sizeof(*cl));
+ err = get_handle(index, dba, &handle);
+ if (err < 0)
+ return err;
- cl->dev_id = index;
- cl->conn_num = 10;
- ci = cl->conn_info;
+ memset(&cp, 0, sizeof(cp));
+ cp.handle = htobs(handle);
+ cp.reason = reason;
- if (ioctl(dev->sk, HCIGETCONNLIST, (void *) cl) < 0) {
- err = -errno;
- goto failed;
- }
+ if (hci_send_cmd(devs[index].sk, OGF_LINK_CTL, OCF_DISCONNECT,
+ DISCONNECT_CP_SIZE, &cp) < 0)
+ return -errno;
- err = -ENOENT;
-
- for (i = 0; i < cl->conn_num; i++, ci++) {
- if (bacmp(&ci->bdaddr, dba) == 0) {
- err = disconnect_handle(index, ci->handle, reason);
- break;
- }
- }
-
-failed:
- g_free(cl);
- return err;
+ return 0;
}
static inline int get_bdaddr(int index, uint16_t handle, bdaddr_t *dba)
@@ -613,33 +614,6 @@
return -ENOENT;
}
-static int get_handle(int index, const bdaddr_t *bdaddr, uint16_t *handle)
-{
- struct dev_info *dev = &devs[index];
- struct hci_conn_info_req *cr;
- char addr[18];
- int err;
-
- ba2str(bdaddr, addr);
- DBG("hci%d dba %s", index, addr);
-
- cr = g_malloc0(sizeof(*cr) + sizeof(struct hci_conn_info));
- bacpy(&cr->bdaddr, bdaddr);
- cr->type = ACL_LINK;
-
- if (ioctl(dev->sk, HCIGETCONNINFO, (unsigned long) cr) < 0) {
- err = -errno;
- goto fail;
- }
-
- err = 0;
- *handle = cr->conn_info->handle;
-
-fail:
- g_free(cr);
- return err;
-}
-
/* Link Key handling */
static void link_key_request(int index, bdaddr_t *dba)