|
|
| 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 |
|
|
| 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); |
|
|
| 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 |
} |
|
|
| 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 |
{ |
|
|
| 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) |
|
|
| 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 |
{ |
|
|
| 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 |
} |
|
|
| 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 |
{ |