• Marcel Holtmann's avatar
    Bluetooth: Introduce new HCI socket channel for user operation · 23500189
    Marcel Holtmann authored
    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: default avatarMarcel Holtmann <marcel@holtmann.org>
    Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
    23500189
hci_sock.c 24.7 KB