67 if (std::string(par(name).stringValue()).empty())
73 std::stringstream moduleName;
74 moduleName << prefix << par(name).stringValue();
75 cModuleType* policyType = cModuleType::get(moduleName.str().c_str());
76 return policyType->createScheduleInit(name, getParentModule());
83 (
"RTTEstimatorPolicy");
132 rendezvousEnabled = getModuleByPath(
".^.^.efcp")->par(
"rendezvousEnabled").boolValue();
164 bool interrupter =
false;
165 interrupter = getModuleByPath(
".^.^.")->par(
"interrupter").boolValue();
170 scheduleAt(120, startR);
174 scheduleAt(140, stopR);
234 cancelAndDelete((*it));
245 if (!getEnvir()->isGUI())
255 cDisplayString& disp = getDisplayString();
256 disp.setTagArg(
"t", 1,
"r");
257 std::ostringstream desc;
264 std::vector<DataTransferPDU*>::iterator it;
265 std::vector<DataTransferPDU*>* pduQ;
270 desc <<
"reassemblyQ: empty" <<
"\n";
274 desc <<
"reassemblyQ: ";
275 std::vector<DataTransferPDU*>::iterator it;
276 for (it = pduQ->begin(); it != pduQ->end(); ++it)
278 desc << (*it)->getSeqNum() <<
" | ";
286 disp.setTagArg(
"t", 0, desc.str().c_str());
345 if (msg->isSelfMessage())
379 if (msg->arrivedOn(
northI->getId()))
385 else if (msg->arrivedOn(
southI->getId()))
428 dataPDU->encapsulate(userDataField);
470 Enter_Method_Silent();
473 for (
auto it = pduQ->begin();
476 send((*it)->decapsulate(),
northO);
478 it = pduQ->erase(it);
567 Enter_Method_Silent();
658 unsigned int startSeqNum = selNackPdu->
getNackList(i * 2);
659 unsigned int endSeqNum = selNackPdu->
getNackList((i * 2) + 1);
670 unsigned int tempSLWE = 0;
673 unsigned int startSeqNum = selAckPdu->
getNackList(i * 2);
674 unsigned int endSeqNum = selAckPdu->
getNackList((i * 2) + 1);
676 tempSLWE = std::max(endSeqNum, tempSLWE);
711 EV << getFullPath() <<
": PDU number: " << ackPdu->
getAckNackSeqNum() <<
" Acked" << endl;
762 if (dynamic_cast<DataTransferPDU*>(msg))
769 else if (dynamic_cast<ControlPDU*>(msg))
772 EV << getFullPath() <<
": Control PDU number: " << pdu->
getSeqNum() <<
" received" << endl;
781 throw cRuntimeError(
"Unexptected PDU Type");
802 Enter_Method_Silent();
803 for (
auto it =
aTimerQ.begin(); it !=
aTimerQ.end() && (*it)->getSeqNum() <= seqNum;)
805 cancelAndDelete((*it));
820 Enter_Method_Silent();
828 for(; it !=
aTimerQ.end(); ++it)
830 if((*it)->getSeqNum() > seqNum)
846 for (it = pduQ->begin(); it != pduQ->end(); ++it)
848 if ((*it)->getSeqNum() == seqNum)
865 EV << getFullPath() <<
": PDU number: " << pdu->
getSeqNum() <<
" received" << endl;
914 bubble(
"Received PDU with DRF set");
959 bubble(
"Dropping duplicate PDU");
960 EV << getFullPath() <<
":Duplicated PDU number: " << pdu->
getSeqNum() <<
" received - DROPPING!" << endl;
977 EV << getFullPath() <<
":Duplicated PDU number: " << pdu->
getSeqNum() <<
" received - DROPPING!" << endl;
1102 Enter_Method_Silent();
1124 for (
auto it = pduQ->begin(); it != pduQ->end() && (*it)->getSeqNum() <= timer->
getSeqNum(); ++it)
1136 for (
auto it = pduQ->begin(); it != pduQ->end() && (*it)->getSeqNum() <= timer->
getSeqNum();)
1141 it = pduQ->erase(it);
1148 bubble(
"RcvLeftWindowEdge SHOULD not be bigger than seqNum in A-Timer, right?");
1205 unsigned int counter = 0;
1285 Enter_Method_Silent();
1333 std::vector<DataTransferPDU*>::iterator it;
1334 for (it = pduQ->begin(); it != pduQ->end(); it = pduQ->begin())
1404 std::vector<DataTransferPDU*>::iterator it;
1406 for (it = pduQ->begin(); it != pduQ->end();)
1409 it = pduQ->erase(it);
1416 std::vector<DataTransferPDU*>::iterator it;
1418 for (it = pduQ->begin(); it != pduQ->end();)
1425 it = pduQ->erase(it);
1433 std::vector<DataTransferPDU*>::iterator it;
1435 for (it = pduQ->begin(); it != pduQ->end();)
1439 it = pduQ->erase(it);
1449 std::vector<DataTransferPDU*>::iterator it;
1451 for (it = pduQ->begin(); it != pduQ->end();)
1454 it = pduQ->erase(it);
1472 Enter_Method(
"InitialSeqNumPolicy");
1498 EV << getFullPath() <<
": Sending Ack for PDU number: " << seqNum << endl;
1516 Enter_Method_Silent();
1548 userData->encapsulate(pduData);
1551 dataPdu->encapsulate(userData);
1622 (
"RcvrInactivityPolicy");
1636 (
"SenderInactivityPolicy");
1651 Enter_Method_Silent(
"SendToRMT");
1658 EV << getFullPath() <<
": PDU number: " << pdu->
getSeqNum() <<
" sent in time: " << simTime() << endl;
1664 EV << getFullPath() <<
": Control PDU number: " << pdu->
getSeqNum() <<
" sent in time: " << simTime() << endl;
1751 scheduleAt(simTime() + 3 * (MPL + R + A), timer);
1755 scheduleAt(simTime() + 2 * (MPL + R + A), timer);
1759 scheduleAt(simTime() + A, timer);
1777 if (dtcp !=
nullptr)
1785 this->state =
state;
bool runSenderAckPolicy(DTPState *dtpState)
void runRTTEstimatorPolicy()
bool runInitialSeqNumPolicy()
void rcvrBufferStateChange()
void generateDTPDU(UserDataField *userDataField)
void sendReliableControlPDU()
Class representing flow object with attributes from specs.
virtual void handleMessage(cMessage *msg)
virtual void setAction(int action)
virtual void setRcvRate(unsigned int rcvRate)
void trySendGenPDUs(std::vector< DataTransferPDU * > *pduQ)
void fillRendezvousPDU(RendezvousPDU *rendezPDU)
const APNamingInfo & getSrcApni() const
Gets read-only source APNamingInfo.
void setPduDroppingEnabled(bool pduDroppingEnabled)
void handleQueueInfo(QueueInfo *queueInfo)
void setRcvLeftWinEdge(unsigned int rcvLeftWinEdge)
virtual unsigned int getSeqNum() const
void resetSenderInactivTimer()
void handleDTPRcvrInactivityTimer(RcvrInactivityTimer *timer)
void setSndRendez(bool sndRendez)
virtual void setRcvRightWinEdge(unsigned int rcvRightWinEdge)
simsignal_t sigStatDTPRecvSeqNum
RcvrInactivityPolicyBase * rcvrInactivityPolicy
void setPDUHeader(PDU *pdu)
RTTEstimatorPolicyBase * rttEstimatorPolicy
unsigned int getLastSeqNumSent() const
void ackPDU(unsigned int startSeqNum, unsigned int endSeqNum=0)
void updateSenderLWE(unsigned int seqNum)
void handleDTPATimer(ATimer *timer)
PDUQ_t * getPostablePDUQ()
void notifyStartSending()
virtual void setSndRightWinEdge(unsigned int sndRightWinEdge)
virtual unsigned int getSeqNum() const
void handleMsgFromRMT(PDU *msg)
void svUpdate(unsigned int seqNum)
simsignal_t sigStatDTPSentSeqNum
void fillControlAckPDU(ControlAckPDU *ctrlAckPdu)
bool isClosedWinQClosed()
virtual void setSeqNum(unsigned int seqNum)
void pushBackToGeneratedPDUQ(DataTransferPDU *pdu)
void runRcvrInactivityTimerPolicy()
unsigned int getMaxSeqNumRcvd() const
unsigned int getNextSeqNumToSend()
virtual unsigned int getLastCtrlSeqNumRcv() const
void addPDUToReassemblyQ(DataTransferPDU *pdu)
virtual void setDstApn(const APN &dstApn)
void startReliableCPDUTimer()
virtual void setTimeUnit(unsigned long timeUnit)
void handleRendezvousTimer(DTCPRendezvousTimer *timer)
void fillFlowControlPDU(FlowControlPDU *flowControlPdu)
unsigned int getSendingRate() const
Connection identifier as defined in specifications.
virtual bool call(DTPState *dtpState, DTCPState *dtcpState)
void rendezvousCondition()
virtual void setSrcAddr(const Address &srcAddr)
SenderInactivityTimer * senderInactivityTimer
unsigned int getPdusSentInTimeUnit() const
bool runRateReductionPolicy(DTPState *dtpState)
void notifyAboutInactivity()
#define INITIAL_SEQ_NUM_POLICY_NAME
void handleInterrupterTimer(TheInterrupterTimer *msg)
virtual void setDstAddr(const Address &dstAddr)
void setRcvCredit(unsigned int rcvCredit)
unsigned int getRendezSeqNum() const
void schedule(DTPTimers *timer, double time=0.0)
void setRcvRightWinEdgeSent(unsigned int rcvrRightWinEdgeSent)
bool runRcvrAckPolicy(DTPState *dtpState)
void setSendingRate(unsigned int sendingRate)
unsigned int getSndRightWinEdge() const
void sduProtection(SDU *sdu)
bool runTxControlPolicy(DTPState *dtpState, PDUQ_t *pduQ)
const APN & getApn() const
Getter of APN.
double getATime() const
Gets A-Timer parameter.
bool runECNPolicy(DTPState *dtpState)
bool isBlockingPort() const
void startATimer(unsigned int seqNum)
bool isSendingRateFullfilled() const
bool isDuplicate(unsigned int seqNum)
bool runRcvrControlAckPolicy(DTPState *dtpState)
bool isSetDrfFlag() const
void handleDTPSenderInactivityTimer(SenderInactivityTimer *timer)
void updateRcvRtWinEdge(DTPState *dtpState)
const QoSCube * getQoSCube() const
PDUQ_t * getGeneratedPDUQ()
unsigned int getClosedWinQueLen() const
virtual void setAckNackSeqNum(unsigned int ackNackSeqNum)
bool isDtcpPresent() const
virtual void setFlags(int flags)
void clearReassemblyPDUQ()
void setQoSCube(const QoSCube *&qoSCube)
const Address & getSrcAddr() const
Gets source Address, which is the address of communication start-point.
InitialSeqNumPolicyBase * initialSeqNumPolicy
unsigned int delimit(SDUData *sduData)
unsigned long getSendingTimeUnit()
void addPDUToReassemblyQ(DataTransferPDU *pdu)
bool isClosedWindow() const
void runSenderInactivityTimerPolicy()
unsigned int getMaxClosedWinQueLen() const
virtual unsigned int getRcvRate() const
unsigned int getSndRtWinEdge()
bool commonRcvControl(ControlPDU *pdu)
unsigned int getRcvLeftWinEdge() const
const QoSCube * getQoSCube() const
bool runRcvrFCPolicy(DTPState *dtpState)
virtual void setDataType(int dataType)
bool runReceivingFCPolicy(DTPState *dtpState)
void updateRcvLWE(unsigned int seqNum)
virtual void setRcvLeftWinEdge(unsigned int rcvLeftWinEdge)
virtual void initialize(int step)
const char * DTP_SEQ_NUM_SENT
virtual unsigned int getSeqNum() const
#define SENDER_INACTIVITY_POLICY_NAME
std::vector< DataTransferPDU * > PDUQ_t
void handleControlPDUFromRMT(ControlPDU *pdu)
void stopReliableCPDUTimer()
void setTmpAtimer(ATimer *tmpAtimer)
void handleQueueInfoFromSocket(QueueInfo *queueInfo)
virtual void setSeqNum(unsigned int seqNum)
simsignal_t sigStatDTPRTT
unsigned int getPdusRcvdInTimeUnit() const
void setSetDrfFlag(bool setDrfFlag)
unsigned int getRcvRightWinEdge() const
cModule * createPolicyModule(const char *prefix, const char *name)
void pushBackToPostablePDUQ(DataTransferPDU *pdu)
simsignal_t sigStatDTPClosedWinQ
virtual void setSrcApn(const APN &srcApn)
const char * SIG_EFCP_StopSending
RcvrInactivityTimer * rcvrInactivityTimer
virtual int getType() const
unsigned int getSndLeftWinEdge() const
virtual unsigned int getNackList(unsigned int k) const
bool runLostControlPDUPolicy(DTPState *dtpState)
const PDU * getCurrentPdu() const
void setRendezSeqNum(unsigned int rendezSeqNum)
bool runSendingAckPolicy(DTPState *dtpState, ATimer *timer)
unsigned int getRcvrRate() const
virtual void setRcvRate(unsigned int rcvRate)
void sendAckFlowPDU(unsigned int seqNum=0, bool seqNumValid=false)
unsigned int getSndLeftWinEdge() const
virtual unsigned int getRendezSeqNum() const
unsigned int getRcvRightWinEdge()
virtual unsigned int getNackListLen() const
std::vector< DataTransferPDU * > * getReassemblyPDUQ()
SenderInactivityPolicyBase * senderInactivityPolicy
bool runReconcileFCPolicy(DTPState *dtpState)
Class representing QoSCube with all its properties that is primarily used by FA, RMT and RA Specifica...
const ConnectionId & getConId() const
Gets read-only Flow's ConnectionId.
virtual DataTransferPDU * dup() const
void handleMsgFromUp(UserDataField *userDataField)
virtual void setCompleteSDU(bool completeSDU)
simsignal_t sigEFCPStartSending
unsigned int getDataReXmitMax() const
virtual void setLastCtrlSeqNumRcv(unsigned int lastCtrlSeqNumRcv)
unsigned int getDropDup() const
bool runNoRateSlowDownPolicy(DTPState *dtpState)
DTCPState * getDTCPState() const
const char * GATE_DTP_NORTHIO
void setSndRtWinEdge(unsigned int sndRtWinEdge)
virtual void setRcvRightWinEdge(unsigned int rcvRightWinEdge)
virtual void setSndRate(unsigned int sndRate)
std::vector< DataTransferPDU * > * getClosedWindowQ()
virtual void setSndRightWinEdge(unsigned int sndRightWinEdge)
virtual void setSndLeftWinEdge(unsigned int sndLeftWinEdge)
void nackPDU(unsigned int startSeqNum, unsigned int endSeqNum=0)
void setRendezvousTimer(DTCPRendezvousTimer *rendezvousTimer)
const char * GATE_DTP_SOUTHIO
#define RTT_ESTIMATOR_POLICY_NAME
virtual int getFlags() const
void sendAckOnlyPDU(unsigned int seqNum)
void setLastSeqNumSent(unsigned int lastSeqNumSent)
void startRendezvousTimer()
const char * SIG_EFCP_StartSending
unsigned int getNextSndCtrlSeqNum()
void setClosedWindow(bool closedWindow)
virtual void encapsulate(Data *data)
void handleQueueInfoFromRMT(QueueInfo *queueInfo)
void initSignalsAndListeners()
virtual unsigned int getAckNackSeqNum() const
std::vector< UserDataField * > userDataFieldQOut
const Address & getDstAddr() const
Gets source Address, which is the address of communication end-point.
virtual int getAction() const
#define RCVR_INACTIVITY_POLICY_NAME
void runCongestionNotificationPolicy()
void setFlow(const Flow *flow)
unsigned int getAllowableGap()
void cancelATimer(unsigned int seqNum)
void setQoSCube(const QoSCube *qosCube)
bool runNoOverridePeakPolicy(DTPState *dtpState)
void setLastControlSeqNumSent(unsigned int lastControlSeqNumSent)
bool setDRFInPDU(bool override)
const char * DTP_SEQ_NUM_RCVD
void setLastCtrlSeqnumRcvd(unsigned int ctrlSeqNum)
void pushBackToRxQ(DataTransferPDU *pdu)
void setConnId(const ConnectionId &connId)
virtual unsigned int getRcvRightWinEdge() const
DTCPRendezvousTimer * getRendezvousTimer()
void flushAllQueuesAndPrepareToDie()
const char * SIG_STAT_DTP_RTT
unsigned int getLastCtrlSeqNumRcv()
void handleDataTransferPDUFromRMT(DataTransferPDU *pdu)
virtual void setRendezSeqNum(unsigned int rendezSeqNum)
virtual void setConnId(const ConnectionId &connId)
void setRcvRendez(bool rcvRendez)
simsignal_t sigEFCPStahpSending
virtual void setSndLeftWinEdge(unsigned int sndLeftWinEdge)
bool runSndFCOverrunPolicy(DTPState *dtpState)
void setCurrentPdu(PDU *currentPdu)
const APNamingInfo & getDstApni() const
Gets read-only destination APNamingInfo.
void setState(DTPState *state)
std::vector< ATimer * > aTimerQ
void setBlockingPort(bool blockingPort)
const char * SIG_STAT_DTP_CLOSED_WIN_Q
bool runRcvFCOverrunPolicy(DTPState *dtpState)
void notifyAboutUnableMaintain()
void pushBackToClosedWinQ(DataTransferPDU *pdu)
bool runECNSlowDownPolicy(DTPState *dtpState)
void flushReassemblyPDUQ()
int getMaxAllowGap() const
Gets Maximum Allowable Gap in SDUs parameter.
virtual int getType() const
void setMaxSeqNumRcvd(unsigned int maxSeqNumRcvd)
unsigned int getNextSeqNumToSendWithoutIncrement()