|  | // 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; | 
|  | }; |