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

Ethernet MAC module which supports both half-duplex (CSMA/CD) and full-duplex operation. More...

#include <EthernetCsmaMac.h>

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

Classes

struct  PkIdRxTime
 
class  RxSignal
 

Public Member Functions

 EthernetCsmaMac ()
 
virtual ~EthernetCsmaMac ()
 
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 initializeFlags () override
 
virtual void initializeStatistics () override
 
virtual void handleMessageWhenUp (cMessage *msg) override
 
virtual void finish () override
 
virtual void handleSelfMessage (cMessage *msg) override
 
virtual void handleEndIFGPeriod ()
 
virtual void handleEndPausePeriod ()
 
virtual void handleEndTxPeriod ()
 
virtual void handleEndRxPeriod ()
 
virtual void handleEndBackoffPeriod ()
 
virtual void handleEndJammingPeriod ()
 
virtual void handleRetransmission ()
 
virtual void readChannelParameters (bool errorWhenAsymmetric) override
 Calculates datarates, etc. More...
 
virtual void handleUpperPacket (Packet *msg) override
 
virtual void processMsgFromNetwork (EthernetSignalBase *msg)
 
virtual void scheduleEndIFGPeriod ()
 
virtual void fillIFGInBurst ()
 
virtual void scheduleEndPausePeriod (int pauseUnits)
 
virtual void beginSendFrames ()
 
virtual void sendJamSignal ()
 
virtual void startFrameTransmission ()
 
virtual void frameReceptionComplete ()
 
virtual void processReceivedDataFrame (Packet *frame)
 
virtual void processReceivedControlFrame (Packet *packet)
 
virtual void processConnectDisconnect () override
 
virtual void processDetectedCollision ()
 
virtual void sendSignal (EthernetSignalBase *signal, simtime_t_cref duration)
 
virtual void handleSignalFromNetwork (EthernetSignalBase *signal)
 
virtual void updateRxSignals (EthernetSignalBase *signal, simtime_t endRxTime)
 
virtual void dropCurrentTxFrame (PacketDropDetails &details) override
 
bool canContinueBurst (b remainingGapLength)
 
B calculateMinFrameLength ()
 
virtual void printState ()
 
- 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 printParameters ()
 
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 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

std::vector< RxSignalrxSignals
 
int backoffs = 0
 
cMessage * endRxTimer = nullptr
 
cMessage * endBackoffTimer = nullptr
 
cMessage * endJammingTimer = nullptr
 
simtime_t totalCollisionTime
 
simtime_t totalSuccessfulRxTxTime
 
simtime_t channelBusySince
 
unsigned long numCollisions = 0
 
unsigned long numBackoffs = 0
 
int framesSentInBurst = 0
 
B bytesSentInBurst = B(0)
 
- 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
 

Static Protected Attributes

static simsignal_t collisionSignal = registerSignal("collision")
 
static simsignal_t backoffSlotsGeneratedSignal = registerSignal("backoffSlotsGenerated")
 
- 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")
 

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
 

Detailed Description

Ethernet MAC module which supports both half-duplex (CSMA/CD) and full-duplex operation.

(See also EthernetMac which has a considerably smaller code with all the CSMA/CD complexity removed.)

See NED file for more details.

Constructor & Destructor Documentation

◆ EthernetCsmaMac()

inet::EthernetCsmaMac::EthernetCsmaMac ( )
inline
25 {}

◆ ~EthernetCsmaMac()

inet::EthernetCsmaMac::~EthernetCsmaMac ( )
virtual
41 {
42  for (auto& rx : rxSignals)
43  delete rx.signal;
44  cancelAndDelete(endRxTimer);
45  cancelAndDelete(endBackoffTimer);
46  cancelAndDelete(endJammingTimer);
47 }

Member Function Documentation

◆ beginSendFrames()

void inet::EthernetCsmaMac::beginSendFrames ( )
protectedvirtual
846 {
847  if (currentTxFrame) {
848  // Other frames are queued, therefore wait IFG period and transmit next frame
849  EV_DETAIL << "Will transmit next frame in output queue after IFG period\n";
851  }
852  else {
853  // No more frames, set transmitter to idle
855  EV_DETAIL << "No more frames to send, transmitter set to idle\n";
856  }
857 }

Referenced by handleEndPausePeriod().

◆ calculateMinFrameLength()

B inet::EthernetCsmaMac::calculateMinFrameLength ( )
protected
387 {
388  bool inBurst = frameBursting && framesSentInBurst;
390 
391  return minFrameLength;
392 }

Referenced by startFrameTransmission().

◆ canContinueBurst()

bool inet::EthernetCsmaMac::canContinueBurst ( b  remainingGapLength)
protected
826 {
827  if ((frameBursting && framesSentInBurst > 0) && (framesSentInBurst < curEtherDescr->maxFramesInBurst)) {
828  if (Packet *pk = txQueue->canPullPacket(gate(upperLayerInGateId)->getPathStartGate())) {
829  // TODO before/after FilledIfg!!!
830  B pkLength = std::max(MIN_ETHERNET_FRAME_BYTES, B(pk->getDataLength()));
831  return (bytesSentInBurst + remainingGapLength + PREAMBLE_BYTES + SFD_BYTES + pkLength) <= curEtherDescr->maxBytesInBurst;
832  }
833  }
834  return false;
835 }

Referenced by handleEndIFGPeriod(), and handleEndTxPeriod().

◆ dropCurrentTxFrame()

void inet::EthernetCsmaMac::dropCurrentTxFrame ( PacketDropDetails details)
overrideprotectedvirtual

Reimplemented from inet::MacProtocolBase.

888 {
890  delete curTxSignal;
891  curTxSignal = nullptr;
892 }

Referenced by handleRetransmission().

◆ fillIFGInBurst()

void inet::EthernetCsmaMac::fillIFGInBurst ( )
protectedvirtual
813 {
814  EV_TRACE << "fillIFGInBurst(): t=" << simTime() << ", framesSentInBurst=" << framesSentInBurst << ", bytesSentInBurst=" << bytesSentInBurst << endl;
815 
816  EthernetFilledIfgSignal *gap = new EthernetFilledIfgSignal("FilledIFG");
817  gap->setBitrate(curEtherDescr->txrate);
818  bytesSentInBurst += B(gap->getByteLength());
819  simtime_t duration = gap->getBitLength() / this->curEtherDescr->txrate;
820  sendSignal(gap, duration);
821  scheduleAfter(duration, endIfgTimer);
823 }

Referenced by handleEndTxPeriod().

◆ finish()

void inet::EthernetCsmaMac::finish ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

681 {
683 
684  simtime_t t = simTime();
685  simtime_t totalChannelIdleTime = t - totalSuccessfulRxTxTime - totalCollisionTime;
686  recordScalar("rx channel idle (%)", 100 * (totalChannelIdleTime / t));
687  recordScalar("rx channel utilization (%)", 100 * (totalSuccessfulRxTxTime / t));
688  recordScalar("rx channel collision (%)", 100 * (totalCollisionTime / t));
689  recordScalar("collisions", numCollisions);
690  recordScalar("backoffs", numBackoffs);
691 }

◆ frameReceptionComplete()

void inet::EthernetCsmaMac::frameReceptionComplete ( )
protectedvirtual
703 {
704  ASSERT(rxSignals.size() == 1);
705  EthernetSignalBase *signal = rxSignals[0].signal;
706  rxSignals.clear();
707 
708  if (dynamic_cast<EthernetFilledIfgSignal *>(signal) != nullptr) {
709  delete signal;
710  return;
711  }
712  if (signal->getSrcMacFullDuplex() != duplexMode)
713  throw cRuntimeError("Ethernet misconfiguration: MACs on the same link must be all in full duplex mode, or all in half-duplex mode");
714 
715  emit(receptionEndedSignal, signal);
716 
717  bool hasBitError = signal->hasBitError();
718  auto packet = check_and_cast<Packet *>(signal->decapsulate());
719  delete signal;
720  decapsulate(packet);
721  emit(packetReceivedFromLowerSignal, packet);
722 
723  if (hasBitError || !verifyCrcAndLength(packet)) {
725  PacketDropDetails details;
726  details.setReason(INCORRECTLY_RECEIVED);
727  emit(packetDroppedSignal, packet, &details);
728  delete packet;
729  return;
730  }
731 
732  const auto& frame = packet->peekAtFront<EthernetMacHeader>();
733  auto macAddressInd = packet->addTag<MacAddressInd>();
734  macAddressInd->setSrcAddress(frame->getSrc());
735  macAddressInd->setDestAddress(frame->getDest());
736  if (dropFrameNotForUs(packet, frame))
737  return;
738 
739  if (frame->getTypeOrLength() == ETHERTYPE_FLOW_CONTROL) {
741  }
742  else {
743  EV_INFO << "Reception of " << packet << " successfully completed.\n";
744  processReceivedDataFrame(packet);
745  }
746 }

Referenced by handleEndRxPeriod(), and processMsgFromNetwork().

◆ handleCanPullPacketChanged()

void inet::EthernetCsmaMac::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.

895 {
896  Enter_Method("handleCanPullPacketChanged");
898  if (currentTxFrame == nullptr && transmitState == TX_IDLE_STATE && canDequeuePacket()) {
899  Packet *packet = dequeuePacket();
900  handleUpperPacket(packet);
901  }
902  }
903 }

◆ handleEndBackoffPeriod()

void inet::EthernetCsmaMac::handleEndBackoffPeriod ( )
protectedvirtual
560 {
562  throw cRuntimeError("At end of BACKOFF and not in BACKOFF_STATE");
563 
564  if (currentTxFrame == nullptr)
565  throw cRuntimeError("At end of BACKOFF and no frame to transmit");
566 
567  if (receiveState == RX_IDLE_STATE) {
568  EV_DETAIL << "Backoff period ended, wait IFG\n";
570  }
571  else {
572  EV_DETAIL << "Backoff period ended but channel is not free, idling\n";
574  }
575 }

Referenced by handleSelfMessage().

◆ handleEndIFGPeriod()

void inet::EthernetCsmaMac::handleEndIFGPeriod ( )
protectedvirtual
358 {
359  EV_DETAIL << "IFG elapsed\n";
360 
361  if (transmitState == SEND_IFG_STATE) {
363  txFinished();
364  if (canContinueBurst(b(0))) {
365  Packet *packet = dequeuePacket();
366  handleUpperPacket(packet);
367  }
368  else
370  }
371  else if (transmitState == WAIT_IFG_STATE) {
372  // End of IFG period, okay to transmit, if Rx idle OR duplexMode ( checked in startFrameTransmission(); )
373  if (currentTxFrame != nullptr)
375  else if (canDequeuePacket()) {
376  Packet *packet = dequeuePacket();
377  handleUpperPacket(packet);
378  }
379  else
381  }
382  else
383  throw cRuntimeError("Not in WAIT_IFG_STATE at the end of IFG period");
384 }

Referenced by handleSelfMessage().

◆ handleEndJammingPeriod()

void inet::EthernetCsmaMac::handleEndJammingPeriod ( )
protectedvirtual
609 {
611  throw cRuntimeError("At end of JAMMING but not in JAMMING_STATE");
612 
614  txFinished();
615  EV_DETAIL << "Jamming finished, executing backoff\n";
617 }

Referenced by handleSelfMessage().

◆ handleEndPausePeriod()

void inet::EthernetCsmaMac::handleEndPausePeriod ( )
protectedvirtual
694 {
695  if (transmitState != PAUSE_STATE)
696  throw cRuntimeError("At end of PAUSE and not in PAUSE_STATE");
697 
698  EV_DETAIL << "Pause finished, resuming transmissions\n";
699  beginSendFrames();
700 }

Referenced by handleSelfMessage().

◆ handleEndRxPeriod()

void inet::EthernetCsmaMac::handleEndRxPeriod ( )
protectedvirtual
521 {
522  simtime_t dt = simTime() - channelBusySince;
523 
524  switch (receiveState) {
525  case RECEIVING_STATE:
528  break;
529 
530  case RX_COLLISION_STATE:
531  EV_DETAIL << "Incoming signals finished after collision\n";
532  totalCollisionTime += dt;
533  for (auto& rx : rxSignals) {
534  delete rx.signal;
535  }
536  rxSignals.clear();
537  break;
538 
539  case RX_RECONNECT_STATE:
540  EV_DETAIL << "Incoming signals finished or reconnect time elapsed after reconnect\n";
541  for (auto& rx : rxSignals) {
542  delete rx.signal;
543  }
544  rxSignals.clear();
545  break;
546 
547  default:
548  throw cRuntimeError("model error: invalid receiveState %d", receiveState);
549  }
550 
552 
554  EV_DETAIL << "Start IFG period\n";
556  }
557 }

Referenced by handleSelfMessage().

◆ handleEndTxPeriod()

void inet::EthernetCsmaMac::handleEndTxPeriod ( )
protectedvirtual
465 {
466  EV_DETAIL << "TX successfully finished\n";
467 
468  // we only get here if transmission has finished successfully, without collision
470  throw cRuntimeError("End of transmission, and incorrect state detected");
471 
472  if (currentTxFrame == nullptr)
473  throw cRuntimeError("Frame under transmission cannot be found");
474 
475  numFramesSent++;
476  numBytesSent += currentTxFrame->getByteLength();
477  emit(packetSentToLowerSignal, currentTxFrame); // consider: emit with start time of frame
478 
480  txFinished();
481 
482  const auto& header = currentTxFrame->peekAtFront<EthernetMacHeader>();
483  if (header->getTypeOrLength() == ETHERTYPE_FLOW_CONTROL) {
484  const auto& controlFrame = currentTxFrame->peekDataAt<EthernetControlFrameBase>(header->getChunkLength(), b(-1));
485  if (controlFrame->getOpCode() == ETHERNET_CONTROL_PAUSE) {
486  const auto& pauseFrame = dynamicPtrCast<const EthernetPauseFrame>(controlFrame);
488  emit(txPausePkUnitsSignal, pauseFrame->getPauseTime());
489  }
490  }
491 
492  EV_INFO << "Transmission of " << currentTxFrame << " successfully completed.\n";
494  lastTxFinishTime = simTime();
495 
496  // only count transmissions in totalSuccessfulRxTxTime if channel is half-duplex
497  if (!duplexMode) {
498  simtime_t dt = simTime() - channelBusySince;
500  }
501 
502  backoffs = 0;
503 
504  // check for and obey received PAUSE frames after each transmission
505  if (pauseUnitsRequested > 0) {
506  // if we received a PAUSE frame recently, go into PAUSE state
507  EV_DETAIL << "Going to PAUSE mode for " << pauseUnitsRequested << " time units\n";
510  }
511  else {
512  EV_DETAIL << "Start IFG period\n";
514  fillIFGInBurst();
515  else
517  }
518 }

Referenced by handleSelfMessage().

◆ handleMessageWhenUp()

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

Reimplemented from inet::LayeredProtocolBase.

171 {
172  if (channelsDiffer)
173  readChannelParameters(true);
174 
175  printState();
176 
177  // some consistency check
179  throw cRuntimeError("Inconsistent state -- transmitting and receiving at the same time");
180 
181  if (msg->isSelfMessage())
182  handleSelfMessage(msg);
183  else if (msg->getArrivalGateId() == upperLayerInGateId)
184  handleUpperPacket(check_and_cast<Packet *>(msg));
185  else if (msg->getArrivalGate() == physInGate)
186  handleSignalFromNetwork(check_and_cast<EthernetSignalBase *>(msg));
187  else
188  throw cRuntimeError("Message received from unknown gate");
189 
191  printState();
192 }

◆ handleRetransmission()

void inet::EthernetCsmaMac::handleRetransmission ( )
protectedvirtual
620 {
621  if (++backoffs > MAX_ATTEMPTS) {
622  EV_DETAIL << "Number of retransmit attempts of frame exceeds maximum, cancelling transmission of frame\n";
623  PacketDropDetails details;
624  details.setReason(RETRY_LIMIT_REACHED);
625  details.setLimit(MAX_ATTEMPTS);
626  dropCurrentTxFrame(details);
628  backoffs = 0;
629 
630  if (canDequeuePacket()) {
631  Packet *packet = dequeuePacket();
632  handleUpperPacket(packet);
633  }
634  return;
635  }
636 
637  int backoffRange = (backoffs >= BACKOFF_RANGE_LIMIT) ? 1024 : (1 << backoffs);
638  int slotNumber = intuniform(0, backoffRange - 1);
639  EV_DETAIL << "Executing backoff procedure (slotNumber=" << slotNumber << ", backoffRange=[0," << backoffRange - 1 << "]" << endl;
640 
641  scheduleAfter(slotNumber * curEtherDescr->slotTime, endBackoffTimer);
643  emit(backoffSlotsGeneratedSignal, slotNumber);
644 
645  numBackoffs++;
646 }

Referenced by handleEndJammingPeriod().

◆ handleSelfMessage()

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

Reimplemented from inet::LayeredProtocolBase.

136 {
137  // Process different self-messages (timer signals)
138  EV_TRACE << "Self-message " << msg << " received\n";
139 
140  switch (msg->getKind()) {
141  case ENDIFG:
143  break;
144 
145  case ENDTRANSMISSION:
147  break;
148 
149  case ENDRECEPTION:
151  break;
152 
153  case ENDBACKOFF:
155  break;
156 
157  case ENDJAMMING:
159  break;
160 
161  case ENDPAUSE:
163  break;
164 
165  default:
166  throw cRuntimeError("Self-message with unexpected message kind %d", msg->getKind());
167  }
168 }

Referenced by handleMessageWhenUp().

◆ handleSignalFromNetwork()

void inet::EthernetCsmaMac::handleSignalFromNetwork ( EthernetSignalBase signal)
protectedvirtual
195 {
196  EV_DETAIL << "Received " << signal << " from network.\n";
197 
198  if (!connected) {
199  EV_WARN << "Interface is not connected -- dropping signal " << signal << endl;
200  if (!signal->isUpdate() && dynamic_cast<EthernetSignal *>(signal)) { // count only signal starts, do not count JAM and IFG packets
201  auto packet = check_and_cast<Packet *>(signal->decapsulate());
202  delete signal;
203  decapsulate(packet);
204  PacketDropDetails details;
205  details.setReason(INTERFACE_DOWN);
206  emit(packetDroppedSignal, packet, &details);
207  delete packet;
209  }
210  else
211  delete signal;
212  return;
213  }
214 
215  // detect cable length violation in half-duplex mode
216  if (!duplexMode) {
217  simtime_t propagationTime = simTime() - signal->getSendingTime();
218  if (propagationTime >= curEtherDescr->maxPropagationDelay) {
219  throw cRuntimeError("Very long frame propagation time detected, maybe cable exceeds "
220  "maximum allowed length? (%s s corresponds to an approx. %s m cable)",
221  SIMTIME_STR(propagationTime),
222  SIMTIME_STR(propagationTime * SPEED_OF_LIGHT_IN_CABLE));
223  }
224  }
225 
226  EthernetJamSignal *jamSignal = dynamic_cast<EthernetJamSignal *>(signal);
227 
228  if (duplexMode && jamSignal)
229  throw cRuntimeError("Stray jam signal arrived in full-duplex mode");
230 
231  if (dynamic_cast<EthernetJamSignal *>(signal)) {
232  updateRxSignals(signal, simTime() + signal->getRemainingDuration());
234  }
235  else
236  processMsgFromNetwork(signal);
237 }

Referenced by handleMessageWhenUp().

◆ handleUpperPacket()

void inet::EthernetCsmaMac::handleUpperPacket ( Packet msg)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

240 {
241  EV_INFO << "Received " << packet << " from upper layer." << endl;
242 
243  numFramesFromHL++;
244  emit(packetReceivedFromUpperSignal, packet);
245 
246  MacAddress address = getMacAddress();
247 
248  auto macHeader = packet->peekAtFront<EthernetMacHeader>();
249  if (macHeader->getDest().equals(address)) {
250  throw cRuntimeError("Logic error: frame %s from higher layer has local MAC address as dest (%s)",
251  packet->getFullName(), macHeader->getDest().str().c_str());
252  }
253 
254  if (packet->getDataLength() > MAX_ETHERNET_FRAME_BYTES) {
255  throw cRuntimeError("Packet length from higher layer (%s) exceeds maximum Ethernet frame size (%s)",
256  packet->getDataLength().str().c_str(), MAX_ETHERNET_FRAME_BYTES.str().c_str());
257  }
258 
259  if (!connected) {
260  EV_WARN << "Interface is not connected -- dropping packet " << packet << endl;
261  PacketDropDetails details;
262  details.setReason(INTERFACE_DOWN);
263  emit(packetDroppedSignal, packet, &details);
265  delete packet;
266 
267  return;
268  }
269 
270  // fill in src address if not set
271  if (macHeader->getSrc().isUnspecified()) {
272  // macHeader is immutable
273  macHeader = nullptr;
274  auto newHeader = packet->removeAtFront<EthernetMacHeader>();
275  newHeader->setSrc(address);
276  packet->insertAtFront(newHeader);
277  macHeader = newHeader;
278  }
279  if (currentTxFrame != nullptr)
280  throw cRuntimeError("EthernetMac already has a transmit packet when packet arrived from upper layer");
282  currentTxFrame = packet;
284 }

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

◆ initialize()

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

Reimplemented from inet::EthernetMacBase.

50 {
52 
53  if (stage == INITSTAGE_LOCAL) {
54  endRxTimer = new cMessage("EndReception", ENDRECEPTION);
55  endBackoffTimer = new cMessage("EndBackoff", ENDBACKOFF);
56  endJammingTimer = new cMessage("EndJamming", ENDJAMMING);
57 
58  // initialize state info
59  backoffs = 0;
60  setTxUpdateSupport(true);
61 
62  WATCH(backoffs);
63  }
64 }

◆ initializeFlags()

void inet::EthernetCsmaMac::initializeFlags ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

86 {
88 
89  duplexMode = par("duplexMode");
90  frameBursting = !duplexMode && par("frameBursting");
91  physInGate->setDeliverImmediately(true);
92 }

◆ initializeStatistics()

void inet::EthernetCsmaMac::initializeStatistics ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

67 {
69 
71  bytesSentInBurst = B(0);
72 
73  WATCH(framesSentInBurst);
74  WATCH(bytesSentInBurst);
75 
76  // initialize statistics
77  totalCollisionTime = 0.0;
80 
81  WATCH(numCollisions);
82  WATCH(numBackoffs);
83 }

◆ numInitStages()

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

Reimplemented from inet::EthernetMacBase.

32 { return NUM_INIT_STAGES; }

◆ printState()

void inet::EthernetCsmaMac::printState ( )
protectedvirtual
649 {
650 #define CASE(x) case x: \
651  EV_DETAIL << #x; break
652 
653  EV_DETAIL << "transmitState: ";
654  switch (transmitState) {
661  CASE(PAUSE_STATE);
662  }
663 
664  EV_DETAIL << ", receiveState: ";
665  switch (receiveState) {
670  }
671 
672  EV_DETAIL << ", backoffs: " << backoffs;
673  EV_DETAIL << ", numConcurrentRxTransmissions: " << rxSignals.size();
674  EV_DETAIL << ", queueLength: " << txQueue->getNumPackets();
675  EV_DETAIL << endl;
676 
677 #undef CASE
678 }

Referenced by handleMessageWhenUp(), and startFrameTransmission().

◆ processConnectDisconnect()

void inet::EthernetCsmaMac::processConnectDisconnect ( )
overrideprotectedvirtual

Reimplemented from inet::EthernetMacBase.

95 {
96  if (!connected) {
97  for (auto& rx : rxSignals)
98  delete rx.signal;
99  rxSignals.clear();
100  cancelEvent(endRxTimer);
101  cancelEvent(endBackoffTimer);
102  cancelEvent(endJammingTimer);
103  bytesSentInBurst = B(0);
104  framesSentInBurst = 0;
105  }
106 
108 
109  if (connected) {
110  if (!duplexMode) {
111  // start RX_RECONNECT_STATE
113  simtime_t reconnectEndTime = simTime() + b(MAX_ETHERNET_FRAME_BYTES + JAM_SIGNAL_BYTES).get() / curEtherDescr->txrate;
114  for (auto& rx : rxSignals)
115  delete rx.signal;
116  rxSignals.clear();
117  EthernetSignalBase *signal = new EthernetSignalBase("RECONNECT");
118  signal->setBitError(true);
119  signal->setDuration(reconnectEndTime);
120  updateRxSignals(signal, reconnectEndTime);
121  }
122  }
123 }

◆ processDetectedCollision()

void inet::EthernetCsmaMac::processDetectedCollision ( )
protectedvirtual
348 {
350  numCollisions++;
351  emit(collisionSignal, 1L);
352  // go to collision state
354  }
355 }

Referenced by handleSignalFromNetwork(), processMsgFromNetwork(), and startFrameTransmission().

◆ processMsgFromNetwork()

void inet::EthernetCsmaMac::processMsgFromNetwork ( EthernetSignalBase msg)
protectedvirtual
287 {
288  simtime_t endRxTime = simTime() + signal->getRemainingDuration();
289 
291  updateRxSignals(signal, endRxTime);
292  }
294  // since we're half-duplex, receiveState must be RX_IDLE_STATE (asserted at top of handleMessage)
295  // set receive state and schedule end of reception
296  updateRxSignals(signal, endRxTime);
298 
299  EV_DETAIL << "Transmission interrupted by incoming frame, handling collision\n";
301 
302  EV_DETAIL << "Transmitting jam signal\n";
303  sendJamSignal(); // backoff will be executed when jamming finished
304 
305  numCollisions++;
306  emit(collisionSignal, 1L);
307  }
308  else if (receiveState == RX_IDLE_STATE) {
309  ASSERT(!signal->isUpdate());
310  channelBusySince = simTime();
311  EV_INFO << "Reception of " << signal << " started.\n";
312  emit(receptionStartedSignal, signal);
313  updateRxSignals(signal, endRxTime);
315  }
316  else if (!signal->isUpdate() && receiveState == RECEIVING_STATE && endRxTimer->getArrivalTime() - simTime() < curEtherDescr->halfBitTime) {
317  // With the above condition we filter out "false" collisions that may occur with
318  // back-to-back frames. That is: when "beginning of frame" message (this one) occurs
319  // BEFORE "end of previous frame" event (endRxMsg) -- same simulation time,
320  // only wrong order.
321 
322  EV_DETAIL << "Back-to-back frames: completing reception of current frame, starting reception of next one\n";
323 
324  // complete reception of previous frame
325  cancelEvent(endRxTimer);
327 
328  // calculate usability
330  channelBusySince = simTime();
331 
332  // start receiving next frame
333  updateRxSignals(signal, endRxTime);
335  }
336  else { // (receiveState==RECEIVING_STATE || receiveState==RX_COLLISION_STATE)
337  // handle overlapping receptions
338  // EtherFrame or EtherPauseFrame
339  updateRxSignals(signal, endRxTime);
340  if (rxSignals.size() > 1) {
341  EV_DETAIL << "Overlapping receptions -- setting collision state\n";
343  }
344  }
345 }

Referenced by handleSignalFromNetwork().

◆ processReceivedControlFrame()

void inet::EthernetCsmaMac::processReceivedControlFrame ( Packet packet)
protectedvirtual
769 {
770  packet->popAtFront<EthernetMacHeader>();
771  const auto& controlFrame = packet->peekAtFront<EthernetControlFrameBase>();
772 
773  if (controlFrame->getOpCode() == ETHERNET_CONTROL_PAUSE) {
774  const auto& pauseFrame = packet->peekAtFront<EthernetPauseFrame>();
775  int pauseUnits = pauseFrame->getPauseTime();
776 
778  emit(rxPausePkUnitsSignal, pauseUnits);
779 
780  if (transmitState == TX_IDLE_STATE) {
781  EV_DETAIL << "PAUSE frame received, pausing for " << pauseUnitsRequested << " time units\n";
782  if (pauseUnits > 0)
783  scheduleEndPausePeriod(pauseUnits);
784  }
785  else if (transmitState == PAUSE_STATE) {
786  EV_DETAIL << "PAUSE frame received, pausing for " << pauseUnitsRequested
787  << " more time units from now\n";
788  cancelEvent(endPauseTimer);
789 
790  if (pauseUnits > 0)
791  scheduleEndPausePeriod(pauseUnits);
792  }
793  else {
794  // transmitter busy -- wait until it finishes with current frame (endTx)
795  // and then it'll go to PAUSE state
796  EV_DETAIL << "PAUSE frame received, storing pause request\n";
797  pauseUnitsRequested = pauseUnits;
798  }
799  }
800  delete packet;
801 }

Referenced by frameReceptionComplete().

◆ processReceivedDataFrame()

void inet::EthernetCsmaMac::processReceivedDataFrame ( Packet frame)
protectedvirtual
749 {
750  // statistics
751  unsigned long curBytes = packet->getByteLength();
753  numBytesReceivedOK += curBytes;
754  emit(rxPkOkSignal, packet);
755 
756  packet->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(&Protocol::ethernetMac);
757  packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(&Protocol::ethernetMac);
758  if (networkInterface)
759  packet->addTagIfAbsent<InterfaceInd>()->setInterfaceId(networkInterface->getInterfaceId());
760 
762  emit(packetSentToUpperSignal, packet);
763  // pass up to upper layer
764  EV_INFO << "Sending " << packet << " to upper layer.\n";
765  send(packet, "upperLayerOut");
766 }

Referenced by frameReceptionComplete().

◆ readChannelParameters()

void inet::EthernetCsmaMac::readChannelParameters ( bool  errorWhenAsymmetric)
overrideprotectedvirtual

Calculates datarates, etc.

Verifies the datarates on the incoming/outgoing channels, and throws error when they differ and the parameter errorWhenAsymmetric is true.

Reimplemented from inet::EthernetMacBase.

126 {
127  EthernetMacBase::readChannelParameters(errorWhenAsymmetric);
128 
129  if (connected && !duplexMode) {
131  throw cRuntimeError("%g bps Ethernet only supports full-duplex links", curEtherDescr->txrate);
132  }
133 }

Referenced by handleMessageWhenUp().

◆ scheduleEndIFGPeriod()

void inet::EthernetCsmaMac::scheduleEndIFGPeriod ( )
protectedvirtual
804 {
805  bytesSentInBurst = B(0);
806  framesSentInBurst = 0;
807  simtime_t ifgTime = b(INTERFRAME_GAP_BITS).get() / curEtherDescr->txrate;
808  scheduleAfter(ifgTime, endIfgTimer);
810 }

Referenced by handleEndBackoffPeriod(), handleEndIFGPeriod(), handleEndRxPeriod(), and handleEndTxPeriod().

◆ scheduleEndPausePeriod()

void inet::EthernetCsmaMac::scheduleEndPausePeriod ( int  pauseUnits)
protectedvirtual
838 {
839  // length is interpreted as 512-bit-time units
840  simtime_t pausePeriod = pauseUnits * PAUSE_UNIT_BITS / curEtherDescr->txrate;
841  scheduleAfter(pausePeriod, endPauseTimer);
843 }

Referenced by handleEndTxPeriod(), and processReceivedControlFrame().

◆ sendJamSignal()

void inet::EthernetCsmaMac::sendJamSignal ( )
protectedvirtual
587 {
588  // abort current transmission
589  ASSERT(curTxSignal != nullptr);
590  simtime_t duration = simTime() - curTxSignal->getCreationTime(); // TODO save and use start tx time
591  cutEthernetSignalEnd(curTxSignal, duration); // TODO save and use start tx time
593  send(curTxSignal, SendOptions().finishTx(curTxSignal->getId()).duration(duration), physOutGate);
594  curTxSignal = nullptr;
595 
596  // send JAM
597  EthernetJamSignal *jam = new EthernetJamSignal("JAM_SIGNAL");
598  jam->setByteLength(B(JAM_SIGNAL_BYTES).get());
599  jam->setBitrate(curEtherDescr->txrate);
600 // emit(packetSentToLowerSignal, jam);
601  duration = jam->getBitLength() / this->curEtherDescr->txrate;
602  sendSignal(jam, duration);
603 
604  scheduleAfter(duration, endJammingTimer);
606 }

Referenced by processMsgFromNetwork(), and startFrameTransmission().

◆ sendSignal()

void inet::EthernetCsmaMac::sendSignal ( EthernetSignalBase signal,
simtime_t_cref  duration 
)
protectedvirtual
578 {
579  ASSERT(curTxSignal == nullptr);
580  signal->setDuration(duration);
581  curTxSignal = signal->dup();
583  send(signal, SendOptions().transmissionId(curTxSignal->getId()).duration(duration), physOutGate);
584 }

Referenced by fillIFGInBurst(), sendJamSignal(), and startFrameTransmission().

◆ startFrameTransmission()

void inet::EthernetCsmaMac::startFrameTransmission ( )
protectedvirtual
395 {
396  ASSERT(currentTxFrame);
397  EV_DETAIL << "Transmitting a copy of frame " << currentTxFrame << endl;
398 
399  Packet *frame = currentTxFrame->dup();
400 
401  const auto& hdr = frame->peekAtFront<EthernetMacHeader>();
402  ASSERT(hdr);
403  ASSERT(!hdr->getSrc().isUnspecified());
404 
405  B minFrameLengthWithExtension = calculateMinFrameLength();
406  B extensionLength = minFrameLengthWithExtension > frame->getDataLength() ? (minFrameLengthWithExtension - frame->getDataLength()) : B(0);
407 
408  // add preamble and SFD (Starting Frame Delimiter), then send out
409  encapsulate(frame);
410 
411  B sentFrameByteLength = frame->getDataLength() + extensionLength;
412  auto& oldPacketProtocolTag = frame->removeTag<PacketProtocolTag>();
413  frame->clearTags();
414  auto newPacketProtocolTag = frame->addTag<PacketProtocolTag>();
415  *newPacketProtocolTag = *oldPacketProtocolTag;
416  EV_INFO << "Transmission of " << frame << " started.\n";
417  auto signal = new EthernetSignal(frame->getName());
418  signal->setSrcMacFullDuplex(duplexMode);
419  signal->setBitrate(curEtherDescr->txrate);
420  if (sendRawBytes) {
421  auto bytes = frame->peekDataAsBytes();
422  frame->eraseAll();
423  frame->insertAtFront(bytes);
424  }
425  signal->encapsulate(frame);
426  signal->addByteLength(extensionLength.get());
427  simtime_t duration = signal->getBitLength() / this->curEtherDescr->txrate;
428 
429  sendSignal(signal, duration);
430 
431  // check for collisions (there might be an ongoing reception which we don't know about, see below)
433  // During the IFG period the hardware cannot listen to the channel,
434  // so it might happen that receptions have begun during the IFG,
435  // and even collisions might be in progress.
436  //
437  // But we don't know of any ongoing transmission so we blindly
438  // start transmitting, immediately collide and send a jam signal.
439  //
440 
442  EV_DETAIL << "startFrameTransmission(): sending JAM signal.\n";
443  printState();
444  sendJamSignal();
445  }
446  else {
447  // no collision
448 
449  // update burst variables
450  if (frameBursting) {
451  bytesSentInBurst += sentFrameByteLength;
453  }
454 
455  scheduleAfter(duration, endTxTimer);
457 
458  // only count transmissions in totalSuccessfulRxTxTime if channel is half-duplex
459  if (!duplexMode)
460  channelBusySince = simTime();
461  }
462 }

Referenced by beginSendFrames(), handleEndIFGPeriod(), and handleUpperPacket().

◆ updateRxSignals()

void inet::EthernetCsmaMac::updateRxSignals ( EthernetSignalBase signal,
simtime_t  endRxTime 
)
protectedvirtual
860 {
861  simtime_t maxEndRxTime = endRxTime;
862  bool found = false;
863  bool isUpdate = signal->isUpdate();
864  long signalTransmissionId = signal->getTransmissionId();
865 
866  for (auto& rx : rxSignals) {
867  if (isUpdate && rx.transmissionId == signalTransmissionId) {
868  ASSERT(!found);
869  found = true;
870  delete rx.signal;
871  rx.signal = signal;
872  rx.endRxTime = endRxTime;
873  }
874 
875  if (rx.endRxTime > maxEndRxTime)
876  maxEndRxTime = rx.endRxTime;
877  }
878 
879  if (!found)
880  rxSignals.push_back(RxSignal(signalTransmissionId, signal, endRxTime));
881 
882  if (endRxTimer->getArrivalTime() != maxEndRxTime || endRxTime == maxEndRxTime) {
883  rescheduleAt(maxEndRxTime, endRxTimer);
884  }
885 }

Referenced by handleSignalFromNetwork(), processConnectDisconnect(), and processMsgFromNetwork().

Member Data Documentation

◆ backoffs

int inet::EthernetCsmaMac::backoffs = 0
protected

◆ backoffSlotsGeneratedSignal

simsignal_t inet::EthernetCsmaMac::backoffSlotsGeneratedSignal = registerSignal("backoffSlotsGenerated")
staticprotected

Referenced by handleRetransmission().

◆ bytesSentInBurst

B inet::EthernetCsmaMac::bytesSentInBurst = B(0)
protected

◆ channelBusySince

simtime_t inet::EthernetCsmaMac::channelBusySince
protected

◆ collisionSignal

simsignal_t inet::EthernetCsmaMac::collisionSignal = registerSignal("collision")
staticprotected

◆ endBackoffTimer

cMessage* inet::EthernetCsmaMac::endBackoffTimer = nullptr
protected

◆ endJammingTimer

cMessage* inet::EthernetCsmaMac::endJammingTimer = nullptr
protected

◆ endRxTimer

cMessage* inet::EthernetCsmaMac::endRxTimer = nullptr
protected

◆ framesSentInBurst

◆ numBackoffs

unsigned long inet::EthernetCsmaMac::numBackoffs = 0
protected

◆ numCollisions

unsigned long inet::EthernetCsmaMac::numCollisions = 0
protected

◆ rxSignals

◆ totalCollisionTime

simtime_t inet::EthernetCsmaMac::totalCollisionTime
protected

◆ totalSuccessfulRxTxTime

simtime_t inet::EthernetCsmaMac::totalSuccessfulRxTxTime
protected

The documentation for this class was generated from the following files:
inet::MacProtocolBase::networkInterface
opp_component_ptr< NetworkInterface > networkInterface
Definition: MacProtocolBase.h:30
inet::EthernetMacBase::ENDIFG
@ ENDIFG
Definition: EthernetMacBase.h:56
inet::EthernetMacBase::EtherDescr::frameInBurstMinBytes
B frameInBurstMinBytes
Definition: EthernetMacBase.h:75
inet::EthernetCsmaMac::startFrameTransmission
virtual void startFrameTransmission()
Definition: EthernetCsmaMac.cc:394
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::EthernetCsmaMac::collisionSignal
static simsignal_t collisionSignal
Definition: EthernetCsmaMac.h:74
inet::EthernetMacBase::numDroppedPkFromHLIfaceDown
unsigned long numDroppedPkFromHLIfaceDown
Definition: EthernetMacBase.h:120
inet::EthernetMacBase::ENDTRANSMISSION
@ ENDTRANSMISSION
Definition: EthernetMacBase.h:59
inet::MIN_ETHERNET_FRAME_BYTES
const B MIN_ETHERNET_FRAME_BYTES
Definition: Ethernet.h:22
inet::EthernetCsmaMac::totalSuccessfulRxTxTime
simtime_t totalSuccessfulRxTxTime
Definition: EthernetCsmaMac.h:67
inet::EthernetMacBase::EtherDescr::maxBytesInBurst
B maxBytesInBurst
Definition: EthernetMacBase.h:73
inet::EthernetCsmaMac::frameReceptionComplete
virtual void frameReceptionComplete()
Definition: EthernetCsmaMac.cc:702
inet::EthernetMacBase::rxPausePkUnitsSignal
static simsignal_t rxPausePkUnitsSignal
Definition: EthernetMacBase.h:130
inet::EthernetCsmaMac::canContinueBurst
bool canContinueBurst(b remainingGapLength)
Definition: EthernetCsmaMac.cc:825
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::EthernetCsmaMac::updateRxSignals
virtual void updateRxSignals(EthernetSignalBase *signal, simtime_t endRxTime)
Definition: EthernetCsmaMac.cc:859
inet::JAM_SIGNAL_BYTES
const B JAM_SIGNAL_BYTES
Definition: Ethernet.h:40
inet::EthernetCsmaMac::endBackoffTimer
cMessage * endBackoffTimer
Definition: EthernetCsmaMac.h:54
inet::EthernetCsmaMac::handleEndTxPeriod
virtual void handleEndTxPeriod()
Definition: EthernetCsmaMac.cc:464
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::EthernetCsmaMac::handleRetransmission
virtual void handleRetransmission()
Definition: EthernetCsmaMac.cc:619
inet::RETRY_LIMIT_REACHED
@ RETRY_LIMIT_REACHED
Definition: Simsignals_m.h:78
inet::EthernetCsmaMac::readChannelParameters
virtual void readChannelParameters(bool errorWhenAsymmetric) override
Calculates datarates, etc.
Definition: EthernetCsmaMac.cc:125
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::EthernetMacBase::txPausePkUnitsSignal
static simsignal_t txPausePkUnitsSignal
Definition: EthernetMacBase.h:129
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::EthernetCsmaMac::scheduleEndPausePeriod
virtual void scheduleEndPausePeriod(int pauseUnits)
Definition: EthernetCsmaMac.cc:837
inet::EthernetMacBase::changeReceptionState
void changeReceptionState(MacReceiveState newState)
Definition: EthernetMacBase.cc:655
inet::EthernetMacBase::cutEthernetSignalEnd
virtual void cutEthernetSignalEnd(EthernetSignalBase *signal, simtime_t duration)
Definition: EthernetMacBase.cc:699
inet::EthernetCsmaMac::backoffs
int backoffs
Definition: EthernetCsmaMac.h:51
inet::MacProtocolBase::dropCurrentTxFrame
virtual void dropCurrentTxFrame(PacketDropDetails &details)
Definition: MacProtocolBase.cc:99
inet::EthernetMacBase::verifyCrcAndLength
bool verifyCrcAndLength(Packet *packet)
Verify ethernet packet: check FCS and payload length.
Definition: EthernetMacBase.cc:395
inet::EthernetMacBase::ENDJAMMING
@ ENDJAMMING
Definition: EthernetMacBase.h:60
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::EthernetCsmaMac::printState
virtual void printState()
Definition: EthernetCsmaMac.cc:648
inet::EthernetCsmaMac::backoffSlotsGeneratedSignal
static simsignal_t backoffSlotsGeneratedSignal
Definition: EthernetCsmaMac.h:75
inet::receptionStartedSignal
simsignal_t receptionStartedSignal
Definition: Simsignals.cc:118
inet::EthernetCsmaMac::fillIFGInBurst
virtual void fillIFGInBurst()
Definition: EthernetCsmaMac.cc:812
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::EthernetCsmaMac::processReceivedControlFrame
virtual void processReceivedControlFrame(Packet *packet)
Definition: EthernetCsmaMac.cc:768
inet::EthernetCsmaMac::handleEndPausePeriod
virtual void handleEndPausePeriod()
Definition: EthernetCsmaMac.cc:693
inet::EthernetCsmaMac::bytesSentInBurst
B bytesSentInBurst
Definition: EthernetCsmaMac.h:72
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::EthernetMacBase::numBytesReceivedOK
unsigned long numBytesReceivedOK
Definition: EthernetMacBase.h:118
inet::EthernetMacBase::EtherDescr::slotTime
double slotTime
Definition: EthernetMacBase.h:76
inet::EthernetMacBase::ENDRECEPTION
@ ENDRECEPTION
Definition: EthernetMacBase.h:57
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::EthernetCsmaMac::processMsgFromNetwork
virtual void processMsgFromNetwork(EthernetSignalBase *msg)
Definition: EthernetCsmaMac.cc:286
inet::EthernetMacBase::RECEIVING_STATE
@ RECEIVING_STATE
Definition: EthernetMacBase.h:47
inet::EthernetMacBase::lastTxFinishTime
simtime_t lastTxFinishTime
Definition: EthernetMacBase.h:103
inet::EthernetMacBase::EtherDescr::halfBitTime
double halfBitTime
Definition: EthernetMacBase.h:70
inet::EthernetMacBase::PAUSE_STATE
@ PAUSE_STATE
Definition: EthernetMacBase.h:41
inet::EthernetMacBase::BACKOFF_STATE
@ BACKOFF_STATE
Definition: EthernetMacBase.h:40
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::EthernetCsmaMac::channelBusySince
simtime_t channelBusySince
Definition: EthernetCsmaMac.h:68
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::EthernetCsmaMac::handleSignalFromNetwork
virtual void handleSignalFromNetwork(EthernetSignalBase *signal)
Definition: EthernetCsmaMac.cc:194
inet::receptionEndedSignal
simsignal_t receptionEndedSignal
Definition: Simsignals.cc:119
inet::ETHERNET_CONTROL_PAUSE
@ ETHERNET_CONTROL_PAUSE
Definition: EthernetControlFrame_m.h:55
inet::transmissionStartedSignal
simsignal_t transmissionStartedSignal
Definition: Simsignals.cc:116
inet::EthernetCsmaMac::framesSentInBurst
int framesSentInBurst
Definition: EthernetCsmaMac.h:71
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::EthernetCsmaMac::processDetectedCollision
virtual void processDetectedCollision()
Definition: EthernetCsmaMac.cc:347
inet::EthernetCsmaMac::handleEndRxPeriod
virtual void handleEndRxPeriod()
Definition: EthernetCsmaMac.cc:520
inet::EthernetCsmaMac::totalCollisionTime
simtime_t totalCollisionTime
Definition: EthernetCsmaMac.h:66
inet::EthernetMacBase::readChannelParameters
virtual void readChannelParameters(bool errorWhenAsymmetric)
Calculates datarates, etc.
Definition: EthernetMacBase.cc:485
inet::EthernetCsmaMac::endRxTimer
cMessage * endRxTimer
Definition: EthernetCsmaMac.h:53
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::EthernetCsmaMac::endJammingTimer
cMessage * endJammingTimer
Definition: EthernetCsmaMac.h:55
inet::EthernetMacBase::ENDBACKOFF
@ ENDBACKOFF
Definition: EthernetMacBase.h:58
inet::EthernetMacBase::rxPkOkSignal
static simsignal_t rxPkOkSignal
Definition: EthernetMacBase.h:128
inet::EthernetCsmaMac::scheduleEndIFGPeriod
virtual void scheduleEndIFGPeriod()
Definition: EthernetCsmaMac.cc:803
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::EthernetCsmaMac::handleEndIFGPeriod
virtual void handleEndIFGPeriod()
Definition: EthernetCsmaMac.cc:357
inet::EthernetMacBase::processConnectDisconnect
virtual void processConnectDisconnect()
Definition: EthernetMacBase.cc:347
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::EthernetCsmaMac::beginSendFrames
virtual void beginSendFrames()
Definition: EthernetCsmaMac.cc:845
inet::MAX_ETHERNET_FRAME_BYTES
const B MAX_ETHERNET_FRAME_BYTES
Definition: Ethernet.h:21
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::EthernetMacBase::numDroppedBitError
unsigned long numDroppedBitError
Definition: EthernetMacBase.h:122
inet::MacProtocolBase::deleteCurrentTxFrame
virtual void deleteCurrentTxFrame()
Definition: MacProtocolBase.cc:93
inet::EthernetMacBase::JAMMING_STATE
@ JAMMING_STATE
Definition: EthernetMacBase.h:39
inet::EthernetMacBase::endIfgTimer
cMessage * endIfgTimer
Definition: EthernetMacBase.h:108
inet::EthernetMacBase::RX_COLLISION_STATE
@ RX_COLLISION_STATE
Definition: EthernetMacBase.h:48
inet::EthernetCsmaMac::sendSignal
virtual void sendSignal(EthernetSignalBase *signal, simtime_t_cref duration)
Definition: EthernetCsmaMac.cc:577
inet::EthernetMacBase::duplexMode
bool duplexMode
Definition: EthernetMacBase.h:91
inet::EthernetMacBase::EtherDescr::maxPropagationDelay
double maxPropagationDelay
Definition: EthernetMacBase.h:77
inet::INTERFACE_DOWN
@ INTERFACE_DOWN
Definition: Simsignals_m.h:72
inet::EthernetCsmaMac::calculateMinFrameLength
B calculateMinFrameLength()
Definition: EthernetCsmaMac.cc:386
inet::EthernetMacBase::initializeStatistics
virtual void initializeStatistics()
Definition: EthernetMacBase.cc:247
inet::EthernetCsmaMac::handleEndJammingPeriod
virtual void handleEndJammingPeriod()
Definition: EthernetCsmaMac.cc:608
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::EthernetMacBase::channelsDiffer
bool channelsDiffer
Definition: EthernetMacBase.h:100
inet::EthernetMacBase::RX_IDLE_STATE
@ RX_IDLE_STATE
Definition: EthernetMacBase.h:46
inet::EthernetMacBase::SEND_IFG_STATE
@ SEND_IFG_STATE
Definition: EthernetMacBase.h:37
inet::EthernetCsmaMac::handleEndBackoffPeriod
virtual void handleEndBackoffPeriod()
Definition: EthernetCsmaMac.cc:559
inet::EthernetCsmaMac::numCollisions
unsigned long numCollisions
Definition: EthernetCsmaMac.h:69
inet::MacProtocolBase::dequeuePacket
virtual Packet * dequeuePacket()
Definition: MacProtocolBase.cc:175
inet::EthernetMacBase::curTxSignal
EthernetSignalBase * curTxSignal
Definition: EthernetMacBase.h:112
inet::SFD_BYTES
const B SFD_BYTES
Definition: Ethernet.h:42
CASE
#define CASE(x)
MAX_ATTEMPTS
#define MAX_ATTEMPTS
Definition: Ethernet.h:38
inet::packetSentToUpperSignal
simsignal_t packetSentToUpperSignal
Definition: Simsignals.cc:87
inet::MacProtocolBase::txQueue
opp_component_ptr< queueing::IPacketQueue > txQueue
Messages received from upper layer and to be transmitted later.
Definition: MacProtocolBase.h:38
inet::EthernetCsmaMac::handleUpperPacket
virtual void handleUpperPacket(Packet *msg) override
Definition: EthernetCsmaMac.cc:239
inet::EthernetMacBase::frameBursting
bool frameBursting
Definition: EthernetMacBase.h:92
inet::EthernetCsmaMac::dropCurrentTxFrame
virtual void dropCurrentTxFrame(PacketDropDetails &details) override
Definition: EthernetCsmaMac.cc:887
inet::EthernetCsmaMac::sendJamSignal
virtual void sendJamSignal()
Definition: EthernetCsmaMac.cc:586
inet::EthernetMacBase::SPEED_OF_LIGHT_IN_CABLE
static const double SPEED_OF_LIGHT_IN_CABLE
Definition: EthernetMacBase.h:136
inet::EthernetMacBase::numPauseFramesRcvd
unsigned long numPauseFramesRcvd
Definition: EthernetMacBase.h:125
inet::EthernetMacBase::receiveState
MacReceiveState receiveState
Definition: EthernetMacBase.h:102
inet::EthernetMacBase::ENDPAUSE
@ ENDPAUSE
Definition: EthernetMacBase.h:61
inet::PREAMBLE_BYTES
const B PREAMBLE_BYTES
Definition: Ethernet.h:41
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::EtherDescr::halfDuplexFrameMinBytes
B halfDuplexFrameMinBytes
Definition: EthernetMacBase.h:74
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::EthernetCsmaMac::numBackoffs
unsigned long numBackoffs
Definition: EthernetCsmaMac.h:70
inet::EthernetCsmaMac::handleSelfMessage
virtual void handleSelfMessage(cMessage *msg) override
Definition: EthernetCsmaMac.cc:135
inet::EthernetMacBase::RX_RECONNECT_STATE
@ RX_RECONNECT_STATE
Definition: EthernetMacBase.h:49
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::EthernetCsmaMac::rxSignals
std::vector< RxSignal > rxSignals
Definition: EthernetCsmaMac.h:47
inet::EthernetCsmaMac::processReceivedDataFrame
virtual void processReceivedDataFrame(Packet *frame)
Definition: EthernetCsmaMac.cc:748
inet::EthernetMacBase::changeTransmissionState
void changeTransmissionState(MacTransmitState newState)
Definition: EthernetMacBase.cc:649
BACKOFF_RANGE_LIMIT
#define BACKOFF_RANGE_LIMIT
Definition: Ethernet.h:39
inet::packetSentToLowerSignal
simsignal_t packetSentToLowerSignal
Definition: Simsignals.cc:90