linux/include/net/bluetooth
Marcel Holtmann 23500189d7 Bluetooth: Introduce new HCI socket channel for user operation
This patch introcuces a new HCI socket channel that allows user
applications to take control over a specific HCI device. The application
gains exclusive access to this device and forces the kernel to stay away
and not manage it. In case of the management interface it will actually
hide the device.

Such operation is useful for security testing tools that need to operate
underneath the Bluetooth stack and need full control over a device. The
advantage here is that the kernel still provides the service of hardware
abstraction and HCI level access. The use of Bluetooth drivers for
hardware access also means that sniffing tools like btmon or hcidump
are still working and the whole set of transaction can be traced with
existing tools.

With the new channel it is possible to send HCI commands, ACL and SCO
data packets and receive HCI events, ACL and SCO packets from the
device. The format follows the well established H:4 protocol.

The new HCI user channel can only be established when a device has been
through its setup routine and is currently powered down. This is
enforced to not cause any problems with current operations. In addition
only one user channel per HCI device is allowed. It is exclusive access
for one user application. Access to this channel is limited to process
with CAP_NET_RAW capability.

Using this new facility does not require any external library or special
ioctl or socket filters. Just create the socket and bind it. After that
the file descriptor is ready to speak H:4 protocol.

        struct sockaddr_hci addr;
        int fd;

        fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);

        memset(&addr, 0, sizeof(addr));
        addr.hci_family = AF_BLUETOOTH;
        addr.hci_dev = 0;
        addr.hci_channel = HCI_CHANNEL_USER;

        bind(fd, (struct sockaddr *) &addr, sizeof(addr));

The example shows on how to create a user channel for hci0 device. Error
handling has been left out of the example. However with the limitations
mentioned above it is advised to handle errors. Binding of the user
cahnnel socket can fail for various reasons. Specifically if the device
is currently activated by BlueZ or if the access permissions are not
present.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
2013-09-16 14:35:55 -03:00
..
a2mp.h Bluetooth: AMP: Use set_bit / test_bit for amp_mgr state 2013-01-09 17:05:05 -02:00
amp.h Bluetooth: AMP: Use l2cap_physical_cfm in phylink complete evt 2012-11-01 20:27:10 -02:00
bluetooth.h Bluetooth: Add Bluetooth socket voice option 2013-08-21 16:47:09 +02:00
hci_core.h Bluetooth: Add SCO connection fallback 2013-08-21 16:47:13 +02:00
hci_mon.h Bluetooth: Fix coding style in all .h files 2012-03-07 00:04:25 -03:00
hci.h Bluetooth: Introduce new HCI socket channel for user operation 2013-09-16 14:35:55 -03:00
l2cap.h Bluetooth: Rename L2CAP_CID_LE_DATA to L2CAP_CID_ATT 2013-06-23 00:23:47 +01:00
mgmt.h Bluetooth: Fix mgmt handling of power on failures 2013-06-12 10:20:55 -04:00
rfcomm.h Bluetooth: Remove RFCOMM session refcnt 2013-03-08 10:40:24 -03:00
sco.h Bluetooth: Add Bluetooth socket voice option 2013-08-21 16:47:09 +02:00
smp.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless 2012-09-07 15:07:55 -04:00