blob: 94a33d881ca78c2fc0ab354bd06d5aed9d77b850 [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;
using zx;
// TODO(ctiller): make this fuchsia.io.MAX_FILENAME
const uint64 MAX_SERVICE_NAME_LENGTH = 255;
/// Peer-to-peer protocol between two Overnet nodes.
/// Client QUIC connections send this xunion to servers over QUIC stream 0.
union PeerMessage {
/// Request to create a channel to a service exported by this peer.
1: ConnectToService connect_to_service;
/// Update this peers description on the server.
2: PeerDescription update_node_description;
3: reserved;
/// Open a transfered stream.
4: OpenTransfer open_transfer;
5: reserved;
};
/// Overall connection configuration request
table ConfigRequest {
};
/// Overall connection configuration response - sent as the first response
/// message on the connection stream.
table ConfigResponse {
};
/// Reply messages for PeerMessage, where appropriate.
/// The ConfigResponse message must have been sent already.
union PeerReply {
/// Acknowledge an UpdateLinkStatus message
1: Empty update_link_status_ack;
2: reserved;
};
struct Empty {
};
/// Create a new stream, labelled `stream_id`, to communicate with the
/// advertised service `service_name`.
struct ConnectToService {
/// Which service to connect to.
string:MAX_SERVICE_NAME_LENGTH service_name;
/// On which QUIC stream will this service connection be formed.
StreamRef stream_ref;
/// The channel rights for this connection.
ChannelRights rights;
/// Ancillary options for this connection.
ConnectToServiceOptions options;
};
/// Options for service connection formation.
table ConnectToServiceOptions {
};
/// Create a new stream, labelled `stream_id`, to finalize the transfer
/// labelled `transfer_key`.
struct OpenTransfer {
/// On which QUIC stream will this service connection be formed.
StreamId stream_id;
/// Transfer key tracking the transfer.
TransferKey transfer_key;
};
/// Description of a single node.
table PeerDescription {
/// The set of services published by this node.
1: vector<string:MAX_SERVICE_NAME_LENGTH>:MAX services;
};
/// Metrics associated with a link.
/// Note that a link is a uni-directional connection between two nodes.
table LinkMetrics {
/// Current round trip time for requests across this link in microseconds.
1: uint64 round_trip_time;
};
/// Status packet for a single link. A link is a unidirectional connection
/// between two peers, and is owned by the first peer. The target node is
/// identified by `to`.
struct LinkStatus {
/// Link target node.
NodeId to;
/// An identifier (chosen by the link owner) to label this link.
/// The link owner must guarantee that the tuple (to, local_id) is unique
/// for each of it's held links.
LinkId local_id;
/// Metrics associated with this link.
LinkMetrics metrics;
};
/// Stream control message: sent instead of usual stream frames if the frame
/// type is 1 (StreamControl).
/// TODO: consider defining the stream framing format in FIDL also.
union StreamControl {
/// A transfer is beginning: the sending node would like to transfer
/// control.
1: BeginTransfer begin_transfer;
/// Acknowledge a begin_transfer - the sender has seen a previously sent
/// begin_transfer, and responded to it.
/// This should be the last message sent on a regular stream.
2: Empty ack_transfer;
/// End a transfer - signal that a drain stream has finished draining.
/// This should be the last message sent on a drain stream.
3: Empty end_transfer;
/// Shutdown the stream with some status.
4: zx.status shutdown;
};
/// Body for [`fuchsia.overnet.protocol/StreamControl.begin_transfer`].
struct BeginTransfer {
/// The new owner of this stream endpoint.
NodeId new_destination_node;
/// A key to identify this transfer of ownership.
TransferKey transfer_key;
};
/// A StreamRef identifies a new proxied stream, and details how that stream
/// will come to be on the receiving node.
union StreamRef {
/// A new proxy is being created, and the other end of the proxy is on the
/// sending node. This is the simple case, and we just communicate the QUIC
/// stream ID that will be used to carry traffic.
1: StreamId creating;
/// An existing proxy is being transferred to this node. This node should
/// initiate communication with the peer.
2: TransferInitiator transfer_initiator;
/// An existing proxy is being transferred to this node. This node should
/// await contact from the peer.
3: TransferWaiter transfer_waiter;
};
/// Body for [`fuchsia.overnet.protocol/StreamRef.transfer_initiator`].
struct TransferInitiator {
/// The drain stream for this transfer. Buffered messages from the old
/// proxy end will be sent via this unidirectional QUIC stream and should
/// be processed *prior* to processing any messages from the new endpoint.
StreamId stream_id;
/// The peer node id for this proxy that we should reach out to.
/// Note that this *may* be the same node that receives this message.
NodeId new_destination_node;
/// A key to identify this transfer of ownership.
TransferKey transfer_key;
};
/// Body for [`fuchsia.overnet.protocol/StreamRef.transfer_waiter`].
struct TransferWaiter {
/// The drain stream for this transfer. Buffered messages from the old
/// proxy end will be sent via this unidirectional QUIC stream and should
/// be processed *prior* to processing any messages from the new endpoint.
StreamId stream_id;
/// A key to identify this transfer of ownership.
TransferKey transfer_key;
};