// 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); };