RINASim  October 2016
Documentation of framework for OMNeT++
RcvrAckPolicyLG.cc
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.
31 
32 const char * ECN_MARKED_DATA = "ECN_MARKED_DATA";
33 
35 
37 {
38 }
39 
41 {
42 }
43 
45  sigStatECNMarked = registerSignal(ECN_MARKED_DATA);
46 }
47 
48 
49 bool RcvrAckPolicyLG::run(DTPState* dtpState, DTCPState* dtcpState)
50 {
51  Enter_Method("RcvrAckPolicyLG");
52 
53  DTP* dtp = getRINAModule<DTP*>(this, 1, { MOD_DTP });
54 
55  unsigned int seqNum;
56  seqNum = dtpState->getRcvLeftWinEdge();
57 
58 
59  // Send Ack/Flow Control PDU with LWE and RWE
60  AckFlowPDU* ackFlowPdu = new AckFlowPDU();
61  dtp->setPDUHeader(ackFlowPdu);
62  ackFlowPdu->setSeqNum(dtcpState->getNextSndCtrlSeqNum());
63 
64  ackFlowPdu->setAckNackSeqNum(seqNum);
65 
66  dtp->fillFlowControlPDU(ackFlowPdu);
67 
68  if(dtpState->isEcnSet()) {
69  ackFlowPdu->setFlags(ackFlowPdu->getFlags() | ECN_FLAG);
70  emit(sigStatECNMarked, seqNum);
71  }
72 
73  dtp->sendToRMT(ackFlowPdu);
74 
75 
76  return false;
77 }
void setPDUHeader(PDU *pdu)
Definition: DTP.cc:404
bool isEcnSet() const
Definition: DTPState.cc:329
void fillFlowControlPDU(FlowControlPDU *flowControlPdu)
Definition: DTP.cc:540
unsigned int getNextSndCtrlSeqNum()
Definition: DTCPState.cc:198
void sendToRMT(PDU *pdu)
Definition: DTP.cc:1649
virtual ~RcvrAckPolicyLG()
virtual void setAckNackSeqNum(unsigned int ackNackSeqNum)
virtual void setFlags(int flags)
Definition: PDU_m.cc:361
unsigned int getRcvLeftWinEdge() const
Definition: DTPState.cc:258
virtual void setSeqNum(unsigned int seqNum)
Definition: PDU_m.cc:381
virtual bool run(DTPState *dtpState, DTCPState *dtcpState)
virtual int getFlags() const
Definition: PDU_m.cc:356
#define ECN_FLAG
Definition: PDU.h:37
const char * MOD_DTP
Definition: ExternConsts.cc:38
Register_Class(RcvrAckPolicyLG)
simsignal_t sigStatECNMarked
This is an example policy class implementing LG RcvrAck behavior .
const char * ECN_MARKED_DATA
Definition: DTP.h:60