46 #include <arpa/inet.h> 47 #include <sys/socket.h> 57 #include "debug/DistEthernet.hh" 58 #include "debug/DistEthernetPkt.hh" 59 #include "debug/EthernetData.hh" 66 #include "params/EtherLink.hh" 76 DPRINTF(DistEthernet,
"DistEtherLink::DistEtherLink() " 77 "link delay:%llu ticksPerByte:%f\n", p->delay, p->speed);
84 if (p->sync_repeat != 0) {
85 if (p->sync_repeat != p->delay)
86 warn(
"DistEtherLink(): sync_repeat is %lu and linkdelay is %lu",
87 p->sync_repeat, p->delay);
88 sync_repeat = p->sync_repeat;
90 sync_repeat = p->delay;
95 p->dist_rank, p->dist_size,
96 p->sync_start, sync_repeat,
this,
97 p->dist_sync_on_pseudo_op, p->is_switch,
114 if (if_name ==
"int0")
138 DPRINTF(DistEthernet,
"DistEtherLink::init() called\n");
145 DPRINTF(DistEthernet,
"DistEtherLink::startup() called\n");
167 DPRINTF(DistEthernetPkt,
"DistEtherLink::DistLink::rxDone() " 168 "packet received: len=%d\n", packet->length);
169 DDUMP(EthernetData, packet->data, packet->length);
192 DPRINTF(DistEthernet,
"packet not sent, link busy\n");
197 Tick delay = (
Tick)ceil(((
double)pkt->simLength * ticksPerByte) + 1.0);
206 parent->schedule(doneEvent,
curTick() + delay);
214 bool packet_exists = (packet !=
nullptr);
217 packet->serialize(
"packet", cp);
219 bool event_scheduled =
event->scheduled();
221 if (event_scheduled) {
222 Tick event_time =
event->when();
233 packet = make_shared<EthPacketData>();
234 packet->unserialize(
"packet", cp);
237 bool event_scheduled;
239 if (event_scheduled) {
242 parent->schedule(*
event, event_time);
259 DistEtherLinkParams::create()
Model for a receive link.
Ports are used to interface objects to each other.
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
void serialize(CheckpointOut &cp) const override
Serialize an object.
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
#define DDUMP(x, data, count)
DistEtherLink(const Params *p)
Overload hash function for BasicBlockRange type.
TxLink * txLink
Send link.
std::enable_if< std::is_integral< T >::value, T >::type random()
Use the SFINAE idiom to choose an implementation based on whether the type is integral or floating po...
DistEtherLinkParams Params
#define UNSERIALIZE_SCALAR(scalar)
Tick curTick()
The current simulated tick.
void packetOut(EthPacketPtr pkt, Tick send_delay)
Send out an Ethernet packet.
void setDistInt(DistIface *m)
Register our dist interface to talk to the peer gem5 processes.
DistIface * distIface
Interface to talk to the peer gem5 processes.
void init(const Event *e, Tick link_delay)
void setLocalInt(LocalIface *i)
uint64_t Tick
Tick count type.
const EventFunctionWrapper * doneEvent() const
Done events will be scheduled by DistIface (so we need the accessor)
void setDistInt(DistIface *m)
Register the dist interface to be used to talk to the peer gem5 processes.
Model for a fixed bandwidth full duplex ethernet link.
virtual void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
std::shared_ptr< EthPacketData > EthPacketPtr
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
void serialize(CheckpointOut &cp) const override
Serialize an object.
virtual const std::string name() const
#define SERIALIZE_SCALAR(scalar)
bool sendPacket(EthPacketPtr packet)
virtual void startup() override
startup() is the final initialization call before simulation.
Interface to the local simulated system.
std::ostream CheckpointOut
void unserialize(CheckpointIn &cp) override
Unserialize an object.
RxLink * rxLink
Receive link.
EthPacketPtr packetIn()
Fetch the packet scheduled to be received next by the simulated network link.
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
LocalIface(const std::string &name, TxLink *tx, RxLink *rx, DistIface *m)
void dump()
Dump all statistics data to the registered outputs.
void txDone()
Send done callback.
void rxDone()
Receive done callback method.
The interface class to talk to peer gem5 processes.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Abstract superclass for simulation objects.
bool transmit(EthPacketPtr packet)
Initiate sending of a packet via this link.