From: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCHv3 04/16] android/socket: Define structs and implement listen
Date: Mon, 18 Nov 2013 10:26:07 +0200 [thread overview]
Message-ID: <1384763179-2218-5-git-send-email-Andrei.Emeltchenko.news@gmail.com> (raw)
In-Reply-To: <1384763179-2218-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This defines structures for socket HAL. We need to emulate Android
sockets by sending connect/accept signals over file descriptor.
Handle HAL socket listen call. Create RFCOMM socket and wait for events.
---
android/socket.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 116 insertions(+), 2 deletions(-)
diff --git a/android/socket.c b/android/socket.c
index e580036..276c78c 100644
--- a/android/socket.c
+++ b/android/socket.c
@@ -27,8 +27,12 @@
#include <glib.h>
#include <stdbool.h>
+#include <unistd.h>
+#include <errno.h>
#include "lib/bluetooth.h"
+#include "btio/btio.h"
+#include "lib/sdp.h"
#include "log.h"
#include "hal-msg.h"
#include "hal-ipc.h"
@@ -37,13 +41,123 @@
static bdaddr_t adapter_addr;
-static int handle_listen(void *buf)
+/* Simple list of RFCOMM server sockets */
+GList *rfcomm_srv_list = NULL;
+
+/* Simple list of RFCOMM connected sockets */
+GList *rfcomm_connected_list = NULL;
+
+struct rfcomm_slot {
+ int fd; /* descriptor for communication with Java framework */
+ int real_sock; /* real RFCOMM socket */
+ int channel; /* RFCOMM channel */
+};
+
+static struct rfcomm_slot *create_rfslot(int sock, int *hal_fd)
{
- DBG("Not implemented");
+ int fds[2] = {-1, -1};
+ struct rfcomm_slot *rfslot;
+
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) < 0) {
+ error("socketpair(): %s", strerror(errno));
+ return NULL;
+ }
+
+ rfslot = g_malloc0(sizeof(*rfslot));
+ rfslot->fd = fds[0];
+ *hal_fd = fds[1];
+ rfslot->real_sock = sock;
+
+ return rfslot;
+}
+
+static void cleanup_rfslot(struct rfcomm_slot *rfslot)
+{
+ DBG("Cleanup: rfslot: %p fd %d real_sock %d chan %u",
+ rfslot, rfslot->fd, rfslot->real_sock, rfslot->channel);
+
+ if (rfslot->fd > 0)
+ close(rfslot->fd);
+ if (rfslot->real_sock > 0)
+ close(rfslot->real_sock);
+
+ g_free(rfslot);
+}
+
+static struct {
+ uint8_t uuid[16];
+ uint8_t channel;
+} uuid_to_chan[] = {
+ { .uuid = {
+ 0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
+ },
+#define PBAP_DEFAULT_CHANNEL 15
+ .channel = PBAP_DEFAULT_CHANNEL },
+ { .uuid = {
+ 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
+ },
+#define OPP_DEFAULT_CHANNEL 9
+ .channel = OPP_DEFAULT_CHANNEL },
+ { {0} }
+};
+
+static int get_rfcomm_default_chan(const uint8_t *uuid)
+{
+ int i;
+
+ for (i = 0; uuid_to_chan[i].channel; i++) {
+ if (!memcmp(uuid_to_chan[i].uuid, uuid, 16))
+ return uuid_to_chan[i].channel;
+ }
return -1;
}
+static void accept_cb(GIOChannel *io, GError *err, gpointer user_data)
+{
+}
+
+static int handle_listen(void *buf)
+{
+ struct hal_cmd_sock_listen *cmd = buf;
+ struct rfcomm_slot *rfslot;
+ GIOChannel *io;
+ GError *err = NULL;
+ int hal_fd = -1;
+ int chan;
+
+ DBG("");
+
+ chan = get_rfcomm_default_chan(cmd->uuid);
+ if (chan < 0)
+ return -1;
+
+ DBG("rfcomm channel %d", chan);
+
+ rfslot = create_rfslot(-1, &hal_fd);
+
+ io = bt_io_listen(accept_cb, NULL, rfslot, NULL, &err,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_CHANNEL, chan,
+ BT_IO_OPT_INVALID);
+ if (!io) {
+ error("Failed listen: %s", err->message);
+ g_error_free(err);
+ cleanup_rfslot(rfslot);
+ return -1;
+ }
+
+ rfslot->real_sock = g_io_channel_unix_get_fd(io);
+ rfcomm_srv_list = g_list_append(rfcomm_srv_list, rfslot);
+
+ DBG("real_sock %d fd %d hal_fd %d",
+ rfslot->real_sock, rfslot->fd, hal_fd);
+
+ return hal_fd;
+}
+
static int handle_connect(void *buf)
{
DBG("Not implemented");
--
1.7.10.4
next prev parent reply other threads:[~2013-11-18 8:26 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-18 8:26 [PATCHv3 00/16] Socket HAL Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 01/16] android/hal-sock: Add debug flag printing Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 02/16] android/socket: Use static local adapter address Andrei Emeltchenko
2013-11-18 8:46 ` Johan Hedberg
2013-11-18 8:26 ` [PATCHv3 03/16] android/socket: Add connect signal to socket Andrei Emeltchenko
2013-11-18 8:45 ` Johan Hedberg
2013-11-18 8:26 ` Andrei Emeltchenko [this message]
2013-11-18 8:55 ` [PATCHv3 04/16] android/socket: Define structs and implement listen Johan Hedberg
2013-11-18 10:02 ` Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 05/16] android/socket: Implement socket accepted event Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 06/16] android/socket: Implement Android RFCOMM stack events Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 07/16] android/socket: Implement RFCOMM events Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 08/16] android/socket: Implement accept signal over Android fd Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 09/16] android/socket: Write channel to " Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 10/16] android/socket: Implement socket connect HAL method Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 11/16] android/socket: Parse SDP response and connect Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 12/16] android/socket: Implement HAL connect call Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 13/16] android/socket: Send RFCOMM channel to framework Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 14/16] android/socket: Send connect signal on connect Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 15/16] android/socket: Close file descriptor after sending Andrei Emeltchenko
2013-11-18 8:26 ` [PATCHv3 16/16] android/socket: Add SDP record for OPP profile Andrei Emeltchenko
2013-11-18 9:28 ` Andrei Emeltchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1384763179-2218-5-git-send-email-Andrei.Emeltchenko.news@gmail.com \
--to=andrei.emeltchenko.news@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).