Android Socket protocol for Bluetooth
=====================================

Since Android switched from BlueZ (where sockets where nicely implemented) to
Bluedroid user space stack there is a need to emulate bluetooth sockets.

Android Bluetooth Socket Hardware Abstraction Layer (HAL) bt_sock.h has
only 2 functions:

static btsock_interface_t sock_if = {
	sizeof(sock_if),
	sock_listen,
	sock_connect
};

with following parameters:

sock_listen(btsock_type_t type, const char *service_name,
		const uint8_t *uuid, int chan, int *sock_fd, int flags)
sock_connect(const bt_bdaddr_t *bdaddr, btsock_type_t type,
		const uint8_t *uuid, int chan, int *sock_fd, int flags)

socket type RFCOMM is only supported at the moment. uuid and channel used
to decide where to connect.

sockfd is used to return socket fd to Android framework. It is used to inform
framework when remote device is connected.

listen()
========

Listens on RFCOMM socket, socket channel is either found based on uuid or
channel parameter used directly. Returns sock_fd to Android framework.

Through this sock_fd channel number as (int) needs to be written right after
listen() succeeds.

When remote device is connected to this socket we shall send accept signal
through sock_fd

connect()
=========

Connects to remote device specified in bd_addr parameter. Socket channel is
found by SDP search of remote device by supplied uuid. Returns sock_fd to
Android framework.

Through this sock_fd channel number as (int) needs to be written right after
connects() succeeds.

When remote device is connected to this socket we shall send connect signal
through sock_fd

The format of connect/accept signal is shown below:

struct hal_sock_connect_signal {
	short   size;
	uint8_t bdaddr[6];
	int     channel;
	int     status;
} __attribute__((packed));
