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

(-)a/src/internet/model/ipv4-l3-protocol.h (-4 lines)
 Lines 370-379    Link Here 
370
     */
370
     */
371
    std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
371
    std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
372
372
373
    /**
374
     * \brief Number of references.
375
     */
376
    mutable uint32_t m_refCount;
377
  };
373
  };
378
374
379
  typedef std::map< std::pair<uint64_t, uint32_t>, Ptr<Fragments> > MapFragments_t;
375
  typedef std::map< std::pair<uint64_t, uint32_t>, Ptr<Fragments> > MapFragments_t;
(-)a/src/internet/model/ipv6-extension.cc (-10 / +16 lines)
 Lines 347-353    Link Here 
347
      m_fragments.insert (std::make_pair (fragmentsId, fragments));
347
      m_fragments.insert (std::make_pair (fragmentsId, fragments));
348
      EventId timeout = Simulator::Schedule (Seconds (60),
348
      EventId timeout = Simulator::Schedule (Seconds (60),
349
                                             &Ipv6ExtensionFragment::HandleFragmentsTimeout, this,
349
                                             &Ipv6ExtensionFragment::HandleFragmentsTimeout, this,
350
                                             fragmentsId, fragments, ipHeader);
350
                                             fragmentsId, ipHeader);
351
      fragments->SetTimeoutEventId (timeout);
351
      fragments->SetTimeoutEventId (timeout);
352
    }
352
    }
353
  else
353
  else
 Lines 548-555    Link Here 
548
}
548
}
549
549
550
550
551
void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId, Ptr<Fragments> fragments, Ipv6Header & ipHeader)
551
void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId,
552
                                                    Ipv6Header & ipHeader)
552
{
553
{
554
  Ptr<Fragments> fragments;
555
556
  MapFragments_t::iterator it = m_fragments.find (fragmentsId);
557
  NS_ASSERT_MSG(it != m_fragments.end (), "IPv6 Fragment timeout reached for non-existent fragment");
558
  fragments = it->second;
559
553
  Ptr<Packet> packet = fragments->GetPartialPacket ();
560
  Ptr<Packet> packet = fragments->GetPartialPacket ();
554
561
555
  packet->AddHeader (ipHeader);
562
  packet->AddHeader (ipHeader);
 Lines 557-563    Link Here 
557
  // if we have at least 8 bytes, we can send an ICMP.
564
  // if we have at least 8 bytes, we can send an ICMP.
558
  if ( packet->GetSize () > 8 )
565
  if ( packet->GetSize () > 8 )
559
    {
566
    {
560
561
      Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> ();
567
      Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> ();
562
      icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
568
      icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
563
    }
569
    }
 Lines 580-586    Link Here 
580
{
586
{
581
  std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
587
  std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
582
588
583
  for (it = m_fragments.begin (); it != m_fragments.end (); it++)
589
  for (it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
584
    {
590
    {
585
      if (it->second > fragmentOffset)
591
      if (it->second > fragmentOffset)
586
        {
592
        {
 Lines 588-599    Link Here 
588
        }
594
        }
589
    }
595
    }
590
596
591
  if (it == m_fragments.end ())
597
  if (it == m_packetFragments.end ())
592
    {
598
    {
593
      m_moreFragment = moreFragment;
599
      m_moreFragment = moreFragment;
594
    }
600
    }
595
601
596
  m_fragments.insert (it, std::make_pair<Ptr<Packet>, uint16_t> (fragment, fragmentOffset));
602
  m_packetFragments.insert (it, std::make_pair<Ptr<Packet>, uint16_t> (fragment, fragmentOffset));
597
}
603
}
598
604
599
void Ipv6ExtensionFragment::Fragments::SetUnfragmentablePart (Ptr<Packet> unfragmentablePart)
605
void Ipv6ExtensionFragment::Fragments::SetUnfragmentablePart (Ptr<Packet> unfragmentablePart)
 Lines 603-615    Link Here 
603
609
604
bool Ipv6ExtensionFragment::Fragments::IsEntire () const
610
bool Ipv6ExtensionFragment::Fragments::IsEntire () const
605
{
611
{
606
  bool ret = !m_moreFragment && m_fragments.size () > 0;
612
  bool ret = !m_moreFragment && m_packetFragments.size () > 0;
607
613
608
  if (ret)
614
  if (ret)
609
    {
615
    {
610
      uint16_t lastEndOffset = 0;
616
      uint16_t lastEndOffset = 0;
611
617
612
      for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
618
      for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
613
        {
619
        {
614
          if (lastEndOffset != it->second)
620
          if (lastEndOffset != it->second)
615
            {
621
            {
 Lines 628-634    Link Here 
628
{
634
{
629
  Ptr<Packet> p =  m_unfragmentable->Copy ();
635
  Ptr<Packet> p =  m_unfragmentable->Copy ();
630
636
631
  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
637
  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
632
    {
638
    {
633
      p->AddAtEnd (it->first);
639
      p->AddAtEnd (it->first);
634
    }
640
    }
 Lines 651-657    Link Here 
651
657
652
  uint16_t lastEndOffset = 0;
658
  uint16_t lastEndOffset = 0;
653
659
654
  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
660
  for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_packetFragments.begin (); it != m_packetFragments.end (); it++)
655
    {
661
    {
656
      if (lastEndOffset != it->second)
662
      if (lastEndOffset != it->second)
657
        {
663
        {
(-)a/src/internet/model/ipv6-extension.h (-7 / +2 lines)
 Lines 343-349    Link Here 
343
    /**
343
    /**
344
     * \brief The current fragments.
344
     * \brief The current fragments.
345
     */
345
     */
346
    std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
346
    std::list<std::pair<Ptr<Packet>, uint16_t> > m_packetFragments;
347
347
348
    /**
348
    /**
349
     * \brief The unfragmentable part.
349
     * \brief The unfragmentable part.
 Lines 351-361    Link Here 
351
    Ptr<Packet> m_unfragmentable;
351
    Ptr<Packet> m_unfragmentable;
352
352
353
    /**
353
    /**
354
     * \brief Number of references.
355
     */
356
    mutable uint32_t m_refCount;
357
358
    /**
359
     * \brief Timeout handler event
354
     * \brief Timeout handler event
360
     */
355
     */
361
    EventId m_timeoutEventId;
356
    EventId m_timeoutEventId;
 Lines 367-373    Link Here 
367
   * \param ipHeader the IP header of the original packet
362
   * \param ipHeader the IP header of the original packet
368
   * \param iif Input Interface
363
   * \param iif Input Interface
369
   */
364
   */
370
  void HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> key, Ptr<Fragments> fragments, Ipv6Header & ipHeader);
365
  void HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> key, Ipv6Header & ipHeader);
371
366
372
  /**
367
  /**
373
   * \brief Get the packet parts so far received.
368
   * \brief Get the packet parts so far received.

Return to bug 1422