Manpage logo

rfcomm - RFCOMM protocol

NAME  SYNOPSIS  DESCRIPTION  SOCKET ADDRESS  SOCKET OPTIONS  BT_SECURITY (since Linux 2.6.30)  BT_DEFER_SETUP (since Linux 2.6.30)  BT_FLUSHABLE (since Linux 2.6.39)  BT_CHANNEL_POLICY (since Linux 3.10)  BT_PHY (since Linux 5.10)  RESOURCES  REPORTING BUGS  SEE ALSO  COPYRIGHT 

NAME

rfcomm − RFCOMM protocol

SYNOPSIS

#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>

rfcomm_socket = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

DESCRIPTION

The RFCOMM protocol provides emulation of serial ports over the L2CAP(7) protocol. The protocol is based on the ETSI standard TS 07.10.

RFCOMM is a simple transport protocol, with additional provisions for emulating the 9 circuits of RS−232 (EIATIA−232−E) serial ports.

SOCKET ADDRESS

struct sockaddr_rc {
sa_family_t rc_family;
unsigned short rc_bdaddr;
unsigned char rc_channel;
};

Example:

struct sockaddr_rc addr;

memset(&addr, 0, sizeof(addr));
addr.rc_family = AF_BLUETOOTH;
bacpy(&addr.rc_bdaddr, bdaddr);
addr.rc_channel = channel;

SOCKET OPTIONS

The socket options listed below can be set by using setsockopt(2) and read with getsockopt(2) with the socket level set to SOL_BLUETOOTH.

BT_SECURITY (since Linux 2.6.30)

Channel security level, possible values:

Example:

int level = BT_SECURITY_HIGH;
int err = setsockopt(rfcomm_socket, SOL_BLUETOOTH, BT_SECURITY, &level,
sizeof(level));
if (err == −1) {
perror("setsockopt");
return 1;
}

BT_DEFER_SETUP (since Linux 2.6.30)

Channel defer connection setup, this control if the connection procedure needs to be authorized by userspace before responding which allows authorization at profile level, possible values:

Example:

int defer_setup = 1;
int err = setsockopt(rfcomm_socket, SOL_BLUETOOTH, BT_DEFER_SETUP,
&defer_setup, sizeof(defer_setup));
if (err == −1) {
perror("setsockopt");
return err;
}

err = listen(rfcomm_socket, 5);
if (err) {
perror("listen");
return err;
}

struct sockaddr_rc remote_addr = {0};
socklen_t addr_len = sizeof(remote_addr);
int new_socket = accept(rfcomm_socket, (struct sockaddr*)&remote_addr,
&addr_len);
if (new_socket < 0) {
perror("accept");
return new_socket;
}

/* To complete the connection setup of new_socket read 1 byte */
char c;
struct pollfd pfd;

memset(&pfd, 0, sizeof(pfd));
pfd.fd = new_socket;
pfd.events = POLLOUT;

err = poll(&pfd, 1, 0);
if (err) {
perror("poll");
return err;
}

if (!(pfd.revents & POLLOUT)) {
err = read(sk, &c, 1);
if (err < 0) {
perror("read");
return err;
}
}

BT_FLUSHABLE (since Linux 2.6.39)

Channel flushable flag, this control if the channel data can be flushed or not, possible values:

BT_CHANNEL_POLICY (since Linux 3.10)

High−speed (AMP) channel policy, possible values:

BT_PHY (since Linux 5.10)

Channel supported PHY(s), possible values:

RESOURCES

<http://www.bluez.org>

REPORTING BUGS

<linux−[email protected]>

SEE ALSO

socket(7), rctest(1)

COPYRIGHT

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


Updated 2026-06-01 - jenkler.se | uex.se