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