A Discrete-Event Network Simulator
API
tcp-dctcp-test.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2017 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: Shravya K.S. <shravya.ks0@gmail.com>
19  *
20  */
21 
22 #include "ns3/ipv4.h"
23 #include "ns3/ipv6.h"
24 #include "ns3/ipv4-end-point.h"
25 #include "ns3/ipv6-end-point.h"
26 #include "tcp-general-test.h"
27 #include "ns3/node.h"
28 #include "ns3/log.h"
29 #include "tcp-error-model.h"
30 #include "ns3/tcp-l4-protocol.h"
31 #include "ns3/tcp-dctcp.h"
32 #include "ns3/tcp-linux-reno.h"
33 #include "ns3/tcp-tx-buffer.h"
34 #include "ns3/config.h"
35 
36 using namespace ns3;
37 
38 NS_LOG_COMPONENT_DEFINE ("TcpDctcpTestSuite");
39 
47 {
48 public:
55  TcpDctcpCodePointsTest (uint8_t testCase, const std::string &desc);
56 
57 protected:
58  virtual void Tx (const Ptr<const Packet> p, const TcpHeader&h, SocketWho who);
59  virtual void Rx (const Ptr<const Packet> p, const TcpHeader&h, SocketWho who);
60  virtual Ptr<TcpSocketMsgBase> CreateSenderSocket (Ptr<Node> node);
61  virtual Ptr<TcpSocketMsgBase> CreateReceiverSocket (Ptr<Node> node);
62  void ConfigureProperties ();
63  void ConfigureEnvironment ();
64 
65 private:
66  uint32_t m_senderSent;
67  uint32_t m_receiverSent;
68  uint32_t m_senderReceived;
69  uint8_t m_testCase;
70 };
71 
72 TcpDctcpCodePointsTest::TcpDctcpCodePointsTest (uint8_t testCase, const std::string &desc)
73  : TcpGeneralTest (desc),
74  m_senderSent (0),
75  m_receiverSent (0),
76  m_senderReceived (0),
77  m_testCase (testCase)
78 {
79 }
80 
81 void
83 {
84  bool foundTag = false; // IpTosTag will only be found if ECN bits are set
85  if (who == SENDER && (m_testCase == 1 || m_testCase == 2))
86  {
87  m_senderSent++;
88  SocketIpTosTag ipTosTag;
89  foundTag = p->PeekPacketTag (ipTosTag);
90  if (m_testCase == 1)
91  {
92  if (m_senderSent == 1)
93  {
94  NS_TEST_ASSERT_MSG_EQ (foundTag, true, "Tag not found");
95  NS_TEST_ASSERT_MSG_EQ (unsigned (ipTosTag.GetTos ()), 0x1, "IP TOS should have ECT1 for SYN packet for DCTCP traffic");
96  }
97  if (m_senderSent == 3)
98  {
99  NS_TEST_ASSERT_MSG_EQ (foundTag, true, "Tag not found");
100  NS_TEST_ASSERT_MSG_EQ (unsigned (ipTosTag.GetTos ()), 0x1, "IP TOS should have ECT1 for data packets for DCTCP traffic");
101  }
102  }
103  else
104  {
105  if (m_senderSent == 1)
106  {
107  NS_TEST_ASSERT_MSG_EQ (foundTag, false, "IP TOS should not have ECT1 for SYN packet for DCTCP traffic");
108  }
109  if (m_senderSent == 3)
110  {
111  NS_TEST_ASSERT_MSG_EQ (foundTag, true, "Tag not found");
112  NS_TEST_ASSERT_MSG_EQ (unsigned (ipTosTag.GetTos ()), 0x2, "IP TOS should have ECT0 for data packets for non-DCTCP but ECN enabled traffic");
113  }
114  }
115  }
116  else if (who == RECEIVER && (m_testCase == 1 || m_testCase == 2))
117  {
118  m_receiverSent++;
119  SocketIpTosTag ipTosTag;
120  foundTag = p->PeekPacketTag (ipTosTag);
121  if (m_testCase == 1)
122  {
123  if (m_receiverSent == 1)
124  {
125  NS_TEST_ASSERT_MSG_EQ (foundTag, true, "Tag not found");
126  NS_TEST_ASSERT_MSG_EQ (unsigned (ipTosTag.GetTos ()), 0x1, "IP TOS should have ECT1 for SYN+ACK packet for DCTCP traffic");
127  }
128  if (m_receiverSent == 2)
129  {
130  NS_TEST_ASSERT_MSG_EQ (foundTag, true, "Tag not found");
131  NS_TEST_ASSERT_MSG_EQ (unsigned (ipTosTag.GetTos ()), 0x1, "IP TOS should have ECT1 for pure ACK packets for DCTCP traffic");
132  }
133  }
134  else
135  {
136  if (m_receiverSent == 1)
137  {
138  NS_TEST_ASSERT_MSG_EQ (foundTag, false, "IP TOS should have neither ECT0 nor ECT1 for SYN+ACK packet for non-DCTCP traffic");
139  }
140  if (m_receiverSent == 2)
141  {
142  NS_TEST_ASSERT_MSG_EQ (foundTag, false, "IP TOS should not have ECT1 for pure ACK packets for non-DCTCP traffic but ECN enabled traffic");
143  }
144  }
145  }
146 }
147 
148 void
150 {
151  if (who == SENDER && m_testCase == 3)
152  {
154  if (m_senderReceived == 2 && m_testCase == 3)
155  {
156  NS_TEST_ASSERT_MSG_NE (((h.GetFlags ()) & TcpHeader::ECE), 0, "The flag ECE should be set in TCP header of the packet sent by the receiver when it receives a packet with CE bit set in IP header");
157  }
158  if (m_senderReceived > 2 && m_testCase == 3)
159  {
160  NS_TEST_ASSERT_MSG_EQ (((h.GetFlags ()) & TcpHeader::ECE), 0, "The flag ECE should be not be set in TCP header of the packet sent by the receiver if it receives a packet without CE bit set in IP header inspite of Sender not sending CWR flags to it");
161  }
162  }
163 }
164 
165 void
167 {
168  TcpGeneralTest::ConfigureProperties ();
169  SetUseEcn (SENDER, TcpSocketState::On);
170  SetUseEcn (RECEIVER, TcpSocketState::On);
171 }
172 
173 void
175 {
176  TcpGeneralTest::ConfigureEnvironment ();
177  Config::SetDefault ("ns3::TcpDctcp::UseEct0", BooleanValue (false));
178 }
179 
192 {
193 public:
198  static TypeId GetTypeId (void);
199 
200  uint32_t m_dataPacketSent;
201  uint8_t m_testCase;
202 
204  : TcpSocketMsgBase ()
205  {
206  m_dataPacketSent = 0;
207  }
208 
214  : TcpSocketMsgBase (other)
215  {
216  }
217 
222  void SetTestCase (uint8_t testCase);
223 protected:
224  virtual uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck);
225  virtual void ReTxTimeout ();
226  Ptr<TcpSocketBase> Fork (void);
227 };
228 
230 
231 TypeId
233 {
234  static TypeId tid = TypeId ("ns3::TcpDctcpCongestedRouter")
236  .SetGroupName ("Internet")
237  .AddConstructor<TcpDctcpCongestedRouter> ()
238  ;
239  return tid;
240 }
241 
242 void
244 {
245  TcpSocketBase::ReTxTimeout ();
246 }
247 
248 void
250 {
251  m_testCase = testCase;
252 }
253 
254 uint32_t
255 TcpDctcpCongestedRouter::SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck)
256 {
257  NS_LOG_FUNCTION (this << seq << maxSize << withAck);
259 
260  bool isRetransmission = false;
261  if (seq != m_tcb->m_highTxMark)
262  {
263  isRetransmission = true;
264  }
265 
266  Ptr<Packet> p = m_txBuffer->CopyFromSequence (maxSize, seq)->GetPacketCopy ();
267  uint32_t sz = p->GetSize (); // Size of packet
268  uint8_t flags = withAck ? TcpHeader::ACK : 0;
269  uint32_t remainingData = m_txBuffer->SizeFromSequence (seq + SequenceNumber32 (sz));
270 
271  if (withAck)
272  {
274  m_delAckCount = 0;
275  }
276 
277  // For test 3, we don't send CWR flags on receipt of ECE to check if Receiver sends ECE only when there is CE flags
278  if (m_tcb->m_ecnState == TcpSocketState::ECN_ECE_RCVD && m_ecnEchoSeq.Get () > m_ecnCWRSeq.Get () && !isRetransmission && m_testCase != 3)
279  {
280  NS_LOG_INFO ("Backoff mechanism by reducing CWND by half because we've received ECN Echo");
282  flags |= TcpHeader::CWR;
283  m_ecnCWRSeq = seq;
284  m_tcb->m_ecnState = TcpSocketState::ECN_CWR_SENT;
285  NS_LOG_DEBUG (TcpSocketState::EcnStateName[m_tcb->m_ecnState] << " -> ECN_CWR_SENT");
286  NS_LOG_INFO ("CWR flags set");
287  NS_LOG_DEBUG (TcpSocketState::TcpCongStateName[m_tcb->m_congState] << " -> CA_CWR");
288  if (m_tcb->m_congState == TcpSocketState::CA_OPEN)
289  {
290  m_congestionControl->CongestionStateSet (m_tcb, TcpSocketState::CA_CWR);
291  m_tcb->m_congState = TcpSocketState::CA_CWR;
292  }
293  }
294  /*
295  * Add tags for each socket option.
296  * Note that currently the socket adds both IPv4 tag and IPv6 tag
297  * if both options are set. Once the packet got to layer three, only
298  * the corresponding tags will be read.
299  */
300  if (GetIpTos ())
301  {
302  SocketIpTosTag ipTosTag;
303 
304  NS_LOG_LOGIC (" ECT bits should not be set on retransmitted packets ");
305  if (m_testCase == 3 && m_dataPacketSent == 1 && !isRetransmission)
306  {
307  ipTosTag.SetTos (GetIpTos () | 0x3);
308  }
309  else
310  {
311  if (m_tcb->m_ecnState != TcpSocketState::ECN_DISABLED && (GetIpTos () & 0x3) == 0 && !isRetransmission)
312  {
313  ipTosTag.SetTos (GetIpTos () | 0x1);
314  }
315  else
316  {
317  ipTosTag.SetTos (GetIpTos ());
318  }
319  }
320  p->AddPacketTag (ipTosTag);
321  }
322  else
323  {
324  SocketIpTosTag ipTosTag;
325  if (m_testCase == 3 && m_dataPacketSent == 1 && !isRetransmission)
326  {
327  ipTosTag.SetTos (0x3);
328  }
329  else
330  {
331  if (m_tcb->m_ecnState != TcpSocketState::ECN_DISABLED && !isRetransmission)
332  {
333  ipTosTag.SetTos (0x1);
334  }
335  }
336  p->AddPacketTag (ipTosTag);
337  }
338 
339  if (IsManualIpv6Tclass ())
340  {
341  SocketIpv6TclassTag ipTclassTag;
342  if (m_testCase == 3 && m_dataPacketSent == 1 && !isRetransmission )
343  {
344  ipTclassTag.SetTclass (GetIpv6Tclass () | 0x3);
345  }
346  else
347  {
348  if (m_tcb->m_ecnState != TcpSocketState::ECN_DISABLED && (GetIpv6Tclass () & 0x3) == 0 && !isRetransmission)
349  {
350  ipTclassTag.SetTclass (GetIpv6Tclass () | 0x1);
351  }
352  else
353  {
354  ipTclassTag.SetTclass (GetIpv6Tclass ());
355  }
356  }
357  p->AddPacketTag (ipTclassTag);
358  }
359  else
360  {
361  SocketIpv6TclassTag ipTclassTag;
362  if (m_testCase == 3 && m_dataPacketSent == 1 && !isRetransmission)
363  {
364  ipTclassTag.SetTclass (0x3);
365  }
366  else
367  {
368  if (m_tcb->m_ecnState != TcpSocketState::ECN_DISABLED && !isRetransmission)
369  {
370  ipTclassTag.SetTclass (0x1);
371  }
372  }
373  p->AddPacketTag (ipTclassTag);
374  }
375 
376  if (IsManualIpTtl ())
377  {
378  SocketIpTtlTag ipTtlTag;
379  ipTtlTag.SetTtl (GetIpTtl ());
380  p->AddPacketTag (ipTtlTag);
381  }
382 
383  if (IsManualIpv6HopLimit ())
384  {
385  SocketIpv6HopLimitTag ipHopLimitTag;
386  ipHopLimitTag.SetHopLimit (GetIpv6HopLimit ());
387  p->AddPacketTag (ipHopLimitTag);
388  }
389 
390  uint8_t priority = GetPriority ();
391  if (priority)
392  {
393  SocketPriorityTag priorityTag;
394  priorityTag.SetPriority (priority);
395  p->ReplacePacketTag (priorityTag);
396  }
397 
398  if (m_closeOnEmpty && (remainingData == 0))
399  {
400  flags |= TcpHeader::FIN;
401  if (m_state == ESTABLISHED)
402  { // On active close: I am the first one to send FIN
403  NS_LOG_DEBUG ("ESTABLISHED -> FIN_WAIT_1");
405  }
406  else if (m_state == CLOSE_WAIT)
407  { // On passive close: Peer sent me FIN already
408  NS_LOG_DEBUG ("CLOSE_WAIT -> LAST_ACK");
409  m_state = LAST_ACK;
410  }
411  }
412  TcpHeader header;
413  header.SetFlags (flags);
414  header.SetSequenceNumber (seq);
415  header.SetAckNumber (m_tcb->m_rxBuffer->NextRxSequence ());
416  if (m_endPoint)
417  {
420  }
421  else
422  {
425  }
427  AddOptions (header);
428 
429  if (m_retxEvent.IsExpired ())
430  {
431  // Schedules retransmit timeout. m_rto should be already doubled.
432 
433  NS_LOG_LOGIC (this << " SendDataPacket Schedule ReTxTimeout at time " <<
434  Simulator::Now ().GetSeconds () << " to expire at time " <<
435  (Simulator::Now () + m_rto.Get ()).GetSeconds () );
436  m_retxEvent = Simulator::Schedule (m_rto, &TcpDctcpCongestedRouter::ReTxTimeout, this);
437  }
438 
439  m_txTrace (p, header, this);
440 
441  if (m_endPoint)
442  {
443  m_tcp->SendPacket (p, header, m_endPoint->GetLocalAddress (),
445  NS_LOG_DEBUG ("Send segment of size " << sz << " with remaining data " <<
446  remainingData << " via TcpL4Protocol to " << m_endPoint->GetPeerAddress () <<
447  ". Header " << header);
448  }
449  else
450  {
451  m_tcp->SendPacket (p, header, m_endPoint6->GetLocalAddress (),
453  NS_LOG_DEBUG ("Send segment of size " << sz << " with remaining data " <<
454  remainingData << " via TcpL4Protocol to " << m_endPoint6->GetPeerAddress () <<
455  ". Header " << header);
456  }
457 
458  UpdateRttHistory (seq, sz, isRetransmission);
459 
460  // Notify the application of the data being sent unless this is a retransmit
461  if (seq + sz > m_tcb->m_highTxMark)
462  {
463  Simulator::ScheduleNow (&TcpDctcpCongestedRouter::NotifyDataSent, this,
464  (seq + sz - m_tcb->m_highTxMark.Get ()));
465  }
466  // Update highTxMark
467  m_tcb->m_highTxMark = std::max (seq + sz, m_tcb->m_highTxMark.Get ());
468  return sz;
469 }
470 
473 {
474  return CopyObject<TcpDctcpCongestedRouter> (this);
475 }
476 
479 {
480  if (m_testCase == 2)
481  {
482  return TcpGeneralTest::CreateSenderSocket (node);
483  }
484  else if (m_testCase == 3)
485  {
486  Ptr<TcpDctcpCongestedRouter> socket = DynamicCast<TcpDctcpCongestedRouter> (
487  CreateSocket (node,
489  TcpDctcp::GetTypeId ()));
490  socket->SetTestCase (m_testCase);
491  return socket;
492  }
493  else
494  {
495  return TcpGeneralTest::CreateSocket (node, TcpSocketMsgBase::GetTypeId (), TcpDctcp::GetTypeId ());
496  }
497 }
498 
501 {
502  if (m_testCase == 2)
503  {
504  return TcpGeneralTest::CreateReceiverSocket (node);
505  }
506  else
507  {
508  return TcpGeneralTest::CreateSocket (node, TcpSocketMsgBase::GetTypeId (), TcpDctcp::GetTypeId ());
509  }
510 }
511 
519 {
520 public:
533  TcpDctcpToLinuxReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
534  uint32_t segmentsAcked, SequenceNumber32 highTxMark,
535  SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name);
536 
537 private:
538  virtual void DoRun (void);
541  void ExecuteTest (void);
542 
543  uint32_t m_cWnd;
544  uint32_t m_segmentSize;
545  uint32_t m_segmentsAcked;
546  uint32_t m_ssThresh;
551 };
552 
553 TcpDctcpToLinuxReno::TcpDctcpToLinuxReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
554  uint32_t segmentsAcked, SequenceNumber32 highTxMark,
555  SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name)
556  : TestCase (name),
557  m_cWnd (cWnd),
558  m_segmentSize (segmentSize),
559  m_segmentsAcked (segmentsAcked),
560  m_ssThresh (ssThresh),
561  m_rtt (rtt),
562  m_highTxMark (highTxMark),
563  m_lastAckedSeq (lastAckedSeq)
564 {
565 }
566 
567 void
569 {
570  Simulator::Schedule (Seconds (0.0), &TcpDctcpToLinuxReno::ExecuteTest, this);
571  Simulator::Run ();
572  Simulator::Destroy ();
573 }
574 
575 void
577 {
578  m_state = CreateObject <TcpSocketState> ();
579  m_state->m_cWnd = m_cWnd;
584 
585  Ptr<TcpSocketState> state = CreateObject <TcpSocketState> ();
586  state->m_cWnd = m_cWnd;
587  state->m_ssThresh = m_ssThresh;
588  state->m_segmentSize = m_segmentSize;
589  state->m_highTxMark = m_highTxMark;
591 
592  Ptr<TcpDctcp> cong = CreateObject <TcpDctcp> ();
594 
595  Ptr<TcpLinuxReno> LinuxRenoCong = CreateObject <TcpLinuxReno> ();
596  LinuxRenoCong->IncreaseWindow (state, m_segmentsAcked);
597 
599  "cWnd has not updated correctly");
600 }
601 
609 {
610 public:
611  TcpDctcpTestSuite () : TestSuite ("tcp-dctcp-test", UNIT)
612  {
613  AddTestCase (new TcpDctcpToLinuxReno (2 * 1446, 1446, 4 * 1446, 2, SequenceNumber32 (4753), SequenceNumber32 (3216), MilliSeconds (100), "DCTCP falls to New Reno for slowstart"), TestCase::QUICK);
614  AddTestCase (new TcpDctcpCodePointsTest (1, "ECT Test : Check if ECT is set on Syn, Syn+Ack, Ack and Data packets for DCTCP packets"),
615  TestCase::QUICK);
616  AddTestCase (new TcpDctcpCodePointsTest (2, "ECT Test : Check if ECT is not set on Syn, Syn+Ack and Ack but set on Data packets for non-DCTCP but ECN enabled traffic"),TestCase::QUICK);
617  AddTestCase (new TcpDctcpCodePointsTest (3, "ECE Functionality Test: ECE should only be sent by receiver when it receives CE flags"),
618  TestCase::QUICK);
619  }
620 };
621 
Ipv6Address GetLocalAddress()
Get the local address.
void SetTclass(uint8_t tclass)
Set the tag&#39;s Tclass.
Definition: socket.cc:900
uint8_t GetTos(void) const
Get the tag&#39;s TOS.
Definition: socket.cc:791
static TypeId GetTypeId(void)
Get the type ID.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Connection established.
Definition: tcp-socket.h:71
AttributeValue implementation for Boolean.
Definition: boolean.h:36
TcpDctcpCongestedRouter(const TcpDctcpCongestedRouter &other)
Constructor.
Class for inserting callbacks special points of the flow of TCP sockets.
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer...
Definition: socket.h:1164
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
EventId m_retxEvent
Retransmission event.
A suite of tests to run.
Definition: test.h:1343
uint32_t segmentSize
uint32_t m_senderSent
Number of packets sent by the sender.
TracedValue< EcnState_t > m_ecnState
Current ECN State, represented as combination of EcnState values.
void SetTestCase(uint8_t testCase)
Set the test case type.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
Ptr< TcpSocketState > m_tcb
Congestion control information.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1297
uint32_t m_segmentSize
Segment size.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Ptr< TcpRxBuffer > m_rxBuffer
Rx buffer (reordering buffer)
void SetTos(uint8_t tos)
Set the tag&#39;s TOS.
Definition: socket.cc:785
encapsulates test code
Definition: test.h:1153
void ConfigureProperties()
Change the configuration of the socket properties.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
Definition: socket.h:1116
uint32_t m_segmentsAcked
segments acked
A TCP socket which sends a data packet with CE flags set for test 3.
TracedValue< TcpStates_t > m_state
TCP state.
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
Definition: event-id.cc:65
static TcpDctcpTestSuite g_tcpdctcpTest
static var for test initialization
uint16_t GetPeerPort()
Get the peer port.
uint32_t m_delAckCount
Delayed ACK counter.
uint32_t m_senderReceived
Number of packets received by the sender.
virtual uint8_t GetIpTtl(void) const
Query the value of IP Time to Live field of this socket.
Definition: socket.cc:520
uint32_t m_cWnd
cWnd
Ptr< TcpCongestionOps > m_congestionControl
Congestion control.
void SetSequenceNumber(SequenceNumber32 sequenceNumber)
Set the sequence Number.
Definition: tcp-header.cc:101
#define max(a, b)
Definition: 80211b.c:43
Ptr< TcpTxBuffer > m_txBuffer
Tx buffer.
void SetTtl(uint8_t ttl)
Set the tag&#39;s TTL.
Definition: socket.cc:604
TCP DCTCP TestSuite.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
uint16_t GetLocalPort()
Get the local port.
TcpDctcpToLinuxReno(uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh, uint32_t segmentsAcked, SequenceNumber32 highTxMark, SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name)
Constructor.
Ipv6EndPoint * m_endPoint6
the IPv6 endpoint
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:166
bool ReplacePacketTag(Tag &tag)
Replace the value of a packet tag.
Definition: packet.cc:970
Ipv4Address GetLocalAddress(void)
Get the local address.
indicates whether the socket has a priority set.
Definition: socket.h:1308
uint32_t m_dataPacketSent
Number of packets sent.
virtual void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet transmitted down to IP layer.
SequenceNumber32 m_lastAckedSeq
Last sequence ACKed.
void NotifyDataSent(uint32_t size)
Notify through the callback (if set) that some data have been sent.
Definition: socket.cc:285
void ConfigureEnvironment()
Change the configuration of the environment.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
Ptr< TcpL4Protocol > m_tcp
the associated TCP L4 protocol
void SetHopLimit(uint8_t hopLimit)
Set the tag&#39;s Hop Limit.
Definition: socket.cc:665
TracedValue< uint32_t > m_ssThresh
Slow start threshold.
void SetDestinationPort(uint16_t port)
Set the destination port.
Definition: tcp-header.cc:95
virtual void ReTxTimeout()
An RTO event happened.
void SetFlags(uint8_t flags)
Set flags of the header.
Definition: tcp-header.cc:113
uint8_t m_testCase
Test type.
virtual Ptr< TcpSocketMsgBase > CreateSocket(Ptr< Node > node, TypeId socketType, TypeId congControl)
Create a socket.
virtual void UpdateRttHistory(const SequenceNumber32 &seq, uint32_t sz, bool isRetransmission)
Update the RTT history, when we send TCP segments.
void AddOptions(TcpHeader &tcpHeader)
Add options to TcpHeader.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual void IncreaseWindow(Ptr< TcpSocketState > tcb, uint32_t segmentsAcked)
Congestion avoidance algorithm implementation.
TracedValue< TcpCongState_t > m_congState
State in the Congestion state machine.
bool IsManualIpv6Tclass(void) const
Checks if the socket has a specific IPv6 Tclass set.
Definition: socket.cc:371
Header for the Transmission Control Protocol.
Definition: tcp-header.h:44
uint32_t m_receiverSent
Number of packets sent by the receiver.
void SetSourcePort(uint16_t port)
Set the source port.
Definition: tcp-header.cc:89
indicates whether the socket has IPV6_TCLASS set.
Definition: socket.h:1355
virtual void DoRun(void)
Implementation to actually run this TestCase.
TracedValue< SequenceNumber32 > m_ecnCWRSeq
Sequence number of the last sent CWR.
Our side has shutdown after remote has shutdown.
Definition: tcp-socket.h:75
Remote side has shutdown and is waiting for us to finish writing our data and to shutdown (we have to...
Definition: tcp-socket.h:72
TracedValue< uint32_t > m_cWnd
Congestion window.
uint8_t GetIpv6Tclass(void) const
Query the value of IPv6 Traffic Class field of this socket.
Definition: socket.cc:495
uint32_t m_ssThresh
ss thresh
bool IsManualIpv6HopLimit(void) const
Checks if the socket has a specific IPv6 Hop Limit set.
Definition: socket.cc:383
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
SequenceNumber32 m_highTxMark
high tx mark
General infrastructure for TCP testing.
Ptr< NetDevice > m_boundnetdevice
the device this socket is bound to (might be null).
Definition: socket.h:1077
uint8_t GetFlags() const
Get the flags.
Definition: tcp-header.cc:173
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not...
Definition: test.h:622
TracedValue< Time > m_rto
Retransmit timeout.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Definition: packet.cc:956
uint16_t GetLocalPort(void)
Get the local port.
virtual uint16_t AdvertisedWindowSize(bool scale=true) const
The amount of Rx window announced to the peer.
virtual uint8_t GetIpv6HopLimit(void) const
Query the value of IP Hop Limit field of this socket.
Definition: socket.cc:545
void SetAckNumber(SequenceNumber32 ackNumber)
Set the ACK number.
Definition: tcp-header.cc:107
Ipv6Address GetPeerAddress()
Get the peer address.
Our side has shutdown, waiting to complete transmission of remaining buffered data.
Definition: tcp-socket.h:78
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
T Get(void) const
Get the underlying value.
Definition: traced-value.h:229
TracedValue< SequenceNumber32 > m_ecnEchoSeq
Sequence number of the last received ECN Echo.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
Ipv4Address GetPeerAddress(void)
Get the peer address.
uint16_t GetPeerPort(void)
Get the peer port.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
TracedValue< SequenceNumber32 > m_highTxMark
Highest seqno ever sent, regardless of ReTx.
virtual void Rx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet received from IP layer.
virtual Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node)
Create and install the socket to install on the receiver.
uint32_t m_segmentSize
segment size
uint8_t m_testCase
Test type.
Ptr< TcpSocketBase > Fork(void)
Call CopyObject<> to clone me.
void SetUseEcn(SocketWho who, TcpSocketState::UseEcn_t useEcn)
Forcefully set the ECN mode of use.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Definition: packet.cc:978
This test suite implements a Unit Test.
Definition: test.h:1353
DCTCP should be same as Linux during slow start.
void SetWindowSize(uint16_t windowSize)
Set the window size.
Definition: tcp-header.cc:119
void SetPriority(uint8_t priority)
Set the tag&#39;s priority.
Definition: socket.cc:842
indicates whether the socket has IP_TOS set.
Definition: socket.h:1262
bool IsManualIpTtl(void) const
Checks if the socket has a specific IPv4 TTL set.
Definition: socket.cc:377
void ExecuteTest(void)
Execute the test.
uint8_t GetIpTos(void) const
Query the value of IP Type of Service of this socket.
Definition: socket.cc:453
EventId m_delAckEvent
Delayed ACK timeout event.
a unique identifier for an interface.
Definition: type-id.h:58
SequenceNumber32 m_lastAckedSeq
last acked seq
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
TcpDctcpCodePointsTest(uint8_t testCase, const std::string &desc)
Constructor.
bool m_closeOnEmpty
Close socket upon tx buffer emptied.
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_txTrace
Trace of transmitted packets.
Ptr< TcpSocketState > m_state
state
uint8_t GetPriority(void) const
Query the priority value of this socket.
Definition: socket.cc:396
Validates the setting of ECT and ECE codepoints for DCTCP enabled traffic.
virtual uint32_t SendDataPacket(SequenceNumber32 seq, uint32_t maxSize, bool withAck)
Extract at most maxSize bytes from the TxBuffer at sequence seq, add the TCP header, and send to TcpL4Protocol.