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