// 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.overnet.protocol;

using zx;

/// A single message proxied from a Zircon channel over an Overnet stream.
struct ZirconChannelMessage {
    /// Bytes part of the payload.
    vector<uint8>:zx.CHANNEL_MAX_MSG_BYTES bytes;
    /// Handles part of the payload.
    vector<ZirconHandle>:zx.CHANNEL_MAX_MSG_HANDLES handles;
};

/// A single handle to be proxied.
/// Not all Zircon types are supported.
union ZirconHandle {
    /// A proxied channel.
    1: ChannelHandle channel;
    /// A proxied socket.
    2: SocketHandle socket;
    /// A proxied eventpair.
    3: EventPairHandle event_pair;
};

/// A proxied channel.
struct ChannelHandle {
    /// The handle rights that are given to this handle.
    ChannelRights rights;
    /// The Overnet proxy stream that was created to carry this channel.
    /// The protocol over said stream will be a `ZirconChannel`.
    StreamRef stream_ref;
};

/// The type of socket being communicated via [`fuchsia.overnet.protocol/SocketHandle`].
enum SocketType {
    /// A datagram oriented socket.
    DATAGRAM = 0;
    /// A stream oriented socket.
    STREAM = 1;
};

/// A proxied socket.
struct SocketHandle {
    /// The handle rights that are given to this handle.
    SocketRights rights;
    /// The Overnet proxy stream that was created to carry this socket.
    /// The protocol over said stream will be a `ZirconSocket`.
    StreamRef stream_ref;
    /// Socket options, per `zx_socket_create`.
    SocketType socket_type;
};

/// A proxied eventpair.
struct EventPairHandle {
    /// The handle rights that are given to this handle.
    EventPairRights rights;
    /// The Overnet proxy stream that was created to carry this eventpair.
    /// No payloads will be sent over this stream, however transport and signal control messages
    /// will be per the normal StreamControl/SignalUpdate protocols used for all handle types.
    StreamRef stream_ref;
};

/// Channel rights.
/// Overnet treats rights as per-object type, to reduce the space of things that can be communicated
/// over its wire format. Transfer rights are always assumed present.
bits ChannelRights : uint32 {
    READ = 0x01;
    WRITE = 0x02;
};

/// Socket rights.
/// Overnet treats rights as per-object type, to reduce the space of things that can be communicated
/// over its wire format. Transfer rights are always assumed present.
bits SocketRights : uint32 {
    READ = 0x01;
    WRITE = 0x02;
};

/// EventPair rights.
/// Overnet treats rights as per-object type, to reduce the space of things that can be communicated
/// over its wire format. Transfer rights are always assumed present.
bits EventPairRights : uint32 {
    DO_NOT_USE = 0x80000000;
};

/// Signals that can be propagated.
/// These are deliberately chosen to be different bits than defined in Zircon, to force mapping code
/// to exist, and minimize the chance that Zircon ABI accidentally becomes Overnet protocol.
bits Signals : uint32 {
    USER_0 = 0x01;
    USER_1 = 0x02;
    USER_2 = 0x04;
    USER_3 = 0x08;
    USER_4 = 0x10;
    USER_5 = 0x20;
    USER_6 = 0x40;
    USER_7 = 0x80;
};

/// Signal state updates.
/// Transported as a side channel for each handle type, these propagate some signal bits.
table SignalUpdate {
    /// Update some signals
    1: Signals assert_signals;
};
