blob: 43beddf5955ccccce85556112f9581416007bbb0 [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.
@available(added=16)
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;
using fuchsia.io;
const MAX_SERVICE_NAME_LENGTH uint64 = fuchsia.io.MAX_NAME_LENGTH;
/// Peer-to-peer protocol between two Overnet nodes.
/// Client QUIC connections send this xunion to servers over QUIC stream 0.
type PeerMessage = strict union {
/// Request to create a channel to a service exported by this peer.
1: connect_to_service ConnectToService;
/// Update this peers description on the server.
2: update_node_description PeerDescription;
/// Open a transfered stream.
4: open_transfer OpenTransfer;
};
/// Overall connection configuration request
type ConfigRequest = table {};
/// Overall connection configuration response - sent as the first response
/// message on the connection stream.
type ConfigResponse = table {};
/// Reply messages for PeerMessage, where appropriate.
/// The ConfigResponse message must have been sent already.
type PeerReply = strict union {
/// Acknowledge an UpdateLinkStatus message
1: update_link_status_ack Empty;
};
type Empty = struct {};
/// Create a new stream, labelled `stream_id`, to communicate with the
/// advertised service `service_name`.
type ConnectToService = struct {
/// Which service to connect to.
service_name string:MAX_SERVICE_NAME_LENGTH;
/// On which QUIC stream will this service connection be formed.
stream_ref StreamRef;
/// The channel rights for this connection.
rights ChannelRights;
/// Ancillary options for this connection.
options ConnectToServiceOptions;
};
/// Options for service connection formation.
type ConnectToServiceOptions = table {};
/// Create a new stream, labelled `stream_id`, to finalize the transfer
/// labelled `transfer_key`.
type OpenTransfer = struct {
/// On which QUIC stream will this service connection be formed.
stream_id StreamId;
/// Transfer key tracking the transfer.
transfer_key TransferKey;
};
/// Description of a single node.
type PeerDescription = table {
/// The set of services published by this node.
1: services vector<string:MAX_SERVICE_NAME_LENGTH>:MAX;
};
/// 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.
type StreamControl = strict union {
/// A transfer is beginning: the sending node would like to transfer
/// control.
1: begin_transfer BeginTransfer;
/// 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: ack_transfer Empty;
/// End a transfer - signal that a drain stream has finished draining.
/// This should be the last message sent on a drain stream.
3: end_transfer Empty;
/// Shutdown the stream with some status.
4: shutdown zx.Status;
};
/// Body for [`fuchsia.overnet.protocol/StreamControl.begin_transfer`].
type BeginTransfer = struct {
/// The new owner of this stream endpoint.
new_destination_node NodeId;
/// A key to identify this transfer of ownership.
transfer_key TransferKey;
};
/// A StreamRef identifies a new proxied stream, and details how that stream
/// will come to be on the receiving node.
type StreamRef = strict union {
/// 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: creating StreamId;
/// An existing proxy is being transferred to this node. This node should
/// initiate communication with the peer.
2: transfer_initiator TransferInitiator;
/// An existing proxy is being transferred to this node. This node should
/// await contact from the peer.
3: transfer_waiter TransferWaiter;
};
/// Body for [`fuchsia.overnet.protocol/StreamRef.transfer_initiator`].
type TransferInitiator = struct {
/// 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.
stream_id StreamId;
/// 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.
new_destination_node NodeId;
/// A key to identify this transfer of ownership.
transfer_key TransferKey;
};
/// Body for [`fuchsia.overnet.protocol/StreamRef.transfer_waiter`].
type TransferWaiter = struct {
/// 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.
stream_id StreamId;
/// A key to identify this transfer of ownership.
transfer_key TransferKey;
};