// 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.bluetooth;

/// Timestamp represents the number of seconds and nanoseconds since the Unix epoch.
struct Timestamp {
    /// Valid values for |subsec_nanos| can be greater than 10^9-1. Therefore the total
    /// seconds elapsed since the epoch is defined by the value of |seconds| plus
    /// |subsec_nanos| / 10^9 - the value of |seconds| alone may not be sufficient.
    ///
    /// It is invalid for the carry from |subsec_nanos| to overflow the |seconds| field.
    /// A client or server should reject such data as malformed.
    uint32 subsec_nanos;
    uint64 seconds;
};

/// Messages coming through the Host Controller Interface can be one of three types.
enum PacketType {
    /// Command sent from the host to the controller.
    CMD = 0;
    /// Event sent from the controller to the host.
    EVENT = 1;
    /// Data sent from the controller to the host.
    DATA = 2;
};

struct SnoopPacket {
    /// true if this packet is sent from the controller to the host.
    bool is_received;
    PacketType type;
    /// Timestamp that the bt-snoop service received the packet from a snoop channel as measured
    /// by the host system.
    Timestamp timestamp;
    /// Original length of the packet before truncation.
    uint32 original_len;
    /// Payload sent over the HCI.
    bytes payload;
};

/// Interface to receive packets recorded as received or transmitted for a Bluetooth host.
/// Packets are received by the client as datagrams through the fidl channel as |OnPacket|
/// events.
[Discoverable]
protocol Snoop {
    /// Subscribe to receive packets from the server. Packets that have been recorded are sent
    /// first.
    ///
    /// If |follow| is true, the channel stays open and packets are sent to the client as
    /// the snoop server receives them. If |follow| is false, the channel is closed by the server
    /// when all recorded packets have been sent.
    ///
    /// A |host_device| name may be provided; if so, only events from that host are sent to the client.
    /// If |host_device| is absent, the client is sent events from all host devices.
    ///
    /// Errors:
    ///   |Start| can only be called once per connection. After the first request, subsequent requests
    ///   always return an error.
    ///   |host_device| values that are not recognized by the server return an error.
    Start(bool follow, string? host_device) -> (fuchsia.bluetooth.Status status);

    /// An event containing a packet that the client has registered interest in receiving and the
    /// |host_device| which generated the packet.
    -> OnPacket(string host_device, SnoopPacket packet);
};
