blob: 77291e8a37ca21715b0c4804b9e76e23d03f3286 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IPCZ_SRC_IPCZ_LOCAL_ROUTER_LINK_H_
#define IPCZ_SRC_IPCZ_LOCAL_ROUTER_LINK_H_
#include "ipcz/link_side.h"
#include "ipcz/router.h"
#include "ipcz/router_link.h"
#include "util/ref_counted.h"
namespace ipcz {
struct RouterLinkState;
// Local link between two Routers on the same node. This class is thread-safe.
//
// NOTE: This implementation must take caution when calling into any Router. See
// note on RouterLink's own class documentation.
class LocalRouterLink : public RouterLink {
public:
// Creates a new pair of LocalRouterLinks linking the given pair of Routers
// together. `type` must be either kCentral or kBridge, as local links may
// never be peripheral. `initial_state` determines whether the new link starts
// in a stable state.
//
// It is the caller's responsibilty to give the returned links to their
// respective Routers.
enum InitialState { kUnstable, kStable };
static RouterLink::Pair CreatePair(LinkType type,
const Router::Pair& routers,
InitialState initial_state = kUnstable);
// RouterLink:
LinkType GetType() const override;
RouterLinkState* GetLinkState() const override;
Ref<Router> GetLocalPeer() override;
RemoteRouterLink* AsRemoteRouterLink() override;
void AcceptParcel(Parcel& parcel) override;
void AcceptRouteClosure(SequenceNumber sequence_length) override;
void AcceptRouteDisconnected() override;
void MarkSideStable() override;
bool TryLockForBypass(const NodeName& bypass_request_source) override;
bool TryLockForClosure() override;
void Unlock() override;
bool FlushOtherSideIfWaiting() override;
bool CanNodeRequestBypass(const NodeName& bypass_request_source) override;
void BypassPeer(const NodeName& bypass_target_node,
SublinkId bypass_target_sublink) override;
void StopProxying(SequenceNumber inbound_sequence_length,
SequenceNumber outbound_sequence_length) override;
void ProxyWillStop(SequenceNumber inbound_sequence_length) override;
void BypassPeerWithLink(SublinkId new_sublink,
FragmentRef<RouterLinkState> new_link_state,
SequenceNumber inbound_sequence_length) override;
void StopProxyingToLocalPeer(
SequenceNumber outbound_sequence_length) override;
void Deactivate() override;
std::string Describe() const override;
private:
class SharedState;
LocalRouterLink(LinkSide side, Ref<SharedState> state);
~LocalRouterLink() override;
const LinkSide side_;
const Ref<SharedState> state_;
};
} // namespace ipcz
#endif // IPCZ_SRC_IPCZ_LOCAL_ROUTER_LINK_H_