INET Framework for OMNeT++/OMNEST
inet::physicallayer::WireJunction Class Reference

Models a wiring hub. More...

#include <WireJunction.h>

Inheritance diagram for inet::physicallayer::WireJunction:

Classes

struct  TxInfo
 

Protected Member Functions

virtual void initialize () override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 
virtual void setChannelModes ()
 
virtual void setGateModes ()
 
virtual void addTxInfo (long incomingTxId, int port, long outgoingTxId, simtime_t finishTime)
 
virtual void updateTxInfo (TxInfo *txInfo, simtime_t finishTime)
 
virtual TxInfofindTxInfo (long incomingTxId, int port)
 

Protected Attributes

std::vector< TxInfotxList
 
int numPorts
 
int inputGateBaseId
 
int outputGateBaseId
 
long numMessages
 

Detailed Description

Models a wiring hub.

It simply broadcasts the received message (which can be a transmission update, requiring special attention) on all other ports.

Note that no special attention is made to appropriately model frame truncations that occur when the link breaks, or comes back up while a transmission is underway. This is mainly so because being a generic model, WireJunction doesn't know how to produce sliced (truncated) versions of frames. If you need to precisely model what happens when the link state changes, you cannot use this class.

Member Function Documentation

◆ addTxInfo()

void inet::physicallayer::WireJunction::addTxInfo ( long  incomingTxId,
int  port,
long  outgoingTxId,
simtime_t  finishTime 
)
protectedvirtual
127 {
128  txList.push_back(TxInfo());
129  TxInfo *tx = &txList.back();
130  tx->incomingTxId = incomingTxId;
131  tx->outgoingPort = port;
132  tx->outgoingTxId = outgoingTxId;
133  tx->finishTime = finishTime;
134 }

Referenced by handleMessage().

◆ findTxInfo()

WireJunction::TxInfo * inet::physicallayer::WireJunction::findTxInfo ( long  incomingTxId,
int  port 
)
protectedvirtual
137 {
138  // find transmission, purge expired ones
139  int txIndex = -1;
140  simtime_t now = getSimulation()->getSimTime();
141  for (int i = 0; i < (int)txList.size(); i++) {
142  if (txList[i].finishTime < now) {
143  txList[i] = txList.back(); // no-op if txList[i] is the last item (i.e. txList.back())
144  txList.pop_back();
145  i--;
146  }
147  else if (incomingTxId == txList[i].incomingTxId && port == txList[i].outgoingPort)
148  txIndex = i;
149  }
150  return (txIndex == -1) ? nullptr : &txList[txIndex];
151 }

Referenced by handleMessage().

◆ handleMessage()

void inet::physicallayer::WireJunction::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
79 {
80  cPacket *signal = check_and_cast<cPacket *>(msg);
81 
82  // Handle frame sent down from the network entity: send out on every other port
83  int arrivalPort = signal->getArrivalGate()->getIndex();
84  EV << "Frame " << signal << " arrived on port " << arrivalPort << ", broadcasting on all other ports\n";
85 
86  numMessages++;
87  emit(packetReceivedSignal, signal);
88 
89  if (numPorts <= 1) {
90  delete signal;
91  return;
92  }
93 
94  long incomingTxId = signal->getTransmissionId();
95  for (int i = 0; i < numPorts; i++) {
96  if (i != arrivalPort) {
97  cGate *ogate = gate(outputGateBaseId + i);
98  if (!ogate->isConnected())
99  continue;
100 
101  cPacket *outSignal = signal->dup();
102  SendOptions sendOptions;
103  sendOptions.duration(signal->getDuration());
104 
105  if (!signal->isUpdate()) {
106  sendOptions.transmissionId(outSignal->getId());
107  addTxInfo(signal->getTransmissionId(), i, outSignal->getId(), simTime() + signal->getDuration());
108  }
109  else {
110  TxInfo *tx = findTxInfo(incomingTxId, i);
111  if (!tx) { // we missed the original signal, ignore the update
112  delete outSignal;
113  continue;
114  }
115  updateTxInfo(tx, simTime() + signal->getRemainingDuration());
116  sendOptions.updateTx(tx->outgoingTxId, signal->getRemainingDuration());
117  }
118 
119  // send
120  send(outSignal, sendOptions, ogate);
121  }
122  }
123  delete signal;
124 }

◆ initialize()

void inet::physicallayer::WireJunction::initialize ( )
overrideprotectedvirtual
23 {
24  auto gateNames = getGateNames();
25  if (gateNames.size() != 1)
26  throw cRuntimeError("Cannot find the gate vector");
27  std::string gateName = gateNames[0];
28  numPorts = gateSize(gateName.c_str());
29  inputGateBaseId = gateBaseId((gateName + "$i").c_str());
30  outputGateBaseId = gateBaseId((gateName + "$o").c_str());
31 
32  numMessages = 0;
33  WATCH(numMessages);
34 
35  subscribe(POST_MODEL_CHANGE, this);
36 
37  setTxUpdateSupport(true);
38  setGateModes();
40 }

◆ receiveSignal()

void inet::physicallayer::WireJunction::receiveSignal ( cComponent *  source,
simsignal_t  signalID,
cObject *  obj,
cObject *  details 
)
overrideprotectedvirtual
60 {
61  Enter_Method("%s", cComponent::getSignalName(signalID));
62 
63  ASSERT(signalID == POST_MODEL_CHANGE);
64 
65  if (auto notif = dynamic_cast<cPostGateVectorResizeNotification *>(obj)) {
66  if (notif->module == this)
67  setGateModes();
68  return;
69  }
70 
71  if (auto notif = dynamic_cast<cPostPathCreateNotification *>(obj)) {
72  if ((this == notif->pathStartGate->getOwnerModule()) || (this == notif->pathEndGate->getOwnerModule()))
74  return;
75  }
76 }

◆ setChannelModes()

void inet::physicallayer::WireJunction::setChannelModes ( )
protectedvirtual
49 {
50  for (int i = 0; i < numPorts; i++) {
51  cGate *outGate = gate(outputGateBaseId + i);
52  if (outGate->isConnected()) {
53  cDatarateChannel *outTxChannel = check_and_cast<cDatarateChannel *>(outGate->getTransmissionChannel());
54  outTxChannel->setMode(cDatarateChannel::MULTI);
55  }
56  }
57 }

Referenced by initialize(), and receiveSignal().

◆ setGateModes()

void inet::physicallayer::WireJunction::setGateModes ( )
protectedvirtual
43 {
44  for (int i = 0; i < numPorts; i++)
45  gate(inputGateBaseId + i)->setDeliverImmediately(true);
46 }

Referenced by initialize(), and receiveSignal().

◆ updateTxInfo()

virtual void inet::physicallayer::WireJunction::updateTxInfo ( TxInfo txInfo,
simtime_t  finishTime 
)
inlineprotectedvirtual
55 { txInfo->finishTime = finishTime; }

Referenced by handleMessage().

Member Data Documentation

◆ inputGateBaseId

int inet::physicallayer::WireJunction::inputGateBaseId
protected

Referenced by initialize(), and setGateModes().

◆ numMessages

long inet::physicallayer::WireJunction::numMessages
protected

Referenced by handleMessage(), and initialize().

◆ numPorts

int inet::physicallayer::WireJunction::numPorts
protected

◆ outputGateBaseId

int inet::physicallayer::WireJunction::outputGateBaseId
protected

◆ txList

std::vector<TxInfo> inet::physicallayer::WireJunction::txList
protected

Referenced by addTxInfo(), and findTxInfo().


The documentation for this class was generated from the following files:
inet::physicallayer::WireJunction::setChannelModes
virtual void setChannelModes()
Definition: WireJunction.cc:48
inet::physicallayer::WireJunction::numMessages
long numMessages
Definition: WireJunction.h:45
inet::physicallayer::WireJunction::outputGateBaseId
int outputGateBaseId
Definition: WireJunction.h:42
inet::physicallayer::WireJunction::findTxInfo
virtual TxInfo * findTxInfo(long incomingTxId, int port)
Definition: WireJunction.cc:136
inet::physicallayer::WireJunction::addTxInfo
virtual void addTxInfo(long incomingTxId, int port, long outgoingTxId, simtime_t finishTime)
Definition: WireJunction.cc:126
inet::physicallayer::WireJunction::txList
std::vector< TxInfo > txList
Definition: WireJunction.h:39
inet::packetReceivedSignal
simsignal_t packetReceivedSignal
Definition: Simsignals.cc:97
inet::physicallayer::WireJunction::inputGateBaseId
int inputGateBaseId
Definition: WireJunction.h:41
inet::physicallayer::WireJunction::updateTxInfo
virtual void updateTxInfo(TxInfo *txInfo, simtime_t finishTime)
Definition: WireJunction.h:55
inet::physicallayer::WireJunction::setGateModes
virtual void setGateModes()
Definition: WireJunction.cc:42
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::physicallayer::WireJunction::numPorts
int numPorts
Definition: WireJunction.h:40