blob: dc0bb42bcc19fcf4d09b88306dd78f0eceb62853 [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.
library fuchsia.vsock;
using zx;
using fuchsia.hardware.vsock;
/// Collection of objects that represent an open connection.
resource struct ConnectionTransport {
/// `data` socket that is ultimately given to the underlying vsock driver and
/// is where all incoming data can be received from.
zx.handle:SOCKET data;
/// `Connection` interface that is retained by a vsock service that can be
/// used to manipulate the state of a connection or perform more complex
/// operations than just sending and receiving on a socket.
request<Connection> con;
};
/// Interface for manipulating the state of an active connection.
protocol Connection {
/// Trigger asynchronous shutdown. The underlying channel will be closed
/// once shutdown is complete. Shutdown has an implicit barrier as any already
/// queued sends will complete, but any additional sends will generate errors
Shutdown();
/// Send a VMO. The reply indicates that the VMO send has finished and that
/// data may be queued on the socket again without causing races.
SendVmo(zx.handle:VMO vmo, uint64 off, uint64 len) -> (zx.status status);
};
/// Interface presented by a listener to accept or reject connections
protocol Acceptor {
/// The response is either a `ConnectionTransport` to indicate that the connection
/// is accepted, or none to indicate that it should be rejected.
Accept(fuchsia.hardware.vsock.Addr addr) -> (ConnectionTransport? con);
};
/// Exposed by a service that can act as a bridge to the underlying vsock driver and
/// provides the ability for listeners to be multiplexed by port and manages dynamic
/// port allocation for outbound connections.
[Discoverable]
protocol Connector {
/// Attempt to establish a connection to the specified remote cid/port pair.
/// No local port is specified as an ephemeral one will automatically be allocated.
Connect(uint32 remote_cid, uint32 remote_port, ConnectionTransport con) -> (zx.status status, uint32 local_port);
/// Registers a listener for a local port. There can only be one listener for
/// a single port at a time.
Listen(uint32 local_port, Acceptor acceptor) -> (zx.status status);
};