1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2018 NITK Surathkal
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  *
18  * Author: Viyom Mittal <viyommittal@gmail.com>
19  *         Vivek Jain <jain.vivek.anand@gmail.com>
20  *         Mohit P. Tahiliani <tahiliani@nitk.edu.in>
21  *
22  */
23 #include "tcp-recovery-ops.h"
24 #include "tcp-socket-state.h"
25 
26 #include "ns3/log.h"
27 
28 namespace ns3 {
29 
30 NS_LOG_COMPONENT_DEFINE ("TcpRecoveryOps");
31 
32 NS_OBJECT_ENSURE_REGISTERED (TcpRecoveryOps);
33 
34 TypeId
GetTypeId(void)35 TcpRecoveryOps::GetTypeId (void)
36 {
37   static TypeId tid = TypeId ("ns3::TcpRecoveryOps")
38     .SetParent<Object> ()
39     .SetGroupName ("Internet")
40   ;
41   return tid;
42 }
43 
TcpRecoveryOps()44 TcpRecoveryOps::TcpRecoveryOps () : Object ()
45 {
46   NS_LOG_FUNCTION (this);
47 }
48 
TcpRecoveryOps(const TcpRecoveryOps & other)49 TcpRecoveryOps::TcpRecoveryOps (const TcpRecoveryOps &other) : Object (other)
50 {
51   NS_LOG_FUNCTION (this);
52 }
53 
~TcpRecoveryOps()54 TcpRecoveryOps::~TcpRecoveryOps ()
55 {
56   NS_LOG_FUNCTION (this);
57 }
58 
59 void
UpdateBytesSent(uint32_t bytesSent)60 TcpRecoveryOps::UpdateBytesSent (uint32_t bytesSent)
61 {
62   NS_LOG_FUNCTION (this << bytesSent);
63 }
64 
65 // Classic recovery
66 
67 NS_OBJECT_ENSURE_REGISTERED (TcpClassicRecovery);
68 
69 TypeId
GetTypeId(void)70 TcpClassicRecovery::GetTypeId (void)
71 {
72   static TypeId tid = TypeId ("ns3::TcpClassicRecovery")
73     .SetParent<TcpRecoveryOps> ()
74     .SetGroupName ("Internet")
75     .AddConstructor<TcpClassicRecovery> ()
76   ;
77   return tid;
78 }
79 
TcpClassicRecovery(void)80 TcpClassicRecovery::TcpClassicRecovery (void) : TcpRecoveryOps ()
81 {
82   NS_LOG_FUNCTION (this);
83 }
84 
TcpClassicRecovery(const TcpClassicRecovery & sock)85 TcpClassicRecovery::TcpClassicRecovery (const TcpClassicRecovery& sock)
86   : TcpRecoveryOps (sock)
87 {
88   NS_LOG_FUNCTION (this);
89 }
90 
~TcpClassicRecovery(void)91 TcpClassicRecovery::~TcpClassicRecovery (void)
92 {
93   NS_LOG_FUNCTION (this);
94 }
95 
96 void
EnterRecovery(Ptr<TcpSocketState> tcb,uint32_t dupAckCount,uint32_t unAckDataCount,uint32_t deliveredBytes)97 TcpClassicRecovery::EnterRecovery (Ptr<TcpSocketState> tcb, uint32_t dupAckCount,
98                                    uint32_t unAckDataCount, uint32_t deliveredBytes)
99 {
100   NS_LOG_FUNCTION (this << tcb << dupAckCount << unAckDataCount);
101   NS_UNUSED (unAckDataCount);
102   NS_UNUSED (deliveredBytes);
103   tcb->m_cWnd = tcb->m_ssThresh;
104   tcb->m_cWndInfl = tcb->m_ssThresh + (dupAckCount * tcb->m_segmentSize);
105 }
106 
107 void
DoRecovery(Ptr<TcpSocketState> tcb,uint32_t deliveredBytes)108 TcpClassicRecovery::DoRecovery (Ptr<TcpSocketState> tcb, uint32_t deliveredBytes)
109 {
110   NS_LOG_FUNCTION (this << tcb << deliveredBytes);
111   NS_UNUSED (deliveredBytes);
112   tcb->m_cWndInfl += tcb->m_segmentSize;
113 }
114 
115 void
ExitRecovery(Ptr<TcpSocketState> tcb)116 TcpClassicRecovery::ExitRecovery (Ptr<TcpSocketState> tcb)
117 {
118   NS_LOG_FUNCTION (this << tcb);
119   // Follow NewReno procedures to exit FR if SACK is disabled
120   // (RFC2582 sec.3 bullet #5 paragraph 2, option 2)
121   // In this implementation, actual m_cWnd value is reset to ssThresh
122   // immediately before calling ExitRecovery(), so we just need to
123   // reset the inflated cWnd trace variable
124   tcb->m_cWndInfl = tcb->m_ssThresh.Get ();
125 }
126 
127 std::string
GetName() const128 TcpClassicRecovery::GetName () const
129 {
130   return "TcpClassicRecovery";
131 }
132 
133 Ptr<TcpRecoveryOps>
Fork()134 TcpClassicRecovery::Fork ()
135 {
136   return CopyObject<TcpClassicRecovery> (this);
137 }
138 
139 } // namespace ns3
140 
141