linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] Add BT read clock and get conn handle to hciops
@ 2010-09-22  1:22 Elvis Pfützenreuter
  2010-09-22  1:22 ` [PATCH 2/2] Use hciops functions instead of HCI raw sockets Elvis Pfützenreuter
  2010-09-22  7:47 ` [PATCH 1/2] Add BT read clock and get conn handle to hciops Johan Hedberg
  0 siblings, 2 replies; 4+ messages in thread
From: Elvis Pfützenreuter @ 2010-09-22  1:22 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: epx

---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] Use hciops functions instead of HCI raw sockets
  2010-09-22  1:22 [PATCH 1/2] Add BT read clock and get conn handle to hciops Elvis Pfützenreuter
@ 2010-09-22  1:22 ` Elvis Pfützenreuter
  2010-09-22  7:48   ` Johan Hedberg
  2010-09-22  7:47 ` [PATCH 1/2] Add BT read clock and get conn handle to hciops Johan Hedberg
  1 sibling, 1 reply; 4+ messages in thread
From: Elvis Pfützenreuter @ 2010-09-22  1:22 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: epx

---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Add BT read clock and get conn handle to hciops
  2010-09-22  1:22 [PATCH 1/2] Add BT read clock and get conn handle to hciops Elvis Pfützenreuter
  2010-09-22  1:22 ` [PATCH 2/2] Use hciops functions instead of HCI raw sockets Elvis Pfützenreuter
@ 2010-09-22  7:47 ` Johan Hedberg
  1 sibling, 0 replies; 4+ messages in thread
From: Johan Hedberg @ 2010-09-22  7:47 UTC (permalink / raw)
  To: Elvis Pfützenreuter; +Cc: linux-bluetooth

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] Use hciops functions instead of HCI raw sockets
  2010-09-22  1:22 ` [PATCH 2/2] Use hciops functions instead of HCI raw sockets Elvis Pfützenreuter
@ 2010-09-22  7:48   ` Johan Hedberg
  0 siblings, 0 replies; 4+ messages in thread
From: Johan Hedberg @ 2010-09-22  7:48 UTC (permalink / raw)
  To: Elvis Pfützenreuter; +Cc: linux-bluetooth

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-09-22  7:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-22  1:22 [PATCH 1/2] Add BT read clock and get conn handle to hciops Elvis Pfützenreuter
2010-09-22  1:22 ` [PATCH 2/2] Use hciops functions instead of HCI raw sockets Elvis Pfützenreuter
2010-09-22  7:48   ` Johan Hedberg
2010-09-22  7:47 ` [PATCH 1/2] Add BT read clock and get conn handle to hciops Johan Hedberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).