// Copyright 2013 The Chromium 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.netstack;

using fuchsia.net;
using zircon.ethernet;
using zx;

enum Protocol {
    UNSPECIFIED = 0;
    UDP = 1;
    TCP = 2;
};

enum Status {
    OK = 0;
    UNKNOWN_ERROR = 1;
    DNS_ERROR = 2;
    PARSE_ERROR = 3;
    IPV4_ONLY = 4;
    UNKNOWN_INTERFACE = 5;
};

struct NetErr {
    Status status;
    string message;
};

struct NetTrafficStats {
    // See network interface stats in Linux for future ideas:
    // https://chromium.googlesource.com/native_client/linux-headers-for-nacl/+/2dc04f8190a54defc0d59e693fa6cff3e8a916a9/include/linux/if_link.h#7

    uint64 pkts_total;
    uint64 pkts_echo_req; // request
    uint64 pkts_echo_rep; // reply
    uint64 pkts_echo_req_v6; // request
    uint64 pkts_echo_rep_v6; // reply

    uint64 bytes_total;
};

struct NetInterfaceStats {
    // Placeholder for all statistics regarding the network interface,
    // including, but not limited to traffic itself.

    int64 up_since; // Unix epoch.

    NetTrafficStats rx;
    NetTrafficStats tx;
};

struct IpStats {
    uint64 packets_received;
    uint64 invalid_addresses_received;
    uint64 packets_delivered;
    uint64 packets_sent;
    uint64 outgoing_packet_errors;
};

struct TcpStats {
    uint64 active_connection_openings;
    uint64 passive_connection_openings;
    uint64 failed_connection_attempts;
    uint64 valid_segments_received;
    uint64 invalid_segments_received;
    uint64 segments_sent;
    uint64 resets_sent;
};

struct UdpStats {
    uint64 packets_received;
    uint64 unknown_port_errors;
    uint64 receive_buffer_errors;
    uint64 malformed_packets_received;
    uint64 packets_sent;
};

// Mirrors tcpip.Stats in third_party/netstack/tcpip/tcpip.go.
struct AggregateStats {
    uint64 unknown_protocol_received_packets;
    uint64 malformed_received_packets;
    uint64 dropped_packets;
    IpStats ip_stats;
    TcpStats tcp_stats;
    UdpStats udp_stats;
};

struct InterfaceConfig {
    string name;
    IpAddressConfig ip_address_config;
};

union IpAddressConfig {
    fuchsia.net.Subnet static_ip;
    bool dhcp;
};

// https://linux.die.net/man/7/netdevice
struct NetInterface {
    uint32 id;
    uint32 flags;
    uint32 features;
    uint32 configuration;
    string name;
    fuchsia.net.IpAddress addr;
    fuchsia.net.IpAddress netmask;
    fuchsia.net.IpAddress broadaddr;
    vector<fuchsia.net.Subnet> ipv6addrs;
    vector<uint8> hwaddr;
};

// Flags for NetInterface.flags.
const uint32 NetInterfaceFlagUp = 0x01; // Set if the interface is up.
const uint32 NetInterfaceFlagDhcp = 0x02; // Set if DHCP is enabled.

struct RouteTableEntry {
    fuchsia.net.IpAddress destination;
    fuchsia.net.IpAddress netmask;
    fuchsia.net.IpAddress gateway;
    uint32 nicid;
};

struct SocketAddress {
    fuchsia.net.IpAddress addr;
    uint16 port;
};

[Discoverable]
interface Netstack {
    // Finds the port number from a given service name and protocol. [service] can be a
    // number like "42", or a service name like "http". If [protocol] is UNSPECIFIED,
    // the service is checked for TCP first, then UDP.
    2: GetPortForService(string service, Protocol protocol) -> (uint16 port);

    // Finds the IP address for a given host name and port. This may issue network
    // requests via DNS to look up domain names. E.g.
    // GetAddress("example.com", 80) -> [{142.42.42.1}]
    3: GetAddress(string address, uint16 port) -> (vector<SocketAddress> addresses, NetErr err);

    // Returns the list of registered network interfaces.
    4: GetInterfaces() -> (vector<NetInterface> interfaces);

    // DEPRECATED: see devicesettings.fidl
    // Returns the netstack's node name.
    // 5: GetNodeName() -> (string node_name);

    // Don't use this for read-modify-write.  Use StartRouteTableTransaction instead.
    5: GetRouteTable() -> (vector<RouteTableEntry> rt);

    // TODO (porce): Separate interfaces.
    6: GetStats(uint32 nicid) -> (NetInterfaceStats stats);

    // Get stats for all NICs on the stack.
    7: GetAggregateStats() -> (AggregateStats stats);

    // Sets the status (up or down) for the interface with the given nicid.
    8: SetInterfaceStatus(uint32 nicid, bool enabled);

    // DEPRECATED: Use StartRouteTableTransaction and SetRouteTable from there.
    // 9: SetRouteTable(vector<RouteTableEntry> rt);

    // Sets the address for the interface with the given nicid.
    // Masks off addr.PrefixLen bits from addr.Addr to set the subnet.
    10: SetInterfaceAddress(uint32 nicid, fuchsia.net.IpAddress addr, uint8 prefixLen) -> (NetErr result);

    // Removes the address for the interface with the given nicid.
    // Masks off addr.PrefixLen bits from addr.Addr to set the subnet.
    15: RemoveInterfaceAddress(uint32 nicid, fuchsia.net.IpAddress addr, uint8 prefixLen) -> (NetErr result);

    11: SetDhcpClientStatus(uint32 nicid, bool enabled) -> (NetErr result);

    12: BridgeInterfaces(vector<uint32> nicids) -> (NetErr result);

    // TODO(NET-1263): remove once we can use the ResolverAdmin interface
    16: SetNameServers(vector<fuchsia.net.IpAddress> servers);

    17: AddEthernetDevice(string topological_path, InterfaceConfig interfaceConfig, zircon.ethernet.Device device);

    // Begin a route transaction for atomically getting and setting the route
    // table.  Returns true if a transaction can be started.
    18: StartRouteTableTransaction(request<RouteTableTransaction> routeTableTransaction) -> (zx.status status);

    0x1000: -> OnInterfacesChanged(vector<NetInterface> interfaces);
};

// When Commit is called, the most recent SetRouteTable will be
// committed to the route tables.  Commit may be called multiple times.
[Discoverable]
interface RouteTableTransaction {
    1: GetRouteTable() -> (vector<RouteTableEntry> rt);

    2: SetRouteTable(vector<RouteTableEntry> rt);

    3: Commit() -> (zx.status status);
};
