45#include <sys/socket.h>
55#include "debug/DistEthernet.hh"
56#include "debug/DistEthernetPkt.hh"
57#include "debug/EthernetData.hh"
64#include "params/EtherLink.hh"
75 DPRINTF(DistEthernet,
"DistEtherLink::DistEtherLink() "
76 "link delay:%llu ticksPerByte:%f\n",
p.delay,
p.speed);
83 if (
p.sync_repeat != 0) {
84 if (
p.sync_repeat !=
p.delay)
85 warn(
"DistEtherLink(): sync_repeat is %lu and linkdelay is %lu",
86 p.sync_repeat,
p.delay);
87 sync_repeat =
p.sync_repeat;
89 sync_repeat =
p.delay;
94 p.dist_rank,
p.dist_size,
95 p.sync_start, sync_repeat,
this,
96 p.dist_sync_on_pseudo_op,
p.is_switch,
113 if (if_name ==
"int0")
137 DPRINTF(DistEthernet,
"DistEtherLink::init() called\n");
144 DPRINTF(DistEthernet,
"DistEtherLink::startup() called\n");
166 DPRINTF(DistEthernetPkt,
"DistEtherLink::DistLink::rxDone() "
167 "packet received: len=%d\n", packet->length);
168 DDUMP(EthernetData, packet->data, packet->length);
191 DPRINTF(DistEthernet,
"packet not sent, link busy\n");
196 Tick delay = (
Tick)ceil(((
double)pkt->simLength * ticksPerByte) + 1.0);
205 parent->schedule(doneEvent,
curTick() + delay);
213 bool packet_exists = (packet !=
nullptr);
216 packet->serialize(
"packet", cp);
218 bool event_scheduled =
event->scheduled();
220 if (event_scheduled) {
221 Tick event_time =
event->when();
232 packet = std::make_shared<EthPacketData>();
233 packet->unserialize(
"packet", cp);
236 bool event_scheduled;
238 if (event_scheduled) {
241 parent->schedule(*
event, event_time);
#define DDUMP(x, data, count)
DPRINTF is a debugging trace facility that allows one to selectively enable tracing statements.
void setLocalInt(LocalIface *i)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
void serialize(CheckpointOut &cp) const override
Serialize an object.
Interface to the local simulated system.
LocalIface(const std::string &name, TxLink *tx, RxLink *rx, DistIface *m)
Model for a receive link.
const EventFunctionWrapper * doneEvent() const
Done events will be scheduled by DistIface (so we need the accessor)
void setDistInt(DistIface *m)
Register our dist interface to talk to the peer gem5 processes.
void rxDone()
Receive done callback method.
void txDone()
Send done callback.
void setDistInt(DistIface *m)
Register the dist interface to be used to talk to the peer gem5 processes.
bool transmit(EthPacketPtr packet)
Initiate sending of a packet via this link.
DistEtherLinkParams Params
DistEtherLink(const Params &p)
virtual void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
DistIface * distIface
Interface to talk to the peer gem5 processes.
TxLink * txLink
Send link.
void serialize(CheckpointOut &cp) const override
Serialize an object.
virtual void startup() override
startup() is the final initialization call before simulation.
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
RxLink * rxLink
Receive link.
The interface class to talk to peer gem5 processes.
void init(const Event *e, Tick link_delay)
EthPacketPtr packetIn()
Fetch the packet scheduled to be received next by the simulated network link.
void packetOut(EthPacketPtr pkt, Tick send_delay)
Send out an Ethernet packet.
bool sendPacket(EthPacketPtr packet)
virtual std::string name() const
Ports are used to interface objects to each other.
Abstract superclass for simulation objects.
std::enable_if_t< std::is_integral_v< T >, T > random()
Use the SFINAE idiom to choose an implementation based on whether the type is integral or floating po...
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
void dump()
Dump all statistics data to the registered outputs.
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Tick curTick()
The universal simulation clock.
std::ostream CheckpointOut
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
uint64_t Tick
Tick count type.
std::shared_ptr< EthPacketData > EthPacketPtr
#define UNSERIALIZE_SCALAR(scalar)
#define SERIALIZE_SCALAR(scalar)