|  | // Copyright 2019 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.test; | 
|  |  | 
|  | using fuchsia.bluetooth as bt; | 
|  | using fuchsia.bluetooth.bredr as bredr; | 
|  |  | 
|  | /// Error codes that can be generated for emulator-wide configurations. | 
|  | enum EmulatorError { | 
|  | FAILED = 1; | 
|  | HCI_ALREADY_PUBLISHED = 2; | 
|  | }; | 
|  |  | 
|  | /// Error codes that are generated for functions that manipulate fake peers. | 
|  | enum EmulatorPeerError { | 
|  | ADDRESS_REPEATED = 1; | 
|  | PARAMETERS_INVALID = 2; | 
|  | NOT_FOUND = 3; | 
|  | }; | 
|  |  | 
|  | // TODO(fxbug.dev/822): Add state structures for other LE and BR/EDR operations. | 
|  | // TODO(armansito): Add ability to publish GATT services | 
|  | // TODO(armansito): Add ability to publish SDP records | 
|  | // TODO(armansito): Add ability to specify Bluetooth HCI version. | 
|  |  | 
|  | /// Pre-set HCI configurations. | 
|  | enum HciConfig { | 
|  | /// Support both BR/EDR and LE in LMP features. | 
|  | DUAL_MODE = 1; | 
|  |  | 
|  | /// Limits supported features and HCI commands to those that are required for LE only. | 
|  | LE_ONLY = 2; | 
|  | }; | 
|  |  | 
|  | /// The HCI ACL data flow-control parameters. | 
|  | struct AclBufferSettings { | 
|  | /// ACL frame MTU in bytes. | 
|  | uint16 data_packet_length; | 
|  |  | 
|  | /// The maximum number of ACL frames that the controller can buffer. | 
|  | uint8 total_num_data_packets; | 
|  | }; | 
|  |  | 
|  | /// Controller settings used by the emulator. | 
|  | table EmulatorSettings { | 
|  | /// The `BD_ADDR` (BR/EDR) or LE Public Device Address. Defaults to "00:00:00:00:00:00". | 
|  | 1: bt.Address address; | 
|  |  | 
|  | /// Supported HCI command configuration. Defaults to "`DUAL_MODE`". | 
|  | 2: HciConfig hci_config; | 
|  |  | 
|  | /// True if the 5.0 extended advertising features are supported. Defaults to "false". | 
|  | 3: bool extended_advertising; | 
|  |  | 
|  | /// The ACL-U data buffer settings. Defaults to | 
|  | ///    data_packet_length: 1024 | 
|  | ///    total_num_data_packets: 5 | 
|  | /// IF `hci_config` is set to `DUAL_MODE`. Defaults to null otherwise. | 
|  | 4: AclBufferSettings acl_buffer_settings; | 
|  |  | 
|  | /// The LE-U ACL data buffer settings. Defaults to | 
|  | ///    data_packet_length: 251 | 
|  | ///    total_num_data_packets: 5 | 
|  | 5: AclBufferSettings le_acl_buffer_settings; | 
|  | }; | 
|  |  | 
|  | struct AdvertisingData { | 
|  | bytes:MAX_LEGACY_ADVERTISING_DATA_LENGTH data; | 
|  | }; | 
|  |  | 
|  | /// Parameters used to emulate a peer's behavior over the Low Energy transport. | 
|  | table LowEnergyPeerParameters { | 
|  | /// The LE identity address of the peer. This field is mandatory. | 
|  | 1: bt.Address address; | 
|  |  | 
|  | /// When present and true, the peer will send connectable advertisements and accept connection | 
|  | /// requests. The peer will ignore connection requests if not connectable. | 
|  | 2: bool connectable; | 
|  |  | 
|  | /// The advertising data contents. If not present, the advertising data sent by this peer will | 
|  | /// be empty. | 
|  | 3: AdvertisingData advertisement; | 
|  |  | 
|  | /// The scan response data contents. When present, the fake controller will generate scannable | 
|  | /// advertising packets and scan response events. | 
|  | 4: AdvertisingData scan_response; | 
|  | }; | 
|  |  | 
|  | /// Maximum service records that can be advertised at once. | 
|  | const uint8 MAX_PEER_SERVICES = 32; | 
|  |  | 
|  | /// Parameters used to emulate a peer's behavior over the BR/EDR transport. | 
|  | table BredrPeerParameters { | 
|  | /// The BD_ADDR of the peer. This field is mandatory. | 
|  | 1: bt.Address address; | 
|  |  | 
|  | /// When present and true, the peer will accept connection requests. The peer will ignore | 
|  | /// connection requests if not connectable. | 
|  | 2: bool connectable; | 
|  |  | 
|  | /// The device class reported in the inquiry response for this peer during device discovery. | 
|  | 3: bt.DeviceClass device_class; | 
|  |  | 
|  | // The peer's services that will be discoverable via Service Discovery Protocol. | 
|  | 4: vector<bredr.ServiceDefinition>:MAX_PEER_SERVICES service_definition; | 
|  | }; | 
|  |  | 
|  | enum ConnectionState { | 
|  | CONNECTED = 1; | 
|  | DISCONNECTED = 2; | 
|  | }; | 
|  |  | 
|  | /// Protocol used to drive the state of a fake peer device. | 
|  | protocol Peer { | 
|  | /// Assign a HCI `status` for the controller to generate in response to connection requests. | 
|  | /// Applies to all successive HCI_Create_Connection and HCI_LE_Create_Connection commands. The | 
|  | /// procedure is acknowledged with an empty response. | 
|  | AssignConnectionStatus(HciError status) -> (); | 
|  |  | 
|  | /// Emulates a LE connection event. Does nothing if the peer is already connected. The | 
|  | /// `role` parameter determines the link layer connection role. | 
|  | EmulateLeConnectionComplete(bt.ConnectionRole role); | 
|  |  | 
|  | /// Emulate disconnection. Does nothing if the peer is not connected. | 
|  | EmulateDisconnectionComplete(); | 
|  |  | 
|  | /// Watch connection state changes using the | 
|  | /// [hanging get pattern](/docs/development/api/fidl.md#delay-responses-using-hanging-gets). | 
|  | /// Notifies the most recent controller connection state if there has been a change since the | 
|  | /// last time this method was called. | 
|  | /// | 
|  | /// Multiple calls to this method can be outstanding at a given time. All calls will resolve in | 
|  | /// a response as soon as there is a change to the connection state. | 
|  | WatchConnectionStates() -> (vector<ConnectionState> states); | 
|  | }; | 
|  |  | 
|  | /// Protocol used to emulate a Bluetooth controller that supports the standard Bluetooth HCI. | 
|  | [Discoverable] | 
|  | protocol HciEmulator { | 
|  | /// Publish a bt-hci device using the provided `settings`. Each HciEmulator instance can only | 
|  | /// manage a single bt-hci device. Returns Emulator.`HCI_ALREADY_PUBLISHED` if the device has | 
|  | /// already been published. | 
|  | Publish(EmulatorSettings settings) -> () error EmulatorError; | 
|  |  | 
|  | /// Inserts a new LE peer device to be emulated by this controller. Once registered, the state | 
|  | /// of the fake peer can be driven and observed using the `peer` handle. | 
|  | /// | 
|  | /// A reply will be sent to acknowledge the creation of the fake peer. If a peer cannot be | 
|  | /// initialized (e.g. due to a missing required field in `parameters` or for containing an | 
|  | /// address that is already emulated) the `peer` handle will be closed and an error reply will | 
|  | /// be sent. | 
|  | /// | 
|  | /// The peer will appear in advertising reports and respond to requests according to its | 
|  | /// configuration as long as the `peer` channel is open. The emulator stops emulating this peer | 
|  | /// when the channel gets closed, which makes it no longer discoverable and not respond to any | 
|  | /// requests. | 
|  | AddLowEnergyPeer(LowEnergyPeerParameters parameters, request<Peer> peer) -> () error EmulatorPeerError; | 
|  |  | 
|  | /// Inserts a new BR/EDR peer device to be emulated by this controller. Once registered, the state | 
|  | /// of the fake peer can be driven and observed using the `peer` handle. | 
|  | /// | 
|  | /// A reply will be sent to acknowledge the creation of the fake peer. If a peer cannot be | 
|  | /// initialized (e.g. due to a missing required field in `parameters` or for containing an | 
|  | /// address that is already emulated) the `peer` handle will be closed and an error reply will | 
|  | /// be sent. | 
|  | /// | 
|  | /// The peer will appear in inquiry results and respond to requests according to its | 
|  | /// configuration as long as the `peer` channel is open. The emulator stops emulating this peer | 
|  | /// when the channel gets closed, which makes it no longer discoverable and not respond to any | 
|  | /// requests. | 
|  | AddBredrPeer(BredrPeerParameters parameters, request<Peer> peer) -> () error EmulatorPeerError; | 
|  |  | 
|  | /// Returns the current controller parameter state. If the parameters have not changed since the | 
|  | /// last time this message was received, then this method does not return until there is a | 
|  | /// change. | 
|  | /// (see [hanging get pattern](//docs/development/api/fidl.md#delay-responses-using-hanging-gets)) | 
|  | WatchControllerParameters() -> (ControllerParameters parameters); | 
|  |  | 
|  | /// Returns the most recent set of state transitions for the link layer LE scan procedure. This | 
|  | /// method returns when there has been a state change since the last invocation of this method | 
|  | /// by this client. | 
|  | /// | 
|  | /// Multiple calls to this method can be outstanding at a given time. All calls will resolve in | 
|  | /// a response as soon as there is a change to the scan state. | 
|  | /// (see [hanging get pattern](//docs/development/api/fidl.md#delay-responses-using-hanging-gets)) | 
|  | WatchLeScanStates() -> (vector<LeScanState> states); | 
|  |  | 
|  | /// Returns the most recent set of state transitions for the link layer LE legacy advertising | 
|  | /// procedure. This method returns when there has been a state change since the last invocation | 
|  | /// of this method by this client. | 
|  | /// | 
|  | /// Only one call to this method can be outstanding at a given time. The | 
|  | /// [`fuchsia.bluetooth.test/HciEmulator`] channel will be closed if a call received when one is | 
|  | /// already pending. | 
|  | /// (see [hanging get pattern](//docs/development/api/fidl.md#delay-responses-using-hanging-gets)) | 
|  | WatchLegacyAdvertisingStates() -> (vector<LegacyAdvertisingState> states); | 
|  | }; |