blob: e67b8ed9ac49b6607af7eff7ec63c9797ab46e81 [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 fuchsia.url;
/// The maximum length that a sequence or set of alternatives supported in a
/// DataElement list. If a list is provided that is longer than this from a
/// peer, it is truncated.
const MAX_SEQUENCE_LENGTH uint8 = 255;
/// Maximum length of a string that is alowed in a DataElement. If a
/// DataElement string longer than this is sent by a peer it will be truncated.
const MAX_STRING_LENGTH uint16 = 1024;
/// A DataElement is one element in a SDP record. SDP attributes and other parameters are
/// expresssed in DataElements.
type DataElement = strict union {
1: int8 int8;
2: int16 int16;
3: int32 int32;
4: int64 int64;
5: uint8 uint8;
6: uint16 uint16;
7: uint32 uint32;
8: uint64 uint64;
9: str vector<uint8>:MAX_STRING_LENGTH;
10: url fuchsia.url.Url;
11: uuid fuchsia.bluetooth.Uuid;
12: b bool;
13: sequence vector<DataElement:optional>:MAX_SEQUENCE_LENGTH;
14: alternatives vector<DataElement:optional>:MAX_SEQUENCE_LENGTH;
};
/// Defined Protocol Identifiers for the Protocol Descriptor
/// We intentionally omit deprecated profile identifiers.
/// From Bluetooth Assigned Numbers:
/// https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
type ProtocolIdentifier = strict enum : uint16 {
SDP = 1;
RFCOMM = 3;
ATT = 7;
OBEX = 8;
BNEP = 15;
HIDP = 17;
HARDCOPY_CONTROL_CHANNEL = 18;
HARDCOPY_DATA_CHANNEL = 20;
HARDCOPY_NOTIFICATION = 22;
AVCTP = 23;
AVDTP = 25;
MCAP_CONTROL_CHANNEL = 30;
MCAP_DATA_CHANNEL = 31;
L2CAP = 256;
};
/// Defined PSMs from the Bluetooth Assigned Numbers
/// https://www.bluetooth.com/specifications/assigned-numbers/logical-link-control
/// Used in DataElement as protocol parameters for L2CAP.
const PSM_SDP uint16 = 1;
const PSM_RFCOMM uint16 = 3;
const PSM_TCSBIN uint16 = 5; // Telephony Control Specification
const PSM_TCSBIN_CORDLESS uint16 = 7;
const PSM_BNEP uint16 = 15; // Bluetooth Network Encapsulation Protocol
const PSM_HID_CONTROL uint16 = 17; // Human Interface Device
const PSM_HID_INTERRUPT uint16 = 19; // Human Interface Device
const PSM_AVCTP uint16 = 23; // Audio/Video Control Transport Protocol
const PSM_AVDTP uint16 = 25; // Audio/Video Distribution Transport Protocol
const PSM_AVCTP_BROWSE uint16 = 27; // Audio/Video Remote Control Profile (Browsing)
const PSM_ATT uint16 = 31; // ATT
const PSM_3DSP uint16 = 33; // 3D Synchronization Profile
const PSM_LE_IPSP uint16 = 35; // Internet Protocol Support Profile
const PSM_OTS uint16 = 37; // Object Transfer Service
/// Placeholder PSM value used to request a dynamic PSM. A valid dynamic PSM will be assigned to the
/// service during registration.
/// Used in DataElement as protocol parameters for L2CAP.
/// Note: This value is not a valid PSM in of itself, and is not defined in the Bluetooth
/// Assigned Numbers.
const PSM_DYNAMIC uint16 = 0xffff;
/// Identifies a communications protocol along with protocol-specific parameters.
/// Usually used to describe a protocol endpoint in a ProtocolDescriptorList.
/// Use `PSM_DYNAMIC` in the L2CAP protocol-specific `params` to specify a PSM that is dynamically
/// assigned.
type ProtocolDescriptor = struct {
protocol ProtocolIdentifier;
params vector<DataElement>:MAX_SEQUENCE_LENGTH;
};
/// A ProtocolDescriptorList is a list of protocols in a "stack" from lowest to highest,
/// Specifying a specific protocol endpoint that can be connected.
alias ProtocolDescriptorList = vector<ProtocolDescriptor>:MAX_SEQUENCE_LENGTH;
/// Identifiers that are valid for Bluetooth Classes / Profiles.
/// We intentionally omit classes and profile IDs that are unsupported, deprecated,
/// or reserved for use by Fuchsia Bluetooth.
/// These numbers are sourced from the Bluetooth Assigned Numbers for SDP.
/// https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
type ServiceClassProfileIdentifier = strict enum : uint16 {
// ServiceDiscoveryService and BrowseGroupDescriptorService claimed by Fuchsia
/// Serial Port Profile (SPP)
SERIAL_PORT = 0x1101;
// LANAccessUsingPPP omitted (deprecated)
/// Dial-up Networking Profile (DUN)
DIALUP_NETWORKING = 0x1103;
/// Object Push Profile (OPP)
OBEX_OBJECT_PUSH = 0x1105;
/// File Transfer Profile (FTP)
OPEX_FILE_TRANSFER = 0x1106;
/// Headset Profile (HSP)
HEADSET = 0x1108;
// CordlessTelephony (CTP) omitted (deprecated)
// Fax Profile (FAX) omitted (deprecated)
HEADSET_AUDIO_GATEWAY = 0x1112;
HEADSET_HS = 0x1131;
/// Advanced Audio Distribution Profile (A2DP)
AUDIO_SOURCE = 0x110A;
AUDIO_SINK = 0x110B;
ADVANCED_AUDIO_DISTRIBUTION = 0x110D;
/// Audio/Video Remote Control Profile (AVRCP)
AV_REMOTE_CONTROL_TARGET = 0x110C;
AV_REMOTE_CONTROL = 0x110E;
AV_REMOTE_CONTROL_CONTROLLER = 0x110F;
// Intercom (ICP) omitted (deprecated)
// Wap and Wap Client (WAP) omitted (deprecated)
// Synchronization Profile (SYNC) omitted (unsupported)
/// Personal Area Networking (PAN)
PANU = 0x1115;
NAP = 0x1116;
GN = 0x1117;
// Basic Printing and Basic Imaging Profiles omitted (unsupported)
/// Hands-Free Profile (HFP)
HANDSFREE = 0x111E;
HANDSFREE_AUDIO_GATEWAY = 0x111F;
/// Human Interface Device Profile (HID)
HUMAN_INTERFACE_DEVICE = 0x1124;
// Hardcopy Cable Replacement Profile omitted (unsupported)
/// Sim Access Profile (SAP)
SIM_ACCESS = 0x112D;
/// Phonebook Access Profile (PBAP)
PHONEBOOK_PCE = 0x112E;
PHONEBOOK_PSE = 0x112F;
PHONEBOOK = 0x1130;
/// Message Access Profile (MAP)
MESSAGE_ACCESS_SERVER = 0x1132;
MESSAGE_NOTIFICATION_SERVER = 0x1133;
MESSAGE_ACCESS_PROFILE = 0x1134;
// GNSS and 3DSP omitted (unsupported)
/// Multi-Profile Specification (MPS)
MPS_PROFILE = 0x113A;
MPS_CLASS = 0x113B;
// Calendar, Task, and Notes Profile omitted (unsupported)
/// Device Identification Profile (DI)
PNP_INFORMATION = 0x1200;
/// Generic Networking
GENERIC_NETWORKING = 0x1201;
/// Generic File Transfer
GENERIC_FILE_TRANSFER = 0x1202;
/// Generic Audio
GENERIC_AUDIO = 0x1203;
/// Generic Telephony
GENERIC_TELEPHONY = 0x1204;
// Enhanced Service Discovery Profile (ESDP) service classes omitted (deprecated).
/// Video Distribution Profile (VDP)
VIDEO_SOURCE = 0x1303;
VIDEO_SINK = 0x1304;
VIDEO_DISTRIBUTION = 0x1305;
/// Health Device Profile (HDP)
HDP = 0x1400;
HDP_SOURCE = 0x1401;
HDP_SINK = 0x1402;
};
/// A description of a profile that this service conforms to.
/// See Bluetooth Specification v5.2 Vol 3, Part B, Section 5.1.11
type ProfileDescriptor = struct {
profile_id ServiceClassProfileIdentifier;
major_version uint8;
minor_version uint8;
};
/// Maximum number of languages that are supported by SDP at the moment.
// Note: all informations must be within 0x0100 - 0x01FF per Spec Vol 3, Part B,
// Sec 5.1.8. Since each information consumes three spaces, this means there is
// a max of 256 / 3 = 85 supported.
const MAX_INFORMATION_COUNT uint8 = 85;
/// Human-readable information about a service. Strings are encoded in UTF-8.
/// See Bluetooth Specification v5.2 Vol 3, Part B, Sections 5.1.15 through 5.1.17
type Information = table {
/// Language that the other fields in this table are in.
/// Must be two characters long and a valid ICO 639:1988 identifier.
/// Must be present.
1: language string:2;
/// Service name
2: name string:MAX_STRING_LENGTH;
/// A human-readable description
3: description string:MAX_STRING_LENGTH;
/// The provider of this service (person or organization)
4: provider string:MAX_STRING_LENGTH;
};
/// A generic attribute, used for protocol information;
type Attribute = struct {
id uint16;
element DataElement;
};
/// Universal attribute IDs.
/// From the Bluetooth Specification v5.2, Vol 3, Part B
const ATTR_SERVICE_RECORD_HANDLE uint16 = 0x0000;
const ATTR_SERVICE_CLASS_ID_LIST uint16 = 0x0001;
const ATTR_SERVICE_RECORD_STATE uint16 = 0x0002;
const ATTR_SERVICE_ID uint16 = 0x0003;
const ATTR_PROTOCOL_DESCRIPTOR_LIST uint16 = 0x0004;
const ATTR_ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST uint16 = 0x000D;
const ATTR_BROWSE_GROUP_LIST uint16 = 0x0005;
const ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST uint16 = 0x0006;
const ATTR_SERVICE_INFO_TIME_TO_LIVE uint16 = 0x0007;
const ATTR_SERVICE_AVAILABILITY uint16 = 0x0008;
const ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST uint16 = 0x0009;
/// Maximum additional attributes as defined by the spec. All attributes
/// must be above 0x0200 per the Bluetooth Specfication, Ver 5.2 Vol 3, Part B,
/// Section 5
const MAX_ADDITIONAL_ATTRIBUTES uint16 = 0xFDFF;
/// Definition for a service that is to be advertised as available via Bluetooth BR/EDR.
type ServiceDefinition = table {
/// UUIDs of service classes that this service record conforms to.
/// This field is required - all advertised services must have at least one service class.
1: service_class_uuids vector<fuchsia.bluetooth.Uuid>:MAX_SEQUENCE_LENGTH;
/// Specification for the primary protocol that can be used to gain access to this
/// service, with their protocol-specific identifiers.
/// This is ordered from lowest level (typically L2CAP) to highest.
2: protocol_descriptor_list ProtocolDescriptorList;
/// Additional protocol descriptor lists, if the service requires more channels
/// in addition to the main service.
3: additional_protocol_descriptor_lists vector<ProtocolDescriptorList>:MAX_SEQUENCE_LENGTH;
/// Bluetooth profiles that are supported by this service.
4: profile_descriptors vector<ProfileDescriptor>:MAX_SEQUENCE_LENGTH;
/// Human-readable service information, in one or more languages.
/// The first set of information is considered the primary language.
5: information vector<Information>:MAX_INFORMATION_COUNT;
/// Additional attributes to be included in the Service Definition for specific
/// services or profiles.
/// All of these attributes should have an Attribute ID above 0x0200.
6: additional_attributes vector<Attribute>:MAX_ADDITIONAL_ATTRIBUTES;
};