* [PATCHv8 01/15] android/socket: Parse SDP response and connect
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 02/15] android/socket: Implement HAL connect call Andrei Emeltchenko
` (13 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Parse SDP response, find RFCOMM channel and connect.
---
android/socket.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index 1815367..cd958d9 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -424,9 +424,77 @@ static int handle_listen(void *buf)
return hal_fd;
}
+static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
+{
+}
+
static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
{
+ struct rfcomm_sock *rfsock = data;
+ GError *gerr = NULL;
+ sdp_list_t *list;
+ GIOChannel *io;
+ int chan;
+
DBG("");
+
+ if (err < 0) {
+ error("Unable to get SDP record: %s", strerror(-err));
+ goto fail;
+ }
+
+ if (!recs || !recs->data) {
+ error("No SDP records found");
+ goto fail;
+ }
+
+ for (list = recs; list != NULL; list = list->next) {
+ sdp_record_t *rec = list->data;
+ sdp_list_t *protos;
+
+ if (sdp_get_access_protos(rec, &protos) < 0) {
+ error("Unable to get proto list");
+ goto fail;
+ }
+
+ chan = sdp_get_proto_port(protos, RFCOMM_UUID);
+
+ sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free,
+ NULL);
+ sdp_list_free(protos, NULL);
+
+ if (chan)
+ break;
+ }
+
+ if (chan <= 0) {
+ error("Could not get RFCOMM channel %d", chan);
+ goto fail;
+ }
+
+ DBG("Got RFCOMM channel %d", chan);
+
+ io = bt_io_connect(connect_cb, rfsock, NULL, &gerr,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_DEST_BDADDR, &rfsock->dst,
+ BT_IO_OPT_CHANNEL, chan,
+ BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
+ BT_IO_OPT_INVALID);
+ if (!io) {
+ error("Failed connect: %s", gerr->message);
+ g_error_free(gerr);
+ goto fail;
+ }
+
+ rfsock->real_sock = g_io_channel_unix_get_fd(io);
+ rfsock->channel = chan;
+ connections = g_list_append(connections, rfsock);
+
+ g_io_channel_unref(io);
+
+ return;
+fail:
+ cleanup_rfsock(rfsock);
}
static int handle_connect(void *buf)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 02/15] android/socket: Implement HAL connect call
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 01/15] android/socket: Parse SDP response and connect Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 03/15] android/socket: Send RFCOMM channel to framework Andrei Emeltchenko
` (12 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
HAL connect uses similar event handlers like listen call.
---
android/socket.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index cd958d9..00231a3 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -426,6 +426,42 @@ static int handle_listen(void *buf)
static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
{
+ struct rfcomm_sock *rfsock = user_data;
+ bdaddr_t *dst = &rfsock->dst;
+ GIOChannel *io_stack;
+ char address[18];
+ guint id;
+ GIOCondition cond;
+
+ if (err) {
+ error("%s", err->message);
+ goto fail;
+ }
+
+ ba2str(dst, address);
+ DBG("Connected to %s", address);
+
+ DBG("rfsock: fd %d real_sock %d chan %u sock %d",
+ rfsock->fd, rfsock->real_sock, rfsock->channel,
+ g_io_channel_unix_get_fd(io));
+
+ /* Handle events from Android */
+ cond = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL;
+ io_stack = g_io_channel_unix_new(rfsock->fd);
+ id = g_io_add_watch(io_stack, cond, sock_stack_event_cb, rfsock);
+ g_io_channel_unref(io_stack);
+
+ rfsock->stack_watch = id;
+
+ /* Handle rfcomm events */
+ cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
+ id = g_io_add_watch(io, cond, sock_rfcomm_event_cb, rfsock);
+
+ rfsock->rfcomm_watch = id;
+
+ return;
+fail:
+ cleanup_rfsock(rfsock);
}
static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 03/15] android/socket: Send RFCOMM channel to framework
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 01/15] android/socket: Parse SDP response and connect Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 02/15] android/socket: Implement HAL connect call Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 04/15] android/socket: Send connect signal to Android framework Andrei Emeltchenko
` (11 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Framework expects channel to be send.
---
android/socket.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index 00231a3..4722cf8 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -522,6 +522,11 @@ static void sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
goto fail;
}
+ if (write(rfsock->fd, &chan, sizeof(chan)) != sizeof(chan)) {
+ error("Error sending RFCOMM channel");
+ goto fail;
+ }
+
rfsock->real_sock = g_io_channel_unix_get_fd(io);
rfsock->channel = chan;
connections = g_list_append(connections, rfsock);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 04/15] android/socket: Send connect signal to Android framework
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (2 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 03/15] android/socket: Send RFCOMM channel to framework Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 05/15] android/socket: Close file descriptor after sending Andrei Emeltchenko
` (10 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Android framework expects connect signal to be sent when
remote device is connected.
---
android/socket.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index 4722cf8..f9a6587 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -424,6 +424,33 @@ static int handle_listen(void *buf)
return hal_fd;
}
+static bool sock_send_connect(struct rfcomm_sock *rfsock, bdaddr_t *bdaddr)
+{
+ struct hal_sock_connect_signal cmd;
+ int len;
+
+ DBG("");
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.size = sizeof(cmd);
+ bdaddr2android(bdaddr, cmd.bdaddr);
+ cmd.channel = rfsock->channel;
+ cmd.status = 0;
+
+ len = write(rfsock->fd, &cmd, sizeof(cmd));
+ if (len < 0) {
+ error("%s", strerror(errno));
+ return false;
+ }
+
+ if (len != sizeof(cmd)) {
+ error("Error sending connect signal");
+ return false;
+ }
+
+ return true;
+}
+
static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
{
struct rfcomm_sock *rfsock = user_data;
@@ -445,6 +472,9 @@ static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
rfsock->fd, rfsock->real_sock, rfsock->channel,
g_io_channel_unix_get_fd(io));
+ if (!sock_send_connect(rfsock, dst))
+ goto fail;
+
/* Handle events from Android */
cond = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL;
io_stack = g_io_channel_unix_new(rfsock->fd);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 05/15] android/socket: Close file descriptor after sending
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (3 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 04/15] android/socket: Send connect signal to Android framework Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 06/15] android/socket: Add general service create/remove function Andrei Emeltchenko
` (9 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/socket.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index f9a6587..9f8c535 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -607,6 +607,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
ipc_send(sk, HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
+ close(fd);
return;
case HAL_OP_SOCK_CONNECT:
fd = handle_connect(buf);
@@ -614,6 +615,7 @@ void bt_sock_handle_cmd(int sk, uint8_t opcode, void *buf, uint16_t len)
break;
ipc_send(sk, HAL_SERVICE_ID_SOCK, opcode, 0, NULL, fd);
+ close(fd);
return;
default:
DBG("Unhandled command, opcode 0x%x", opcode);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 06/15] android/socket: Add general service create/remove function
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (4 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 05/15] android/socket: Close file descriptor after sending Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 07/15] android/socket: Add OPP SDP record Andrei Emeltchenko
` (8 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
create_record function from profile is used to create SDP service record.
The record is removed from rfsock cleanup function.
---
android/socket.c | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/android/socket.c b/android/socket.c
index 9f8c535..71dcf4a 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -35,7 +35,9 @@
#include "lib/sdp.h"
#include "lib/sdp_lib.h"
#include "src/sdp-client.h"
+#include "src/sdpd.h"
+#include "bluetooth.h"
#include "log.h"
#include "hal-msg.h"
#include "hal-ipc.h"
@@ -63,6 +65,7 @@ struct rfcomm_sock {
guint stack_watch;
bdaddr_t dst;
+ uint32_t service_handle;
};
static struct rfcomm_sock *create_rfsock(int sock, int *hal_fd)
@@ -102,6 +105,9 @@ static void cleanup_rfsock(struct rfcomm_sock *rfsock)
if (!g_source_remove(rfsock->stack_watch))
error("stack_watch source was not found");
+ if (rfsock->service_handle)
+ bt_adapter_remove_record(rfsock->service_handle);
+
g_free(rfsock);
}
@@ -110,7 +116,7 @@ static struct profile_info {
uint8_t channel;
uint8_t svc_hint;
BtIOSecLevel sec_level;
- sdp_record_t * (*create_record)(uint8_t chan);
+ sdp_record_t * (*create_record)(uint8_t chan, const char *svc_name);
} profiles[] = {
{
.uuid = {
@@ -127,6 +133,24 @@ static struct profile_info {
}
};
+static uint32_t sdp_service_register(struct profile_info *profile,
+ const void *svc_name)
+{
+ sdp_record_t *record;
+
+ record = profile->create_record(profile->channel, svc_name);
+ if (!record)
+ return 0;
+
+ if (bt_adapter_add_record(record, profile->svc_hint) < 0) {
+ error("Failed to register on SDP record");
+ sdp_record_free(record);
+ return 0;
+ }
+
+ return record->handle;
+}
+
static int bt_sock_send_fd(int sock_fd, const void *buf, int len, int send_fd)
{
ssize_t ret;
@@ -388,7 +412,7 @@ static int handle_listen(void *buf)
chan = profile->channel;
- DBG("rfcomm channel %d", chan);
+ DBG("rfcomm channel %d svc_name %s", chan, cmd->name);
rfsock = create_rfsock(-1, &hal_fd);
if (!rfsock)
@@ -421,6 +445,8 @@ static int handle_listen(void *buf)
return -1;
}
+ rfsock->service_handle = sdp_service_register(profile, cmd->name);
+
return hal_fd;
}
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 07/15] android/socket: Add OPP SDP record
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (5 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 06/15] android/socket: Add general service create/remove function Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 08/15] android/socket: Add MAS uuid to profile table Andrei Emeltchenko
` (7 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This adds SDP record for OPP shown below:
Service Name: OBEX Object Push
Service RecHandle: 0x10002
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"RFCOMM" (0x0003)
Channel: 9
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100
---
android/socket.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 81 insertions(+), 1 deletion(-)
diff --git a/android/socket.c b/android/socket.c
index 71dcf4a..a15268d 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -48,6 +48,8 @@
#define OPP_DEFAULT_CHANNEL 9
#define PBAP_DEFAULT_CHANNEL 15
+#define SVC_HINT_OBEX 0x10
+
static bdaddr_t adapter_addr;
/* Simple list of RFCOMM server sockets */
@@ -111,6 +113,82 @@ static void cleanup_rfsock(struct rfcomm_sock *rfsock)
g_free(rfsock);
}
+static sdp_record_t *create_opp_record(uint8_t chan, const char *svc_name)
+{
+ const char *service_name = "OBEX Object Push";
+ sdp_list_t *svclass_id, *pfseq, *apseq, *root;
+ uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
+ sdp_profile_desc_t profile[1];
+ sdp_list_t *aproto, *proto[3];
+ uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
+ void *dtds[sizeof(formats)], *values[sizeof(formats)];
+ unsigned int i;
+ uint8_t dtd = SDP_UINT8;
+ sdp_data_t *sflist;
+ sdp_data_t *channel;
+ sdp_record_t *record;
+
+ record = sdp_record_alloc();
+ if (!record)
+ return NULL;
+
+ record->handle = sdp_next_handle();
+
+ sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
+ root = sdp_list_append(NULL, &root_uuid);
+ sdp_set_browse_groups(record, root);
+
+ sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID);
+ svclass_id = sdp_list_append(NULL, &opush_uuid);
+ sdp_set_service_classes(record, svclass_id);
+
+ sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID);
+ profile[0].version = 0x0100;
+ pfseq = sdp_list_append(NULL, profile);
+ sdp_set_profile_descs(record, pfseq);
+
+ sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
+ proto[0] = sdp_list_append(NULL, &l2cap_uuid);
+ apseq = sdp_list_append(NULL, proto[0]);
+
+ sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
+ proto[1] = sdp_list_append(NULL, &rfcomm_uuid);
+ channel = sdp_data_alloc(SDP_UINT8, &chan);
+ proto[1] = sdp_list_append(proto[1], channel);
+ apseq = sdp_list_append(apseq, proto[1]);
+
+ sdp_uuid16_create(&obex_uuid, OBEX_UUID);
+ proto[2] = sdp_list_append(NULL, &obex_uuid);
+ apseq = sdp_list_append(apseq, proto[2]);
+
+ aproto = sdp_list_append(NULL, apseq);
+ sdp_set_access_protos(record, aproto);
+
+ for (i = 0; i < sizeof(formats); i++) {
+ dtds[i] = &dtd;
+ values[i] = &formats[i];
+ }
+ sflist = sdp_seq_alloc(dtds, values, sizeof(formats));
+ sdp_attr_add(record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist);
+
+ if (svc_name)
+ service_name = svc_name;
+
+ sdp_set_info_attr(record, service_name, NULL, NULL);
+
+ sdp_data_free(channel);
+ sdp_list_free(proto[0], NULL);
+ sdp_list_free(proto[1], NULL);
+ sdp_list_free(proto[2], NULL);
+ sdp_list_free(apseq, NULL);
+ sdp_list_free(pfseq, NULL);
+ sdp_list_free(aproto, NULL);
+ sdp_list_free(root, NULL);
+ sdp_list_free(svclass_id, NULL);
+
+ return record;
+}
+
static struct profile_info {
uint8_t uuid[16];
uint8_t channel;
@@ -129,7 +207,9 @@ static struct profile_info {
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
},
- .channel = OPP_DEFAULT_CHANNEL
+ .channel = OPP_DEFAULT_CHANNEL,
+ .svc_hint = SVC_HINT_OBEX,
+ .create_record = create_opp_record
}
};
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 08/15] android/socket: Add MAS uuid to profile table
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (6 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 07/15] android/socket: Add OPP SDP record Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 09/15] android/socket: Add SPP " Andrei Emeltchenko
` (6 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/socket.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/android/socket.c b/android/socket.c
index a15268d..5f2af48 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -47,6 +47,7 @@
#define OPP_DEFAULT_CHANNEL 9
#define PBAP_DEFAULT_CHANNEL 15
+#define MAS_DEFAULT_CHANNEL 16
#define SVC_HINT_OBEX 0x10
@@ -210,6 +211,12 @@ static struct profile_info {
.channel = OPP_DEFAULT_CHANNEL,
.svc_hint = SVC_HINT_OBEX,
.create_record = create_opp_record
+ }, {
+ .uuid = {
+ 0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
+ },
+ .channel = MAS_DEFAULT_CHANNEL
}
};
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 09/15] android/socket: Add SPP uuid to profile table
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (7 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 08/15] android/socket: Add MAS uuid to profile table Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 10/15] android/socket: Add PBAP SDP record Andrei Emeltchenko
` (5 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/socket.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/android/socket.c b/android/socket.c
index 5f2af48..94add6f 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -45,6 +45,7 @@
#include "utils.h"
#include "socket.h"
+#define SPP_DEFAULT_CHANNEL 3
#define OPP_DEFAULT_CHANNEL 9
#define PBAP_DEFAULT_CHANNEL 15
#define MAS_DEFAULT_CHANNEL 16
@@ -217,7 +218,13 @@ static struct profile_info {
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
},
.channel = MAS_DEFAULT_CHANNEL
- }
+ }, {
+ .uuid = {
+ 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
+ },
+ .channel = SPP_DEFAULT_CHANNEL
+ },
};
static uint32_t sdp_service_register(struct profile_info *profile,
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 10/15] android/socket: Add PBAP SDP record
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (8 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 09/15] android/socket: Add SPP " Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 11/15] android/socket: Add SPP " Andrei Emeltchenko
` (4 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This adds SDP service record like shown below:
Service Name: OBEX Phonebook Access Server
Service RecHandle: 0x10002
Service Class ID List:
"Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
"RFCOMM" (0x0003)
Channel: 15
"OBEX" (0x0008)
Profile Descriptor List:
"Phonebook Access" (0x1130)
Version: 0x0100
---
android/socket.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 73 insertions(+), 1 deletion(-)
diff --git a/android/socket.c b/android/socket.c
index 94add6f..619d5e9 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -191,6 +191,76 @@ static sdp_record_t *create_opp_record(uint8_t chan, const char *svc_name)
return record;
}
+static sdp_record_t *create_pbap_record(uint8_t chan, const char *svc_name)
+{
+ const char *service_name = "OBEX Phonebook Access Server";
+ sdp_list_t *svclass_id, *pfseq, *apseq, *root;
+ uuid_t root_uuid, pbap_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
+ sdp_profile_desc_t profile[1];
+ sdp_list_t *aproto, *proto[3];
+ sdp_data_t *channel;
+ uint8_t formats[] = { 0x01 };
+ uint8_t dtd = SDP_UINT8;
+ sdp_data_t *sflist;
+ sdp_record_t *record;
+
+ record = sdp_record_alloc();
+ if (!record)
+ return NULL;
+
+ record->handle = sdp_next_handle();
+
+ sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
+ root = sdp_list_append(NULL, &root_uuid);
+ sdp_set_browse_groups(record, root);
+
+ sdp_uuid16_create(&pbap_uuid, PBAP_PSE_SVCLASS_ID);
+ svclass_id = sdp_list_append(NULL, &pbap_uuid);
+ sdp_set_service_classes(record, svclass_id);
+
+ sdp_uuid16_create(&profile[0].uuid, PBAP_PROFILE_ID);
+ profile[0].version = 0x0100;
+ pfseq = sdp_list_append(NULL, profile);
+ sdp_set_profile_descs(record, pfseq);
+
+ sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
+ proto[0] = sdp_list_append(NULL, &l2cap_uuid);
+ apseq = sdp_list_append(NULL, proto[0]);
+
+ sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
+ proto[1] = sdp_list_append(NULL, &rfcomm_uuid);
+ channel = sdp_data_alloc(SDP_UINT8, &chan);
+ proto[1] = sdp_list_append(proto[1], channel);
+ apseq = sdp_list_append(apseq, proto[1]);
+
+ sdp_uuid16_create(&obex_uuid, OBEX_UUID);
+ proto[2] = sdp_list_append(NULL, &obex_uuid);
+ apseq = sdp_list_append(apseq, proto[2]);
+
+ aproto = sdp_list_append(NULL, apseq);
+ sdp_set_access_protos(record, aproto);
+
+ sflist = sdp_data_alloc(dtd, formats);
+ sdp_attr_add(record, SDP_ATTR_SUPPORTED_REPOSITORIES, sflist);
+
+ if (svc_name)
+ service_name = svc_name;
+
+ sdp_set_info_attr(record, service_name, NULL, NULL);
+
+ sdp_data_free(channel);
+ sdp_list_free(proto[0], NULL);
+ sdp_list_free(proto[1], NULL);
+ sdp_list_free(proto[2], NULL);
+ sdp_list_free(apseq, NULL);
+ sdp_list_free(pfseq, NULL);
+ sdp_list_free(aproto, NULL);
+ sdp_list_free(root, NULL);
+ sdp_list_free(svclass_id, NULL);
+
+ return record;
+}
+
static struct profile_info {
uint8_t uuid[16];
uint8_t channel;
@@ -203,7 +273,9 @@ static struct profile_info {
0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
},
- .channel = PBAP_DEFAULT_CHANNEL
+ .channel = PBAP_DEFAULT_CHANNEL,
+ .svc_hint = SVC_HINT_OBEX,
+ .create_record = create_pbap_record
}, {
.uuid = {
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 11/15] android/socket: Add SPP SDP record
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (9 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 10/15] android/socket: Add PBAP SDP record Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 12/15] android/socket: Support listen() with supplied chan number Andrei Emeltchenko
` (3 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/socket.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/android/socket.c b/android/socket.c
index 619d5e9..ca5ea2f 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -261,6 +261,75 @@ static sdp_record_t *create_pbap_record(uint8_t chan, const char *svc_name)
return record;
}
+static sdp_record_t *create_spp_record(uint8_t chan, const char *svc_name)
+{
+ const char *service_name = "Serial Port";
+ sdp_list_t *svclass_id, *apseq, *profiles, *root;
+ uuid_t root_uuid, sp_uuid, l2cap, rfcomm;
+ sdp_profile_desc_t profile;
+ sdp_list_t *aproto, *proto[2];
+ sdp_data_t *channel;
+ sdp_record_t *record;
+
+ record = sdp_record_alloc();
+ if (!record)
+ return NULL;
+
+ record->handle = sdp_next_handle();
+
+ sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
+ root = sdp_list_append(NULL, &root_uuid);
+ sdp_set_browse_groups(record, root);
+
+ sdp_uuid16_create(&sp_uuid, SERIAL_PORT_SVCLASS_ID);
+ svclass_id = sdp_list_append(NULL, &sp_uuid);
+ sdp_set_service_classes(record, svclass_id);
+
+ sdp_uuid16_create(&profile.uuid, SERIAL_PORT_PROFILE_ID);
+ profile.version = 0x0100;
+ profiles = sdp_list_append(NULL, &profile);
+ sdp_set_profile_descs(record, profiles);
+
+ sdp_uuid16_create(&l2cap, L2CAP_UUID);
+ proto[0] = sdp_list_append(NULL, &l2cap);
+ apseq = sdp_list_append(NULL, proto[0]);
+
+ sdp_uuid16_create(&rfcomm, RFCOMM_UUID);
+ proto[1] = sdp_list_append(NULL, &rfcomm);
+ channel = sdp_data_alloc(SDP_UINT8, &chan);
+ proto[1] = sdp_list_append(proto[1], channel);
+ apseq = sdp_list_append(apseq, proto[1]);
+
+ aproto = sdp_list_append(NULL, apseq);
+ sdp_set_access_protos(record, aproto);
+
+ sdp_add_lang_attr(record);
+
+ if (svc_name)
+ service_name = svc_name;
+
+ sdp_set_info_attr(record, service_name, "BlueZ", "COM Port");
+
+ sdp_set_url_attr(record, "http://www.bluez.org/",
+ "http://www.bluez.org/", "http://www.bluez.org/");
+
+ sdp_set_service_id(record, sp_uuid);
+ sdp_set_service_ttl(record, 0xffff);
+ sdp_set_service_avail(record, 0xff);
+ sdp_set_record_state(record, 0x00001234);
+
+ sdp_data_free(channel);
+ sdp_list_free(proto[0], NULL);
+ sdp_list_free(proto[1], NULL);
+ sdp_list_free(apseq, NULL);
+ sdp_list_free(aproto, NULL);
+ sdp_list_free(root, NULL);
+ sdp_list_free(svclass_id, NULL);
+ sdp_list_free(profiles, NULL);
+
+ return record;
+}
+
static struct profile_info {
uint8_t uuid[16];
uint8_t channel;
@@ -295,7 +364,9 @@ static struct profile_info {
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
},
- .channel = SPP_DEFAULT_CHANNEL
+ .channel = SPP_DEFAULT_CHANNEL,
+ .svc_hint = 0,
+ .create_record = create_spp_record
},
};
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 12/15] android/socket: Support listen() with supplied chan number
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (10 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 11/15] android/socket: Add SPP " Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 13/15] android/hal-sock: Print bdaddr on connect Andrei Emeltchenko
` (2 subsequent siblings)
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
No profile is assigned in this case. There is a possibility to use
Serial Port Profile.
---
android/socket.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/android/socket.c b/android/socket.c
index ca5ea2f..5f89f2c 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -644,10 +644,13 @@ static int handle_listen(void *buf)
DBG("");
profile = get_profile_by_uuid(cmd->uuid);
- if (!profile)
- return -1;
-
- chan = profile->channel;
+ if (!profile) {
+ if (!cmd->channel)
+ return -1;
+ else
+ chan = cmd->channel;
+ } else
+ chan = profile->channel;
DBG("rfcomm channel %d svc_name %s", chan, cmd->name);
@@ -682,7 +685,9 @@ static int handle_listen(void *buf)
return -1;
}
- rfsock->service_handle = sdp_service_register(profile, cmd->name);
+ if (profile)
+ rfsock->service_handle = sdp_service_register(profile,
+ cmd->name);
return hal_fd;
}
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 13/15] android/hal-sock: Print bdaddr on connect
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (11 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 12/15] android/socket: Support listen() with supplied chan number Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 14/15] android/socket: Refactor socket send_fd function Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 15/15] android/hal-utils: Fix possible NULL pointer dereference Andrei Emeltchenko
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/hal-sock.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/android/hal-sock.c b/android/hal-sock.c
index bd88ad8..e02a49a 100644
--- a/android/hal-sock.c
+++ b/android/hal-sock.c
@@ -82,8 +82,8 @@ static bt_status_t sock_connect(const bt_bdaddr_t *bdaddr, btsock_type_t type,
return BT_STATUS_PARM_INVALID;
}
- DBG("uuid %s chan %d sock %p type %d flags 0x%02x",
- btuuid2str(uuid), chan, sock, type, flags);
+ DBG("bdaddr %s uuid %s chan %d sock %p type %d flags 0x%02x",
+ bdaddr2str(bdaddr), btuuid2str(uuid), chan, sock, type, flags);
if (type != BTSOCK_RFCOMM) {
error("Socket type %u not supported", type);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 14/15] android/socket: Refactor socket send_fd function
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (12 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 13/15] android/hal-sock: Print bdaddr on connect Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
2013-11-25 9:44 ` [PATCHv8 15/15] android/hal-utils: Fix possible NULL pointer dereference Andrei Emeltchenko
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Make code cleaner and initialize local cmsg buffer to zeroes.
---
android/socket.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/android/socket.c b/android/socket.c
index 5f89f2c..22472b9 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -394,7 +394,7 @@ static int bt_sock_send_fd(int sock_fd, const void *buf, int len, int send_fd)
struct msghdr msg;
struct cmsghdr *cmsg;
struct iovec iv;
- char msgbuf[CMSG_SPACE(1)];
+ char cmsgbuf[CMSG_SPACE(sizeof(int))];
DBG("len %d sock_fd %d send_fd %d", len, sock_fd, send_fd);
@@ -402,13 +402,16 @@ static int bt_sock_send_fd(int sock_fd, const void *buf, int len, int send_fd)
return -1;
memset(&msg, 0, sizeof(msg));
+ memset(cmsgbuf, 0, sizeof(cmsgbuf));
+
+ msg.msg_control = cmsgbuf;
+ msg.msg_controllen = sizeof(cmsgbuf);
- msg.msg_control = msgbuf;
- msg.msg_controllen = sizeof(msgbuf);
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof(send_fd));
+
memcpy(CMSG_DATA(cmsg), &send_fd, sizeof(send_fd));
iv.iov_base = (unsigned char *) buf;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCHv8 15/15] android/hal-utils: Fix possible NULL pointer dereference
2013-11-25 9:44 [PATCHv8 00/15] Socket HAL Andrei Emeltchenko
` (13 preceding siblings ...)
2013-11-25 9:44 ` [PATCHv8 14/15] android/socket: Refactor socket send_fd function Andrei Emeltchenko
@ 2013-11-25 9:44 ` Andrei Emeltchenko
14 siblings, 0 replies; 16+ messages in thread
From: Andrei Emeltchenko @ 2013-11-25 9:44 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
android/hal-utils.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/android/hal-utils.c b/android/hal-utils.c
index 4f44d98..e3c0c60 100644
--- a/android/hal-utils.c
+++ b/android/hal-utils.c
@@ -33,6 +33,9 @@ const char *bt_uuid_t2str(const uint8_t *uuid, char *buf)
unsigned int i;
int is_bt;
+ if (!uuid)
+ return strcpy(buf, "NULL");
+
is_bt = !memcmp(&uuid[4], &BT_BASE_UUID[4], HAL_UUID_LEN - 4);
for (i = 0; i < HAL_UUID_LEN; i++) {
@@ -167,6 +170,9 @@ const char *bt_bdaddr_t2str(const bt_bdaddr_t *bd_addr, char *buf)
{
const uint8_t *p = bd_addr->address;
+ if (!bd_addr)
+ return strcpy(buf, "NULL");
+
snprintf(buf, MAX_ADDR_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
p[0], p[1], p[2], p[3], p[4], p[5]);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 16+ messages in thread