Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH 5/7] client: Add untrust command
From: Szymon Janc @ 2014-01-08  0:02 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Bastien Nocera, Szymon Janc
In-Reply-To: <1389139348-3552-1-git-send-email-szymon.janc@gmail.com>

---
 client/main.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/client/main.c b/client/main.c
index ebc85c6..a6e7906 100644
--- a/client/main.c
+++ b/client/main.c
@@ -851,6 +851,35 @@ static void cmd_trust(const char *arg)
 	g_free(str);
 }
 
+static void cmd_untrust(const char *arg)
+{
+	GDBusProxy *proxy;
+	dbus_bool_t trusted;
+	char *str;
+
+	if (!arg || !strlen(arg)) {
+		rl_printf("Missing device address argument\n");
+		return;
+	}
+
+	proxy = find_proxy_by_address(dev_list, arg);
+	if (!proxy) {
+		rl_printf("Device %s not available\n", arg);
+		return;
+	}
+
+	trusted = FALSE;
+
+	str = g_strdup_printf("%s untrust", arg);
+
+	if (g_dbus_proxy_set_property_basic(proxy, "Trusted",
+					DBUS_TYPE_BOOLEAN, &trusted,
+					generic_callback, str, g_free) == TRUE)
+		return;
+
+	g_free(str);
+}
+
 static void remove_device_reply(DBusMessage *message, void *user_data)
 {
 	DBusError error;
@@ -1088,6 +1117,8 @@ static const struct {
 							dev_generator },
 	{ "trust",        "<dev>",    cmd_trust, "Trust device",
 							dev_generator },
+	{ "untrust",      "<dev>",    cmd_untrust, "Untrust device",
+							dev_generator },
 	{ "remove",       "<dev>",    cmd_remove, "Remove device",
 							dev_generator },
 	{ "connect",      "<dev>",    cmd_connect, "Connect device",
-- 
1.8.5.2


^ permalink raw reply related

* [PATCH 6/7] client: Add block command
From: Szymon Janc @ 2014-01-08  0:02 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Bastien Nocera, Szymon Janc
In-Reply-To: <1389139348-3552-1-git-send-email-szymon.janc@gmail.com>

---
 client/main.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/client/main.c b/client/main.c
index a6e7906..9f9231a 100644
--- a/client/main.c
+++ b/client/main.c
@@ -880,6 +880,35 @@ static void cmd_untrust(const char *arg)
 	g_free(str);
 }
 
+static void cmd_block(const char *arg)
+{
+	GDBusProxy *proxy;
+	dbus_bool_t blocked;
+	char *str;
+
+	if (!arg || !strlen(arg)) {
+		rl_printf("Missing device address argument\n");
+		return;
+	}
+
+	proxy = find_proxy_by_address(dev_list, arg);
+	if (!proxy) {
+		rl_printf("Device %s not available\n", arg);
+		return;
+	}
+
+	blocked = TRUE;
+
+	str = g_strdup_printf("%s block", arg);
+
+	if (g_dbus_proxy_set_property_basic(proxy, "Blocked",
+					DBUS_TYPE_BOOLEAN, &blocked,
+					generic_callback, str, g_free) == TRUE)
+		return;
+
+	g_free(str);
+}
+
 static void remove_device_reply(DBusMessage *message, void *user_data)
 {
 	DBusError error;
@@ -1119,6 +1148,8 @@ static const struct {
 							dev_generator },
 	{ "untrust",      "<dev>",    cmd_untrust, "Untrust device",
 							dev_generator },
+	{ "block",        "<dev>",    cmd_block, "Block device",
+								dev_generator },
 	{ "remove",       "<dev>",    cmd_remove, "Remove device",
 							dev_generator },
 	{ "connect",      "<dev>",    cmd_connect, "Connect device",
-- 
1.8.5.2


^ permalink raw reply related

* [PATCH 7/7] client: Add unblock command
From: Szymon Janc @ 2014-01-08  0:02 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Bastien Nocera, Szymon Janc
In-Reply-To: <1389139348-3552-1-git-send-email-szymon.janc@gmail.com>

---
 client/main.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/client/main.c b/client/main.c
index 9f9231a..5791e95 100644
--- a/client/main.c
+++ b/client/main.c
@@ -909,6 +909,35 @@ static void cmd_block(const char *arg)
 	g_free(str);
 }
 
+static void cmd_unblock(const char *arg)
+{
+	GDBusProxy *proxy;
+	dbus_bool_t blocked;
+	char *str;
+
+	if (!arg || !strlen(arg)) {
+		rl_printf("Missing device address argument\n");
+		return;
+	}
+
+	proxy = find_proxy_by_address(dev_list, arg);
+	if (!proxy) {
+		rl_printf("Device %s not available\n", arg);
+		return;
+	}
+
+	blocked = FALSE;
+
+	str = g_strdup_printf("%s unblock", arg);
+
+	if (g_dbus_proxy_set_property_basic(proxy, "Blocked",
+					DBUS_TYPE_BOOLEAN, &blocked,
+					generic_callback, str, g_free) == TRUE)
+		return;
+
+	g_free(str);
+}
+
 static void remove_device_reply(DBusMessage *message, void *user_data)
 {
 	DBusError error;
@@ -1150,6 +1179,8 @@ static const struct {
 							dev_generator },
 	{ "block",        "<dev>",    cmd_block, "Block device",
 								dev_generator },
+	{ "unblock",      "<dev>",    cmd_unblock, "Unblock device",
+								dev_generator },
 	{ "remove",       "<dev>",    cmd_remove, "Remove device",
 							dev_generator },
 	{ "connect",      "<dev>",    cmd_connect, "Connect device",
-- 
1.8.5.2


^ permalink raw reply related

* RFCOMM help
From: code jug @ 2014-01-08  7:43 UTC (permalink / raw)
  To: linux-bluetooth

Hi Everyone,

I have a requirement where I have to
1.get data from bluetooth low energy peripheral.
2.send data to bluetooth classic Device. ( by setting up rfcomm server )
3.Use a single dongle to do both ( if possible ) I have IOgear GBU521

The whole setup needs to run on a raspberry pi "without any user
intervention" for pairing etc.

I have the means to get data from the peripheral..

I want to set a default password (like "1234") so that any device can just
connect to it and receive the data via rfcomm.

Pairing always generates a key on my phone, and there is a prompt on the
linux system. I want it to happen with a default password and not by
prompting. something like pairing to a JYMCU from a phone.

please help.

Regards,
cj

^ permalink raw reply

* Re: [PATCH] android-tester: Add HIDHost initial interface setup test
From: Szymon Janc @ 2014-01-08  8:09 UTC (permalink / raw)
  To: Ravi kumar Veeramally; +Cc: linux-bluetooth
In-Reply-To: <1389104291-27210-1-git-send-email-ravikumar.veeramally@linux.intel.com>

Hi Ravi,

> ---
>  android/android-tester.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)

This patch makes android-tester segfaults when running "HIDHost Init" test.

> 
> diff --git a/android/android-tester.c b/android/android-tester.c
> index 9a161ad..e4837c6 100644
> --- a/android/android-tester.c
> +++ b/android/android-tester.c
> @@ -39,6 +39,7 @@
>  #include <hardware/hardware.h>
>  #include <hardware/bluetooth.h>
>  #include <hardware/bt_sock.h>
> +#include <hardware/bt_hh.h>
>  
>  #include "utils.h"
>  
> @@ -79,6 +80,7 @@ struct test_data {
>  	struct hw_device_t *device;
>  	const bt_interface_t *if_bluetooth;
>  	const btsock_interface_t *if_sock;
> +	const bthh_interface_t *if_hid;
>  
>  	bool mgmt_settings_set;
>  	bool cb_count_checked;
> @@ -958,6 +960,16 @@ static bt_callbacks_t bt_callbacks = {
>  	.le_test_mode_cb = NULL
>  };
>  
> +static bthh_callbacks_t bthh_callbacks = {
> +	.size = sizeof(bthh_callbacks),
> +	.connection_state_cb = NULL,
> +	.hid_info_cb = NULL,
> +	.protocol_mode_cb = NULL,
> +	.idle_time_cb = NULL,
> +	.get_report_cb = NULL,
> +	.virtual_unplug_cb = NULL
> +};
> +
>  static void setup(struct test_data *data)
>  {
>  	const hw_module_t *module;
> @@ -1069,6 +1081,11 @@ static void teardown(const void *test_data)
>  		data->if_bluetooth = NULL;
>  	}
>  
> +	if (data->if_hid) {
> +		data->if_hid->cleanup();
> +		data->if_hid = NULL;
> +	}
> +
>  	data->device->close(data->device);
>  
>  	if (data->bluetoothd_pid)
> @@ -1860,6 +1877,32 @@ clean:
>  		close(sock_fd);
>  }
>  
> +static void setup_hidhost_interface(const void *test_data)
> +{
> +	struct test_data *data = tester_get_data();
> +	bt_status_t status;
> +	const void *hid;
> +
> +	setup(data);
> +
> +	status = data->if_hid->init(&bthh_callbacks);
> +	if (status != BT_STATUS_SUCCESS) {
> +		data->if_hid = NULL;
> +		tester_setup_failed();
> +		return;
> +	}
> +
> +	hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
> +	if (!hid) {
> +		tester_setup_failed();
> +		return;
> +	}
> +
> +	data->if_hid = hid;
> +
> +	tester_setup_complete();
> +}
> +
>  #define test_bredrle(name, data, test_setup, test, test_teardown) \
>  	do { \
>  		struct test_data *user; \
> @@ -2071,5 +2114,8 @@ int main(int argc, char *argv[])
>  			setup_socket_interface_enabled,
>  			test_socket_real_connect, teardown);
>  
> +	test_bredrle("HIDHost Init", NULL, setup_hidhost_interface,
> +						test_dummy, teardown);
> +
>  	return tester_run();
>  }
> 

-- 
BR
Szymon Janc


^ permalink raw reply

* Re: [PATCH] android-tester: Add HIDHost initial interface setup test
From: Ravi kumar Veeramally @ 2014-01-08  8:17 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <1816544.qZJOrILi6u@uw000953>

Hi Szymon,

On 01/08/2014 10:09 AM, Szymon Janc wrote:
> Hi Ravi,
>
>> ---
>>   android/android-tester.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 46 insertions(+)
> This patch makes android-tester segfaults when running "HIDHost Init" test.
  When I run output is:
HIDHost Init - init
   Read Index List callback
     Status: 0x00
   New hciemu instance created
   Index Added callback
     Index: 0x0001
   Read Info callback
     Status: 0x00
     Address: 00:AA:01:00:00:00
     Version: 0x06
     Manufacturer: 0x003f
     Supported settings: 0x000002ff
     Current settings: 0x00000080
     Class: 0x000000
     Name:
     Short name:
HIDHost Init - setup

Nothing happened. Let me know what commands and in which sequence it 
occurred ?

Regards,
Ravi.
>
>> diff --git a/android/android-tester.c b/android/android-tester.c
>> index 9a161ad..e4837c6 100644
>> --- a/android/android-tester.c
>> +++ b/android/android-tester.c
>> @@ -39,6 +39,7 @@
>>   #include <hardware/hardware.h>
>>   #include <hardware/bluetooth.h>
>>   #include <hardware/bt_sock.h>
>> +#include <hardware/bt_hh.h>
>>   
>>   #include "utils.h"
>>   
>> @@ -79,6 +80,7 @@ struct test_data {
>>   	struct hw_device_t *device;
>>   	const bt_interface_t *if_bluetooth;
>>   	const btsock_interface_t *if_sock;
>> +	const bthh_interface_t *if_hid;
>>   
>>   	bool mgmt_settings_set;
>>   	bool cb_count_checked;
>> @@ -958,6 +960,16 @@ static bt_callbacks_t bt_callbacks = {
>>   	.le_test_mode_cb = NULL
>>   };
>>   
>> +static bthh_callbacks_t bthh_callbacks = {
>> +	.size = sizeof(bthh_callbacks),
>> +	.connection_state_cb = NULL,
>> +	.hid_info_cb = NULL,
>> +	.protocol_mode_cb = NULL,
>> +	.idle_time_cb = NULL,
>> +	.get_report_cb = NULL,
>> +	.virtual_unplug_cb = NULL
>> +};
>> +
>>   static void setup(struct test_data *data)
>>   {
>>   	const hw_module_t *module;
>> @@ -1069,6 +1081,11 @@ static void teardown(const void *test_data)
>>   		data->if_bluetooth = NULL;
>>   	}
>>   
>> +	if (data->if_hid) {
>> +		data->if_hid->cleanup();
>> +		data->if_hid = NULL;
>> +	}
>> +
>>   	data->device->close(data->device);
>>   
>>   	if (data->bluetoothd_pid)
>> @@ -1860,6 +1877,32 @@ clean:
>>   		close(sock_fd);
>>   }
>>   
>> +static void setup_hidhost_interface(const void *test_data)
>> +{
>> +	struct test_data *data = tester_get_data();
>> +	bt_status_t status;
>> +	const void *hid;
>> +
>> +	setup(data);
>> +
>> +	status = data->if_hid->init(&bthh_callbacks);
>> +	if (status != BT_STATUS_SUCCESS) {
>> +		data->if_hid = NULL;
>> +		tester_setup_failed();
>> +		return;
>> +	}
>> +
>> +	hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
>> +	if (!hid) {
>> +		tester_setup_failed();
>> +		return;
>> +	}
>> +
>> +	data->if_hid = hid;
>> +
>> +	tester_setup_complete();
>> +}
>> +
>>   #define test_bredrle(name, data, test_setup, test, test_teardown) \
>>   	do { \
>>   		struct test_data *user; \
>> @@ -2071,5 +2114,8 @@ int main(int argc, char *argv[])
>>   			setup_socket_interface_enabled,
>>   			test_socket_real_connect, teardown);
>>   
>> +	test_bredrle("HIDHost Init", NULL, setup_hidhost_interface,
>> +						test_dummy, teardown);
>> +
>>   	return tester_run();
>>   }
>>


^ permalink raw reply

* Re: [PATCH] android-tester: Add HIDHost initial interface setup test
From: Szymon Janc @ 2014-01-08  8:26 UTC (permalink / raw)
  To: Ravi kumar Veeramally; +Cc: linux-bluetooth
In-Reply-To: <52CD098D.2090308@linux.intel.com>

Hi Ravi,

> Hi Szymon,
> 
> On 01/08/2014 10:09 AM, Szymon Janc wrote:
> > Hi Ravi,
> >
> >> ---
> >>   android/android-tester.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> >>   1 file changed, 46 insertions(+)
> > This patch makes android-tester segfaults when running "HIDHost Init" test.
>   When I run output is:
> HIDHost Init - init
>    Read Index List callback
>      Status: 0x00
>    New hciemu instance created
>    Index Added callback
>      Index: 0x0001
>    Read Info callback
>      Status: 0x00
>      Address: 00:AA:01:00:00:00
>      Version: 0x06
>      Manufacturer: 0x003f
>      Supported settings: 0x000002ff
>      Current settings: 0x00000080
>      Class: 0x000000
>      Name:
>      Short name:
> HIDHost Init - setup
> 
> Nothing happened. Let me know what commands and in which sequence it 
> occurred ?

This is due to running tester via sudo. Run it from root shell or gdb/valgrind.

> 
> Regards,
> Ravi.
> >
> >> diff --git a/android/android-tester.c b/android/android-tester.c
> >> index 9a161ad..e4837c6 100644
> >> --- a/android/android-tester.c
> >> +++ b/android/android-tester.c
> >> @@ -39,6 +39,7 @@
> >>   #include <hardware/hardware.h>
> >>   #include <hardware/bluetooth.h>
> >>   #include <hardware/bt_sock.h>
> >> +#include <hardware/bt_hh.h>
> >>   
> >>   #include "utils.h"
> >>   
> >> @@ -79,6 +80,7 @@ struct test_data {
> >>   	struct hw_device_t *device;
> >>   	const bt_interface_t *if_bluetooth;
> >>   	const btsock_interface_t *if_sock;
> >> +	const bthh_interface_t *if_hid;
> >>   
> >>   	bool mgmt_settings_set;
> >>   	bool cb_count_checked;
> >> @@ -958,6 +960,16 @@ static bt_callbacks_t bt_callbacks = {
> >>   	.le_test_mode_cb = NULL
> >>   };
> >>   
> >> +static bthh_callbacks_t bthh_callbacks = {
> >> +	.size = sizeof(bthh_callbacks),
> >> +	.connection_state_cb = NULL,
> >> +	.hid_info_cb = NULL,
> >> +	.protocol_mode_cb = NULL,
> >> +	.idle_time_cb = NULL,
> >> +	.get_report_cb = NULL,
> >> +	.virtual_unplug_cb = NULL
> >> +};
> >> +
> >>   static void setup(struct test_data *data)
> >>   {
> >>   	const hw_module_t *module;
> >> @@ -1069,6 +1081,11 @@ static void teardown(const void *test_data)
> >>   		data->if_bluetooth = NULL;
> >>   	}
> >>   
> >> +	if (data->if_hid) {
> >> +		data->if_hid->cleanup();
> >> +		data->if_hid = NULL;
> >> +	}
> >> +
> >>   	data->device->close(data->device);
> >>   
> >>   	if (data->bluetoothd_pid)
> >> @@ -1860,6 +1877,32 @@ clean:
> >>   		close(sock_fd);
> >>   }
> >>   
> >> +static void setup_hidhost_interface(const void *test_data)
> >> +{
> >> +	struct test_data *data = tester_get_data();
> >> +	bt_status_t status;
> >> +	const void *hid;
> >> +
> >> +	setup(data);
> >> +
> >> +	status = data->if_hid->init(&bthh_callbacks);
> >> +	if (status != BT_STATUS_SUCCESS) {
> >> +		data->if_hid = NULL;
> >> +		tester_setup_failed();
> >> +		return;
> >> +	}
> >> +
> >> +	hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
> >> +	if (!hid) {
> >> +		tester_setup_failed();
> >> +		return;
> >> +	}
> >> +
> >> +	data->if_hid = hid;
> >> +
> >> +	tester_setup_complete();
> >> +}
> >> +
> >>   #define test_bredrle(name, data, test_setup, test, test_teardown) \
> >>   	do { \
> >>   		struct test_data *user; \
> >> @@ -2071,5 +2114,8 @@ int main(int argc, char *argv[])
> >>   			setup_socket_interface_enabled,
> >>   			test_socket_real_connect, teardown);
> >>   
> >> +	test_bredrle("HIDHost Init", NULL, setup_hidhost_interface,
> >> +						test_dummy, teardown);
> >> +
> >>   	return tester_run();
> >>   }
> >>
> 

-- 
BR
Szymon Janc


^ permalink raw reply

* Re: [PATCH] android-tester: Add HIDHost initial interface setup test
From: Ravi kumar Veeramally @ 2014-01-08  8:43 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <3983437.QCzj2PTKjz@uw000953>

Hi

On 01/08/2014 10:26 AM, Szymon Janc wrote:
> Hi Ravi,
>
>> Hi Szymon,
>>
>> On 01/08/2014 10:09 AM, Szymon Janc wrote:
>>> Hi Ravi,
>>>
>>>> ---
>>>>    android/android-tester.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>>>>    1 file changed, 46 insertions(+)
>>> This patch makes android-tester segfaults when running "HIDHost Init" test.
>>    When I run output is:
>> HIDHost Init - init
>>     Read Index List callback
>>       Status: 0x00
>>     New hciemu instance created
>>     Index Added callback
>>       Index: 0x0001
>>     Read Info callback
>>       Status: 0x00
>>       Address: 00:AA:01:00:00:00
>>       Version: 0x06
>>       Manufacturer: 0x003f
>>       Supported settings: 0x000002ff
>>       Current settings: 0x00000080
>>       Class: 0x000000
>>       Name:
>>       Short name:
>> HIDHost Init - setup
>>
>> Nothing happened. Let me know what commands and in which sequence it
>> occurred ?
> This is due to running tester via sudo. Run it from root shell or gdb/valgrind.
   Yes, got it. I'll send v2.

  Thanks,
  Ravi.
>
>> Regards,
>> Ravi.
>>>> diff --git a/android/android-tester.c b/android/android-tester.c
>>>> index 9a161ad..e4837c6 100644
>>>> --- a/android/android-tester.c
>>>> +++ b/android/android-tester.c
>>>> @@ -39,6 +39,7 @@
>>>>    #include <hardware/hardware.h>
>>>>    #include <hardware/bluetooth.h>
>>>>    #include <hardware/bt_sock.h>
>>>> +#include <hardware/bt_hh.h>
>>>>    
>>>>    #include "utils.h"
>>>>    
>>>> @@ -79,6 +80,7 @@ struct test_data {
>>>>    	struct hw_device_t *device;
>>>>    	const bt_interface_t *if_bluetooth;
>>>>    	const btsock_interface_t *if_sock;
>>>> +	const bthh_interface_t *if_hid;
>>>>    
>>>>    	bool mgmt_settings_set;
>>>>    	bool cb_count_checked;
>>>> @@ -958,6 +960,16 @@ static bt_callbacks_t bt_callbacks = {
>>>>    	.le_test_mode_cb = NULL
>>>>    };
>>>>    
>>>> +static bthh_callbacks_t bthh_callbacks = {
>>>> +	.size = sizeof(bthh_callbacks),
>>>> +	.connection_state_cb = NULL,
>>>> +	.hid_info_cb = NULL,
>>>> +	.protocol_mode_cb = NULL,
>>>> +	.idle_time_cb = NULL,
>>>> +	.get_report_cb = NULL,
>>>> +	.virtual_unplug_cb = NULL
>>>> +};
>>>> +
>>>>    static void setup(struct test_data *data)
>>>>    {
>>>>    	const hw_module_t *module;
>>>> @@ -1069,6 +1081,11 @@ static void teardown(const void *test_data)
>>>>    		data->if_bluetooth = NULL;
>>>>    	}
>>>>    
>>>> +	if (data->if_hid) {
>>>> +		data->if_hid->cleanup();
>>>> +		data->if_hid = NULL;
>>>> +	}
>>>> +
>>>>    	data->device->close(data->device);
>>>>    
>>>>    	if (data->bluetoothd_pid)
>>>> @@ -1860,6 +1877,32 @@ clean:
>>>>    		close(sock_fd);
>>>>    }
>>>>    
>>>> +static void setup_hidhost_interface(const void *test_data)
>>>> +{
>>>> +	struct test_data *data = tester_get_data();
>>>> +	bt_status_t status;
>>>> +	const void *hid;
>>>> +
>>>> +	setup(data);
>>>> +
>>>> +	status = data->if_hid->init(&bthh_callbacks);
>>>> +	if (status != BT_STATUS_SUCCESS) {
>>>> +		data->if_hid = NULL;
>>>> +		tester_setup_failed();
>>>> +		return;
>>>> +	}
>>>> +
>>>> +	hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
>>>> +	if (!hid) {
>>>> +		tester_setup_failed();
>>>> +		return;
>>>> +	}
>>>> +
>>>> +	data->if_hid = hid;
>>>> +
>>>> +	tester_setup_complete();
>>>> +}
>>>> +
>>>>    #define test_bredrle(name, data, test_setup, test, test_teardown) \
>>>>    	do { \
>>>>    		struct test_data *user; \
>>>> @@ -2071,5 +2114,8 @@ int main(int argc, char *argv[])
>>>>    			setup_socket_interface_enabled,
>>>>    			test_socket_real_connect, teardown);
>>>>    
>>>> +	test_bredrle("HIDHost Init", NULL, setup_hidhost_interface,
>>>> +						test_dummy, teardown);
>>>> +
>>>>    	return tester_run();
>>>>    }
>>>>


^ permalink raw reply

* [PATCH] android/pts: Update PTS results for MAP
From: Jakub Tyszkowski @ 2014-01-08  8:52 UTC (permalink / raw)
  To: linux-bluetooth

Update MAP PTS results for BlueZ stack on Nexus4 (Android 4.4.2).
---
 android/pts-map.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/android/pts-map.txt b/android/pts-map.txt
index 26702af..9850fd4 100644
--- a/android/pts-map.txt
+++ b/android/pts-map.txt
@@ -1,7 +1,7 @@
 PTS test results for MAP
 
 PTS version: 5.0
-Tested: 17.12.2013
+Tested: 07.01.2014
 
 Results:
 PASS	test passed
@@ -70,7 +70,7 @@ TC_MSE_MMB_BV_14_I	PASS
 TC_MSE_MMB_BV_15_I	PASS
 TC_MSE_MMB_BV_16_I	INC	Mailbox MAS instance not available on IUT.
 TC_MSE_MMD_BV_02_I	PASS
-TC_MSE_MMU_BV_02_I	PASS
+TC_MSE_MMU_BV_02_I	INC	Passing randomly. (Reported PTS Issue ID: 11689)
 TC_MSE_MMU_BV_03_I	PASS
 TC_MSE_MMN_BV_02_I	PASS
 TC_MSE_MMN_BV_04_I	N/A
-- 
1.8.5


^ permalink raw reply related

* bluez Low Energy to RFCOMM data streaming and RFCOMM Server Just Works Pairing
From: code jug @ 2014-01-08  8:54 UTC (permalink / raw)
  To: linux-bluetooth

Hi Everyone,

I have a requirement where I have to
1.get data from bluetooth low energy peripheral.
2.send data to bluetooth classic Device. ( by setting up rfcomm server )
3.Use a single dongle to do both ( if possible ) I have IOgear GBU521

The whole setup needs to run on a raspberry pi "without any user
intervention" for pairing etc.

I have the means to get data from the peripheral..

I want to set a default password (like "1234") so that any device can just
connect to it and receive the data via rfcomm.

Pairing always generates a key on my phone, and there is a prompt on the
linux system. I want it to happen with a default password and not by
prompting. something like pairing to a JYMCU from a phone.

please help.

Regards,
cj

^ permalink raw reply

* Re: [PATCH_v3 2/4] android/pan: Listen for incoming connections and accept in NAP role
From: Luiz Augusto von Dentz @ 2014-01-08  9:07 UTC (permalink / raw)
  To: Ravi kumar Veeramally; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <1389097880-14783-3-git-send-email-ravikumar.veeramally@linux.intel.com>

Hi Ravi,

On Tue, Jan 7, 2014 at 2:31 PM, Ravi kumar Veeramally
<ravikumar.veeramally@linux.intel.com> wrote:
> Listen for incoming connections and accept it. Create bnep interface
> add it to bridge and notify control and connection state information
> through HAL. Remove the device on disconnect request. If android
> settings UI does not have bluetooth tethering enabled it immediately
> sends disconnect signal.
> ---
>  android/pan.c | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 190 insertions(+), 2 deletions(-)
>
> diff --git a/android/pan.c b/android/pan.c
> index 93078ba..0eef284 100644
> --- a/android/pan.c
> +++ b/android/pan.c
> @@ -63,12 +63,17 @@ struct pan_device {
>         uint8_t         role;
>         GIOChannel      *io;
>         struct bnep     *session;
> +       guint           watch;
>  };
>
>  static struct {
>         uint32_t        record_id;
> +       guint           watch;
> +       GIOChannel      *io;
>  } nap_dev = {
>         .record_id = 0,
> +       .watch = 0,
> +       .io = NULL,
>  };
>
>  static int device_cmp(gconstpointer s, gconstpointer user_data)
> @@ -81,13 +86,21 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
>
>  static void pan_device_free(struct pan_device *dev)
>  {
> +       if (dev->watch > 0) {
> +               bnep_server_delete(BNEP_BRIDGE, dev->iface, &dev->dst);
> +               g_source_remove(dev->watch);
> +               dev->watch = 0;

Usually it is not necessary to assign anything to struct members when
you are freeing the whole struct since its memory gonna be freed
anyway.

^ permalink raw reply

* Re: [PATCH_v3 1/4] android/pan: Register Network Access Point
From: Szymon Janc @ 2014-01-08  9:18 UTC (permalink / raw)
  To: Ravi kumar Veeramally; +Cc: linux-bluetooth
In-Reply-To: <1389097880-14783-2-git-send-email-ravikumar.veeramally@linux.intel.com>

Hi Ravi,

> Register NAP server and adds bnep bridge. Removes bridge
> on destroy call. Bridge mechanism is needed when device acting
> as a server and listen for incoming connections.
> ---
>  android/pan.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 108 insertions(+), 4 deletions(-)
> 
> diff --git a/android/pan.c b/android/pan.c
> index 38e353d..93078ba 100644
> --- a/android/pan.c
> +++ b/android/pan.c
> @@ -28,6 +28,11 @@
>  #include <unistd.h>
>  #include <fcntl.h>
>  #include <glib.h>
> +#include <sys/ioctl.h>
> +#include <sys/socket.h>
> +#include <sys/wait.h>
> +#include <net/if.h>
> +#include <linux/sockios.h>
>  
>  #include "btio/btio.h"
>  #include "lib/bluetooth.h"
> @@ -45,11 +50,11 @@
>  #include "bluetooth.h"
>  
>  #define SVC_HINT_NETWORKING 0x02
> +#define BNEP_BRIDGE	"bnep"
>  
>  static bdaddr_t adapter_addr;
>  GSList *devices = NULL;
>  uint8_t local_role = HAL_PAN_ROLE_NONE;
> -static uint32_t record_id = 0;
>  
>  struct pan_device {
>  	char		iface[16];
> @@ -60,6 +65,12 @@ struct pan_device {
>  	struct bnep	*session;
>  };
>  
> +static struct {
> +	uint32_t	record_id;
> +} nap_dev = {
> +	.record_id = 0,
> +};
> +
>  static int device_cmp(gconstpointer s, gconstpointer user_data)
>  {
>  	const struct pan_device *dev = s;
> @@ -297,6 +308,91 @@ failed:
>  	ipc_send_rsp(HAL_SERVICE_ID_PAN, HAL_OP_PAN_DISCONNECT, status);
>  }
>  
> +static int set_forward_delay(void)
> +{
> +	int fd, ret;
> +	char path[41];
> +
> +	sprintf(path, "/sys/class/net/%s/bridge/forward_delay", BNEP_BRIDGE);
> +
> +	fd = open(path, O_RDWR);
> +	if (fd < 0)
> +		return -errno;
> +
> +	ret = write(fd, "0", sizeof("0"));
> +	close(fd);
> +
> +	return ret;
> +}
> +
> +static int nap_create_bridge(void)
> +{
> +	int sk, err;
> +
> +	DBG("%s", BNEP_BRIDGE);
> +
> +	sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
> +	if (sk < 0)
> +		return -EOPNOTSUPP;
> +
> +	if (ioctl(sk, SIOCBRADDBR, BNEP_BRIDGE) < 0) {
> +		err = -errno;
> +		if (err != -EEXIST) {
> +			close(sk);
> +			return -EOPNOTSUPP;
> +		}
> +	}
> +
> +	err = set_forward_delay();
> +	if (err < 0)
> +		ioctl(sk, SIOCBRDELBR, BNEP_BRIDGE);
> +
> +	close(sk);
> +
> +	return err;
> +}
> +
> +static int nap_remove_bridge(void)
> +{
> +	int sk, err;
> +
> +	DBG("%s", BNEP_BRIDGE);
> +
> +	sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
> +	if (sk < 0)
> +		return -EOPNOTSUPP;
> +
> +	err = ioctl(sk, SIOCBRDELBR, BNEP_BRIDGE);
> +	close(sk);
> +
> +	if (err < 0)
> +		return -EOPNOTSUPP;
> +
> +	return 0;
> +}
> +
> +static void destroy_nap_device(void)
> +{
> +	DBG("");
> +
> +	nap_remove_bridge();
> +
> +	nap_dev.record_id = 0;
> +}
> +
> +static int register_nap_server(void)
> +{
> +	int err;
> +
> +	DBG("");
> +
> +	err = nap_create_bridge();
> +	if (err < 0)
> +		return err;
> +
> +	return 0;
> +}
> +
>  static void bt_pan_enable(const void *buf, uint16_t len)
>  {
>  	const struct hal_cmd_pan_enable *cmd = buf;
> @@ -441,7 +537,15 @@ bool bt_pan_register(const bdaddr_t *addr)
>  		return false;
>  	}
>  
> -	record_id = rec->handle;
> +	err = register_nap_server();
> +	if (err < 0) {
> +		bt_adapter_remove_record(rec->handle);
> +		sdp_record_free(rec);
> +		bnep_cleanup();
> +		return false;
> +	}
> +
> +	nap_dev.record_id = rec->handle;
>  	ipc_register(HAL_SERVICE_ID_PAN, cmd_handlers,
>  						G_N_ELEMENTS(cmd_handlers));
>  
> @@ -455,6 +559,6 @@ void bt_pan_unregister(void)
>  	bnep_cleanup();
>  
>  	ipc_unregister(HAL_SERVICE_ID_PAN);
> -	bt_adapter_remove_record(record_id);
> -	record_id = 0;
> +	bt_adapter_remove_record(nap_dev.record_id);
> +	destroy_nap_device();

I would either zero nap_dev.record_id right after removing record or move
removing record to destroy_nap_device().

-- 
BR
Szymon Janc


^ permalink raw reply

* [PATCHv3 1/5] tools/rfcomm-tester: Initial version of rfcomm-tester
From: Marcin Kraglak @ 2014-01-08  9:23 UTC (permalink / raw)
  To: linux-bluetooth

Add rfcomm-tester to tree.
---
 .gitignore            |  1 +
 Makefile.tools        |  6 +++++-
 tools/rfcomm-tester.c | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 tools/rfcomm-tester.c

diff --git a/.gitignore b/.gitignore
index 3e0641d..4ac216d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -81,6 +81,7 @@ unit/test-mgmt
 tools/mgmt-tester
 tools/smp-tester
 tools/gap-tester
+tools/rfcomm-tester
 tools/btattach
 tools/btmgmt
 tools/btsnoop
diff --git a/Makefile.tools b/Makefile.tools
index c78cc50..ef17305 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -39,7 +39,7 @@ if EXPERIMENTAL
 noinst_PROGRAMS += emulator/btvirt emulator/b1ee tools/3dsp \
 					tools/mgmt-tester tools/gap-tester \
 					tools/l2cap-tester tools/sco-tester \
-					tools/smp-tester
+					tools/smp-tester tools/rfcomm-tester
 
 emulator_btvirt_SOURCES = emulator/main.c monitor/bt.h \
 					monitor/mainloop.h monitor/mainloop.c \
@@ -76,6 +76,10 @@ tools_l2cap_tester_SOURCES = tools/l2cap-tester.c monitor/bt.h \
 				src/shared/tester.h src/shared/tester.c
 tools_l2cap_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 
+tools_rfcomm_tester_SOURCES = tools/rfcomm-tester.c src/shared/tester.h \
+				src/shared/tester.c
+tools_rfcomm_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+
 tools_smp_tester_SOURCES = tools/smp-tester.c monitor/bt.h \
 				emulator/btdev.h emulator/btdev.c \
 				emulator/bthost.h emulator/bthost.c \
diff --git a/tools/rfcomm-tester.c b/tools/rfcomm-tester.c
new file mode 100644
index 0000000..200d953
--- /dev/null
+++ b/tools/rfcomm-tester.c
@@ -0,0 +1,36 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2014  Intel Corporation. All rights reserved.
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include "src/shared/tester.h"
+
+int main(int argc, char *argv[])
+{
+	tester_init(&argc, &argv);
+
+	return tester_run();
+}
-- 
1.8.3.1


^ permalink raw reply related

* [PATCHv3 2/5] tools/rfcomm-tester: Add basic rfcomm test case
From: Marcin Kraglak @ 2014-01-08  9:23 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1389173030-27970-1-git-send-email-marcin.kraglak@tieto.com>

This test case verifies creating rfcomm socket.
---
 Makefile.tools        |   9 +-
 tools/rfcomm-tester.c | 249 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 256 insertions(+), 2 deletions(-)

diff --git a/Makefile.tools b/Makefile.tools
index ef17305..6f716fd 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -76,8 +76,13 @@ tools_l2cap_tester_SOURCES = tools/l2cap-tester.c monitor/bt.h \
 				src/shared/tester.h src/shared/tester.c
 tools_l2cap_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 
-tools_rfcomm_tester_SOURCES = tools/rfcomm-tester.c src/shared/tester.h \
-				src/shared/tester.c
+tools_rfcomm_tester_SOURCES = tools/rfcomm-tester.c monitor/bt.h \
+				emulator/btdev.h emulator/btdev.c \
+				emulator/bthost.h emulator/bthost.c \
+				src/shared/util.h src/shared/util.c \
+				src/shared/mgmt.h src/shared/mgmt.c \
+				src/shared/hciemu.h src/shared/hciemu.c \
+				src/shared/tester.h src/shared/tester.c
 tools_rfcomm_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 
 tools_smp_tester_SOURCES = tools/smp-tester.c monitor/bt.h \
diff --git a/tools/rfcomm-tester.c b/tools/rfcomm-tester.c
index 200d953..a4f1c8e 100644
--- a/tools/rfcomm-tester.c
+++ b/tools/rfcomm-tester.c
@@ -25,12 +25,261 @@
 #include <config.h>
 #endif
 
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdbool.h>
+
 #include <glib.h>
+
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+
+#include "monitor/bt.h"
+#include "emulator/bthost.h"
+
 #include "src/shared/tester.h"
+#include "src/shared/mgmt.h"
+#include "src/shared/hciemu.h"
+
+struct test_data {
+	struct mgmt *mgmt;
+	uint16_t mgmt_index;
+	struct hciemu *hciemu;
+	enum hciemu_type hciemu_type;
+	const void *test_data;
+};
+
+static void mgmt_debug(const char *str, void *user_data)
+{
+	const char *prefix = user_data;
+
+	tester_print("%s%s", prefix, str);
+}
+
+static void read_info_callback(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+	const struct mgmt_rp_read_info *rp = param;
+	char addr[18];
+	uint16_t manufacturer;
+	uint32_t supported_settings, current_settings;
+
+	tester_print("Read Info callback");
+	tester_print("  Status: 0x%02x", status);
+
+	if (status || !param) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	ba2str(&rp->bdaddr, addr);
+	manufacturer = btohs(rp->manufacturer);
+	supported_settings = btohl(rp->supported_settings);
+	current_settings = btohl(rp->current_settings);
+
+	tester_print("  Address: %s", addr);
+	tester_print("  Version: 0x%02x", rp->version);
+	tester_print("  Manufacturer: 0x%04x", manufacturer);
+	tester_print("  Supported settings: 0x%08x", supported_settings);
+	tester_print("  Current settings: 0x%08x", current_settings);
+	tester_print("  Class: 0x%02x%02x%02x",
+			rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
+	tester_print("  Name: %s", rp->name);
+	tester_print("  Short name: %s", rp->short_name);
+
+	if (strcmp(hciemu_get_address(data->hciemu), addr)) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	tester_pre_setup_complete();
+}
+
+static void index_added_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Index Added callback");
+	tester_print("  Index: 0x%04x", index);
+
+	data->mgmt_index = index;
+
+	mgmt_send(data->mgmt, MGMT_OP_READ_INFO, data->mgmt_index, 0, NULL,
+					read_info_callback, NULL, NULL);
+}
+
+static void index_removed_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Index Removed callback");
+	tester_print("  Index: 0x%04x", index);
+
+	if (index != data->mgmt_index)
+		return;
+
+	mgmt_unregister_index(data->mgmt, data->mgmt_index);
+
+	mgmt_unref(data->mgmt);
+	data->mgmt = NULL;
+
+	tester_post_teardown_complete();
+}
+
+static void read_index_list_callback(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Read Index List callback");
+	tester_print("  Status: 0x%02x", status);
+
+	if (status || !param) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	mgmt_register(data->mgmt, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
+					index_added_callback, NULL, NULL);
+
+	mgmt_register(data->mgmt, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
+					index_removed_callback, NULL, NULL);
+
+	data->hciemu = hciemu_new(data->hciemu_type);
+	if (!data->hciemu) {
+		tester_warn("Failed to setup HCI emulation");
+		tester_pre_setup_failed();
+	}
+
+	tester_print("New hciemu instance created");
+}
+
+static void test_pre_setup(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	data->mgmt = mgmt_new_default();
+	if (!data->mgmt) {
+		tester_warn("Failed to setup management interface");
+		tester_pre_setup_failed();
+		return;
+	}
+
+	if (tester_use_debug())
+		mgmt_set_debug(data->mgmt, mgmt_debug, "mgmt: ", NULL);
+
+	mgmt_send(data->mgmt, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0, NULL,
+					read_index_list_callback, NULL, NULL);
+}
+
+static void test_post_teardown(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	hciemu_unref(data->hciemu);
+	data->hciemu = NULL;
+}
+
+static void test_data_free(void *test_data)
+{
+	struct test_data *data = test_data;
+
+	free(data);
+}
+
+static void client_connectable_complete(uint16_t opcode, uint8_t status,
+					const void *param, uint8_t len,
+					void *user_data)
+{
+	switch (opcode) {
+	case BT_HCI_CMD_WRITE_SCAN_ENABLE:
+		break;
+	default:
+		return;
+	}
+
+	tester_print("Client set connectable status 0x%02x", status);
+
+	if (status)
+		tester_setup_failed();
+	else
+		tester_setup_complete();
+}
+
+static void setup_powered_client_callback(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+	struct bthost *bthost;
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		tester_setup_failed();
+		return;
+	}
+
+	tester_print("Controller powered on");
+
+	bthost = hciemu_client_get_host(data->hciemu);
+	bthost_set_cmd_complete_cb(bthost, client_connectable_complete, data);
+	bthost_write_scan_enable(bthost, 0x03);
+}
+
+static void setup_powered_client(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	unsigned char param[] = { 0x01 };
+
+	tester_print("Powering on controller");
+
+	mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
+				sizeof(param), param, NULL, NULL, NULL);
+
+	mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
+			sizeof(param), param, setup_powered_client_callback,
+			NULL, NULL);
+}
+
+static void test_basic(const void *test_data)
+{
+	int sk;
+
+	sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
+	if (sk < 0) {
+		tester_warn("Can't create socket: %s (%d)", strerror(errno),
+									errno);
+		tester_test_failed();
+		return;
+	}
+
+	close(sk);
+
+	tester_test_passed();
+}
+
+#define test_rfcomm(name, data, setup, func) \
+	do { \
+		struct test_data *user; \
+		user = malloc(sizeof(struct test_data)); \
+		if (!user) \
+			break; \
+		user->hciemu_type = HCIEMU_TYPE_BREDR; \
+		user->test_data = data; \
+		tester_add_full(name, data, \
+				test_pre_setup, setup, func, NULL, \
+				test_post_teardown, 2, user, test_data_free); \
+	} while (0)
 
 int main(int argc, char *argv[])
 {
 	tester_init(&argc, &argv);
 
+	test_rfcomm("Basic RFCOMM Socket - Success", NULL,
+					setup_powered_client, test_basic);
+
 	return tester_run();
 }
-- 
1.8.3.1


^ permalink raw reply related

* [PATCHv3 3/5] monitor: Add rfcomm.h to tree
From: Marcin Kraglak @ 2014-01-08  9:23 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1389173030-27970-1-git-send-email-marcin.kraglak@tieto.com>

Add initial rfcomm structs and defines to rfcomm.h.
---
 monitor/rfcomm.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 monitor/rfcomm.h

diff --git a/monitor/rfcomm.h b/monitor/rfcomm.h
new file mode 100644
index 0000000..8dcb9c1
--- /dev/null
+++ b/monitor/rfcomm.h
@@ -0,0 +1,47 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2014 Intel Corporation
+ *
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#define RFCOMM_SABM	0x2f
+#define RFCOMM_DISC	0x43
+#define RFCOMM_UA	0x63
+#define RFCOMM_DM	0x0f
+#define RFCOMM_UIH	0xef
+
+#define RFCOMM_GET_TYPE(control)	((control) & 0xef)
+#define RFCOMM_GET_DLCI(address)	((address & 0xfc) >> 2)
+#define RFCOMM_GET_CHANNEL(address)	((address & 0xf8) >> 3)
+#define RFCOMM_GET_DIR(address)	((address & 0x04) >> 2)
+#define RFCOMM_TEST_EA(length)	((length & 0x01))
+
+struct rfcomm_hdr {
+	uint8_t address;
+	uint8_t control;
+	uint8_t length;
+} __attribute__((packed));
+
+struct rfcomm_cmd {
+	uint8_t address;
+	uint8_t control;
+	uint8_t length;
+	uint8_t fcs;
+} __attribute__((packed));
-- 
1.8.3.1


^ permalink raw reply related

* [PATCHv3 4/5] emulator/bthost: Add initial rfcomm handling
From: Marcin Kraglak @ 2014-01-08  9:23 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1389173030-27970-1-git-send-email-marcin.kraglak@tieto.com>

This is initial rfcomm handling in bthost.
---
 emulator/bthost.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

diff --git a/emulator/bthost.c b/emulator/bthost.c
index 83bfdee..5e13745 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
@@ -36,6 +36,7 @@
 #include "bluetooth/bluetooth.h"
 
 #include "monitor/bt.h"
+#include "monitor/rfcomm.h"
 #include "bthost.h"
 
 /* ACL handle and flags pack/unpack */
@@ -1173,6 +1174,64 @@ static struct cid_hook *find_cid_hook(struct btconn *conn, uint16_t cid)
 	return NULL;
 }
 
+static void rfcomm_sabm_recv(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+}
+
+static void rfcomm_disc_recv(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+}
+
+static void rfcomm_ua_recv(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+}
+
+static void rfcomm_dm_recv(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+}
+
+static void rfcomm_uih_recv(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+}
+
+static void process_rfcomm(struct bthost *bthost, struct btconn *conn,
+				struct l2conn *l2conn, const void *data,
+				uint16_t len)
+{
+	const struct rfcomm_hdr *hdr = data;
+
+	switch (RFCOMM_GET_TYPE(hdr->control)) {
+	case RFCOMM_SABM:
+		rfcomm_sabm_recv(bthost, conn, l2conn, data, len);
+		break;
+	case RFCOMM_DISC:
+		rfcomm_disc_recv(bthost, conn, l2conn, data, len);
+		break;
+	case RFCOMM_UA:
+		rfcomm_ua_recv(bthost, conn, l2conn, data, len);
+		break;
+	case RFCOMM_DM:
+		rfcomm_dm_recv(bthost, conn, l2conn, data, len);
+		break;
+	case RFCOMM_UIH:
+		rfcomm_uih_recv(bthost, conn, l2conn, data, len);
+		break;
+	default:
+		printf("Unknown frame type\n");
+		break;
+	}
+}
+
 static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
 {
 	const struct bt_hci_acl_hdr *acl_hdr = data;
@@ -1180,6 +1239,7 @@ static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
 	uint16_t handle, cid, acl_len, l2_len;
 	struct cid_hook *hook;
 	struct btconn *conn;
+	struct l2conn *l2conn;
 	const void *l2_data;
 
 	if (len < sizeof(*acl_hdr) + sizeof(*l2_hdr))
@@ -1218,7 +1278,12 @@ static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
 		l2cap_le_sig(bthost, conn, l2_data, l2_len);
 		break;
 	default:
-		printf("Packet for unknown CID 0x%04x (%u)\n", cid, cid);
+		l2conn = btconn_find_l2cap_conn_by_scid(conn, cid);
+		if (l2conn && l2conn->psm == 0x0003)
+			process_rfcomm(bthost, conn, l2conn, l2_data, l2_len);
+		else
+			printf("Packet for unknown CID 0x%04x (%u)\n", cid,
+									cid);
 		break;
 	}
 }
-- 
1.8.3.1


^ permalink raw reply related

* [PATCHv3 5/5] emulator/bthost: Add method to create rfcomm server
From: Marcin Kraglak @ 2014-01-08  9:23 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1389173030-27970-1-git-send-email-marcin.kraglak@tieto.com>

It allows user to create rfcomm server on bthost.
---
 emulator/bthost.c | 32 ++++++++++++++++++++++++++++++++
 emulator/bthost.h |  6 ++++++
 2 files changed, 38 insertions(+)

diff --git a/emulator/bthost.c b/emulator/bthost.c
index 5e13745..8d53923 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
@@ -99,6 +99,13 @@ struct l2cap_conn_cb_data {
 	struct l2cap_conn_cb_data *next;
 };
 
+struct rfcomm_conn_cb_data {
+	uint8_t channel;
+	bthost_rfcomm_connect_cb func;
+	void *user_data;
+	struct rfcomm_conn_cb_data *next;
+};
+
 struct bthost {
 	uint8_t bdaddr[6];
 	bthost_send_func send_handler;
@@ -111,6 +118,7 @@ struct bthost {
 	bthost_new_conn_cb new_conn_cb;
 	void *new_conn_data;
 	struct l2cap_conn_cb_data *new_l2cap_conn_data;
+	struct rfcomm_conn_cb_data *new_rfcomm_conn_data;
 	struct l2cap_pending_req *l2reqs;
 };
 
@@ -246,6 +254,13 @@ void bthost_destroy(struct bthost *bthost)
 		free(cb);
 	}
 
+	while (bthost->new_rfcomm_conn_data) {
+		struct rfcomm_conn_cb_data *cb = bthost->new_rfcomm_conn_data;
+
+		bthost->new_rfcomm_conn_data = cb->next;
+		free(cb);
+	}
+
 	free(bthost);
 }
 
@@ -1392,6 +1407,23 @@ void bthost_add_l2cap_server(struct bthost *bthost, uint16_t psm,
 	bthost->new_l2cap_conn_data = data;
 }
 
+void bthost_add_rfcomm_server(struct bthost *bthost, uint8_t channel,
+				bthost_rfcomm_connect_cb func, void *user_data)
+{
+	struct rfcomm_conn_cb_data *data;
+
+	data = malloc(sizeof(struct rfcomm_conn_cb_data));
+	if (!data)
+		return;
+
+	data->channel = channel;
+	data->user_data = user_data;
+	data->func = func;
+	data->next = bthost->new_rfcomm_conn_data;
+
+	bthost->new_rfcomm_conn_data = data;
+}
+
 void bthost_start(struct bthost *bthost)
 {
 	if (!bthost)
diff --git a/emulator/bthost.h b/emulator/bthost.h
index 97f011b..7186aa0 100644
--- a/emulator/bthost.h
+++ b/emulator/bthost.h
@@ -80,5 +80,11 @@ typedef void (*bthost_l2cap_connect_cb) (uint16_t handle, uint16_t cid,
 void bthost_add_l2cap_server(struct bthost *bthost, uint16_t psm,
 				bthost_l2cap_connect_cb func, void *user_data);
 
+typedef void (*bthost_rfcomm_connect_cb) (uint16_t handle, uint16_t cid,
+					uint8_t channel, void *user_data);
+
+void bthost_add_rfcomm_server(struct bthost *bthost, uint8_t channel,
+			bthost_rfcomm_connect_cb func, void *user_data);
+
 void bthost_start(struct bthost *bthost);
 void bthost_stop(struct bthost *bthost);
-- 
1.8.3.1


^ permalink raw reply related

* Re: [PATCH_v3 3/4] android/pan: Implement PAN enable HAL api at daemon side
From: Szymon Janc @ 2014-01-08  9:24 UTC (permalink / raw)
  To: Ravi kumar Veeramally; +Cc: linux-bluetooth
In-Reply-To: <1389097880-14783-4-git-send-email-ravikumar.veeramally@linux.intel.com>

Hi Ravi,

> ---
>  android/pan.c | 32 ++++++++++++++++++++++++++------
>  1 file changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/android/pan.c b/android/pan.c
> index 0eef284..0e12245 100644
> --- a/android/pan.c
> +++ b/android/pan.c
> @@ -585,18 +585,38 @@ static void bt_pan_enable(const void *buf, uint16_t len)
>  {
>  	const struct hal_cmd_pan_enable *cmd = buf;
>  	uint8_t status;
> +	int err;
> +
> +	DBG("");
> +
> +	if (local_role == cmd->local_role) {
> +		status = HAL_STATUS_SUCCESS;
> +		goto reply;
> +	}
> +
> +	/* destroy existing server */
> +	destroy_nap_device();
>  
>  	switch (cmd->local_role) {
>  	case HAL_PAN_ROLE_PANU:
> -	case HAL_PAN_ROLE_NAP:
> -		DBG("Not Implemented");
> -		status  = HAL_STATUS_FAILED;
> -		break;
> -	default:
>  		status = HAL_STATUS_UNSUPPORTED;
> -		break;
> +		goto reply;
> +	case HAL_PAN_ROLE_NONE:
> +		status = HAL_STATUS_SUCCESS;
> +		goto reply;
> +	}

Why do you remove default here? Daemon should verify parameter correctness.

> +
> +	local_role = cmd->local_role;
> +	err = register_nap_server();
> +	if (err < 0) {
> +		status = HAL_STATUS_FAILED;
> +		destroy_nap_device();
> +		goto reply;
>  	}
>  
> +	status = HAL_STATUS_SUCCESS;
> +
> +reply:
>  	ipc_send_rsp(HAL_SERVICE_ID_PAN, HAL_OP_PAN_ENABLE, status);
>  }
>  
> 

-- 
BR
Szymon Janc



^ permalink raw reply

* Re: [PATCH_v3 1/4] android/pan: Register Network Access Point
From: Ravi kumar Veeramally @ 2014-01-08  9:27 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <1697122.rgbbQeg154@uw000953>

Hi Szymon,

On 01/08/2014 11:18 AM, Szymon Janc wrote:
> Hi Ravi,
>
>> +
>> +	nap_dev.record_id = rec->handle;
>>   	ipc_register(HAL_SERVICE_ID_PAN, cmd_handlers,
>>   						G_N_ELEMENTS(cmd_handlers));
>>   
>> @@ -455,6 +559,6 @@ void bt_pan_unregister(void)
>>   	bnep_cleanup();
>>   
>>   	ipc_unregister(HAL_SERVICE_ID_PAN);
>> -	bt_adapter_remove_record(record_id);
>> -	record_id = 0;
>> +	bt_adapter_remove_record(nap_dev.record_id);
>> +	destroy_nap_device();
> I would either zero nap_dev.record_id right after removing record or move
> removing record to destroy_nap_device().

  OK, I will zero it right after removing record.

  Thanks,
  Ravi.

^ permalink raw reply

* Re: [PATCH_v3 3/4] android/pan: Implement PAN enable HAL api at daemon side
From: Ravi kumar Veeramally @ 2014-01-08  9:29 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth
In-Reply-To: <7986762.b1HJLuCvE7@uw000953>

Hi Szymon,

On 01/08/2014 11:24 AM, Szymon Janc wrote:
> Hi Ravi,
>
>> ---
>>   android/pan.c | 32 ++++++++++++++++++++++++++------
>>   1 file changed, 26 insertions(+), 6 deletions(-)
>>
>> diff --git a/android/pan.c b/android/pan.c
>> index 0eef284..0e12245 100644
>> --- a/android/pan.c
>> +++ b/android/pan.c
>> @@ -585,18 +585,38 @@ static void bt_pan_enable(const void *buf, uint16_t len)
>>   {
>>   	const struct hal_cmd_pan_enable *cmd = buf;
>>   	uint8_t status;
>> +	int err;
>> +
>> +	DBG("");
>> +
>> +	if (local_role == cmd->local_role) {
>> +		status = HAL_STATUS_SUCCESS;
>> +		goto reply;
>> +	}
>> +
>> +	/* destroy existing server */
>> +	destroy_nap_device();
>>   
>>   	switch (cmd->local_role) {
>>   	case HAL_PAN_ROLE_PANU:
>> -	case HAL_PAN_ROLE_NAP:
>> -		DBG("Not Implemented");
>> -		status  = HAL_STATUS_FAILED;
>> -		break;
>> -	default:
>>   		status = HAL_STATUS_UNSUPPORTED;
>> -		break;
>> +		goto reply;
>> +	case HAL_PAN_ROLE_NONE:
>> +		status = HAL_STATUS_SUCCESS;
>> +		goto reply;
>> +	}
> Why do you remove default here? Daemon should verify parameter correctness.

   Yes, default should be there, I think I was still in the impression of
  HAL side parameter validation. I will correct it in next version.

  Thanks,
  Ravi.
>
>> +
>> +	local_role = cmd->local_role;
>> +	err = register_nap_server();
>> +	if (err < 0) {
>> +		status = HAL_STATUS_FAILED;
>> +		destroy_nap_device();
>> +		goto reply;
>>   	}
>>   
>> +	status = HAL_STATUS_SUCCESS;
>> +
>> +reply:
>>   	ipc_send_rsp(HAL_SERVICE_ID_PAN, HAL_OP_PAN_ENABLE, status);
>>   }
>>   
>>


^ permalink raw reply

* Re: [PATCH_v3 2/4] android/pan: Listen for incoming connections and accept in NAP role
From: Ravi kumar Veeramally @ 2014-01-08  9:34 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <CABBYNZJHnUd9z6SRt84=OCXueBru9f5ae_m2SR06ujJzjQidBQ@mail.gmail.com>

Hi Luiz,

On 01/08/2014 11:07 AM, Luiz Augusto von Dentz wrote:
> Hi Ravi,
>
> On Tue, Jan 7, 2014 at 2:31 PM, Ravi kumar Veeramally
> <ravikumar.veeramally@linux.intel.com> wrote:
>> Listen for incoming connections and accept it. Create bnep interface
>> add it to bridge and notify control and connection state information
>> through HAL. Remove the device on disconnect request. If android
>> settings UI does not have bluetooth tethering enabled it immediately
>> sends disconnect signal.
>> ---
>>   android/pan.c | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>   1 file changed, 190 insertions(+), 2 deletions(-)
>>
>> diff --git a/android/pan.c b/android/pan.c
>> index 93078ba..0eef284 100644
>> --- a/android/pan.c
>> +++ b/android/pan.c
>> @@ -63,12 +63,17 @@ struct pan_device {
>>          uint8_t         role;
>>          GIOChannel      *io;
>>          struct bnep     *session;
>> +       guint           watch;
>>   };
>>
>>   static struct {
>>          uint32_t        record_id;
>> +       guint           watch;
>> +       GIOChannel      *io;
>>   } nap_dev = {
>>          .record_id = 0,
>> +       .watch = 0,
>> +       .io = NULL,
>>   };
>>
>>   static int device_cmp(gconstpointer s, gconstpointer user_data)
>> @@ -81,13 +86,21 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
>>
>>   static void pan_device_free(struct pan_device *dev)
>>   {
>> +       if (dev->watch > 0) {
>> +               bnep_server_delete(BNEP_BRIDGE, dev->iface, &dev->dst);
>> +               g_source_remove(dev->watch);
>> +               dev->watch = 0;
> Usually it is not necessary to assign anything to struct members when
> you are freeing the whole struct since its memory gonna be freed
> anyway.

   Yes you are right. Profiles/network/connection.c keeps device data 
after disconnecting,
   it will remove only on device remove call. Assigning zero or NULL 
make sense there.
   But in bluez-android device struct t is removed from list on 
disconnected state.
   Here it won't make much sense. I will remove it in my next version.

  Thanks,
  Ravi.

^ permalink raw reply

* [PATCH] android/pics: Update PICS to PTS 5.0 for GAP
From: Sebastian Chlad @ 2014-01-08  9:46 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Sebastian Chlad

Add new PICS settings for the GAP profile in accordance with PTS 5.0
---
 android/pics-gap.txt | 44 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 37 insertions(+), 7 deletions(-)

diff --git a/android/pics-gap.txt b/android/pics-gap.txt
index e8ab2ab..56a33d5 100644
--- a/android/pics-gap.txt
+++ b/android/pics-gap.txt
@@ -1,5 +1,7 @@
 GAP PICS for the PTS tool.
 
+PTS version: 5.0
+
 * - different than PTS defaults
 # - not yet implemented/supported
 
@@ -668,19 +670,33 @@ TSPC_GAP_41_1	True (#)	Central BR/EDR/LE: Security Aspects (M)
 -------------------------------------------------------------------------------
 
 
+		Central Simultaneous BR/EDR and LE Transports
+-------------------------------------------------------------------------------
+Parameter Name	Selected	Description
+-------------------------------------------------------------------------------
+TSPC_GAP_42_1	False		Simultaneous BR/EDR and LE Transports –	BR/EDR
+					Slave to the same device (C.1)
+TSPC_GAP_42_2	False		Simultaneous BR/EDR and LE Transports – BR/EDR
+					Master to the same device (C.1)
+-------------------------------------------------------------------------------
+C.1: Optional if ((SUM ICS 31/14 (Core Spec Version 4.1) or SUM ICS 31/15
+	(Core Spec Version 4.1+HS)) is supported, otherwise Excluded.
+-------------------------------------------------------------------------------
+
+
 		Peripheral BR/EDR/LE Modes
 -------------------------------------------------------------------------------
 Parameter Name	Selected	Description
 -------------------------------------------------------------------------------
-TSPC_GAP_42_1	False		Peripheral BR/EDR/LE: Non-Discoverable Mode
+TSPC_GAP_43_1	False		Peripheral BR/EDR/LE: Non-Discoverable Mode
 				(C.1)
-TSPC_GAP_42_2	False		Peripheral BR/EDR/LE: Discoverable Mode
+TSPC_GAP_43_2	False		Peripheral BR/EDR/LE: Discoverable Mode
 				(C.2)
-TSPC_GAP_42_3	False		Peripheral BR/EDR/LE: Non-Connectable Mode
+TSPC_GAP_43_3	False		Peripheral BR/EDR/LE: Non-Connectable Mode
 				(C.3)
-TSPC_GAP_42_4	False (*)	Peripheral BR/EDR/LE: Connectable Mode  (M)
-TSPC_GAP_42_5	False		Peripheral BR/EDR/LE: Non-Bondable Mode (C.4)
-TSPC_GAP_42_6	False		Peripheral BR/EDR/LE: Bondable Mode (C.5)
+TSPC_GAP_43_4	False (*)	Peripheral BR/EDR/LE: Connectable Mode  (M)
+TSPC_GAP_43_5	False		Peripheral BR/EDR/LE: Non-Bondable Mode (C.4)
+TSPC_GAP_43_6	False		Peripheral BR/EDR/LE: Bondable Mode (C.5)
 -------------------------------------------------------------------------------
 C.1: Mandatory if TSPC_GAP_1_1 is supported over BR/EDR, otherwise Excluded.
 C.2: Mandatory if (TSPC_GAP_1_2 or TSPC_GAP_1_3) is supported over BR/EDR,
@@ -695,7 +711,21 @@ C.5: Mandatory if TSPC_GAP_1_7 is supported over BR/EDR, otherwise Excluded.
 -------------------------------------------------------------------------------
 Parameter Name	Selected	Description
 -------------------------------------------------------------------------------
-TSPC_GAP_43_1	False (*)	Peripheral BR/EDR/LE: Security Aspects (M)
+TSPC_GAP_44_1	False (*)	Peripheral BR/EDR/LE: Security Aspects (M)
+-------------------------------------------------------------------------------
+
+
+		Peripheral Simultaneous BR/EDR and LE Transports
+-------------------------------------------------------------------------------
+Parameter Name	Selected	Description
+-------------------------------------------------------------------------------
+TSPC_GAP_45_1	False		Simultaneous BR/EDR and LE Transports – BR/EDR
+					Slave to the same device (C.1)
+TSPC_GAP_45_2	False		Simultaneous BR/EDR and LE Transports – BR/EDR
+					Master to the same device (C.1)
+-------------------------------------------------------------------------------
+C.1: Optional if ((SUM ICS 31/14 (Core Spec Version 4.1) or SUM ICS 31/15
+(Core Spec Version 4.1+HS)) is supported, otherwise Excluded.
 -------------------------------------------------------------------------------
 
 
-- 
1.8.3.2


^ permalink raw reply related

* [PATCH] android/pics: Update PICS to PTS 5.0 for DID
From: Sebastian Chlad @ 2014-01-08 10:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Sebastian Chlad

Remove PICS settings which are not applicable in PTS
---
 android/pics-did.txt | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/android/pics-did.txt b/android/pics-did.txt
index 8f92bc1..58cee41 100644
--- a/android/pics-did.txt
+++ b/android/pics-did.txt
@@ -1,21 +1,13 @@
 DID PICS for the PTS tool.
 
+PTS version: 5.0
+
 * - different than PTS defaults
 # - not yet implemented/supported
 
 M - mandatory
 O - optional
 
-		Version
--------------------------------------------------------------------------------
-Parameter Name	Selected	Description
--------------------------------------------------------------------------------
-TSPC_DID_0_1	False		Device ID 1.2 (C.1)
-TSPC_DID_0_2	True		Device ID 1.3 (C.1)
--------------------------------------------------------------------------------
-C.1: It is mandatory to support one of the profile versions.
--------------------------------------------------------------------------------
-
 
 		SDP Requirements
 -------------------------------------------------------------------------------
-- 
1.8.3.2


^ permalink raw reply related

* Re: [PATCH] android: Cleanup Android.mk
From: Szymon Janc @ 2014-01-08 10:19 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1389108453-19758-1-git-send-email-szymon.janc@tieto.com>

On Tuesday 07 of January 2014 16:27:33 Szymon Janc wrote:
> Remove not needed headers file in source list (Android build handles
> this), explicitly mark packages as optional and fix bluetooth.default
> dependencies (it should not depend on haltest as it is optional debug
> package and should not be installed in user build).
> ---
>  android/Android.mk | 30 +++++++-----------------------
>  1 file changed, 7 insertions(+), 23 deletions(-)
> 
> diff --git a/android/Android.mk b/android/Android.mk
> index 27631cc..16339b1 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -25,8 +25,8 @@ LOCAL_SRC_FILES := \
>  	bluetooth.c \
>  	hidhost.c \
>  	socket.c \
> -	ipc.c ipc.h \
> -	audio-ipc.c audio-ipc.h \
> +	ipc.c \
> +	audio-ipc.c \
>  	avdtp.c \
>  	a2dp.c \
>  	pan.c \
> @@ -75,6 +75,8 @@ $(shell mkdir -p $(LOCAL_PATH)/../lib/bluetooth)
>  
>  $(foreach file,$(lib_headers), $(shell ln -sf ../$(file) $(LOCAL_PATH)/../lib/bluetooth/$(file)))
>  
> +LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
> +LOCAL_MODULE_TAGS := optional
>  LOCAL_MODULE := bluetoothd
>  
>  include $(BUILD_EXECUTABLE)
> @@ -107,7 +109,7 @@ LOCAL_MODULE := bluetooth.default
>  LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
>  LOCAL_MODULE_TAGS := optional
>  LOCAL_MODULE_CLASS := SHARED_LIBRARIES
> -LOCAL_REQUIRED_MODULES := haltest bluetoothd
> +LOCAL_REQUIRED_MODULES := bluetoothd bluetoothd-snoop
>  
>  include $(BUILD_SHARED_LIBRARY)
>  
> @@ -146,7 +148,8 @@ LOCAL_CFLAGS := $(BLUEZ_COMMON_CFLAGS)
>  
>  LOCAL_SHARED_LIBRARIES := libhardware
>  
> -LOCAL_MODULE_TAGS := optional
> +LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
> +LOCAL_MODULE_TAGS := debug
>  LOCAL_MODULE := haltest
>  
>  include $(BUILD_EXECUTABLE)
> @@ -159,42 +162,23 @@ include $(CLEAR_VARS)
>  
>  LOCAL_SRC_FILES := \
>  	../monitor/main.c \
> -	../monitor/bt.h \
> -	../monitor/mainloop.h \
>  	../monitor/mainloop.c \
> -	../monitor/display.h \
>  	../monitor/display.c \
> -	../monitor/hcidump.h \
>  	../monitor/hcidump.c \
> -	../monitor/btsnoop.h \
>  	../monitor/btsnoop.c \
> -	../monitor/control.h \
>  	../monitor/control.c \
> -	../monitor/packet.h \
>  	../monitor/packet.c \
> -	../monitor/l2cap.h \
>  	../monitor/l2cap.c \
> -	../monitor/uuid.h \
>  	../monitor/uuid.c \
> -	../monitor/sdp.h \
>  	../monitor/sdp.c \
> -	../monitor/vendor.h \
>  	../monitor/vendor.c \
> -	../monitor/lmp.h \
>  	../monitor/lmp.c \
> -	../monitor/crc.h \
>  	../monitor/crc.c \
> -	../monitor/ll.h \
>  	../monitor/ll.c \
> -	../monitor/hwdb.h \
>  	../monitor/hwdb.c \
> -	../monitor/ellisys.h \
>  	../monitor/ellisys.c \
> -	../monitor/analyze.h \
>  	../monitor/analyze.c \
> -	../src/shared/util.h \
>  	../src/shared/util.c \
> -	../src/shared/queue.h \
>  	../src/shared/queue.c \
>  	../lib/hci.c \
>  	../lib/bluetooth.c \
> 

Pushed upstream.

-- 
BR
Szymon Janc


^ permalink raw reply

* [PATCH_v2] android-tester: Add HIDHost initial interface setup test
From: Ravi kumar Veeramally @ 2014-01-08 11:02 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Ravi kumar Veeramally

---
 android/android-tester.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/android/android-tester.c b/android/android-tester.c
index 9a161ad..cbb827d 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -39,6 +39,7 @@
 #include <hardware/hardware.h>
 #include <hardware/bluetooth.h>
 #include <hardware/bt_sock.h>
+#include <hardware/bt_hh.h>
 
 #include "utils.h"
 
@@ -79,6 +80,7 @@ struct test_data {
 	struct hw_device_t *device;
 	const bt_interface_t *if_bluetooth;
 	const btsock_interface_t *if_sock;
+	const bthh_interface_t *if_hid;
 
 	bool mgmt_settings_set;
 	bool cb_count_checked;
@@ -958,6 +960,16 @@ static bt_callbacks_t bt_callbacks = {
 	.le_test_mode_cb = NULL
 };
 
+static bthh_callbacks_t bthh_callbacks = {
+	.size = sizeof(bthh_callbacks),
+	.connection_state_cb = NULL,
+	.hid_info_cb = NULL,
+	.protocol_mode_cb = NULL,
+	.idle_time_cb = NULL,
+	.get_report_cb = NULL,
+	.virtual_unplug_cb = NULL
+};
+
 static void setup(struct test_data *data)
 {
 	const hw_module_t *module;
@@ -1069,6 +1081,11 @@ static void teardown(const void *test_data)
 		data->if_bluetooth = NULL;
 	}
 
+	if (data->if_hid) {
+		data->if_hid->cleanup();
+		data->if_hid = NULL;
+	}
+
 	data->device->close(data->device);
 
 	if (data->bluetoothd_pid)
@@ -1860,6 +1877,39 @@ clean:
 		close(sock_fd);
 }
 
+static void setup_hidhost_interface(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+	const void *hid;
+
+	setup(data);
+
+	status = data->if_bluetooth->init(&bt_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+		return;
+	}
+
+	hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
+	if (!hid) {
+		tester_setup_failed();
+		return;
+	}
+
+	data->if_hid = hid;
+
+	status = data->if_hid->init(&bthh_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_hid = NULL;
+		tester_setup_failed();
+		return;
+	}
+
+	tester_setup_complete();
+}
+
 #define test_bredrle(name, data, test_setup, test, test_teardown) \
 	do { \
 		struct test_data *user; \
@@ -2071,5 +2121,8 @@ int main(int argc, char *argv[])
 			setup_socket_interface_enabled,
 			test_socket_real_connect, teardown);
 
+	test_bredrle("HIDHost Init", NULL, setup_hidhost_interface,
+						test_dummy, teardown);
+
 	return tester_run();
 }
-- 
1.8.3.2


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox