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

/// Ipv4Address is expressed in network byte order, so the most significant byte
/// ("127" in the address "127.0.0.1") will be at index 0.
struct Ipv4Address {
    array<uint8>:4 addr;
};

/// Ipv6Address is expressed in network byte order, so the most significant byte
/// ("ff" in the address "ff02::1") will be at index 0.
struct Ipv6Address {
    array<uint8>:16 addr;
};

/// Represents an IP address that may be either v4 or v6.
union IpAddress {
    1: Ipv4Address ipv4;
    2: Ipv6Address ipv6;
};

/// Endpoint describes an IP address and port. The network protocol associated
/// with the Endpoint will be known from context or communicated through
/// additional structures.
struct Endpoint {
    /// The IP address of the endpoint.
    IpAddress addr;

    /// The port number of the endpoint.
    uint16 port;
};

/// Subnet describes an IP subnetwork, where all host IP addresses share the same most significant
/// bits.
struct Subnet {
    /// The Ipv4 or Ipv6 address. Only the `prefix_len` most significant bits may be set in `addr`;
    /// all bits in the host portion of the address must be zero.
    IpAddress addr;

    /// The prefix length of the netmask. E.g. for 192.168.1.0/24, the prefix
    /// length is 24, corresponding to a netmask of 255.255.255.0.
    /// For Ipv4, prefix_len must be in the range [0, 32].
    /// For Ipv6, prefix_len must be in the range [0, 128].
    uint8 prefix_len;
};

/// A MAC address used to identify a network interface on the data link layer within the network.
struct MacAddress {
    array<uint8>:6 octets;
};
