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