LEFT | RIGHT |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2010-2015 Adrian Sai-wah Tam | 3 * Copyright (c) 2010-2015 Adrian Sai-wah Tam |
4 * Copyright (c) 2016 Natale Patriciello <natale.patriciello@gmail.com> | 4 * Copyright (c) 2016 Natale Patriciello <natale.patriciello@gmail.com> |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License version 2 as | 7 * it under the terms of the GNU General Public License version 2 as |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 } | 105 } |
106 | 106 |
107 /* A user is supposed to create a TcpSocket through a factory. In TcpSocket, | 107 /* A user is supposed to create a TcpSocket through a factory. In TcpSocket, |
108 * there are attributes SndBufSize and RcvBufSize to control the default Tx and | 108 * there are attributes SndBufSize and RcvBufSize to control the default Tx and |
109 * Rx window sizes respectively, with default of 128 KiByte. The attribute | 109 * Rx window sizes respectively, with default of 128 KiByte. The attribute |
110 * SndBufSize is passed to TcpTxBuffer by TcpSocketBase::SetSndBufSize() and in | 110 * SndBufSize is passed to TcpTxBuffer by TcpSocketBase::SetSndBufSize() and in |
111 * turn, TcpTxBuffer:SetMaxBufferSize(). Therefore, the m_maxBuffer value | 111 * turn, TcpTxBuffer:SetMaxBufferSize(). Therefore, the m_maxBuffer value |
112 * initialized below is insignificant. | 112 * initialized below is insignificant. |
113 */ | 113 */ |
114 TcpTxBuffer::TcpTxBuffer (uint32_t n) | 114 TcpTxBuffer::TcpTxBuffer (uint32_t n) |
115 : m_maxBuffer (32768), m_size (0), m_sentSize (0), m_firstByteSeq (n) | 115 : m_maxBuffer (32768), |
| 116 m_size (0), |
| 117 m_sentSize (0), |
| 118 m_firstByteSeq (n) |
116 { | 119 { |
117 } | 120 } |
118 | 121 |
119 TcpTxBuffer::~TcpTxBuffer (void) | 122 TcpTxBuffer::~TcpTxBuffer (void) |
120 { | 123 { |
| 124 PacketList::iterator it; |
| 125 |
| 126 for (it = m_sentList.begin (); it != m_sentList.end (); ++it) |
| 127 { |
| 128 TcpTxItem *item = *it; |
| 129 m_sentSize -= item->m_packet->GetSize (); |
| 130 delete item; |
| 131 } |
| 132 |
| 133 for (it = m_appList.begin (); it != m_appList.end (); ++it) |
| 134 { |
| 135 TcpTxItem *item = *it; |
| 136 m_size -= item->m_packet->GetSize (); |
| 137 delete item; |
| 138 } |
121 } | 139 } |
122 | 140 |
123 SequenceNumber32 | 141 SequenceNumber32 |
124 TcpTxBuffer::HeadSequence (void) const | 142 TcpTxBuffer::HeadSequence (void) const |
125 { | 143 { |
126 return m_firstByteSeq; | 144 return m_firstByteSeq; |
127 } | 145 } |
128 | 146 |
129 SequenceNumber32 | 147 SequenceNumber32 |
130 TcpTxBuffer::TailSequence (void) const | 148 TcpTxBuffer::TailSequence (void) const |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 NS_LOG_DEBUG ("New segment [" << seq << ";" << seq + s << "|" << s << | 270 NS_LOG_DEBUG ("New segment [" << seq << ";" << seq + s << "|" << s << |
253 "] from " << *this); | 271 "] from " << *this); |
254 } | 272 } |
255 else if (m_firstByteSeq + m_sentSize > seq && m_firstByteSeq + m_sentSize < se
q + s) | 273 else if (m_firstByteSeq + m_sentSize > seq && m_firstByteSeq + m_sentSize < se
q + s) |
256 { | 274 { |
257 // Partial: a part is retransmission, the remaining data is new | 275 // Partial: a part is retransmission, the remaining data is new |
258 | 276 |
259 // Take the new data and move it into sent list | 277 // Take the new data and move it into sent list |
260 uint32_t amount = seq + s - m_firstByteSeq.Get () - m_sentSize; | 278 uint32_t amount = seq + s - m_firstByteSeq.Get () - m_sentSize; |
261 NS_LOG_DEBUG ("Moving segment [" << m_firstByteSeq + m_sentSize << ";" << | 279 NS_LOG_DEBUG ("Moving segment [" << m_firstByteSeq + m_sentSize << ";" << |
262 m_firstByteSeq + m_sentSize + amount <<"|" << amount << | 280 m_firstByteSeq + m_sentSize + amount << "|" << amount << |
263 "] from " << *this); | 281 "] from " << *this); |
264 | 282 |
265 outItem = GetNewSegment (amount); | 283 outItem = GetNewSegment (amount); |
266 NS_ASSERT (outItem != 0); | 284 NS_ASSERT (outItem != 0); |
267 | 285 |
268 // Now get outItem from the sent list (there will be a merge) | 286 // Now get outItem from the sent list (there will be a merge) |
269 return CopyFromSequence (numBytes, seq); | 287 return CopyFromSequence (numBytes, seq); |
270 } | 288 } |
271 | 289 |
272 outItem->m_lost = false; | 290 outItem->m_lost = false; |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 { | 483 { |
466 // A perfect match! | 484 // A perfect match! |
467 return outItem; | 485 return outItem; |
468 } | 486 } |
469 else | 487 else |
470 { | 488 { |
471 // the end is exactly the end of current packet, but | 489 // the end is exactly the end of current packet, but |
472 // current > outPacket in the list. Merge current with the | 490 // current > outPacket in the list. Merge current with the |
473 // previous, and recurse. | 491 // previous, and recurse. |
474 NS_ASSERT (it != list.begin ()); | 492 NS_ASSERT (it != list.begin ()); |
| 493 TcpTxItem *previous = *(--it); |
| 494 |
475 list.erase (it); | 495 list.erase (it); |
476 | |
477 TcpTxItem *previous = *(--it); | |
478 | 496 |
479 MergeItems (*previous, *currentItem); | 497 MergeItems (*previous, *currentItem); |
480 delete currentItem; | 498 delete currentItem; |
481 *listEdited = true; | 499 *listEdited = true; |
482 | 500 |
483 return GetPacketFromList (list, listStartFrom, numBytes, seq,
listEdited); | 501 return GetPacketFromList (list, listStartFrom, numBytes, seq,
listEdited); |
484 } | 502 } |
485 } | 503 } |
486 else if (numBytes < currentPacket->GetSize ()) | 504 else if (numBytes < currentPacket->GetSize ()) |
487 { | 505 { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 // it is precisely mapped over the option | 686 // it is precisely mapped over the option |
669 if (beginOfCurrentPacket >= b.first | 687 if (beginOfCurrentPacket >= b.first |
670 && beginOfCurrentPacket + current->GetSize () <= b.second) | 688 && beginOfCurrentPacket + current->GetSize () <= b.second) |
671 { | 689 { |
672 if (item->m_sacked) | 690 if (item->m_sacked) |
673 { | 691 { |
674 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second
<< | 692 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second
<< |
675 ", checking sentList for block " << beginOfCurren
tPacket << | 693 ", checking sentList for block " << beginOfCurren
tPacket << |
676 ";" << beginOfCurrentPacket + current->GetSize ()
<< | 694 ";" << beginOfCurrentPacket + current->GetSize ()
<< |
677 "], found in the sackboard already sacked"); | 695 "], found in the sackboard already sacked"); |
678 NS_ASSERT (beginOfCurrentPacket + current->GetSize () <= m_hig
hestSack.second); | |
679 } | 696 } |
680 else | 697 else |
681 { | 698 { |
682 item->m_sacked = true; | 699 item->m_sacked = true; |
683 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second
<< | 700 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second
<< |
684 ", checking sentList for block " << beginOfCurren
tPacket << | 701 ", checking sentList for block " << beginOfCurren
tPacket << |
685 ";" << beginOfCurrentPacket + current->GetSize ()
<< | 702 ";" << beginOfCurrentPacket + current->GetSize ()
<< |
686 "], found in the sackboard, sacking"); | 703 "], found in the sackboard, sacking"); |
687 if (m_highestSack.second <= beginOfCurrentPacket + current->Ge
tSize ()) | 704 if (m_highestSack.second <= beginOfCurrentPacket + current->Ge
tSize ()) |
688 { | 705 { |
689 PacketList::iterator new_it = item_it; | 706 PacketList::iterator new_it = item_it; |
690 m_highestSack = std::make_pair (++new_it, beginOfCurrentPa
cket+current->GetSize()); | 707 m_highestSack = std::make_pair (++new_it, beginOfCurrentPa
cket + current->GetSize ()); |
691 } | 708 } |
692 } | 709 } |
693 modified = true; | 710 modified = true; |
694 } | 711 } |
695 else if (beginOfCurrentPacket + current->GetSize () > b.second) | 712 else if (beginOfCurrentPacket + current->GetSize () > b.second) |
696 { | 713 { |
697 // we missed the block. It's useless to iterate again; Say "ciao" | 714 // we missed the block. It's useless to iterate again; Say "ciao" |
698 // to the loop for optimization purposes | 715 // to the loop for optimization purposes |
699 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second << | 716 NS_LOG_INFO ("Received block [" << b.first << ";" << b.second << |
700 ", checking sentList for block " << beginOfCurrentPac
ket << | 717 ", checking sentList for block " << beginOfCurrentPac
ket << |
701 ";" << beginOfCurrentPacket + current->GetSize () << | 718 ";" << beginOfCurrentPacket + current->GetSize () << |
702 "], not found, breaking loop"); | 719 "], not found, breaking loop"); |
703 break; | 720 break; |
704 } | 721 } |
705 | 722 |
706 beginOfCurrentPacket += current->GetSize (); | 723 beginOfCurrentPacket += current->GetSize (); |
707 ++item_it; | 724 ++item_it; |
708 } | 725 } |
709 } | 726 } |
710 | 727 |
711 NS_ASSERT ((*(m_sentList.begin()))->m_sacked == false); | 728 NS_ASSERT ((*(m_sentList.begin ()))->m_sacked == false); |
712 | 729 |
713 return modified; | 730 return modified; |
714 } | 731 } |
715 | 732 |
716 Ptr<const TcpOptionSack> | 733 Ptr<const TcpOptionSack> |
717 TcpTxBuffer::CraftSackOption (const SequenceNumber32 &seq, uint8_t available) co
nst | 734 TcpTxBuffer::CraftSackOption (const SequenceNumber32 &seq, uint8_t available) co
nst |
718 { | 735 { |
719 NS_LOG_FUNCTION (this); | 736 NS_LOG_FUNCTION (this); |
720 Ptr<TcpOptionSack> sackBlock = 0; | 737 Ptr<TcpOptionSack> sackBlock = 0; |
721 SequenceNumber32 beginOfCurrentPacket = m_firstByteSeq; | 738 SequenceNumber32 beginOfCurrentPacket = m_firstByteSeq; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 uint32_t dupThresh, uint32_t segmentSize) const | 828 uint32_t dupThresh, uint32_t segmentSize) const |
812 { | 829 { |
813 NS_LOG_FUNCTION (this << seq << dupThresh << segmentSize); | 830 NS_LOG_FUNCTION (this << seq << dupThresh << segmentSize); |
814 uint32_t count = 0; | 831 uint32_t count = 0; |
815 uint32_t bytes = 0; | 832 uint32_t bytes = 0; |
816 PacketList::const_iterator it; | 833 PacketList::const_iterator it; |
817 TcpTxItem *item; | 834 TcpTxItem *item; |
818 Ptr<const Packet> current; | 835 Ptr<const Packet> current; |
819 SequenceNumber32 beginOfCurrentPacket = seq; | 836 SequenceNumber32 beginOfCurrentPacket = seq; |
820 | 837 |
| 838 NS_LOG_INFO ("Checking if seq=" << seq << " is lost from the buffer "); |
| 839 |
821 if ((*segment)->m_lost == true) | 840 if ((*segment)->m_lost == true) |
822 { | 841 { |
| 842 NS_LOG_INFO ("seq=" << seq << " is lost because of lost flag"); |
823 return true; | 843 return true; |
824 } | 844 } |
825 | 845 |
826 if ((*segment)->m_sacked == true) | 846 if ((*segment)->m_sacked == true) |
827 { | 847 { |
| 848 NS_LOG_INFO ("seq=" << seq << " is not lost because of sacked flag"); |
828 return false; | 849 return false; |
829 } | 850 } |
830 | 851 |
831 // From RFC 6675: | 852 // From RFC 6675: |
832 // > The routine returns true when either dupThresh discontiguous SACKed | 853 // > The routine returns true when either dupThresh discontiguous SACKed |
833 // > sequences have arrived above 'seq' or more than (dupThresh - 1) * SMSS by
tes | 854 // > sequences have arrived above 'seq' or more than (dupThresh - 1) * SMSS by
tes |
834 // > with sequence numbers greater than 'SeqNum' have been SACKed. Otherwise,
the | 855 // > with sequence numbers greater than 'SeqNum' have been SACKed. Otherwise,
the |
835 // > routine returns false. | 856 // > routine returns false. |
836 for (it = segment; it != m_highestSack.first; ++it) | 857 for (it = segment; it != m_highestSack.first; ++it) |
837 { | 858 { |
838 if (beginOfCurrentPacket >= m_highestSack.second) | 859 if (beginOfCurrentPacket >= m_highestSack.second) |
839 { | 860 { |
| 861 NS_LOG_INFO ("seq=" << seq << " is not lost because there are no sacke
d segment ahead"); |
840 return false; | 862 return false; |
841 } | 863 } |
842 | 864 |
843 item = *it; | 865 item = *it; |
844 current = item->m_packet; | 866 current = item->m_packet; |
845 | 867 |
846 if (item->m_sacked) | 868 if (item->m_sacked) |
847 { | 869 { |
848 NS_LOG_DEBUG ("Segment [" << beginOfCurrentPacket << ", " << | 870 NS_LOG_INFO ("Segment [" << beginOfCurrentPacket << ", " << |
849 beginOfCurrentPacket+item->m_packet->GetSize () << | 871 beginOfCurrentPacket + item->m_packet->GetSize () << |
850 "] found to be SACKed, increasing counter and bytes by "
<< | 872 "] found to be SACKed"); |
851 current->GetSize ()); | |
852 ++count; | 873 ++count; |
853 bytes += current->GetSize (); | 874 bytes += current->GetSize (); |
854 if ((count >= dupThresh) || (bytes > (dupThresh-1) * segmentSize)) | 875 if ((count >= dupThresh) || (bytes > (dupThresh - 1) * segmentSize)) |
855 { | 876 { |
| 877 NS_LOG_INFO ("seq=" << seq << " is lost because of 3 sacked blocks
ahead"); |
856 return true; | 878 return true; |
857 } | 879 } |
858 } | 880 } |
859 | 881 |
860 beginOfCurrentPacket += current->GetSize (); | 882 beginOfCurrentPacket += current->GetSize (); |
861 } | 883 } |
862 | 884 |
863 return false; | 885 return false; |
864 } | 886 } |
865 | 887 |
(...skipping 22 matching lines...) Expand all Loading... |
888 } | 910 } |
889 | 911 |
890 beginOfCurrentPacket += (*it)->m_packet->GetSize (); | 912 beginOfCurrentPacket += (*it)->m_packet->GetSize (); |
891 } | 913 } |
892 | 914 |
893 return false; | 915 return false; |
894 } | 916 } |
895 | 917 |
896 bool | 918 bool |
897 TcpTxBuffer::NextSeg (SequenceNumber32 *seq, uint32_t dupThresh, | 919 TcpTxBuffer::NextSeg (SequenceNumber32 *seq, uint32_t dupThresh, |
898 uint32_t segmentSize) const | 920 uint32_t segmentSize, bool isRecovery) const |
899 { | 921 { |
900 NS_LOG_FUNCTION (this); | 922 NS_LOG_FUNCTION (this); |
901 | 923 |
902 /* RFC 6675, NextSeg definition. | 924 /* RFC 6675, NextSeg definition. |
903 * | 925 * |
904 * (1) If there exists a smallest unSACKed sequence number 'S2' that | 926 * (1) If there exists a smallest unSACKed sequence number 'S2' that |
905 * meets the following three criteria for determining loss, the | 927 * meets the following three criteria for determining loss, the |
906 * sequence range of one segment of up to SMSS octets starting | 928 * sequence range of one segment of up to SMSS octets starting |
907 * with S2 MUST be returned. | 929 * with S2 MUST be returned. |
908 * | 930 * |
(...skipping 15 matching lines...) Expand all Loading... |
924 item = *it; | 946 item = *it; |
925 | 947 |
926 // Condition 1.a , 1.b , and 1.c | 948 // Condition 1.a , 1.b , and 1.c |
927 if (item->m_retrans == false && item->m_sacked == false) | 949 if (item->m_retrans == false && item->m_sacked == false) |
928 { | 950 { |
929 if (IsLost (beginOfCurrentPkt, it, dupThresh, segmentSize)) | 951 if (IsLost (beginOfCurrentPkt, it, dupThresh, segmentSize)) |
930 { | 952 { |
931 *seq = beginOfCurrentPkt; | 953 *seq = beginOfCurrentPkt; |
932 return true; | 954 return true; |
933 } | 955 } |
934 else if (seqPerRule3.GetValue () == 0) | 956 else if (seqPerRule3.GetValue () == 0 && isRecovery) |
935 { | 957 { |
936 isSeqPerRule3Valid = true; | 958 isSeqPerRule3Valid = true; |
937 seqPerRule3 = beginOfCurrentPkt; | 959 seqPerRule3 = beginOfCurrentPkt; |
938 } | 960 } |
939 } | 961 } |
940 | 962 |
941 // Nothing found, iterate | 963 // Nothing found, iterate |
942 beginOfCurrentPkt += item->m_packet->GetSize (); | 964 beginOfCurrentPkt += item->m_packet->GetSize (); |
943 } | 965 } |
944 | 966 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 if (!item->m_sacked) | 1020 if (!item->m_sacked) |
999 { | 1021 { |
1000 // (a) If IsLost (S1) returns false: Pipe is incremented by 1 octet. | 1022 // (a) If IsLost (S1) returns false: Pipe is incremented by 1 octet. |
1001 if (!IsLost (beginOfCurrentPkt, it, dupThresh, segmentSize)) | 1023 if (!IsLost (beginOfCurrentPkt, it, dupThresh, segmentSize)) |
1002 { | 1024 { |
1003 size += item->m_packet->GetSize (); | 1025 size += item->m_packet->GetSize (); |
1004 } | 1026 } |
1005 // (b) If S1 <= HighRxt: Pipe is incremented by 1 octet. | 1027 // (b) If S1 <= HighRxt: Pipe is incremented by 1 octet. |
1006 // (NOTE: we use the m_retrans flag instead of keeping and updating | 1028 // (NOTE: we use the m_retrans flag instead of keeping and updating |
1007 // another variable). Only if the item is not marked as lost | 1029 // another variable). Only if the item is not marked as lost |
1008 else if (item->m_retrans && ! item->m_lost) | 1030 else if (item->m_retrans && !item->m_lost) |
1009 { | 1031 { |
1010 size += item->m_packet->GetSize (); | 1032 size += item->m_packet->GetSize (); |
1011 } | 1033 } |
1012 } | 1034 } |
1013 beginOfCurrentPkt += item->m_packet->GetSize (); | 1035 beginOfCurrentPkt += item->m_packet->GetSize (); |
1014 } | 1036 } |
1015 | 1037 |
1016 return size; | 1038 return size; |
1017 } | 1039 } |
1018 | 1040 |
1019 void | 1041 void |
1020 TcpTxBuffer::ResetScoreboard () | 1042 TcpTxBuffer::ResetScoreboard () |
1021 { | 1043 { |
1022 NS_LOG_FUNCTION (this); | 1044 NS_LOG_FUNCTION (this); |
1023 | 1045 |
1024 PacketList::iterator it; | 1046 PacketList::iterator it; |
1025 SequenceNumber32 beginOfCurrentPkt = m_firstByteSeq; | 1047 SequenceNumber32 beginOfCurrentPkt = m_firstByteSeq; |
1026 | 1048 |
1027 for (it = m_sentList.begin (); it != m_sentList.end (); ++it) | 1049 for (it = m_sentList.begin (); it != m_sentList.end (); ++it) |
1028 { | 1050 { |
1029 (*it)->m_sacked = false; | 1051 (*it)->m_sacked = false; |
1030 beginOfCurrentPkt += (*it)->m_packet->GetSize (); | 1052 beginOfCurrentPkt += (*it)->m_packet->GetSize (); |
1031 } | 1053 } |
1032 | 1054 |
1033 m_highestSack = std::make_pair (m_sentList.end(), SequenceNumber32 (0)); | 1055 m_highestSack = std::make_pair (m_sentList.end (), SequenceNumber32 (0)); |
1034 } | 1056 } |
1035 | 1057 |
1036 void | 1058 void |
1037 TcpTxBuffer::ResetSentList () | 1059 TcpTxBuffer::ResetSentList () |
1038 { | 1060 { |
1039 NS_LOG_FUNCTION (this); | 1061 NS_LOG_FUNCTION (this); |
1040 TcpTxItem *item; | 1062 TcpTxItem *item; |
1041 | 1063 |
1042 // Keep the head; it will then marked as retransmitted. | 1064 // Keep the head; it will then marked as retransmitted. |
1043 while (m_sentList.size () > 1) | 1065 while (m_sentList.size () > 1) |
1044 { | 1066 { |
1045 item = m_sentList.back (); | 1067 item = m_sentList.back (); |
1046 item->m_retrans = item->m_sacked = false; | 1068 item->m_retrans = item->m_sacked = false; |
1047 m_appList.push_front (item); | 1069 m_appList.push_front (item); |
1048 m_sentList.pop_back (); | 1070 m_sentList.pop_back (); |
1049 } | 1071 } |
1050 | 1072 |
1051 if (m_sentList.size () > 0) | 1073 if (m_sentList.size () > 0) |
1052 { | 1074 { |
1053 item = m_sentList.back (); | 1075 item = m_sentList.back (); |
1054 item->m_lost = true; | 1076 item->m_lost = true; |
1055 item->m_sacked = false; | 1077 item->m_sacked = false; |
1056 item->m_retrans = false; | 1078 item->m_retrans = false; |
1057 m_sentSize = item->m_packet->GetSize (); | 1079 m_sentSize = item->m_packet->GetSize (); |
1058 } | 1080 } |
1059 else | 1081 else |
1060 { | 1082 { |
1061 m_sentSize = 0; | 1083 m_sentSize = 0; |
1062 } | 1084 } |
1063 m_highestSack = std::make_pair (m_sentList.end(), SequenceNumber32 (0)); | 1085 m_highestSack = std::make_pair (m_sentList.end (), SequenceNumber32 (0)); |
1064 } | 1086 } |
1065 | 1087 |
1066 void | 1088 void |
1067 TcpTxBuffer::ResetLastSegmentSent () | 1089 TcpTxBuffer::ResetLastSegmentSent () |
1068 { | 1090 { |
1069 NS_LOG_FUNCTION (this); | 1091 NS_LOG_FUNCTION (this); |
1070 if (!m_sentList.empty ()) | 1092 if (!m_sentList.empty ()) |
1071 { | 1093 { |
1072 TcpTxItem *item = m_sentList.back (); | 1094 TcpTxItem *item = m_sentList.back (); |
1073 | 1095 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1133 " Total size: " << tcpTxBuf.m_size << | 1155 " Total size: " << tcpTxBuf.m_size << |
1134 " m_firstByteSeq = " << tcpTxBuf.m_firstByteSeq << | 1156 " m_firstByteSeq = " << tcpTxBuf.m_firstByteSeq << |
1135 " m_sentSize = " << tcpTxBuf.m_sentSize; | 1157 " m_sentSize = " << tcpTxBuf.m_sentSize; |
1136 | 1158 |
1137 NS_ASSERT (sentSize == tcpTxBuf.m_sentSize); | 1159 NS_ASSERT (sentSize == tcpTxBuf.m_sentSize); |
1138 NS_ASSERT (tcpTxBuf.m_size - tcpTxBuf.m_sentSize == appSize); | 1160 NS_ASSERT (tcpTxBuf.m_size - tcpTxBuf.m_sentSize == appSize); |
1139 return os; | 1161 return os; |
1140 } | 1162 } |
1141 | 1163 |
1142 } // namepsace ns3 | 1164 } // namepsace ns3 |
LEFT | RIGHT |