| // 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 MAX_SERVICE_NAME_LENGTH uint64 = 255; |
| |
| /// 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; |
| 3: reserved; |
| /// Open a transfered stream. |
| 4: open_transfer OpenTransfer; |
| 5: reserved; |
| }; |
| |
| /// 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; |
| 2: reserved; |
| }; |
| |
| 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; |
| }; |