blob: 5cee6100fbbbd697ea64acdce2d8187674aa594c [file] [log] [blame]
// 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.
#pragma once
#include <queue>
#include "src/connectivity/overnet/lib/environment/trace.h"
#include "src/connectivity/overnet/lib/links/packet_stuffer.h"
#include "src/connectivity/overnet/lib/packet_protocol/packet_protocol.h"
#include "src/connectivity/overnet/lib/routing/router.h"
namespace overnet {
class PacketLink : public Link, private PacketProtocol::PacketSender {
public:
static inline constexpr auto kModule = Module::PACKET_LINK;
PacketLink(Router* router, NodeId peer, uint32_t mss, uint64_t label);
void Close(Callback<void> quiesced) override final;
void Forward(Message message) override final;
void Process(TimeStamp received, Slice packet);
virtual void Emit(Slice packet) = 0;
fuchsia::overnet::protocol::LinkStatus GetLinkStatus() override final;
// Mark this link as inoperable
virtual void Tombstone();
const LinkStats* GetStats() const override final { return protocol_.stats(); }
private:
void SchedulePacket();
void SendPacket(SeqNum seq, LazySlice packet) override final;
Status ProcessBody(TimeStamp received, Slice packet);
Router* const router_;
Timer* const timer_;
const NodeId peer_;
const uint64_t label_;
uint64_t metrics_version_ = 1;
PacketProtocol protocol_;
bool sending_ = false;
bool closed_ = false;
class LinkSendRequest final : public PacketProtocol::SendRequest {
public:
LinkSendRequest(PacketLink* link);
~LinkSendRequest();
Slice GenerateBytes(LazySliceArgs args) override;
void Ack(const Status& status) override;
private:
const Op op_ = ScopedOp::current();
PacketLink* const link_;
bool blocking_sends_ = true;
};
// Pointer to a queue that's being used to queue pending sends.
// This queue is held on the stack within SendPacket().
std::queue<LazySlice>* send_packet_queue_ = nullptr;
PacketStuffer packet_stuffer_;
};
} // namespace overnet