Provided by: libbluetooth-dev_5.83-1~exp1_amd64 bug

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:
                ┌────────────────────┬──────────────────────┬────────────────────────┬──────────────┐
                │ Value              │ Security Level       │ Link Key Type          │ Encryption   │
                ├────────────────────┼──────────────────────┼────────────────────────┼──────────────┤
                │ BT_SECURITY_SDP    │ 0 (SDP Only)         │ None                   │ Not required │
                ├────────────────────┼──────────────────────┼────────────────────────┼──────────────┤
                │ BT_SECURITY_LOW    │ 1 (Low)              │ Unauthenticated        │ Not required │
                ├────────────────────┼──────────────────────┼────────────────────────┼──────────────┤
                │ BT_SECURITY_MEDIUM │ 2 (Medium - default) │ Unauthenticated        │ Desired      │
                ├────────────────────┼──────────────────────┼────────────────────────┼──────────────┤
                │ BT_SECURITY_HIGH   │ 3 (High)             │ Authenticated          │ Required     │
                ├────────────────────┼──────────────────────┼────────────────────────┼──────────────┤
                │ BT_SECURITY_FIPS   │ 4 (Secure Only)      │ Authenticated   (P-256 │ Required     │
                │ (since Linux 3.15) │                      │ based  Secure   Simple │              │
                │                    │                      │ Pairing   and   Secure │              │
                │                    │                      │ Authentication)        │              │
                └────────────────────┴──────────────────────┴────────────────────────┴──────────────┘

       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:
                                    ┌───────┬───────────────────┬───────────────┐
                                    │ Value │ Description       │ Authorization │
                                    ├───────┼───────────────────┼───────────────┤
                                    │ 0     │ Disable (default) │ Not required  │
                                    ├───────┼───────────────────┼───────────────┤
                                    │ 1     │ Enable            │ Required      │
                                    └───────┴───────────────────┴───────────────┘

       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;
          };
                        ┌────────────────────────────┬────────┬──────────────────────────────┐
                        │ Define                     │ Value  │ Description                  │
                        ├────────────────────────────┼────────┼──────────────────────────────┤
                        │ BT_VOICE_TRANSPARENT       │ 0x0003 │ Transparent output           │
                        ├────────────────────────────┼────────┼──────────────────────────────┤
                        │ BT_VOICE_CVSD_16BIT        │ 0x0060 │ C-VSD   output   PCM  16-bit │
                        │                            │        │ input                        │
                        ├────────────────────────────┼────────┼──────────────────────────────┤
                        │ BT_VOICE_TRANSPARENT_16BIT │ 0x0063 │ Transparent    output    PCM │
                        │                            │        │ 16-bit input                 │
                        └────────────────────────────┴────────┴──────────────────────────────┘

       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:
                                   ┌────────────────────┬───────┬─────────────────┐
                                   │ Define             │ Value │ Description     │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_1M_1SLOT │ BIT 0 │ BR 1Mbps 1SLOT  │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_1M_3SLOT │ BIT 1 │ BR 1Mbps 3SLOT  │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_2M_1SLOT │ BIT 3 │ EDR 2Mbps 1SLOT │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_2M_3SLOT │ BIT 4 │ EDR 2Mbps 3SLOT │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_3M_1SLOT │ BIT 6 │ EDR 3Mbps 1SLOT │
                                   ├────────────────────┼───────┼─────────────────┤
                                   │ BT_PHY_BR_3M_3SLOT │ BIT 7 │ EDR 3Mbps 3SLOT │
                                   └────────────────────┴───────┴─────────────────┘

   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).

BlueZ                                              March 2025                                             SCO(7)