blob: 57136b06fe7c10ea7ce4b81c15fb8c469a7b18a0 [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.overnet.protocol;
// WARNING: The overnet protocol is considered frozen and should not be
// modified. Future development will likely occur in a new protocol, such as
// is proposed in RFC-0228
using zx;
/// A single message proxied from a Zircon channel over an Overnet stream.
type ZirconChannelMessage = struct {
/// Bytes part of the payload.
bytes vector<uint8>:zx.CHANNEL_MAX_MSG_BYTES;
/// Handles part of the payload.
handles vector<ZirconHandle>:zx.CHANNEL_MAX_MSG_HANDLES;
};
/// A single handle to be proxied.
/// Not all Zircon types are supported.
type ZirconHandle = strict union {
/// A proxied channel.
1: channel ChannelHandle;
/// A proxied socket.
2: socket SocketHandle;
/// A proxied eventpair.
3: event_pair EventPairHandle;
};
/// A proxied channel.
type ChannelHandle = struct {
/// The handle rights that are given to this handle.
rights ChannelRights;
/// The Overnet proxy stream that was created to carry this channel.
/// The protocol over said stream will be a `ZirconChannel`.
stream_ref StreamRef;
};
/// The type of socket being communicated via [`fuchsia.overnet.protocol/SocketHandle`].
type SocketType = strict enum {
/// A datagram oriented socket.
DATAGRAM = 0;
/// A stream oriented socket.
STREAM = 1;
};
/// A proxied socket.
type SocketHandle = struct {
/// The handle rights that are given to this handle.
rights SocketRights;
/// The Overnet proxy stream that was created to carry this socket.
/// The protocol over said stream will be a `ZirconSocket`.
stream_ref StreamRef;
/// Socket options, per `zx_socket_create`.
socket_type SocketType;
};
/// A proxied eventpair.
type EventPairHandle = struct {
/// The handle rights that are given to this handle.
rights EventPairRights;
/// 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.
stream_ref StreamRef;
};
/// 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.
type ChannelRights = strict bits : 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.
type SocketRights = strict bits : 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.
type EventPairRights = strict bits : 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.
type Signals = strict bits : 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.
type SignalUpdate = table {
/// Update some signals
1: assert_signals Signals;
};