// Copyright 2020 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.
@available(added=7)
library fuchsia.net.routes;

using fuchsia.net;
using zx;

/// Collection of addresses and identifiers describing a network destination.
///
/// A `Destination` is the "next-hop" for a routed packet.
type Destination = table {
    /// The IP address of the destination.
    1: address fuchsia.net.IpAddress;
    /// The MAC address of the destination. Only set if the destination is on a
    /// link that requires a MAC address.
    2: mac fuchsia.net.MacAddress;
    /// The interface identifier over which the destination can be reached.
    3: interface_id fuchsia.net.interface_id;
    /// The preferred local IP address used to communicate with the destination.
    4: source_address fuchsia.net.IpAddress;
};

/// Provides access to the system's routing state.
@discoverable
protocol State {
    /// Resolves the route to a destination.
    ///
    /// + request `destination` the IP address to resolve a route to. If the
    ///     unspecified address (all zeroes) is provided, the default route will
    ///     be returned. The variant of `destination` determines variant of
    ///     [`fuchsia.net/IpAddress`] fields in the resolved route.
    /// - response `result` contains the resolved route to `destination`.
    /// * error `ZX_ERR_ADDRESS_UNREACHABLE` if `destination` can't be resolved.
    // TODO(brunodalbo) In the future we may have multiple tables and we may
    // want to let the caller specify which table to use. Alternatively, if
    // multiple tables are accessed through scoped objects, a `Resolve` call in
    // a table would have the same effect.
    Resolve(struct {
        destination fuchsia.net.IpAddress;
    }) -> (struct {
        /// A resolved route.
        ///
        /// Contains the information for the "next-hop" or immediate-destination
        /// that is the result of a route resolution. A resolved route is only
        /// meaningful in the context of a requested destination.
        result @generated_name("Resolved") strict union {
            /// The requested destination is directly reachable.
            1: direct Destination;
            /// The requested destination is reachable through a gateway, thus
            /// the next hop is the gateway.
            2: gateway Destination;
        };
    }) error zx.status;
};
