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

#include <MacRelayUnit.h>

Inheritance diagram for inet::MacRelayUnit:
inet::MacRelayUnitBase inet::LayeredProtocolBase inet::StringFormat::IDirectiveResolver inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Protected Member Functions

virtual void handleLowerPacket (Packet *packet) override
 
- Protected Member Functions inherited from inet::MacRelayUnitBase
virtual void initialize (int stage) override
 
virtual void finish () override
 
virtual void updateDisplayString () const
 
virtual const char * resolveDirective (char directive) const override
 
virtual bool isForwardingInterface (NetworkInterface *networkInterface) const
 
virtual void broadcastPacket (Packet *packet, const MacAddress &destinationAddress, NetworkInterface *incomingInterface)
 
virtual void sendPacket (Packet *packet, const MacAddress &destinationAddress, NetworkInterface *outgoingInterface)
 
virtual void updatePeerAddress (NetworkInterface *incomingInterface, MacAddress sourceAddress, unsigned int vlanId)
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
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
 
- Protected Member Functions inherited from inet::LayeredProtocolBase
virtual void handleMessageWhenUp (cMessage *message) override
 
virtual void handleSelfMessage (cMessage *message)
 
virtual void handleUpperMessage (cMessage *message)
 
virtual void handleLowerMessage (cMessage *message)
 
virtual void handleUpperCommand (cMessage *message)
 
virtual void handleLowerCommand (cMessage *message)
 
virtual void handleUpperPacket (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 void handleMessageWhenDown (cMessage *msg)
 
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 ()
 

Additional Inherited Members

- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 
- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 
- Protected Attributes inherited from inet::MacRelayUnitBase
ModuleRefByPar< IInterfaceTableinterfaceTable
 
ModuleRefByPar< IMacForwardingTablemacForwardingTable
 
long numProcessedFrames = 0
 
long numDroppedFrames = 0
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Member Function Documentation

◆ handleLowerPacket()

void inet::MacRelayUnit::handleLowerPacket ( Packet packet)
overrideprotectedvirtual

Reimplemented from inet::LayeredProtocolBase.

23 {
24  auto protocol = incomingPacket->getTag<PacketProtocolTag>()->getProtocol();
25  auto macAddressInd = incomingPacket->getTag<MacAddressInd>();
26  auto sourceAddress = macAddressInd->getSrcAddress();
27  auto destinationAddress = macAddressInd->getDestAddress();
28  auto interfaceInd = incomingPacket->getTag<InterfaceInd>();
29  int incomingInterfaceId = interfaceInd->getInterfaceId();
30  auto incomingInterface = interfaceTable->getInterfaceById(incomingInterfaceId);
31  unsigned int vlanId = 0;
32  if (auto vlanInd = incomingPacket->findTag<VlanInd>())
33  vlanId = vlanInd->getVlanId();
34  EV_INFO << "Processing packet from network" << EV_FIELD(incomingInterface) << EV_FIELD(incomingPacket) << EV_ENDL;
35  updatePeerAddress(incomingInterface, sourceAddress, vlanId);
36 
37  auto outgoingPacket = incomingPacket->dup();
38  outgoingPacket->trim();
39  outgoingPacket->clearTags();
40  outgoingPacket->addTag<PacketProtocolTag>()->setProtocol(protocol);
41  if (auto vlanInd = incomingPacket->findTag<VlanInd>())
42  outgoingPacket->addTag<VlanReq>()->setVlanId(vlanInd->getVlanId());
43  if (auto userPriorityInd = incomingPacket->findTag<UserPriorityInd>())
44  outgoingPacket->addTag<UserPriorityReq>()->setUserPriority(userPriorityInd->getUserPriority());
45  auto& macAddressReq = outgoingPacket->addTag<MacAddressReq>();
46  macAddressReq->setSrcAddress(sourceAddress);
47  macAddressReq->setDestAddress(destinationAddress);
48  if (destinationAddress.isBroadcast())
49  broadcastPacket(outgoingPacket, destinationAddress, incomingInterface);
50  else if (destinationAddress.isMulticast()) {
51  auto outgoingInterfaceIds = macForwardingTable->getMulticastAddressForwardingInterfaces(destinationAddress, vlanId);
52  if (outgoingInterfaceIds.size() == 0)
53  broadcastPacket(incomingPacket, destinationAddress, incomingInterface);
54  else {
55  for (auto outgoingInterfaceId : outgoingInterfaceIds) {
56  if (interfaceInd != nullptr && outgoingInterfaceId == interfaceInd->getInterfaceId())
57  EV_WARN << "Ignoring outgoing interface because it is the same as incoming interface" << EV_FIELD(destinationAddress) << EV_FIELD(incomingInterface) << EV_FIELD(incomingPacket) << EV_ENDL;
58  else {
59  auto outgoingInterface = interfaceTable->getInterfaceById(outgoingInterfaceId);
60  sendPacket(incomingPacket->dup(), destinationAddress, outgoingInterface);
61  }
62  }
63  delete incomingPacket;
64  }
65  }
66  else {
67  // Find output interface of destination address and send packet to output interface
68  // if not found then broadcasts to all other interfaces instead
69  int outgoingInterfaceId = macForwardingTable->getUnicastAddressForwardingInterface(destinationAddress);
70  // should not send out the same packet on the same interface
71  // (although wireless interfaces are ok to receive the same message)
72  if (incomingInterfaceId == outgoingInterfaceId) {
73  EV_WARN << "Discarding packet because outgoing interface is the same as incoming interface" << EV_FIELD(destinationAddress) << EV_FIELD(incomingInterface) << EV_FIELD(incomingPacket) << EV_ENDL;
75  PacketDropDetails details;
76  details.setReason(NO_INTERFACE_FOUND);
77  emit(packetDroppedSignal, outgoingPacket, &details);
78  delete outgoingPacket;
79  }
80  else if (outgoingInterfaceId != -1) {
81  auto outgoingInterface = interfaceTable->getInterfaceById(outgoingInterfaceId);
82  sendPacket(outgoingPacket, destinationAddress, outgoingInterface);
83  }
84  else
85  broadcastPacket(outgoingPacket, destinationAddress, incomingInterface);
86  }
89  delete incomingPacket;
90 }

The documentation for this class was generated from the following files:
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::NO_INTERFACE_FOUND
@ NO_INTERFACE_FOUND
Definition: Simsignals_m.h:74
inet::MacRelayUnitBase::updatePeerAddress
virtual void updatePeerAddress(NetworkInterface *incomingInterface, MacAddress sourceAddress, unsigned int vlanId)
Definition: MacRelayUnitBase.cc:89
inet::MacRelayUnitBase::numProcessedFrames
long numProcessedFrames
Definition: MacRelayUnitBase.h:27
inet::MacRelayUnitBase::updateDisplayString
virtual void updateDisplayString() const
Definition: MacRelayUnitBase.cc:53
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::MacRelayUnitBase::interfaceTable
ModuleRefByPar< IInterfaceTable > interfaceTable
Definition: MacRelayUnitBase.h:24
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::MacRelayUnitBase::broadcastPacket
virtual void broadcastPacket(Packet *packet, const MacAddress &destinationAddress, NetworkInterface *incomingInterface)
Definition: MacRelayUnitBase.cc:61
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::MacRelayUnitBase::macForwardingTable
ModuleRefByPar< IMacForwardingTable > macForwardingTable
Definition: MacRelayUnitBase.h:25
inet::MacRelayUnitBase::sendPacket
virtual void sendPacket(Packet *packet, const MacAddress &destinationAddress, NetworkInterface *outgoingInterface)
Definition: MacRelayUnitBase.cc:75
inet::MacRelayUnitBase::numDroppedFrames
long numDroppedFrames
Definition: MacRelayUnitBase.h:28
EV_ENDL
#define EV_ENDL
Definition: INETDefs.h:114