Man page - sco(7)
Packages contains this manual
Manual
SCO
NAMESYNOPSIS
DESCRIPTION
SOCKET ADDRESS
SOCKET OPTIONS
BT_SECURITY (since Linux 2.6.30)
BT_DEFER_SETUP (since Linux 2.6.30)
BT_VOICE (since Linux 3.11)
BT_PHY (since Linux 5.10)
BT_CODEC (since Linux 5.14)
RESOURCES
REPORTING BUGS
SEE ALSO
COPYRIGHT
NAME
sco - SCO transport
SYNOPSIS
#include
<sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/sco.h>
sco_socket = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
DESCRIPTION
The SCO logical transport, is a symmetric, point-to-point transport between the Central and a specific Peripheral. The SCO logical transport reserves slots and can therefore be considered as a circuit-switched connection between the Central and the Peripheral.
In addition to the reserved slots, when eSCO is supported, a retransmission window follows immediately after. Together, the reserved slots and the retransmission window form the complete eSCO window.
SOCKET ADDRESS
struct
sockaddr_sco {
sa_family_t sco_family;
bdaddr_t sco_bdaddr;
};
Example:
struct sockaddr_sco addr;
memset(&addr,
0, sizeof(addr));
addr.sco_family = AF_BLUETOOTH;
bacpy(&addr.sco_bdaddr, bdaddr);
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(sco_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(sco_socket, SOL_BLUETOOTH,
BT_DEFER_SETUP,
&defer_setup, sizeof(defer_setup));
if (err == -1) {
perror("setsockopt");
return err;
}
err =
listen(sco_socket, 5);
if (err) {
perror("listen");
return err;
}
struct
sockaddr_sco remote_addr = {0};
socklen_t addr_len = sizeof(remote_addr);
int new_socket = accept(sco_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_VOICE (since Linux 3.11)
Transport voice settings, possible values:
struct bt_voice
{
uint16_t setting;
};
Example:
struct bt_voice voice;
memset(&voice,
0, sizeof(voice));
voice.setting = BT_VOICE_TRANSPARENT;
int err = setsockopt(sco_socket, SOL_BLUETOOTH, BT_VOICE,
&voice,
sizeof(voice));
if (err == -1) {
perror("setsockopt");
return 1;
}
BT_PHY (since Linux 5.10)
Transport supported PHY(s), possible values:
BT_CODEC (since Linux 5.14)
Transport codec offload, possible values:
struct bt_codec
{
uint8_t id;
uint16_t cid;
uint16_t vid;
uint8_t data_path_id;
uint8_t num_caps;
struct codec_caps {
uint8_t len;
uint8_t data[];
} caps[];
} __attribute__((packed));
struct
bt_codecs {
uint8_t num_codecs;
struct bt_codec codecs[];
} __attribute__((packed));
Example:
char
buffer[sizeof(struct bt_codecs) + sizeof(struct bt_codec)];
struct bt_codec *codecs = (void *)buffer;
memset(codecs,
0, sizeof(codecs));
codec->num_codecs = 1;
codecs->codecs[0].id = 0x05;
codecs->codecs[0].data_path_id = 1;
int err =
setsockopt(sco_socket, SOL_BLUETOOTH, BT_CODEC, codecs,
sizeof(buffer));
if (err == -1) {
perror("setsockopt");
return 1;
}
RESOURCES
<http://www.bluez.org>
REPORTING BUGS
<linux-bluetooth@vger.kernel.org>
SEE ALSO
socket(7), scotest(1)
COPYRIGHT
Free use of this software is granted under the terms of the GNU Lesser General Public Licenses (LGPL).