// 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.
library fuchsia.overnet.protocol;

using fuchsia.net;

/// Control frame sent over a link.
type LinkControlFrame = strict union {
    1: ack uint64;
    2: message LinkControlMessage;
};

/// Control message sent over a link.
type LinkControlMessage = struct {
    seq uint64;
    payload LinkControlPayload;
};

/// Control message payload.
type LinkControlPayload = strict union {
    /// Initial message.
    1: introduction LinkIntroduction;
    /// Configure some routes.
    /// Since the complete routing table might be longer than can fit in one frame, it may take
    /// multiple set_route messages to update a routing table. is_end will be set on the last frame
    /// of a given update round to signify that the update is done.
    2: set_route SetRoute;
};

/// Partial send of new routes.
type SetRoute = struct {
    /// Is this the last SetRoute frame in an update?
    is_end bool;
    /// Routes to add to the route map being sent.
    routes vector<Route>:MAX;
};

/// Update route visibility via a node.
type Route = struct {
    /// Target node id that can be routed to via this peer.
    destination NodeId;
    /// Metrics associated with this route.
    route_metrics RouteMetrics;
};

/// Metrics that may be used to determine the optimimum route for a packet.
type RouteMetrics = table {
    /// Intermediate proposed path to the destination (used for loop prevention).
    1: intermediate_hops vector<NodeId>:MAX;
    /// Round trip time to the destination and back (in microseconds).
    2: round_trip_time_us uint64;
};

/// Introduction data for a link - basic configuration stuff will go here.
type LinkIntroduction = table {
    /// For IP based link protocols: the address of the receiver of this introduction, as observed
    /// by the sender.
    1: you_are fuchsia.net.SocketAddress;
};
