|
Lines 1078-1083
void TcpSocketImpl::NewRx (Ptr<Packet> p
|
Link Here
|
|---|
|
| 1078 |
i = m_bufferedData.find (tcpHeader.GetSequenceNumber () ); |
1078 |
i = m_bufferedData.find (tcpHeader.GetSequenceNumber () ); |
| 1079 |
UnAckData_t::iterator next = i; |
1079 |
UnAckData_t::iterator next = i; |
| 1080 |
next++; |
1080 |
next++; |
|
|
1081 |
//make sure the buffer is logically sequenced |
| 1082 |
if(next != m_bufferedData.end()) |
| 1083 |
{ |
| 1084 |
NS_ASSERT(next->first >= i->first + SequenceNumber(i->second->GetSize ())); |
| 1085 |
} |
| 1081 |
while(next != m_bufferedData.end()) |
1086 |
while(next != m_bufferedData.end()) |
| 1082 |
{ |
1087 |
{ |
| 1083 |
if(i->first + SequenceNumber(i->second->GetSize ()) == next->first) |
1088 |
if(i->first + SequenceNumber(i->second->GetSize ()) == next->first) |
|
Lines 1121-1126
void TcpSocketImpl::NewRx (Ptr<Packet> p
|
Link Here
|
|---|
|
| 1121 |
tag.SetAddress (fromAddress); |
1126 |
tag.SetAddress (fromAddress); |
| 1122 |
p->AddTag (tag); |
1127 |
p->AddTag (tag); |
| 1123 |
m_bufferedData[tcpHeader.GetSequenceNumber () ] = p; |
1128 |
m_bufferedData[tcpHeader.GetSequenceNumber () ] = p; |
|
|
1129 |
i = |
| 1130 |
m_bufferedData.find (tcpHeader.GetSequenceNumber () ); |
| 1131 |
UnAckData_t::iterator next = i; |
| 1132 |
++next; |
| 1133 |
if(next != m_bufferedData.end()) |
| 1134 |
{ |
| 1135 |
NS_ASSERT(next->first >= i->first + SequenceNumber(i->second->GetSize ())); |
| 1136 |
} |
| 1137 |
} |
| 1138 |
else if (tcpHeader.GetSequenceNumber () + SequenceNumber(s) > m_nextRxSequence) |
| 1139 |
{//parial new data case, only part of the packet is new data |
| 1140 |
s = tcpHeader.GetSequenceNumber () + SequenceNumber(s) - m_nextRxSequence; //how much new |
| 1141 |
UnAckData_t::iterator next = m_bufferedData.upper_bound (m_nextRxSequence); |
| 1142 |
if (next != m_bufferedData.end ()) |
| 1143 |
{ |
| 1144 |
SequenceNumber nextBufferedSeq = next->first; |
| 1145 |
if (m_nextRxSequence + SequenceNumber(s) > nextBufferedSeq) |
| 1146 |
{//tail end isn't all new either, trim enough off the end |
| 1147 |
s = nextBufferedSeq - m_nextRxSequence; |
| 1148 |
} |
| 1149 |
} |
| 1150 |
p = p->CreateFragment (m_nextRxSequence - tcpHeader.GetSequenceNumber (),s); |
| 1151 |
SequenceNumber start = m_nextRxSequence; |
| 1152 |
m_nextRxSequence += s; // Advance next expected sequence |
| 1153 |
SocketAddressTag tag; |
| 1154 |
tag.SetAddress (fromAddress); |
| 1155 |
p->AddTag (tag); |
| 1156 |
//buffer the new fragment, it'll be read by call to Recv |
| 1157 |
UnAckData_t::iterator i = m_bufferedData.find (start); |
| 1158 |
if (i != m_bufferedData.end () ) //we found it already in the buffer |
| 1159 |
{ |
| 1160 |
i->second = 0; // relase reference to already buffered |
| 1161 |
} |
| 1162 |
// Save for later delivery |
| 1163 |
m_bufferedData[start] = p; |
| 1164 |
m_rxAvailable += p->GetSize (); |
| 1165 |
i = m_bufferedData.find (start); |
| 1166 |
next = i; |
| 1167 |
++next; |
| 1168 |
if(next != m_bufferedData.end()) |
| 1169 |
{ |
| 1170 |
NS_ASSERT(next->first >= i->first + SequenceNumber(i->second->GetSize ())); |
| 1171 |
} |
| 1124 |
} |
1172 |
} |
| 1125 |
else |
1173 |
else |
| 1126 |
{ // debug |
1174 |
{ // debug |