blob: b8f6a7c2a133a79021761af0bc21366c498c84ca [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.net;
// Legacy interface to create a socket
enum SocketDomain {
inet = 2;
inet6 = 10;
};
enum SocketType {
stream = 1;
dgram = 2;
};
enum SocketProtocol {
ip = 0;
icmp = 1;
tcp = 6;
udp = 17;
ipv6 = 41;
icmpv6 = 58;
};
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;
};
// TODO(NET-1865): remove this, SocketDomain, SocketType, and SocketProtocol
// after Chromium rolls.
[Discoverable, Layout = "Simple"]
interface LegacySocketProvider {
1: OpenSocket(SocketDomain domain, SocketType type, SocketProtocol protocol)
-> (handle<socket>? s, int32 status);
// TODO(FIDL-323): use vector<AddInfo>:4.
2: GetAddrInfo(string:256? node, string:256? service, AddrInfoHints? hints)
-> (AddrInfoStatus status, uint32 nres, array<AddrInfo>:4 res);
};
// 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;
/// POSIX, as much as possible. |code| values are defined in errno.h.
[Discoverable, Layout = "Simple"]
interface SocketProvider {
Socket(int16 domain, int16 type, int16 protocol) -> (int16 code, handle<socket>? s);
// TODO(FIDL-323): use vector<AddInfo>:4.
GetAddrInfo(string:256? node, string:256? service, AddrInfoHints? hints)
-> (AddrInfoStatus status, uint32 nres, array<AddrInfo>:4 res);
};
// This interface is essentially POSIX. Its implementation must support
// Linux-specific arguments to {Get,Set}SockOpt.
[Transport = "SocketControl", Layout = "Simple"]
interface SocketControl {
Close() -> (int16 code);
Ioctl(int16 req, vector<uint8>:MAX_BUFFER in) -> (int16 code, vector<uint8>:MAX_BUFFER out);
Connect(vector<uint8>:MAX_ADDR addr) -> (int16 code);
Accept(int16 flags) -> (int16 code);
Bind(vector<uint8>:MAX_ADDR addr) -> (int16 code);
Listen(int16 backlog) -> (int16 code);
GetSockName() -> (int16 code, vector<uint8>:MAX_ADDR addr);
GetPeerName() -> (int16 code, vector<uint8>:MAX_ADDR addr);
SetSockOpt(int16 level, int16 optname, vector<uint8>:MAX_BUFFER optval) -> (int16 code);
GetSockOpt(int16 level, int16 optname) -> (int16 code, vector<uint8>:MAX_BUFFER optval);
};