View | Details | Raw Unified | Return to bug 248
Collapse All | Expand All

(-)a/src/internet-stack/tcp-socket-impl.cc (+48 lines)
 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

Return to bug 248