etherlink.cc (11263:8dcc6b40f164) etherlink.cc (11701:5e7599457b97)
1/*
2 * Copyright (c) 2015 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 178 unchanged lines hidden (view full) ---

187 DPRINTF(Ethernet, "packet not sent, link busy\n");
188 return false;
189 }
190
191 DPRINTF(Ethernet, "packet sent: len=%d\n", pkt->length);
192 DDUMP(EthernetData, pkt->data, pkt->length);
193
194 packet = pkt;
1/*
2 * Copyright (c) 2015 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 178 unchanged lines hidden (view full) ---

187 DPRINTF(Ethernet, "packet not sent, link busy\n");
188 return false;
189 }
190
191 DPRINTF(Ethernet, "packet sent: len=%d\n", pkt->length);
192 DDUMP(EthernetData, pkt->data, pkt->length);
193
194 packet = pkt;
195 Tick delay = (Tick)ceil(((double)pkt->length * ticksPerByte) + 1.0);
195 Tick delay = (Tick)ceil(((double)pkt->simLength * ticksPerByte) + 1.0);
196 if (delayVar != 0)
197 delay += random_mt.random<Tick>(0, delayVar);
198
199 DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n",
200 delay, ticksPerByte);
201 parent->schedule(doneEvent, curTick() + delay);
202
203 return true;

--- 26 unchanged lines hidden (view full) ---

230}
231
232void
233EtherLink::Link::unserialize(const string &base, CheckpointIn &cp)
234{
235 bool packet_exists;
236 paramIn(cp, base + ".packet_exists", packet_exists);
237 if (packet_exists) {
196 if (delayVar != 0)
197 delay += random_mt.random<Tick>(0, delayVar);
198
199 DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n",
200 delay, ticksPerByte);
201 parent->schedule(doneEvent, curTick() + delay);
202
203 return true;

--- 26 unchanged lines hidden (view full) ---

230}
231
232void
233EtherLink::Link::unserialize(const string &base, CheckpointIn &cp)
234{
235 bool packet_exists;
236 paramIn(cp, base + ".packet_exists", packet_exists);
237 if (packet_exists) {
238 packet = make_shared<EthPacketData>(16384);
238 packet = make_shared();
239 packet->unserialize(base + ".packet", cp);
240 }
241
242 bool event_scheduled;
243 paramIn(cp, base + ".event_scheduled", event_scheduled);
244 if (event_scheduled) {
245 Tick event_time;
246 paramIn(cp, base + ".event_time", event_time);
247 parent->schedule(doneEvent, event_time);
248 }
249
250 size_t tx_queue_size;
251 if (optParamIn(cp, base + ".tx_queue_size", tx_queue_size)) {
252 for (size_t idx = 0; idx < tx_queue_size; ++idx) {
253 Tick tick;
239 packet->unserialize(base + ".packet", cp);
240 }
241
242 bool event_scheduled;
243 paramIn(cp, base + ".event_scheduled", event_scheduled);
244 if (event_scheduled) {
245 Tick event_time;
246 paramIn(cp, base + ".event_time", event_time);
247 parent->schedule(doneEvent, event_time);
248 }
249
250 size_t tx_queue_size;
251 if (optParamIn(cp, base + ".tx_queue_size", tx_queue_size)) {
252 for (size_t idx = 0; idx < tx_queue_size; ++idx) {
253 Tick tick;
254 EthPacketPtr delayed_packet = make_shared<EthPacketData>(16384);
254 EthPacketPtr delayed_packet = make_shared();
255
256 paramIn(cp, csprintf("%s.txQueue[%i].tick", base, idx), tick);
257 delayed_packet->unserialize(
258 csprintf("%s.txQueue[%i].packet", base, idx), cp);
259
260 fatal_if(!txQueue.empty() && txQueue.back().first > tick,
261 "Invalid txQueue packet order in EtherLink!\n");
262 txQueue.emplace_back(std::make_pair(tick, delayed_packet));

--- 18 unchanged lines hidden ---
255
256 paramIn(cp, csprintf("%s.txQueue[%i].tick", base, idx), tick);
257 delayed_packet->unserialize(
258 csprintf("%s.txQueue[%i].packet", base, idx), cp);
259
260 fatal_if(!txQueue.empty() && txQueue.back().first > tick,
261 "Invalid txQueue packet order in EtherLink!\n");
262 txQueue.emplace_back(std::make_pair(tick, delayed_packet));

--- 18 unchanged lines hidden ---