| // 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; |
| |
| /// The maximum length of a hostname, as per |
| /// [RFC 1035 section 2.3.4](https://tools.ietf.org/html/rfc1035#section-2.3.4). |
| // TODO(https://fxbug.dev/42164951): inline this constant below. |
| const MAX_HOSTNAME_SIZE uint64 = 255; |
| |
| /// A hostname. |
| /// |
| /// Although the maximum length of a domain or hostname is 255 characters, |
| /// each label within a name must not be longer than 63 characters as per |
| /// [RFC 1035 section 2.3.4](https://tools.ietf.org/html/rfc1035#section-2.3.4). |
| /// A label in a host name is the alphanumeric characters or hyphens, seperated |
| /// by a period (e.g. abc.com has two labels, 'abc' and 'com'). |
| alias Hostname = string:MAX_HOSTNAME_SIZE; |
| |
| /// A unique non-zero interface identifier. |
| alias InterfaceId = uint64; |
| |
| /// IpVersion is an IP version. |
| type IpVersion = strict enum { |
| V4 = 1; |
| V6 = 2; |
| }; |
| |
| /// 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. |
| type Ipv4Address = struct { |
| // TODO(https://fxbug.dev/42094982): rename to octets. |
| addr array<uint8, 4>; |
| }; |
| |
| /// Ipv6Address is expressed in network byte order, so the most significant byte |
| /// ("ff" in the address "ff02::1") will be at index 0. |
| type Ipv6Address = struct { |
| // TODO(https://fxbug.dev/42094982): rename to octets. |
| addr array<uint8, 16>; |
| }; |
| |
| /// Represents an IP address that may be either v4 or v6. |
| type IpAddress = strict union { |
| 1: ipv4 Ipv4Address; |
| 2: ipv6 Ipv6Address; |
| }; |
| |
| // TODO(https://fxbug.dev/42131655): rename Subnet to AddressWithPrefix when |
| // binding support is ready, so we don't have to recursively fix all users. |
| /// An IP address with its subnet prefix length. |
| type Subnet = struct { |
| /// The IPv4 or IPv6 address. |
| addr IpAddress; |
| |
| /// The number of bits set to 1 in the subnet mask. |
| /// |
| /// When [`addr`] is [`IpAddress.ipv4`], must be in the range `[0, 32]`. |
| /// When [`addr`] is [`IpAddress.ipv6`], must be in the range `[0, 128]`. |
| // TODO(https://fxbug.dev/42094982): rename to prefix_length. |
| prefix_len uint8; |
| }; |
| |
| /// An IPv4 address with its subnet prefix length. |
| type Ipv4AddressWithPrefix = struct { |
| /// The IPv4 address. |
| addr Ipv4Address; |
| |
| /// The prefix length. Must be in the range [0, 32]. |
| prefix_len uint8; |
| }; |
| |
| /// An IPv6 address with its subnet prefix length. |
| type Ipv6AddressWithPrefix = struct { |
| /// The IPv6 address. |
| addr Ipv6Address; |
| |
| /// The prefix length. Must be in the range [0, 128]. |
| prefix_len uint8; |
| }; |
| |
| /// A MAC address used to identify a network interface on the data link layer within the network. |
| type MacAddress = struct { |
| octets array<uint8, 6>; |
| }; |
| |
| /// The metric of a route. Lower metrics indicate higher priority. |
| alias RouteMetric = uint32; |