src/internet/model/ipv6-extension.cc
changeset 8793 9c59d55abcce
parent 7790 47d6d575412c
child 8977 2bd04c7f5010
--- a/src/internet/model/ipv6-extension.cc	Tue May 22 21:41:55 2012 -0700
+++ b/src/internet/model/ipv6-extension.cc	Tue May 22 21:44:19 2012 +0200
@@ -347,7 +347,7 @@
       m_fragments.insert (std::make_pair (fragmentsId, fragments));
       EventId timeout = Simulator::Schedule (Seconds (60),
                                              &Ipv6ExtensionFragment::HandleFragmentsTimeout, this,
-                                             fragmentsId, fragments, ipHeader);
+                                             fragmentsId, ipHeader);
       fragments->SetTimeoutEventId (timeout);
     }
   else
@@ -548,8 +548,15 @@
 }
 
 
-void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId, Ptr<Fragments> fragments, Ipv6Header & ipHeader)
+void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId,
+                                                    Ipv6Header & ipHeader)
 {
+  Ptr<Fragments> fragments;
+
+  MapFragments_t::iterator it = m_fragments.find (fragmentsId);
+  NS_ASSERT_MSG(it != m_fragments.end (), "IPv6 Fragment timeout reached for non-existent fragment");
+  fragments = it->second;
+
   Ptr<Packet> packet = fragments->GetPartialPacket ();
 
   packet->AddHeader (ipHeader);
@@ -557,7 +564,6 @@
   // if we have at least 8 bytes, we can send an ICMP.
   if ( packet->GetSize () > 8 )
     {
-
       Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> ();
       icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
     }
@@ -580,7 +586,7 @@
 {
   std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
 
-  for (it = m_fragments.begin (); it != m_fragments.end (); it++)
+  for (it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
     {
       if (it->second > fragmentOffset)
         {
@@ -588,12 +594,12 @@
         }
     }
 
-  if (it == m_fragments.end ())
+  if (it == m_packetFragments.end ())
     {
       m_moreFragment = moreFragment;
     }
 
-  m_fragments.insert (it, std::make_pair<Ptr<Packet>, uint16_t> (fragment, fragmentOffset));
+  m_packetFragments.insert (it, std::make_pair<Ptr<Packet>, uint16_t> (fragment, fragmentOffset));
 }
 
 void Ipv6ExtensionFragment::Fragments::SetUnfragmentablePart (Ptr<Packet> unfragmentablePart)
@@ -603,13 +609,13 @@
 
 bool Ipv6ExtensionFragment::Fragments::IsEntire () const
 {
-  bool ret = !m_moreFragment && m_fragments.size () > 0;
+  bool ret = !m_moreFragment && m_packetFragments.size () > 0;
 
   if (ret)
     {
       uint16_t lastEndOffset = 0;
 
-      for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
+      for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
         {
           if (lastEndOffset != it->second)
             {
@@ -628,7 +634,7 @@
 {
   Ptr<Packet> p =  m_unfragmentable->Copy ();
 
-  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
+  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
     {
       p->AddAtEnd (it->first);
     }
@@ -651,7 +657,7 @@
 
   uint16_t lastEndOffset = 0;
 
-  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
+  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
     {
       if (lastEndOffset != it->second)
         {