---
name: "hci"
section: "7"
platform: "linux"
package: "bluez-utils"
version: "5.87-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/hci"
---

# hci(7)

Bluetooth HCI protocol

## Name

hci - Bluetooth HCI protocol

## SYNOPSIS

```
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
hci_socket = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
```

## DESCRIPTION

Bluetooth Host Controller Interface (HCI) is the standard protocol to communicate with Bluetooth adapters. HCI protocol provides a uniform command method for the Host to access Controller capabilities and to control connections to other Controllers.

## SOCKET ADDRESS

```
struct sockaddr_hci {
    sa_family_t    hci_family;
    unsigned short hci_dev;
    unsigned short hci_channel;
};
```

Possible values for hci\_channel:

| | | |
| --- | --- | --- |
| Define | Value | Description |
| **HCI\_CHANNEL\_RAW** | 0x00 | Raw channel - Used for raw HCI communication |
| **HCI\_CHANNEL\_USER** | 0x01 | User channel - Used for userspace HCI communication (disables kernel processing) |
| **HCI\_CHANNEL\_MONITOR** | 0x02 | Monitor channel - Used for monitoring HCI traffic ([btmon(1)](/btmon/1.md)) |
| **HCI\_CHANNEL\_CONTROL** | 0x03 | Control channel - Used to manage local adapters (bluetoothd(7)) |
| **HCI\_CHANNEL\_LOGGING** | 0x04 | Logging channel - Used to inject logging messages (bluetoothd(7)) |

Example:

```
struct sockaddr_hci addr;
memset(&addr, 0, sizeof(addr));
addr.hci_family = AF_BLUETOOTH;
addr.hci_dev = HCI_DEV_NONE;
addr.hci_channel = HCI_CHANNEL_CONTROL;
```

## SOCKET OPTIONS

The socket options listed below can be set by using **[setsockopt(2)](/setsockopt/2.md)** and read with **[getsockopt(2)](/getsockopt/2.md)** with the socket level set to SOL\_BLUETOOTH or SOL\_HCI (HCI\_FILTER).

### HCI\_FILTER (since Linux 2.6)

Filter by HCI events, requires hci\_channel to be set to HCI\_CHANNEL\_RAW, possible values:

```
struct hci_filter {
    uint32_t type_mask;
    uint32_t event_mask[2];
    uint16_t opcode;
};
```

Example:

```
struct hci_filter flt;
memset(&flt, 0, sizeof(flt));
flt.type_mask = 1 << BT_H4_EVT_PKT;
flt.event_mask[0] = 0xffffffff;
flt.event_mask[1] = 0xffffffff;
setsockopt(fd, SOL_HCI, HCI_FILTER, &flt, sizeof(flt));
```

### BT\_SNDBUF (since Linux 5.16)

Set send buffer size, requires hci\_channel to be set to HCI\_CHANNEL\_MONITOR, HCI\_CHANNEL\_CONTROL or HCI\_CHANNEL\_LOGGING.

Default value is 1028.

Example:

```
uint16_t mtu = UINT16_MAX;
int err;
err = setsockopt(fd, SOL_BLUETOOTH, BT_SNDMTU, &mtu, sizeof(mtu));
```

### BT\_RCVBUF (since Linux 5.16)

Set receive buffer size, requires hci\_channel to be set to HCI\_CHANNEL\_MONITOR, HCI\_CHANNEL\_CONTROL or HCI\_CHANNEL\_LOGGING.

Default value is 1028.

Example:

```
uint16_t mtu;
socklen_t len;
int err;
len = sizeof(mtu);
err = getsockopt(sock, SOL_BLUETOOTH, BT_RCVMTU, mtu, &len);
```

## RESOURCES

\<http://www.bluez.org\>

## REPORTING BUGS

\<linux-bluetooth@vger.kernel.org\>

## SEE ALSO

[socket(7)](/socket/7.md)

## Copyright

Free use of this software is granted under the terms of the GNU Lesser General Public Licenses (LGPL).
