RINASim  October 2016
Documentation of framework for OMNeT++
DTP.h
Go to the documentation of this file.
1 // The MIT License (MIT)
2 //
3 // Copyright (c) 2014-2016 Brno University of Technology, PRISTINE project
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in
13 // all copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 // THE SOFTWARE.
22 
23 #ifndef DTP_H_
24 #define DTP_H_
25 
26 #include <omnetpp.h>
27 #include <vector>
28 
29 #include "RINASignals.h"
30 #include "ExternConsts.h"
31 
32 #include "DTPState.h"
33 #include "DTPTimers_m.h"
34 #include "DTCP.h"
35 //#include "PDU.h"
36 #include "DataTransferPDU.h"
37 #include "ControlPDU_m.h"
38 #include "SDU.h"
39 #include "RMT.h"
40 
41 #include "RA.h"
42 #include "SDUData_m.h"
43 
44 #include "QueueInfo.h"
45 
46 
47 /* Policies */
51 #include "RTTEstimatorPolicyBase.h"
52 
53 //#include "SDUs.h"
54 
55 #define DEFAULT_INIT_SEQUENCE_NUMBER 1
56 
57 
58 class DTCP;
59 
60 class DTP : public cSimpleModule
61 {
62 
63  friend class DTCP;
64  private:
65 
66  unsigned int sduSeqNum;
67  std::set<unsigned int> sequencingQ;
68  int deletePdu;
71 
72  DTPState* state; //state of this data-transfer
74  const Flow* flow;
75 
76 // const QoSCube *qosCube;
77 
78  /* Policies */
83 
84  /* Various queues */
85 
86 
87  std::vector<UserDataField*> userDataFieldQOut;
88 
89  std::vector<ATimer*> aTimerQ;
90 
91 
92 
93  /* Timers */
96 
97 
98  /**************** Moved rateFulfilled to FC together with sendingRatetimer **************************/
99  /* This timer should be in FlowControl, but since for some reason "rateFulfilled" is in DTState it is better available from here */
100 // SendingRateTimer* sendingRateTimer;
101 
102 // WindowTimer* windowTimer;
103 
104  /* Gates */
105  /* To FAI */
106  cGate* northI;
107  cGate* northO;
108 
109  /* To RMT */
110  cGate* southI;
111  cGate* southO;
112 
114 
115  /* Handle messages and timer */
116 // void handleDTPRxExpiryTimer(RxExpiryTimer* timer);
117 // void handleDTPSendingRateTimer(SendingRateTimer* timer);
118 // void handleDTPWindowTimer(WindowTimer* timer);
121  void handleDTPATimer(ATimer* timer);
122 
123 // void handleMsgFromDelimiting(Data* msg);
124  void handleMsgFromUp(UserDataField* userDataField);
125  void handleMsgFromRMT(PDU* msg);
127 
128  void handleQueueInfo(QueueInfo* queueInfo);
129 
130  /* Send */
131 
132 
134  unsigned int delimit(SDUData* sduData);
135  unsigned int delimitFromRMT(PDU *pdu, unsigned int len);
136 
137 
139  void generatePDUsnew();
140 
141  void trySendGenPDUs(std::vector<DataTransferPDU*>* pduQ);
142 
143 
144 
146  void sduProtection(SDU *sdu);
147 
148  void getSDUFromQ(SDU *sdu);
149 
150 
151  void setConnId(const ConnectionId& connId);
152 
153  /* Policies */
154 
155 
156  /* Policy-related methods */
157 // void runTxControlPolicy(std::vector<DataTransferPDU*>* pduQ);
158 // void runNoRateSlowDownPolicy();
159 // void runReconcileFlowControlPolicy();
160 
161 // void runRateReductionPolicy();
162 // void runRxTimerExpiryPolicy(RxExpiryTimer* timer);
165  void runRTTEstimatorPolicy();
166 
167 
168 
169 
170 
171  unsigned int getFlowControlRightWinEdge();
172 
173  /* This method SHOULD return amount of time to wait before retransmission attempt */
174  double getRxTime();
175 
176  unsigned int getAllowableGap();
177 
178 
179 
180  void flushReassemblyPDUQ();
181  void clearRxQ();
182  void clearClosedWindowQ();
183 
184  void generateDTPDU(UserDataField* userDataField);
185 
186  void schedule(DTPTimers* timer, double time =0.0);
187 
188 // void handleSDUs(CDAPMessage* cdap);
189 
190  void initGates();
191 
192  bool commonRcvControl(ControlPDU* pdu);
193 
194 
195 
196  void sendAckOnlyPDU(unsigned int seqNum);
197  bool setDRFInPDU(bool override);
198 
199  void redrawGUI();
201 
202 
203 
204  void rcvrBufferStateChange();
205  bool isDuplicate(unsigned int seqNum);
206  void notifyAboutInactivity();
207 
208 
209  void notifyStartSending();
211 
212  double getATime();
213  void fillControlAckPDU(ControlAckPDU* ctrlAckPdu);
214  void fillRendezvousPDU(RendezvousPDU* rendezPDU);
215  void sendRendezvousPDU();
216  void rendezvousCondition();
219  void changeInBuffers();
220 
221  public:
222  DTP();
223  virtual ~DTP();
224 
225 // bool read(int portId, unsigned char * buffer, int len);
226 // bool readImmediate(int portId, unsigned char* buffer, int len);
227 // bool write(int portId, unsigned char *buffer, int len);
228 
229  void delimitFromRMT();
230  void svUpdate(unsigned int seqNum);
231 
232  void setFlow(const Flow* flow);
233  void setDTCP(DTCP* dtcp);
234  const QoSCube* getQoSCube() const;
235  void setQoSCube(const QoSCube* qosCube);
236  void setPduDroppingEnabled(bool pduDroppingEnabled);
237 
239  cModule* createPolicyModule(const char* prefix, const char* name);
240  void startATimer(unsigned int seqNum);
241 
243 
244  void setPDUHeader(PDU* pdu);
245  void fillFlowControlPDU(FlowControlPDU* flowControlPdu);
246 
247  void sendFCOnlyPDU();
248  void sendAckFlowPDU(unsigned int seqNum = 0, bool seqNumValid = false);
249  void sendControlAckPDU();
250  void sendEmptyDTPDU();
251 
252  void sendToRMT(PDU *pdu);
253 
254 
255 
256  void notifyStopSending();
258 
260  bool runInitialSeqNumPolicy();
261 
262  void setState(DTPState* state);
263  void sendReliableControlPDU();
264  void cancelATimer(unsigned int seqNum);
265  bool isATimerQEmpty();
266 
267 
268  /* Handle signals */
269  void handleQueueInfoFromRMT(QueueInfo* queueInfo);
270  void handleQueueInfoFromSocket(QueueInfo* queueInfo);
271 
272  protected:
273  virtual void handleMessage(cMessage *msg);
274  virtual void initialize(int step);
275  int numInitStages() const
276  {
277  return 2;
278  }
280 
281 
282 
283  //Signals
284 
285  simsignal_t sigEFCPStahpSending;
286  simsignal_t sigEFCPStartSending;
287 
288  //Statistic signals
289  simsignal_t sigStatDTPRTT;
290  simsignal_t sigStatDTPClosedWinQ;
291 // simsignal_t sigStatDTPRxCount;
292  simsignal_t sigStatDTPSentSeqNum;
293  simsignal_t sigStatDTPRecvSeqNum;
294 
295 };
296 
297 #endif /* DTP_H_ */
void runRTTEstimatorPolicy()
Definition: DTP.cc:80
bool runInitialSeqNumPolicy()
Definition: DTP.cc:1470
void rcvrBufferStateChange()
Definition: DTP.cc:1686
void generateDTPDU(UserDataField *userDataField)
Definition: DTP.cc:418
void sendReliableControlPDU()
Definition: DTP.cc:319
Class representing flow object with attributes from specs.
Definition: Flow.h:45
virtual void handleMessage(cMessage *msg)
Definition: DTP.cc:343
void trySendGenPDUs(std::vector< DataTransferPDU * > *pduQ)
Definition: DTP.cc:1323
void fillRendezvousPDU(RendezvousPDU *rendezPDU)
Definition: DTP.cc:1261
cGate * northO
Definition: DTP.h:107
void setPduDroppingEnabled(bool pduDroppingEnabled)
Definition: DTP.cc:216
void handleQueueInfo(QueueInfo *queueInfo)
Definition: DTP.cc:100
DTPState * state
Definition: DTP.h:72
void resetSenderInactivTimer()
Definition: DTP.cc:1100
void sendFCOnlyPDU()
Definition: DTP.cc:519
void handleDTPRcvrInactivityTimer(RcvrInactivityTimer *timer)
Definition: DTP.cc:1087
simsignal_t sigStatDTPRecvSeqNum
Definition: DTP.h:293
RcvrInactivityPolicyBase * rcvrInactivityPolicy
Definition: DTP.h:79
void setPDUHeader(PDU *pdu)
Definition: DTP.cc:404
RTTEstimatorPolicyBase * rttEstimatorPolicy
Definition: DTP.h:82
void handleDTPATimer(ATimer *timer)
Definition: DTP.cc:1107
void notifyStartSending()
Definition: DTP.cc:1581
void generatePDUsnew()
Definition: DTP.cc:1225
double getRxTime()
Definition: DTP.cc:1670
void handleMsgFromRMT(PDU *msg)
Definition: DTP.cc:757
void svUpdate(unsigned int seqNum)
Definition: DTP.cc:1694
simsignal_t sigStatDTPSentSeqNum
Definition: DTP.h:292
void fillControlAckPDU(ControlAckPDU *ctrlAckPdu)
Definition: DTP.cc:1503
void runRcvrInactivityTimerPolicy()
Definition: DTP.cc:1619
void addPDUToReassemblyQ(DataTransferPDU *pdu)
Definition: DTP.cc:458
void handleRendezvousTimer(DTCPRendezvousTimer *timer)
Definition: DTP.cc:299
void fillFlowControlPDU(FlowControlPDU *flowControlPdu)
Definition: DTP.cc:540
Connection identifier as defined in specifications.
Definition: ConnectionId.h:42
void rendezvousCondition()
Definition: DTP.cc:1283
SenderInactivityTimer * senderInactivityTimer
Definition: DTP.h:94
void notifyAboutInactivity()
Definition: DTP.cc:1607
void handleInterrupterTimer(TheInterrupterTimer *msg)
Definition: DTP.cc:325
void schedule(DTPTimers *timer, double time=0.0)
Definition: DTP.cc:1736
Definition: DTCP.h:63
void sendToRMT(PDU *pdu)
Definition: DTP.cc:1649
void sduProtection(SDU *sdu)
Definition: DTP.cc:1464
void startATimer(unsigned int seqNum)
Definition: DTP.cc:812
void initGates()
Definition: DTP.cc:185
bool isDuplicate(unsigned int seqNum)
Definition: DTP.cc:840
void notifyStopSending()
Definition: DTP.cc:1594
void redrawGUI()
Definition: DTP.cc:243
Monitoring and adjustment of IPC process operations .
void sendRendezvousPDU()
Definition: DTP.cc:1272
void handleDTPSenderInactivityTimer(SenderInactivityTimer *timer)
Definition: DTP.cc:1094
int numInitStages() const
Definition: DTP.h:275
unsigned int sduSeqNum
Definition: DTP.h:66
void sendEmptyDTPDU()
Definition: DTP.cc:1525
const QoSCube * getQoSCube() const
Definition: DTP.cc:196
ConnectionId connId
Definition: DTP.h:113
Definition: PDU.h:42
InitialSeqNumPolicyBase * initialSeqNumPolicy
Definition: DTP.h:81
unsigned int delimit(SDUData *sduData)
Definition: DTP.cc:1171
cGate * northI
Definition: DTP.h:106
void runSenderInactivityTimerPolicy()
Definition: DTP.cc:1633
DTCP * dtcp
Definition: DTP.h:73
bool commonRcvControl(ControlPDU *pdu)
Definition: DTP.cc:488
virtual void initialize(int step)
Definition: DTP.cc:116
void sendControlAckPDU()
Definition: DTP.cc:1514
void handleControlPDUFromRMT(ControlPDU *pdu)
Definition: DTP.cc:602
Relaying and Multiplexing Task .
void handleQueueInfoFromSocket(QueueInfo *queueInfo)
Definition: DTP.cc:95
simsignal_t sigStatDTPRTT
Definition: DTP.h:289
cModule * createPolicyModule(const char *prefix, const char *name)
Definition: DTP.cc:65
simsignal_t sigStatDTPClosedWinQ
Definition: DTP.h:290
RcvrInactivityTimer * rcvrInactivityTimer
Definition: DTP.h:95
int deletePdu
Definition: DTP.h:68
void sendAckFlowPDU(unsigned int seqNum=0, bool seqNumValid=false)
Definition: DTP.cc:565
cGate * southI
Definition: DTP.h:110
SenderInactivityPolicyBase * senderInactivityPolicy
Definition: DTP.h:80
void delimitFromRMT()
Definition: DTP.cc:468
Class representing QoSCube with all its properties that is primarily used by FA, RMT and RA Specifica...
Definition: QoSCube.h:57
virtual ~DTP()
Definition: DTP.cc:53
void handleMsgFromUp(UserDataField *userDataField)
Definition: DTP.cc:437
simsignal_t sigEFCPStartSending
Definition: DTP.h:286
void getSDUFromQ(SDU *sdu)
Definition: SDU.h:47
void setDTCP(DTCP *dtcp)
Definition: DTP.cc:1774
double getATime()
Definition: DTP.cc:857
std::set< unsigned int > sequencingQ
Definition: DTP.h:67
DTP()
Definition: DTP.cc:32
void sendAckOnlyPDU(unsigned int seqNum)
Definition: DTP.cc:1490
bool pduDroppingEnabled
Definition: DTP.h:69
void initSignalsAndListeners()
Definition: DTP.cc:104
void handleQueueInfoFromRMT(QueueInfo *queueInfo)
Definition: DTP.cc:1788
std::vector< UserDataField * > userDataFieldQOut
Definition: DTP.h:87
void runCongestionNotificationPolicy()
Definition: DTP.cc:90
void setFlow(const Flow *flow)
Definition: DTP.cc:1769
unsigned int getAllowableGap()
Definition: DTP.cc:1678
void cancelATimer(unsigned int seqNum)
Definition: DTP.cc:800
void setQoSCube(const QoSCube *qosCube)
Definition: DTP.cc:205
bool isATimerQEmpty()
Definition: DTP.cc:789
cGate * southO
Definition: DTP.h:111
bool setDRFInPDU(bool override)
Definition: DTP.cc:1212
void setConnId(const ConnectionId &connId)
Definition: DTP.cc:294
unsigned int getFlowControlRightWinEdge()
void flushAllQueuesAndPrepareToDie()
Definition: DTP.cc:225
void handleDataTransferPDUFromRMT(DataTransferPDU *pdu)
Definition: DTP.cc:862
simsignal_t sigEFCPStahpSending
Definition: DTP.h:285
void setState(DTPState *state)
Definition: DTP.cc:1783
std::vector< ATimer * > aTimerQ
Definition: DTP.h:89
void clearRxQ()
Definition: DTP.cc:1731
Definition: DTP.h:60
void notifyAboutUnableMaintain()
Definition: DTP.cc:1565
void flushReassemblyPDUQ()
Definition: DTP.cc:1726
void clearClosedWindowQ()
bool rendezvousEnabled
Definition: DTP.h:70
const Flow * flow
Definition: DTP.h:74
void changeInBuffers()
Definition: DTP.cc:307