blob: 45139bea5e1693749e47150145dde655d1b61536 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.bluetooth.bredr;
using fuchsia.bluetooth;
using zx;
/// The RFCOMM channel ID used when requesting to open a channel.
/// This is known as a ServerChannel in RFCOMM. It must be within the
/// range [1,30] (inclusive). See RFCOMM 5.4.
alias RfcommChannel = uint8;
/// The parameters associated with a connection over the RFCOMM protocol.
table RfcommParameters {
/// Required. RFCOMM channel for the connection.
1: RfcommChannel channel;
/// The parameters associated with a connection over the L2CAP protocol.
table L2capParameters {
/// Required. Dynamic PSM for the connection. See the defined PSMs in `service.fidl`.
1: uint16 psm;
/// Optional. L2CAP channel parameters.
2: ChannelParameters parameters;
/// The channel and relevant parameters for a connection.
union ConnectParameters {
/// An L2CAP connection.
1: L2capParameters l2cap;
/// An RFCOMM connection.
2: RfcommParameters rfcomm;
/// Authentication and permission requirements to access an advertised service.
table SecurityRequirements {
/// If present and true, the physical link must be authenticated with man-in-the-middle attack
/// protection to access this service. If missing, authentication is not required.
1: bool authentication_required;
/// If present and true, the physical link must be encrypted with a Secure Connections key to
/// access this service if the host is capable. Advertisement will fail if the host does not
/// support Secure Connections. See Bluetooth Spec v5.2, Vol 3, Part C, Sec
2: bool secure_connections_required;
/// Used to specify preferred and accepted L2CAP channel modes. If the peer rejects a non-BASIC
/// mode, the Bluetooth system will attempt to open the channel in BASIC mode instead. For a
/// description of each mode, see Bluetooth Spec v5.2, Vol 3, Part A, Sec 2.4.
enum ChannelMode {
BASIC = 1;
/// Used to specify preferred L2CAP channel parameters.
table ChannelParameters {
/// Optional. If not provided, BASIC will be used.
1: ChannelMode channel_mode;
/// Maximum SDU size this profile is capable of accepting. Must be >= 48. Optional. If not
/// provided, the size will be determined by the Bluetooth system. No guarantees are given
/// regarding the size selected.
2: uint16 max_rx_sdu_size;
/// Minimum security requirements a link must have before this channel can be created.
/// The requirements provided here will be attempted with the peer before the channel is
/// established. If a peer cannot provide the requirements, the channel is closed.
/// Optional. If not provided, then the only security property guaranteed is encryption.
3: SecurityRequirements security_requirements;
/// A channel opened to a peer.
resource table Channel {
/// Socket interface for sending/receiving SDUs on the channel.
/// Always present.
1: zx.handle:SOCKET socket;
/// Channel mode accepted by the peer.
/// Always present.
2: ChannelMode channel_mode;
/// Maximum SDU size the peer is capable of accepting.
/// Always present.
3: uint16 max_tx_sdu_size;
/// Audio Direction priority extension. See `AudioDirectionExt`.
/// Present only if supported by the host.
4: AudioDirectionExt ext_direction;
/// A2DP packet priority used in `AudioDirectionExt`. `NORMAL` should be used whenever audio is not
/// streaming, and `SOURCE`/`SINK` should match the direction audio is being streamed.
enum A2dpDirectionPriority {
SINK = 3;
/// Audio Priority Direction extension.
/// Used to put the channel in a mode where A2DP packets are prioritized over other packets in the
/// source or sink direction.
protocol AudioDirectionExt {
SetPriority(A2dpDirectionPriority priority) -> () error fuchsia.bluetooth.ErrorCode;
/// Represents a service which is registered by this profile. Closing this protocol will remove the
/// service registration.
protocol ConnectionReceiver {
/// Called when a peer connects to this service. The channel connected is delivered
/// with parameters in `channel`.
/// `protocol` will contain a protocol list up to the point connected (for example, if
/// L2CAP is connected, it will contain the L2CAP protocol and specify the PSM connected)
Connected(fuchsia.bluetooth.PeerId peer_id, Channel channel, ProtocolDescriptorList protocol);
/// Maximum number of attributes returned or allowed in a search request.
const uint16 MAX_ATTRIBUTES = 512;
/// Represents an active search which can produce results when peers are connected. Closing this
/// protocol will result in the associated search not being performed on new connected peers.
protocol SearchResults {
/// Called when a search this client added finds a matching service on a peer.
/// `peer_id` is the peer the service was found on.
/// `protocol` includes the ProtocolDescriptorList in the service record if it exists
/// (it is also included in `attributes`.)
/// `attributes` contains all attributes requested from the search that are present on the
/// peer record. It may also include additional attributes.
/// Each ServiceFound call should be acknowledged by replying.
/// A limited amount of unacknowledged results will be sent on the channel. Results may be
/// dropped if results are received while too many results are unacknowledged.
ServiceFound(fuchsia.bluetooth.PeerId peer_id, ProtocolDescriptorList? protocol,
vector<Attribute>:MAX_ATTRIBUTES attributes) -> ();
/// Maximum service records that can be advertised at once.
/// Service provides Bluetooth BR/EDR profiles a way to register a service definition, making a
/// profile discoverable by peers. Registered services can receive L2CAP connections made to the
/// advertised records, and can open new connections on peers.
[Discoverable] protocol Profile {
/// Register a set of services.
/// The call will resolve when the service advertisement terminates or if there was an error
/// when advertising.
/// These services will be discoverable via Service Discovery Protocol server.
/// All services advertising the same channel must be added at once - if services are already
/// registered on any channel advertised, registration will fail, the receiver will be closed
/// with ZX_ERR_ALREADY_BOUND and an error will be returned.
/// The ConnectionReceiver will get calls for connections to the channels included in the
/// `protocol_descriptor` or `alternative_protocol_descriptors` in the services advertised.
/// The receiver will be closed if there are any errors advertising.
/// If the advertisement cannot be made for any reason, an error of `INVALID_ARGUMENTS`
/// will be returned and the receiver will be closed with a suitable epitaph.
Advertise(vector<ServiceDefinition>:MAX_SERVICES_PER_ADVERTISEMENT services,
ChannelParameters parameters, ConnectionReceiver receiver)
-> () error fuchsia.bluetooth.ErrorCode;
/// Register a search for services on newly connected peers. The SearchResults protocol will be
/// used to report results for this search. Any service result with a service matching
/// `service_uuid` will be returned with the additional attributes in `attr_ids`. If `attr_ids`
/// is empty, all attributes will be requested. The additional attribute
/// BLUETOOTH_PROTOCOL_DESCRIPTOR_LIST is always requested. See the Bluetooth Spec v5.2, Vol 3,
/// Part B, Section 5) and relevant profile specification documents.
Search(ServiceClassProfileIdentifier service_uuid, vector<uint16>:MAX_ATTRIBUTES attr_ids,
SearchResults results);
/// Connect an L2CAP or RFCOMM channel to the connected peer identified by `peer_id` using the
/// desired `connection` parameters listed. Dynamic PSMs can be specified in `connection`.
/// Returns the channel connected once established, or an error code if the channel could not
/// be connected.
Connect(fuchsia.bluetooth.PeerId peer_id, ConnectParameters connection)
-> (Channel channel) error fuchsia.bluetooth.ErrorCode;
/// Attempt to establish a synchronous connection to `peer_id` configured using `params`.
/// If `initiator` is true, a connection request will be sent. If `initiator` is false, the host will
/// attempt to accept the next connection request.
/// The result of the connection attempt will be returned with `receiver`. Dropping `receiver` will cancel the request.
ConnectSco(fuchsia.bluetooth.PeerId peer_id, bool initiator, ScoConnectionParameters params, ScoConnectionReceiver receiver);