// Copyright 2019 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.posix.socket;

using fuchsia.io;

/// Chosen to match `sizeof(struct sockaddr_storage)`.
using sockaddr = bytes:128;

/// Chosen to be large enough to hold whatever we might want to cram in it. So long as we support
/// socket options, we don't have a good sense of what we might want to send as payload.
//TODO(fxbug.dev/20966): link to description of supported socket options.
using sockopt = bytes:900;

/// The control plane for a network socket.
///
/// Once a socket has been retrieved from a `Provider`, this interface is then used to further
/// configure and use the socket. This interface is essentially POSIX. Its implementation must
/// support Linux-specific arguments to {Get,Set}SockOpt.
///
/// *Warning:* This protocol is not yet ready for direct use by clients. Instead, clients should
/// use the BSD sockets API to interact with sockets. We plan to change this protocol substantially
/// and clients that couple directly to this protocol will make those changes more difficult.
protocol Control {
    compose fuchsia.io.Node;

    /// Sets the local address used for the socket.
    Bind(sockaddr addr) -> (int16 code);
    /// Initiates a connection to a remote address.
    Connect(sockaddr addr) -> (int16 code);
    /// Begins listening for new incoming connections. At most `backlog` connections will be
    /// buffered.
    Listen(int16 backlog) -> (int16 code);
    /// Accepts a buffered incoming connection.
    Accept(int16 flags) -> (int16 code, Control? s);
    /// Retrieves the local socket address.
    GetSockName() -> (int16 code, sockaddr addr);
    /// Retrieves the remote socket address.
    GetPeerName() -> (int16 code, sockaddr addr);
    /// Sets the value of a socket option.
    SetSockOpt(int16 level, int16 optname, sockopt optval) -> (int16 code);
    /// Retrieves the value of a socket option.
    GetSockOpt(int16 level, int16 optname) -> (int16 code, sockopt optval);
};

/// Provider implements the POSIX sockets API.
[Discoverable]
protocol Provider {
    /// Requests a socket with the specified parameters. Values for `code` are defined in errno.h.
    Socket(int16 domain, int16 type, int16 protocol) -> (int16 code, Control? s);
};
