| // 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.net; |
| |
| enum AddrInfoStatus { |
| ok = 0; |
| // invalid flags |
| bad_flags = 1; |
| // missing node name or service name |
| no_name = 2; |
| // temporary failure |
| again = 3; |
| // non-recoverable failure |
| fail = 4; |
| // no address found for node name |
| no_data = 5; |
| // argument buffer overflow |
| buffer_overflow = 6; |
| // system error |
| system_error = 7; |
| }; |
| |
| struct AddrInfoHints { |
| int32 flags; |
| int32 family; |
| int32 sock_type; |
| int32 protocol; |
| }; |
| |
| struct AddrStorage { |
| array<uint8>:16 val; |
| uint32 len; |
| }; |
| |
| struct AddrInfo { |
| int32 flags; |
| int32 family; |
| int32 sock_type; |
| int32 protocol; |
| AddrStorage addr; // TODO(FIDL-323): replace with vector<uint8>:16. |
| uint16 port; |
| }; |
| |
| // Chosen to match `sizeof(struct sockaddr_storage)`. |
| const uint64 MAX_ADDR = 128; |
| // Chosen to be large enough to hold whatever we might want to cram in it. |
| // So long as we support Ioctl, we don't have a good sense of what we might |
| // want to send as payload. |
| const uint64 MAX_BUFFER = 900; |
| |
| /// SocketProvider implements the POSIX sockets API. |
| [Discoverable, Layout = "Simple"] |
| protocol SocketProvider { |
| /// Requests a socket with the specified parameters. Values for |code| are defined in |
| /// errno.h. |
| Socket(int16 domain, int16 type, int16 protocol) -> (int16 code, handle<socket>? s); |
| /// Retrieves information about the address of a node and/or service. The number of valid |
| /// results in |res| is given by the |count| return value. |
| // TODO(FIDL-323): use vector<AddInfo>:4. |
| GetAddrInfo(string:256? node, string:256? service, AddrInfoHints? hints) |
| -> (AddrInfoStatus status, uint32 nres, array<AddrInfo>:4 res); |
| }; |
| |
| /// The control plane for a network socket. Once a socket has been retrieved from a |
| /// |SocketProvider|, 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. |
| [Transport = "SocketControl", Layout = "Simple"] |
| protocol SocketControl { |
| /// Sets the local address used for the socket. |
| Bind(vector<uint8>:MAX_ADDR addr) -> (int16 code); |
| /// Initiates a connection to a network endpoint. |
| Connect(vector<uint8>:MAX_ADDR addr) -> (int16 code); |
| /// Begin listening for new connections from network endpoints. At most |backlog| connections |
| /// will be buffered. |
| Listen(int16 backlog) -> (int16 code); |
| /// Accepts an incoming connection from a network endpoint. |
| Accept(int16 flags) -> (int16 code); |
| /// Closes the socket. |
| Close() -> (int16 code); |
| /// Retrieves the local socket address. |
| GetSockName() -> (int16 code, vector<uint8>:MAX_ADDR addr); |
| /// Retrieves the remote socket address. |
| GetPeerName() -> (int16 code, vector<uint8>:MAX_ADDR addr); |
| /// Sets a socket option. TODO(NET-1699): link to description of supported socket options. |
| SetSockOpt(int16 level, int16 optname, vector<uint8>:MAX_BUFFER optval) -> (int16 code); |
| /// Retrieves the current value of a socket option. TODO(NET-1699): link to description of |
| /// supported socket options. |
| GetSockOpt(int16 level, int16 optname) -> (int16 code, vector<uint8>:MAX_BUFFER optval); |
| /// Runs operations (e.g., get the receive timestamp of the last packet) on the socket. |
| Ioctl(int16 req, vector<uint8>:MAX_BUFFER in) -> (int16 code, vector<uint8>:MAX_BUFFER out); |
| }; |