blob: 2d17e3e2241b94fc20c4e22fd7792824a03401f3 [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.snoop;
using fuchsia.io as io;
using zx;
/// HCI packet format
/// Defined by the Core Specification (v5.4: Vol 4, Part E, Sec 5.4)
type PacketFormat = flexible enum {
/// Command sent to the controller from the host.
COMMAND = 1;
/// Exchange of data between host and controller.
ACL_DATA = 2;
/// Exchange of synchronous data (SCO or eSCO) betweeen host and controller.
SYNCHRONOUS_DATA = 3;
/// Used by the controller to notify the host when events occur.
EVENT = 4;
/// Used to exchange isochronous data between the host and controller.
ISO_DATA = 5;
};
type SnoopPacket = table {
/// true if this packet is sent from the controller to the host.
/// Always present.
1: is_received bool;
/// Packet format, determined by the transport.
/// Always present.
2: format PacketFormat;
/// Timestamp that the snoop service received the packet from a transport
/// as measured by the host system, in system monotonic time.
3: timestamp zx.Time;
/// Length of the packet. This may differ from the length of `data`
/// as payloads can be truncated for storage reasons.
4: length uint32;
/// Packet data. This may be truncated, but if non-empty contains the packet
/// data starting from the beginning.
5: data vector<uint8>:MAX;
};
type CaptureError = flexible union {
/// Unrecognized device name
1: UnrecognizedDeviceName table {};
};
type DevicePackets = table {
/// The device these packets were observed from.
/// Always provided.
1: host_device string:io.MAX_FILENAME;
/// Set of packets that were observed.
/// Always provided.
2: packets vector<SnoopPacket>:MAX;
};
open protocol PacketObserver {
/// Observe some packets which have been transmitted over HCI.
/// Return ack is used for flow control.
flexible Observe(DevicePackets) -> ();
/// Called when an error occurs either during capture or while starting
/// capture. The protocol will be closed after this is sent.
flexible Error(CaptureError);
};
/// Interface to receive packets recorded as received or transmitted for a Bluetooth host.
@discoverable
open protocol Snoop {
/// Subscribe to receive packets from the server. Packets that have been recorded are sent
/// first.
///
/// If `follow` is true, the protocol stays open and packets are returned to the client as
/// the snoop server receives them. If `follow` is missing or false, the client is closed
/// when all currently recorded packets have been sent.
///
/// A `host_device` name may be provided; if so, only events from that host are sent.
/// If `host_device` is absent, packets from all host devices are sent.
///
/// Errors are reported through the client.
flexible Start(resource table {
1: follow bool;
2: host_device string:io.MAX_FILENAME;
3: client client_end:PacketObserver;
});
};