---
plugins/hciops.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
src/adapter.c | 25 +++++++++++++++++++++++++
src/adapter.h | 9 +++++++++
3 files changed, 78 insertions(+), 0 deletions(-)
diff --git a/plugins/hciops.c b/plugins/hciops.c
index f1e9f69..faac4ce 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -748,6 +748,48 @@ static int hciops_fast_connectable(int index, gboolean enable)
return err;
}
+static int hciops_read_clock(int index, int handle, int which, int timeout,
+ uint32_t *clock, uint16_t *accuracy)
+{
+ int dd, err = 0;
+
+ dd = hci_open_dev(index);
+ if (dd < 0)
+ return -EIO;
+
+ if (hci_read_clock(dd, handle, which, clock, accuracy, timeout))
+ err = errno;
+
+ hci_close_dev(dd);
+
+ return err;
+}
+
+static int hciops_conn_handle(int index, const bdaddr_t *bdaddr, int *handle)
+{
+ struct hci_conn_info_req *cr;
+ int dd, err = 0;
+
+ dd = hci_open_dev(index);
+ if (dd < 0)
+ return -EIO;
+
+ cr = g_malloc0(sizeof(*cr) + sizeof(struct hci_conn_info));
+ bacpy(&cr->bdaddr, bdaddr);
+ cr->type = ACL_LINK;
+
+ if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr))
+ err = errno;
+
+ if (!err)
+ *handle = htobs(cr->conn_info->handle);
+
+ hci_close_dev(dd);
+ g_free(cr);
+
+ return err;
+}
+
static struct btd_adapter_ops hci_ops = {
.setup = hciops_setup,
.cleanup = hciops_cleanup,
@@ -765,6 +807,8 @@ static struct btd_adapter_ops hci_ops = {
.read_name = hciops_read_name,
.set_class = hciops_set_class,
.set_fast_connectable = hciops_fast_connectable,
+ .read_clock = hciops_read_clock,
+ .get_conn_handle = hciops_conn_handle,
};
static int hciops_init(void)
diff --git a/src/adapter.c b/src/adapter.c
index 670b8bd..9121c20 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3519,3 +3519,28 @@ int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
}
+
+int btd_adapter_read_clock(struct btd_adapter *adapter, int handle, int which,
+ int timeout, uint32_t *clock, uint16_t *accuracy)
+{
+ if (!adapter_ops)
+ return -EINVAL;
+
+ if (!adapter->up)
+ return -EINVAL;
+
+ return adapter_ops->read_clock(adapter->dev_id, handle, which,
+ timeout, clock, accuracy);
+}
+
+int btd_adapter_get_conn_handle(struct btd_adapter *adapter,
+ const bdaddr_t *bdaddr, int *handle)
+{
+ if (!adapter_ops)
+ return -EINVAL;
+
+ if (!adapter->up)
+ return -EINVAL;
+
+ return adapter_ops->get_conn_handle(adapter->dev_id, bdaddr, handle);
+}
diff --git a/src/adapter.h b/src/adapter.h
index fb52b34..5eceaee 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -187,6 +187,9 @@ struct btd_adapter_ops {
int (*read_name) (int index);
int (*set_class) (int index, uint32_t class);
int (*set_fast_connectable) (int index, gboolean enable);
+ int (*read_clock) (int index, int handle, int which, int timeout,
+ uint32_t *clock, uint16_t *accuracy);
+ int (*get_conn_handle) (int index, const bdaddr_t *bdaddr, int *handle);
};
int btd_register_adapter_ops(struct btd_adapter_ops *btd_adapter_ops);
@@ -205,3 +208,9 @@ void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
* type to default values. Valid for both connectable and discoverable modes. */
int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
gboolean enable);
+
+int btd_adapter_read_clock(struct btd_adapter *adapter, int handle, int which,
+ int timeout, uint32_t *clock,
+ uint16_t *accuracy);
+int btd_adapter_get_conn_handle(struct btd_adapter *adapter,
+ const bdaddr_t *bdaddr, int *handle);
--
1.7.0.4
Hi Elvis,
On Tue, Sep 21, 2010, Elvis Pf?tzenreuter wrote:
> ---
> health/mcap_sync.c | 84 +++++++++++++++------------------------------------
> 1 files changed, 25 insertions(+), 59 deletions(-)
Thanks. This one has also been pushed upstream.
Johan
Hi Elvis,
On Tue, Sep 21, 2010, Elvis Pf?tzenreuter wrote:
> ---
> plugins/hciops.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> src/adapter.c | 25 +++++++++++++++++++++++++
> src/adapter.h | 9 +++++++++
> 3 files changed, 78 insertions(+), 0 deletions(-)
Thanks. the patch has been pushed upstream. I also pushed another patch
to cleanup error variable usage in hciops.
Johan
---
health/mcap_sync.c | 84 +++++++++++++++------------------------------------
1 files changed, 25 insertions(+), 59 deletions(-)
diff --git a/health/mcap_sync.c b/health/mcap_sync.c
index 670260b..954a9b8 100644
--- a/health/mcap_sync.c
+++ b/health/mcap_sync.c
@@ -32,8 +32,9 @@
#include <time.h>
#include <stdlib.h>
#include <bluetooth/bluetooth.h>
-#include <bluetooth/hci.h>
-#include <bluetooth/hci_lib.h>
+#include <bluetooth/l2cap.h>
+#include "../src/adapter.h"
+#include "../src/manager.h"
#include <sys/ioctl.h>
#include "config.h"
@@ -60,8 +61,6 @@ struct mcap_csp {
guint ind_timer; /* CSP-Slave: indication timer */
guint set_timer; /* CSP-Slave: delayed set timer */
void *set_data; /* CSP-Slave: delayed set data */
- gint dev_id; /* CSP-Slave: device ID */
- gint dev_hci_fd; /* CSP-Slave fd to read BT clock */
void *csp_priv_data; /* CSP-Master: In-flight request data */
};
@@ -173,8 +172,6 @@ void mcap_sync_init(struct mcap_mcl *mcl)
mcl->csp->rem_req_acc = 10000; /* safe divisor */
mcl->csp->set_data = NULL;
- mcl->csp->dev_id = -1;
- mcl->csp->dev_hci_fd = -1;
mcl->csp->csp_priv_data = NULL;
reset_tmstamp(mcl->csp, NULL, 0);
@@ -185,9 +182,6 @@ void mcap_sync_stop(struct mcap_mcl *mcl)
if (!mcl->csp)
return;
- if (mcl->csp->dev_hci_fd > -1)
- hci_close_dev(mcl->csp->dev_hci_fd);
-
if (mcl->csp->ind_timer)
g_source_remove(mcl->csp->ind_timer);
@@ -200,7 +194,6 @@ void mcap_sync_stop(struct mcap_mcl *mcl)
if (mcl->csp->csp_priv_data)
g_free(mcl->csp->csp_priv_data);
- mcl->csp->dev_hci_fd = -1;
mcl->csp->ind_timer = 0;
mcl->csp->set_timer = 0;
mcl->csp->set_data = NULL;
@@ -247,54 +240,23 @@ static gboolean valid_btclock(uint32_t btclk)
return btclk <= MCAP_BTCLOCK_MAX;
}
-static int mcl_hci_fd(struct mcap_mcl *mcl)
-{
- if (mcl->csp->dev_hci_fd < 0) {
- if (mcl->csp->dev_id < 0)
- mcl->csp->dev_id = hci_get_route(&mcl->addr);
- mcl->csp->dev_hci_fd = hci_open_dev(mcl->csp->dev_id);
- }
- return mcl->csp->dev_hci_fd;
-}
-
-static void mcl_hci_fd_close(struct mcap_mcl *mcl)
-{
- hci_close_dev(mcl->csp->dev_hci_fd);
- mcl->csp->dev_hci_fd = -1;
-}
-
/* This call may fail; either deal with retry or use read_btclock_retry */
static gboolean read_btclock(struct mcap_mcl *mcl, uint32_t *btclock,
uint16_t *btaccuracy)
{
- int fd, ret, handle, which;
- struct hci_conn_info_req *cr;
-
- if (mcl) {
- which = 1;
- fd = mcl_hci_fd(mcl);
-
- cr = g_malloc0(sizeof(*cr) + sizeof(struct hci_conn_info));
- bacpy(&cr->bdaddr, &mcl->addr);
- cr->type = ACL_LINK;
+ int ret, handle, which = 1;
+ struct btd_adapter *adapter;
- ret = ioctl(fd, HCIGETCONNINFO, (unsigned long) cr);
- g_free(cr);
+ adapter = manager_find_adapter(&mcl->ms->src);
- if (ret < 0)
- return FALSE;
- else
- handle = htobs(cr->conn_info->handle);
- } else {
- fd = hci_open_dev(hci_get_route(NULL));
- which = 0;
- handle = 0;
- }
+ if (!adapter)
+ return FALSE;
- ret = hci_read_clock(fd, handle, which, btclock, btaccuracy, 1000);
+ if (btd_adapter_get_conn_handle(adapter, &mcl->addr, &handle))
+ return FALSE;
- if (!mcl)
- hci_close_dev(fd);
+ ret = btd_adapter_read_clock(adapter, handle, which, 1000, btclock,
+ btaccuracy);
return ret < 0 ? FALSE : TRUE;
}
@@ -315,15 +277,19 @@ static gboolean read_btclock_retry(struct mcap_mcl *mcl, uint32_t *btclock,
static gboolean get_btrole(struct mcap_mcl *mcl)
{
- int fd = mcl_hci_fd(mcl);
- struct hci_dev_info di = { dev_id: mcl->csp->dev_id };
+ int sock, flags;
+ socklen_t len;
- if (ioctl(fd, HCIGETDEVINFO, (void *) &di)) {
- mcl_hci_fd_close(mcl);
- return FALSE;
- }
+ if (mcl->cc == NULL)
+ return -1;
+
+ sock = g_io_channel_unix_get_fd(mcl->cc);
+ len = sizeof(flags);
+
+ if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len))
+ DBG("CSP: could not read role");
- return di.link_mode == HCI_LM_MASTER;
+ return flags & L2CAP_LM_MASTER;
}
uint64_t mcap_get_timestamp(struct mcap_mcl *mcl,
--
1.7.0.4