INET Framework for OMNeT++/OMNEST
inet::EthernetMac Class Reference

A simplified version of EthernetCsmaMac. More...

#include <EthernetMac.h>

Inheritance diagram for inet::EthernetMac:
inet::EthernetMacBase inet::MacProtocolBase inet::queueing::IActivePacketSink inet::LayeredProtocolBase inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Public Member Functions

 EthernetMac ()
 
virtual void handleCanPullPacketChanged (cGate *gate) override
 Notifies about a change in the possibility of pulling some packet from the passive packet source at the given gate. More...
 
- Public Member Functions inherited from inet::EthernetMacBase
 EthernetMacBase ()
 
virtual ~EthernetMacBase ()
 
virtual MacAddress getMacAddress ()
 
double getTxRate ()
 
bool isActive ()
 
MacTransmitState getTransmitState ()
 
MacReceiveState getReceiveState ()
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
virtual void processAtHandleMessageFinished ()
 
void addPaddingAndSetFcs (Packet *packet, B requiredMinByteLength=MIN_ETHERNET_FRAME_BYTES) const
 Inserts padding in front of FCS and calculate FCS. More...
 
virtual queueing::IPassivePacketSourcegetProvider (cGate *gate) override
 Returns the passive packet source from where packets are pulled or nullptr if the connected module doesn't implement the interface. More...
 
virtual void handlePullPacketProcessed (Packet *packet, cGate *gate, bool successful) override
 Notifies about the completion of the packet processing for a packet that was pulled earlier independently whether the packet is passed or streamed. More...
 
- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 
- Public Member Functions inherited from inet::queueing::IActivePacketSink
virtual ~IActivePacketSink ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void initializeStatistics () override
 
virtual void initializeFlags () override
 
virtual void handleMessageWhenUp (cMessage *msg) override
 
virtual void finish () override
 
virtual void handleEndIFGPeriod ()
 
virtual void handleEndTxPeriod ()
 
virtual void handleEndPausePeriod ()
 
virtual void handleSelfMessage (cMessage *msg) override
 
virtual void startFrameTransmission ()
 
virtual void handleUpperPacket (Packet *pk) override
 
virtual void processMsgFromNetwork (EthernetSignalBase *signal)
 
virtual void processReceivedDataFrame (Packet *packet, const Ptr< const EthernetMacHeader > &frame)
 
virtual void processPauseCommand (int pauseUnits)
 
virtual void scheduleEndIFGPeriod ()
 
virtual void scheduleEndPausePeriod (int pauseUnits)
 
virtual void beginSendFrames ()
 
- Protected Member Functions inherited from inet::EthernetMacBase
virtual bool dropFrameNotForUs (Packet *packet, const Ptr< const EthernetMacHeader > &frame)
 Checks destination address and drops the frame when frame is not for us; returns true if frame is dropped. More...
 
virtual void readChannelParameters (bool errorWhenAsymmetric)
 Calculates datarates, etc. More...
 
virtual void printParameters ()
 
virtual void processConnectDisconnect ()
 
virtual void encapsulate (Packet *packet)
 
virtual void decapsulate (Packet *packet)
 
bool verifyCrcAndLength (Packet *packet)
 Verify ethernet packet: check FCS and payload length. More...
 
virtual void configureNetworkInterface () override
 
virtual void refreshDisplay () const override
 
virtual void receiveSignal (cComponent *src, simsignal_t signalId, cObject *obj, cObject *details) override
 
virtual void refreshConnection ()
 
void changeTransmissionState (MacTransmitState newState)
 
void changeReceptionState (MacReceiveState newState)
 
virtual void cutEthernetSignalEnd (EthernetSignalBase *signal, simtime_t duration)
 
virtual void txFinished ()
 
- Protected Member Functions inherited from inet::MacProtocolBase
 MacProtocolBase ()
 
virtual ~MacProtocolBase ()
 
virtual void registerInterface ()
 
virtual MacAddress parseMacAddressParameter (const char *addrstr)
 
virtual void deleteCurrentTxFrame ()
 
virtual void dropCurrentTxFrame (PacketDropDetails &details)
 
virtual void handleMessageWhenDown (cMessage *msg) override
 
virtual void sendUp (cMessage *message)
 
virtual void sendDown (cMessage *message)
 
virtual bool isUpperMessage (cMessage *message) const override
 
virtual bool isLowerMessage (cMessage *message) const override
 
virtual bool isInitializeStage (int stage) const override
 
virtual bool isModuleStartStage (int stage) const override
 
virtual bool isModuleStopStage (int stage) const override
 
virtual void flushQueue (PacketDropDetails &details)
 should clear queue and emit signal "packetDropped" with entire packets More...
 
virtual void clearQueue ()
 should clear queue silently More...
 
queueing::IPacketQueuegetQueue (cGate *gate) const
 
virtual bool canDequeuePacket () const
 
virtual PacketdequeuePacket ()
 
- Protected Member Functions inherited from inet::LayeredProtocolBase
virtual void handleUpperMessage (cMessage *message)
 
virtual void handleLowerMessage (cMessage *message)
 
virtual void handleUpperCommand (cMessage *message)
 
virtual void handleLowerCommand (cMessage *message)
 
virtual void handleLowerPacket (Packet *packet)
 
- Protected Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual int numInitStages () const override
 
virtual void refreshDisplay () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
virtual State getInitialOperationalState () const
 Returns initial operational state: OPERATING or NOT_OPERATING. More...
 
virtual void handleActiveOperationTimeout (cMessage *message)
 
virtual bool isUp () const
 utility functions More...
 
virtual bool isDown () const
 
virtual void setOperationalState (State newState)
 
virtual void scheduleOperationTimeout (simtime_t timeout)
 
virtual void setupActiveOperation (LifecycleOperation *operation, IDoneCallback *doneCallback, State)
 
virtual void delayActiveOperationFinish (simtime_t timeout)
 
virtual void startActiveOperationExtraTime (simtime_t delay=SIMTIME_ZERO)
 
virtual void startActiveOperationExtraTimeOrFinish (simtime_t extraTime)
 
virtual void finishActiveOperation ()
 

Protected Attributes

simtime_t totalSuccessfulRxTime
 
- Protected Attributes inherited from inet::EthernetMacBase
const char * displayStringTextFormat = nullptr
 
bool sendRawBytes = false
 
FcsMode fcsMode = FCS_MODE_UNDEFINED
 
const EtherDescrcurEtherDescr = nullptr
 
bool connected = false
 
bool promiscuous = false
 
bool duplexMode = false
 
bool frameBursting = false
 
cChannel * transmissionChannel = nullptr
 
cGate * physInGate = nullptr
 
cGate * physOutGate = nullptr
 
bool channelsDiffer = false
 
MacTransmitState transmitState = static_cast<MacTransmitState>(-1)
 
MacReceiveState receiveState = static_cast<MacReceiveState>(-1)
 
simtime_t lastTxFinishTime
 
int pauseUnitsRequested = 0
 
cMessage * endTxTimer = nullptr
 
cMessage * endIfgTimer = nullptr
 
cMessage * endPauseTimer = nullptr
 
EthernetSignalBasecurTxSignal = nullptr
 
unsigned long numFramesSent = 0
 
unsigned long numFramesReceivedOK = 0
 
unsigned long numBytesSent = 0
 
unsigned long numBytesReceivedOK = 0
 
unsigned long numFramesFromHL = 0
 
unsigned long numDroppedPkFromHLIfaceDown = 0
 
unsigned long numDroppedIfaceDown = 0
 
unsigned long numDroppedBitError = 0
 
unsigned long numDroppedNotForUs = 0
 
unsigned long numFramesPassedToHL = 0
 
unsigned long numPauseFramesRcvd = 0
 
unsigned long numPauseFramesSent = 0
 
- Protected Attributes inherited from inet::MacProtocolBase
int upperLayerInGateId = -1
 Gate ids. More...
 
int upperLayerOutGateId = -1
 
int lowerLayerInGateId = -1
 
int lowerLayerOutGateId = -1
 
opp_component_ptr< NetworkInterfacenetworkInterface
 
opp_component_ptr< cModule > hostModule
 
PacketcurrentTxFrame = nullptr
 Currently transmitted frame if any. More...
 
opp_component_ptr< queueing::IPacketQueuetxQueue
 Messages received from upper layer and to be transmitted later. More...
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Additional Inherited Members

- Public Types inherited from inet::EthernetMacBase
enum  MacTransmitState {
  TX_IDLE_STATE = 1, WAIT_IFG_STATE, SEND_IFG_STATE, TRANSMITTING_STATE,
  JAMMING_STATE, BACKOFF_STATE, PAUSE_STATE
}
 
enum  MacReceiveState { RX_IDLE_STATE = 1, RECEIVING_STATE, RX_COLLISION_STATE, RX_RECONNECT_STATE }
 
- Static Public Attributes inherited from inet::EthernetMacBase
static const double SPEED_OF_LIGHT_IN_CABLE = 200000000.0
 
- Protected Types inherited from inet::EthernetMacBase
enum  SelfMsgKindValues {
  ENDIFG = 100, ENDRECEPTION, ENDBACKOFF, ENDTRANSMISSION,
  ENDJAMMING, ENDPAUSE
}
 
enum  { NUM_OF_ETHERDESCRS = 11 }
 
- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 
- Static Protected Attributes inherited from inet::EthernetMacBase
static const EtherDescr etherDescrs [NUM_OF_ETHERDESCRS]
 
static const EtherDescr nullEtherDescr
 
static simsignal_t rxPkOkSignal = registerSignal("rxPkOk")
 
static simsignal_t txPausePkUnitsSignal = registerSignal("txPausePkUnits")
 
static simsignal_t rxPausePkUnitsSignal = registerSignal("rxPausePkUnits")
 
static simsignal_t transmissionStateChangedSignal = registerSignal("transmissionStateChanged")
 
static simsignal_t receptionStateChangedSignal = registerSignal("receptionStateChanged")
 

Detailed Description

A simplified version of EthernetCsmaMac.

Since modern Ethernets typically operate over duplex links where's no contention, the original CSMA/CD algorithm is no longer needed. This simplified implementation doesn't contain CSMA/CD, frames are just simply queued up and sent out one by one.

Constructor & Destructor Documentation

◆ EthernetMac()

inet::EthernetMac::EthernetMac ( )
28 {
29 }

Member Function Documentation

◆ beginSendFrames()

void inet::EthernetMac::beginSendFrames ( )
protectedvirtual
400 {
401  if (currentTxFrame) {
402  // Other frames are queued, transmit next frame
403  EV_DETAIL << "Transmit next frame in output queue\n";
405  }
406  else {
407  // No more frames set transmitter to idle
409  EV_DETAIL << "No more frames to send, transmitter set to idle\n";
410  }
411 }

Referenced by initialize().

◆ finish()

void inet::EthernetMac::finish ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

312 {
314 
315  simtime_t t = simTime();
316  simtime_t totalRxChannelIdleTime = t - totalSuccessfulRxTime;
317  recordScalar("rx channel idle (%)", 100 * (totalRxChannelIdleTime / t));
318  recordScalar("rx channel utilization (%)", 100 * (totalSuccessfulRxTime / t));
319 }

◆ handleCanPullPacketChanged()

void inet::EthernetMac::handleCanPullPacketChanged ( cGate *  gate)
overridevirtual

Notifies about a change in the possibility of pulling some packet from the passive packet source at the given gate.

This method is called, for example, when a new packet is inserted into a queue. It allows the sink to pull a new packet from the queue.

The gate parameter must be a valid gate of this module.

Implements inet::queueing::IActivePacketSink.

414 {
415  Enter_Method("handleCanPullPacketChanged");
416  if (currentTxFrame == nullptr && transmitState == TX_IDLE_STATE && canDequeuePacket()) {
417  Packet *packet = dequeuePacket();
418  handleUpperPacket(packet);
419  }
420 }

◆ handleEndIFGPeriod()

void inet::EthernetMac::handleEndIFGPeriod ( )
protectedvirtual
253 {
254  ASSERT(nullptr == currentTxFrame);
256  throw cRuntimeError("Not in WAIT_IFG_STATE at the end of IFG period");
257 
258  // End of IFG period, okay to transmit
259  EV_DETAIL << "IFG elapsed" << endl;
261 
262  if (canDequeuePacket()) {
263  Packet *packet = dequeuePacket();
264  handleUpperPacket(packet);
265  }
266 }

Referenced by handleSelfMessage().

◆ handleEndPausePeriod()

void inet::EthernetMac::handleEndPausePeriod ( )
protectedvirtual
322 {
323  ASSERT(nullptr == currentTxFrame);
324  if (transmitState != PAUSE_STATE)
325  throw cRuntimeError("End of PAUSE event occurred when not in PAUSE_STATE!");
326 
327  EV_DETAIL << "Pause finished, resuming transmissions\n";
329 
330  if (canDequeuePacket()) {
331  Packet *packet = dequeuePacket();
332  handleUpperPacket(packet);
333  }
334 }

Referenced by handleSelfMessage().

◆ handleEndTxPeriod()

void inet::EthernetMac::handleEndTxPeriod ( )
protectedvirtual
269 {
270  // we only get here if transmission has finished successfully
272  throw cRuntimeError("Model error: End of transmission, and incorrect state detected");
273 
274  if (nullptr == currentTxFrame)
275  throw cRuntimeError("Model error: Frame under transmission cannot be found");
276 
277  numFramesSent++;
278  numBytesSent += currentTxFrame->getByteLength();
279  emit(packetSentToLowerSignal, currentTxFrame); // consider: emit with start time of frame
280 
282  txFinished();
283 
284  const auto& header = currentTxFrame->peekAtFront<EthernetMacHeader>();
285  if (header->getTypeOrLength() == ETHERTYPE_FLOW_CONTROL) {
286  const auto& controlFrame = currentTxFrame->peekDataAt<EthernetControlFrameBase>(header->getChunkLength(), b(-1));
287  if (controlFrame->getOpCode() == ETHERNET_CONTROL_PAUSE) {
288  const auto& pauseFrame = CHK(dynamicPtrCast<const EthernetPauseFrame>(controlFrame));
290  emit(txPausePkUnitsSignal, pauseFrame->getPauseTime());
291  }
292  }
293 
294  EV_INFO << "Transmission of " << currentTxFrame << " successfully completed.\n";
296  lastTxFinishTime = simTime();
297 
298  if (pauseUnitsRequested > 0) {
299  // if we received a PAUSE frame recently, go into PAUSE state
300  EV_DETAIL << "Going to PAUSE mode for " << pauseUnitsRequested << " time units\n";
301 
304  }
305  else {
306  EV_DETAIL << "Start IFG period\n";
308  }
309 }

Referenced by handleSelfMessage().

◆ handleMessageWhenUp()

void inet::EthernetMac::handleMessageWhenUp ( cMessage *  msg)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

61 {
62  if (channelsDiffer)
64 
65  if (msg->isSelfMessage())
66  handleSelfMessage(msg);
67  else if (msg->getArrivalGateId() == upperLayerInGateId)
68  handleUpperPacket(check_and_cast<Packet *>(msg));
69  else if (msg->getArrivalGate() == physInGate)
70  processMsgFromNetwork(check_and_cast<EthernetSignalBase *>(msg));
71  else
72  throw cRuntimeError("Message received from unknown gate!");
74 }

◆ handleSelfMessage()

void inet::EthernetMac::handleSelfMessage ( cMessage *  msg)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

77 {
78  EV_TRACE << "Self-message " << msg << " received\n";
79 
80  if (msg == endTxTimer)
82  else if (msg == endIfgTimer)
84  else if (msg == endPauseTimer)
86  else
87  throw cRuntimeError("Unknown self message received!");
88 }

Referenced by handleMessageWhenUp().

◆ handleUpperPacket()

void inet::EthernetMac::handleUpperPacket ( Packet pk)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

128 {
129  //ASSERT2(false, "using EthernetMac");
130  EV_INFO << "Received " << packet << " from upper layer." << endl;
131 
132  numFramesFromHL++;
133  emit(packetReceivedFromUpperSignal, packet);
134 
135  auto frame = packet->peekAtFront<EthernetMacHeader>();
136  if (frame->getDest().equals(getMacAddress())) {
137  throw cRuntimeError("logic error: frame %s from higher layer has local MAC address as dest (%s)",
138  packet->getFullName(), frame->getDest().str().c_str());
139  }
140 
141  if (packet->getDataLength() > MAX_ETHERNET_FRAME_BYTES) { // FIXME two MAX FRAME BYTES in specif...
142  throw cRuntimeError("packet from higher layer (%s) exceeds maximum Ethernet frame size (%s)",
143  B(packet->getByteLength()).str().c_str(), MAX_ETHERNET_FRAME_BYTES.str().c_str());
144  }
145 
146  if (!connected) {
147  EV_WARN << "Interface is not connected -- dropping packet " << packet << endl;
148  PacketDropDetails details;
149  details.setReason(INTERFACE_DOWN);
150  emit(packetDroppedSignal, packet, &details);
152  delete packet;
153 
154  return;
155  }
156 
157  // fill in src address if not set
158  if (frame->getSrc().isUnspecified()) {
159  frame = nullptr; // drop shared ptr
160  auto newFrame = packet->removeAtFront<EthernetMacHeader>();
161  newFrame->setSrc(getMacAddress());
162  packet->insertAtFront(newFrame);
163  frame = newFrame;
164  }
165 
167  throw cRuntimeError("EthernetMac not in TX_IDLE_STATE when packet arrived from upper layer");
168  if (currentTxFrame != nullptr)
169  throw cRuntimeError("EthernetMac already has a transmit packet when packet arrived from upper layer");
171  currentTxFrame = packet;
173 }

Referenced by handleCanPullPacketChanged(), handleEndIFGPeriod(), handleEndPausePeriod(), and handleMessageWhenUp().

◆ initialize()

void inet::EthernetMac::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

32 {
34 
35  if (stage == INITSTAGE_LOCAL) {
36  if (!par("duplexMode"))
37  throw cRuntimeError("Half duplex operation is not supported by EthernetMac, use the EthernetCsmaMac module for that! (Please enable csmacdSupport on EthernetInterface)");
38  }
39  else if (stage == INITSTAGE_LINK_LAYER) {
40  beginSendFrames(); // FIXME choose an another stage for it
41  }
42 }

◆ initializeFlags()

void inet::EthernetMac::initializeFlags ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

53 {
55 
56  duplexMode = true;
57  physInGate->setDeliverImmediately(false);
58 }

◆ initializeStatistics()

void inet::EthernetMac::initializeStatistics ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

45 {
47 
48  // initialize statistics
50 }

◆ numInitStages()

virtual int inet::EthernetMac::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

30 { return NUM_INIT_STAGES; }

◆ processMsgFromNetwork()

void inet::EthernetMac::processMsgFromNetwork ( EthernetSignalBase signal)
protectedvirtual
176 {
177  EV_INFO << signal << " received." << endl;
178 
179  if (!connected) {
180  EV_WARN << "Interface is not connected -- dropping signal " << signal << endl;
181  if (dynamic_cast<EthernetSignal *>(signal)) { // do not count JAM and IFG packets
182  auto packet = check_and_cast<Packet *>(signal->decapsulate());
183  delete signal;
184  decapsulate(packet);
185  PacketDropDetails details;
186  details.setReason(INTERFACE_DOWN);
187  emit(packetDroppedSignal, packet, &details);
188  delete packet;
190  }
191  else
192  delete signal;
193 
194  return;
195  }
196 
197  emit(receptionEndedSignal, signal);
198 
199  totalSuccessfulRxTime += signal->getDuration();
200 
201  if (signal->getSrcMacFullDuplex() != duplexMode)
202  throw cRuntimeError("Ethernet misconfiguration: MACs on the same link must be all in full duplex mode, or all in half-duplex mode");
203 
204  if (dynamic_cast<EthernetFilledIfgSignal *>(signal))
205  throw cRuntimeError("There is no burst mode in full-duplex operation: EtherFilledIfg is unexpected");
206 
207  if (dynamic_cast<EthernetJamSignal *>(signal))
208  throw cRuntimeError("There is no JAM signal in full-duplex operation: EthernetJamSignal is unexpected");
209 
210  bool hasBitError = signal->hasBitError();
211  auto packet = check_and_cast<Packet *>(signal->decapsulate());
212  delete signal;
213  decapsulate(packet);
214  emit(packetReceivedFromLowerSignal, packet);
215 
216  if (hasBitError || !verifyCrcAndLength(packet)) {
217  EV_WARN << "Bit error/CRC error in incoming packet -- dropping packet " << EV_FIELD(packet) << EV_ENDL;
219  PacketDropDetails details;
220  details.setReason(INCORRECTLY_RECEIVED);
221  emit(packetDroppedSignal, packet, &details);
222  delete packet;
223  return;
224  }
225 
226  const auto& frame = packet->peekAtFront<EthernetMacHeader>();
227  if (dropFrameNotForUs(packet, frame))
228  return;
229 
230  if (frame->getTypeOrLength() == ETHERTYPE_FLOW_CONTROL) {
231  const auto& controlFrame = currentTxFrame->peekDataAt<EthernetControlFrameBase>(frame->getChunkLength(), b(-1));
232  if (controlFrame->getOpCode() == ETHERNET_CONTROL_PAUSE) {
233  auto pauseFrame = check_and_cast<const EthernetPauseFrame *>(controlFrame.get());
234  int pauseUnits = pauseFrame->getPauseTime();
235  EV_INFO << "Reception of PAUSE frame " << packet << " successfully completed." << endl;
236  delete packet;
238  emit(rxPausePkUnitsSignal, pauseUnits);
239  processPauseCommand(pauseUnits);
240  }
241  else {
242  EV_INFO << "Received unknown ethernet flow control frame " << EV_FIELD(packet) << ", dropped." << endl;
243  delete packet;
244  }
245  }
246  else {
247  EV_INFO << "Reception of " << EV_FIELD(packet) << " successfully completed." << endl;
248  processReceivedDataFrame(packet, frame);
249  }
250 }

Referenced by handleMessageWhenUp().

◆ processPauseCommand()

void inet::EthernetMac::processPauseCommand ( int  pauseUnits)
protectedvirtual
360 {
361  if (transmitState == TX_IDLE_STATE) {
362  EV_DETAIL << "PAUSE frame received, pausing for " << pauseUnitsRequested << " time units\n";
363  if (pauseUnits > 0)
364  scheduleEndPausePeriod(pauseUnits);
365  }
366  else if (transmitState == PAUSE_STATE) {
367  EV_DETAIL << "PAUSE frame received, pausing for " << pauseUnitsRequested
368  << " more time units from now\n";
369  cancelEvent(endPauseTimer);
370 
371  // Terminate PAUSE if pauseUnits == 0; Extend PAUSE if pauseUnits > 0
372  scheduleEndPausePeriod(pauseUnits);
373  }
374  else {
375  // transmitter busy -- wait until it finishes with current frame (endTx)
376  // and then it'll go to PAUSE state
377  EV_DETAIL << "PAUSE frame received, storing pause request\n";
378  pauseUnitsRequested = pauseUnits;
379  }
380 }

Referenced by processMsgFromNetwork().

◆ processReceivedDataFrame()

void inet::EthernetMac::processReceivedDataFrame ( Packet packet,
const Ptr< const EthernetMacHeader > &  frame 
)
protectedvirtual
337 {
338  // statistics
339  unsigned long curBytes = packet->getByteLength();
341  numBytesReceivedOK += curBytes;
342  emit(rxPkOkSignal, packet);
343 
344  const auto macAddressInd = packet->addTagIfAbsent<MacAddressInd>();
345  macAddressInd->setSrcAddress(frame->getSrc());
346  macAddressInd->setDestAddress(frame->getDest());
347  packet->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(&Protocol::ethernetMac);
348  packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(&Protocol::ethernetMac);
349  if (networkInterface)
350  packet->addTagIfAbsent<InterfaceInd>()->setInterfaceId(networkInterface->getInterfaceId());
351 
353  emit(packetSentToUpperSignal, packet);
354  // pass up to upper layer
355  EV_INFO << "Sending " << packet << " to upper layer.\n";
356  send(packet, upperLayerOutGateId);
357 }

Referenced by processMsgFromNetwork().

◆ scheduleEndIFGPeriod()

void inet::EthernetMac::scheduleEndIFGPeriod ( )
protectedvirtual
383 {
384  ASSERT(nullptr == currentTxFrame);
386  simtime_t endIFGTime = simTime() + (b(INTERFRAME_GAP_BITS).get() / curEtherDescr->txrate);
387  scheduleAt(endIFGTime, endIfgTimer);
388 }

Referenced by handleEndTxPeriod().

◆ scheduleEndPausePeriod()

void inet::EthernetMac::scheduleEndPausePeriod ( int  pauseUnits)
protectedvirtual
391 {
392  ASSERT(nullptr == currentTxFrame);
393  // length is interpreted as 512-bit-time units
394  simtime_t pausePeriod = ((pauseUnits * PAUSE_UNIT_BITS) / curEtherDescr->txrate);
395  scheduleAfter(pausePeriod, endPauseTimer);
397 }

Referenced by handleEndTxPeriod(), and processPauseCommand().

◆ startFrameTransmission()

void inet::EthernetMac::startFrameTransmission ( )
protectedvirtual
91 {
92  ASSERT(currentTxFrame);
93  EV_DETAIL << "Transmitting a copy of frame " << currentTxFrame << endl;
94 
95  Packet *frame = currentTxFrame->dup(); // note: we need to duplicate the frame because we emit a signal with it in endTxPeriod()
96  const auto& hdr = frame->peekAtFront<EthernetMacHeader>(); // note: we need to duplicate the frame because we emit a signal with it in endTxPeriod()
97  ASSERT(hdr);
98  ASSERT(!hdr->getSrc().isUnspecified());
99 
100  // add preamble and SFD (Starting Frame Delimiter), then send out
101  encapsulate(frame);
102 
103  // send
104  auto& oldPacketProtocolTag = frame->removeTag<PacketProtocolTag>();
105  frame->clearTags();
106  auto newPacketProtocolTag = frame->addTag<PacketProtocolTag>();
107  *newPacketProtocolTag = *oldPacketProtocolTag;
108  EV_INFO << "Transmission of " << frame << " started.\n";
109  auto signal = new EthernetSignal(frame->getName());
110  signal->setSrcMacFullDuplex(duplexMode);
111  signal->setBitrate(curEtherDescr->txrate);
112  if (sendRawBytes) {
113  auto bytes = frame->peekDataAsBytes();
114  frame->eraseAll();
115  frame->insertAtFront(bytes);
116  }
117  signal->encapsulate(frame);
118  ASSERT(curTxSignal == nullptr);
119  curTxSignal = signal->dup();
120  emit(transmissionStartedSignal, signal);
121  send(signal, physOutGate);
122 
123  scheduleAt(transmissionChannel->getTransmissionFinishTime(), endTxTimer);
125 }

Referenced by beginSendFrames(), and handleUpperPacket().

Member Data Documentation

◆ totalSuccessfulRxTime

simtime_t inet::EthernetMac::totalSuccessfulRxTime
protected

The documentation for this class was generated from the following files:
inet::MacProtocolBase::networkInterface
opp_component_ptr< NetworkInterface > networkInterface
Definition: MacProtocolBase.h:30
CHK
#define CHK(x)
Definition: INETDefs.h:87
inet::EthernetMac::processPauseCommand
virtual void processPauseCommand(int pauseUnits)
Definition: EthernetMac.cc:359
inet::EthernetMacBase::numFramesSent
unsigned long numFramesSent
Definition: EthernetMacBase.h:115
inet::EthernetMacBase::initialize
virtual void initialize(int stage) override
Definition: EthernetMacBase.cc:188
inet::EthernetMacBase::txFinished
virtual void txFinished()
Definition: EthernetMacBase.cc:720
inet::units::value::str
std::string str() const
Definition: Units.h:101
inet::EthernetMacBase::numDroppedPkFromHLIfaceDown
unsigned long numDroppedPkFromHLIfaceDown
Definition: EthernetMacBase.h:120
inet::MIN_ETHERNET_FRAME_BYTES
const B MIN_ETHERNET_FRAME_BYTES
Definition: Ethernet.h:22
inet::EthernetMac::beginSendFrames
virtual void beginSendFrames()
Definition: EthernetMac.cc:399
inet::MacProtocolBase::upperLayerOutGateId
int upperLayerOutGateId
Definition: MacProtocolBase.h:25
inet::EthernetMacBase::rxPausePkUnitsSignal
static simsignal_t rxPausePkUnitsSignal
Definition: EthernetMacBase.h:130
inet::EthernetMacBase::numBytesSent
unsigned long numBytesSent
Definition: EthernetMacBase.h:117
inet::EthernetMacBase::encapsulate
virtual void encapsulate(Packet *packet)
Definition: EthernetMacBase.cc:380
inet::INCORRECTLY_RECEIVED
@ INCORRECTLY_RECEIVED
Definition: Simsignals_m.h:71
inet::EthernetMacBase::numDroppedIfaceDown
unsigned long numDroppedIfaceDown
Definition: EthernetMacBase.h:121
inet::EthernetMacBase::transmissionChannel
cChannel * transmissionChannel
Definition: EthernetMacBase.h:95
inet::packetReceivedFromUpperSignal
simsignal_t packetReceivedFromUpperSignal
Definition: Simsignals.cc:88
inet::Packet::peekAtFront
const Ptr< const Chunk > peekAtFront(b length=b(-1), int flags=0) const
Returns the designated part from the beginning of the data part of the packet as an immutable chunk i...
Definition: Packet.h:245
inet::physicallayer::EthernetSignalBase::dup
virtual EthernetSignalBase * dup() const override
Definition: EthernetSignal_m.h:85
PAUSE_UNIT_BITS
#define PAUSE_UNIT_BITS
Definition: Ethernet.h:44
inet::EthernetMac::scheduleEndIFGPeriod
virtual void scheduleEndIFGPeriod()
Definition: EthernetMac.cc:382
inet::EthernetMacBase::txPausePkUnitsSignal
static simsignal_t txPausePkUnitsSignal
Definition: EthernetMacBase.h:129
inet::EthernetMac::handleEndPausePeriod
virtual void handleEndPausePeriod()
Definition: EthernetMac.cc:321
inet::INTERFRAME_GAP_BITS
const b INTERFRAME_GAP_BITS
Definition: Ethernet.h:24
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
inet::EthernetMacBase::verifyCrcAndLength
bool verifyCrcAndLength(Packet *packet)
Verify ethernet packet: check FCS and payload length.
Definition: EthernetMacBase.cc:395
inet::EthernetMacBase::numFramesFromHL
unsigned long numFramesFromHL
Definition: EthernetMacBase.h:119
inet::EthernetMacBase::physOutGate
cGate * physOutGate
Definition: EthernetMacBase.h:97
inet::ETHERTYPE_FLOW_CONTROL
@ ETHERTYPE_FLOW_CONTROL
Definition: EtherType_m.h:92
inet::EthernetMacBase::WAIT_IFG_STATE
@ WAIT_IFG_STATE
Definition: EthernetMacBase.h:36
inet::Packet::peekDataAt
const Ptr< const Chunk > peekDataAt(b offset, b length=b(-1), int flags=0) const
Returns the designated data part as an immutable chunk in the current representation.
Definition: Packet.h:332
inet::EthernetMac::handleSelfMessage
virtual void handleSelfMessage(cMessage *msg) override
Definition: EthernetMac.cc:76
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::EthernetMacBase::numBytesReceivedOK
unsigned long numBytesReceivedOK
Definition: EthernetMacBase.h:118
inet::EthernetMacBase::numPauseFramesSent
unsigned long numPauseFramesSent
Definition: EthernetMacBase.h:126
inet::EthernetMacBase::EtherDescr::txrate
double txrate
Definition: EthernetMacBase.h:69
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::EthernetMacBase::lastTxFinishTime
simtime_t lastTxFinishTime
Definition: EthernetMacBase.h:103
inet::EthernetMac::processMsgFromNetwork
virtual void processMsgFromNetwork(EthernetSignalBase *signal)
Definition: EthernetMac.cc:175
inet::EthernetMacBase::PAUSE_STATE
@ PAUSE_STATE
Definition: EthernetMacBase.h:41
inet::EthernetMacBase::dropFrameNotForUs
virtual bool dropFrameNotForUs(Packet *packet, const Ptr< const EthernetMacHeader > &frame)
Checks destination address and drops the frame when frame is not for us; returns true if frame is dro...
Definition: EthernetMacBase.cc:446
inet::transmissionEndedSignal
simsignal_t transmissionEndedSignal
Definition: Simsignals.cc:117
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::Packet::dup
virtual Packet * dup() const override
Definition: Packet.h:171
inet::receptionEndedSignal
simsignal_t receptionEndedSignal
Definition: Simsignals.cc:119
inet::EthernetMac::processReceivedDataFrame
virtual void processReceivedDataFrame(Packet *packet, const Ptr< const EthernetMacHeader > &frame)
Definition: EthernetMac.cc:336
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::ETHERNET_CONTROL_PAUSE
@ ETHERNET_CONTROL_PAUSE
Definition: EthernetControlFrame_m.h:55
inet::transmissionStartedSignal
simsignal_t transmissionStartedSignal
Definition: Simsignals.cc:116
inet::EthernetMacBase::getMacAddress
virtual MacAddress getMacAddress()
Definition: EthernetMacBase.h:142
inet::MacProtocolBase::currentTxFrame
Packet * currentTxFrame
Currently transmitted frame if any.
Definition: MacProtocolBase.h:35
inet::EthernetMac::handleEndIFGPeriod
virtual void handleEndIFGPeriod()
Definition: EthernetMac.cc:252
inet::EthernetMacBase::readChannelParameters
virtual void readChannelParameters(bool errorWhenAsymmetric)
Calculates datarates, etc.
Definition: EthernetMacBase.cc:485
inet::EthernetMacBase::endPauseTimer
cMessage * endPauseTimer
Definition: EthernetMacBase.h:109
inet::Protocol::ethernetMac
static const Protocol ethernetMac
Definition: Protocol.h:65
inet::EthernetMacBase::sendRawBytes
bool sendRawBytes
Definition: EthernetMacBase.h:86
inet::EthernetMac::scheduleEndPausePeriod
virtual void scheduleEndPausePeriod(int pauseUnits)
Definition: EthernetMac.cc:390
inet::EthernetMacBase::rxPkOkSignal
static simsignal_t rxPkOkSignal
Definition: EthernetMacBase.h:128
inet::MacProtocolBase::upperLayerInGateId
int upperLayerInGateId
Gate ids.
Definition: MacProtocolBase.h:24
inet::EthernetMacBase::endTxTimer
cMessage * endTxTimer
Definition: EthernetMacBase.h:107
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::EthernetMacBase::finish
virtual void finish() override
Definition: EthernetMacBase.cc:566
inet::EthernetMacBase::connected
bool connected
Definition: EthernetMacBase.h:89
inet::EthernetMacBase::addPaddingAndSetFcs
void addPaddingAndSetFcs(Packet *packet, B requiredMinByteLength=MIN_ETHERNET_FRAME_BYTES) const
Inserts padding in front of FCS and calculate FCS.
Definition: EthernetMacBase.cc:661
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::packetReceivedFromLowerSignal
simsignal_t packetReceivedFromLowerSignal
Definition: Simsignals.cc:91
inet::EthernetMacBase::processAtHandleMessageFinished
virtual void processAtHandleMessageFinished()
Definition: EthernetMacBase.cc:310
inet::EthernetMacBase::physInGate
cGate * physInGate
Definition: EthernetMacBase.h:96
inet::EthernetMac::handleUpperPacket
virtual void handleUpperPacket(Packet *pk) override
Definition: EthernetMac.cc:127
inet::MAX_ETHERNET_FRAME_BYTES
const B MAX_ETHERNET_FRAME_BYTES
Definition: Ethernet.h:21
inet::EthernetMacBase::numDroppedBitError
unsigned long numDroppedBitError
Definition: EthernetMacBase.h:122
inet::MacProtocolBase::deleteCurrentTxFrame
virtual void deleteCurrentTxFrame()
Definition: MacProtocolBase.cc:93
inet::EthernetMacBase::endIfgTimer
cMessage * endIfgTimer
Definition: EthernetMacBase.h:108
inet::EthernetMacBase::duplexMode
bool duplexMode
Definition: EthernetMacBase.h:91
inet::INTERFACE_DOWN
@ INTERFACE_DOWN
Definition: Simsignals_m.h:72
inet::EthernetMacBase::initializeStatistics
virtual void initializeStatistics()
Definition: EthernetMacBase.cc:247
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::EthernetMacBase::channelsDiffer
bool channelsDiffer
Definition: EthernetMacBase.h:100
inet::MacProtocolBase::dequeuePacket
virtual Packet * dequeuePacket()
Definition: MacProtocolBase.cc:175
inet::EthernetMacBase::curTxSignal
EthernetSignalBase * curTxSignal
Definition: EthernetMacBase.h:112
inet::packetSentToUpperSignal
simsignal_t packetSentToUpperSignal
Definition: Simsignals.cc:87
inet::EthernetMac::handleEndTxPeriod
virtual void handleEndTxPeriod()
Definition: EthernetMac.cc:268
inet::EthernetMacBase::numPauseFramesRcvd
unsigned long numPauseFramesRcvd
Definition: EthernetMacBase.h:125
inet::EthernetMac::startFrameTransmission
virtual void startFrameTransmission()
Definition: EthernetMac.cc:90
inet::EthernetMac::totalSuccessfulRxTime
simtime_t totalSuccessfulRxTime
Definition: EthernetMac.h:56
EV_ENDL
#define EV_ENDL
Definition: INETDefs.h:114
inet::EthernetMacBase::pauseUnitsRequested
int pauseUnitsRequested
Definition: EthernetMacBase.h:104
inet::MacProtocolBase::canDequeuePacket
virtual bool canDequeuePacket() const
Definition: MacProtocolBase.cc:170
inet::EthernetMacBase::transmitState
MacTransmitState transmitState
Definition: EthernetMacBase.h:101
inet::EthernetMacBase::TRANSMITTING_STATE
@ TRANSMITTING_STATE
Definition: EthernetMacBase.h:38
inet::EthernetMacBase::numFramesReceivedOK
unsigned long numFramesReceivedOK
Definition: EthernetMacBase.h:116
inet::EthernetMacBase::numFramesPassedToHL
unsigned long numFramesPassedToHL
Definition: EthernetMacBase.h:124
inet::EthernetMacBase::TX_IDLE_STATE
@ TX_IDLE_STATE
Definition: EthernetMacBase.h:35
inet::INITSTAGE_LINK_LAYER
INET_API InitStage INITSTAGE_LINK_LAYER
Initialization of link-layer protocols.
inet::EthernetMacBase::initializeFlags
virtual void initializeFlags()
Definition: EthernetMacBase.cc:229
inet::EthernetMacBase::curEtherDescr
const EtherDescr * curEtherDescr
Definition: EthernetMacBase.h:88
inet::EthernetMacBase::decapsulate
virtual void decapsulate(Packet *packet)
Definition: EthernetMacBase.cc:387
inet::EthernetMacBase::changeTransmissionState
void changeTransmissionState(MacTransmitState newState)
Definition: EthernetMacBase.cc:649
inet::packetSentToLowerSignal
simsignal_t packetSentToLowerSignal
Definition: Simsignals.cc:90