// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef IPCZ_SRC_IPCZ_ROUTE_EDGE_H_ #define IPCZ_SRC_IPCZ_ROUTE_EDGE_H_ #include <optional> #include "ipcz/router_link.h" #include "ipcz/sequence_number.h" #include "ipcz/sublink_id.h" #include "third_party/abseil-cpp/absl/base/macros.h" #include "util/ref_counted.h" namespace ipcz { class NodeLink; class Router; class RouterLink; // A RouteEdge is responsible for message ingress and egress on one // (inward-facing or outward-facing) side of a router. Every functioning router // has one outward edge and (if proxying) one inward edge. // // Over the course of its lifetime a RouteEdge may utilize many different // RouterLinks, but at any moment it has at most two: one "primary" link and one // "decaying" link. // // The decaying link's usage is restricted to transmission and receipt of a // limited range of parcels based on SequenceNumber, and once all expected // parcels are sent and received, the link is dropped from the edge. // // When a RouteEdge has no decaying link, it may be able to transition its // primary link to a decaying link, while adopting a new primary link to take // its place. This process of incremental link replacement is the basis for ipcz // route reduction. // // This object is not thread-safe. class RouteEdge { … }; } // namespace ipcz #endif // IPCZ_SRC_IPCZ_ROUTE_EDGE_H_