// 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.virtualization;

using zx;

// |HOST_CID| is the reserved context ID (CID) of the host.
//
// CIDs for guests are assigned by the Manager and can be found in the
// corresponding |InstanceInfo| structure.
const uint32 HOST_CID = 2;

// Exposed by guests capable of listening via vsocks. On a request to establish
// a connection, the |Accept| method will be called. If the port is open and
// accepting connections, the implementation should return |ZX_OK|.
//
// Also see |GuestVsockEndpoint|.
protocol GuestVsockAcceptor {
    Accept(uint32 src_cid, uint32 src_port, uint32 port, handle? handle)
        -> (zx.status status);
};

// Exposed by a host capable of listening via vsocks. A variant of a
// |GuestVsockAcceptor| that is responsible for creating the |handle| with which
// to communicate. The |handle| will be either a socket or a channel, depending
// on the current configuration.
protocol HostVsockAcceptor {
    Accept(uint32 src_cid, uint32 src_port, uint32 port)
        -> (zx.status status, handle? handle);
};

// Exposed by a host capable of connecting via vsocks. This allows a guest to
// identify itself via {src_cid, src_port}, and request to connect to
// {cid, port}. The host should return |ZX_OK|, and create a handle with which
// to communicate. The |handle| will be either a socket or a channel, depending
// on the current configuration.
protocol HostVsockConnector {
    Connect(uint32 src_cid, uint32 src_port, uint32 cid, uint32 port)
        -> (zx.status status, handle? handle);
};

// Exposed by guests capable of handling vsock traffic. During
// initialization the Manager will assign a unique CID to this endpoint and
// provide a |HostVsockConnector| that can be used to establish outbound
// connections. The implementation should provide a |GuestVsockAcceptor|
// implementation that can handle any inbound connection requests.
[Discoverable]
protocol GuestVsockEndpoint {
    SetContextId(uint32 cid, HostVsockConnector connector,
                 request<GuestVsockAcceptor> acceptor);
    -> OnShutdown(uint32 src_cid, uint32 src_port, uint32 dst_cid, uint32 dst_port);
};

// Exposed by a host to provide the ability for listeners to be multiplexed by
// port and to manage dynamic port allocation for outbound connections.
protocol HostVsockEndpoint {
    // Register |acceptor| to be invoked for any connection requests to |port|.
    Listen(uint32 port, HostVsockAcceptor acceptor)
        -> (zx.status status);

    // Similar to |HostVsockConnector.Connect| except the |src_cid| is
    // |HOST_CID| and |src_port| is generated automatically.
    Connect(uint32 cid, uint32 port, handle? handle)
        -> (zx.status status);
};
