OLD | NEW |
1 /* Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ | 1 /* Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2007-2009 Strasbourg University | 3 * Copyright (c) 2007-2009 Strasbourg University |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 Ipv6Address src = ipv6Header.GetSourceAddress (); | 336 Ipv6Address src = ipv6Header.GetSourceAddress (); |
337 | 337 |
338 std::pair<Ipv6Address, uint32_t> fragmentsId = std::make_pair<Ipv6Address, uin
t32_t> (src, identification); | 338 std::pair<Ipv6Address, uint32_t> fragmentsId = std::make_pair<Ipv6Address, uin
t32_t> (src, identification); |
339 Ptr<Fragments> fragments; | 339 Ptr<Fragments> fragments; |
340 | 340 |
341 MapFragments_t::iterator it = m_fragments.find (fragmentsId); | 341 MapFragments_t::iterator it = m_fragments.find (fragmentsId); |
342 if (it == m_fragments.end ()) | 342 if (it == m_fragments.end ()) |
343 { | 343 { |
344 fragments = Create<Fragments> (); | 344 fragments = Create<Fragments> (); |
345 m_fragments.insert (std::make_pair (fragmentsId, fragments)); | 345 m_fragments.insert (std::make_pair (fragmentsId, fragments)); |
| 346 EventId timeout = Simulator::Schedule (Seconds(60), |
| 347 &Ipv6ExtensionFragment::HandleFragm
entsTimeout, this, |
| 348 fragmentsId, fragments, ipv6Header)
; |
| 349 fragments->SetTimeoutEventId (timeout); |
346 } | 350 } |
347 else | 351 else |
348 { | 352 { |
349 fragments = it->second; | 353 fragments = it->second; |
350 } | 354 } |
351 | 355 |
352 if (fragmentOffset == 0) | 356 if (fragmentOffset == 0) |
353 { | 357 { |
354 Ptr<Packet> unfragmentablePart = packet->Copy (); | 358 Ptr<Packet> unfragmentablePart = packet->Copy (); |
355 unfragmentablePart->RemoveAtEnd (packet->GetSize () - offset); | 359 unfragmentablePart->RemoveAtEnd (packet->GetSize () - offset); |
356 fragments->SetUnfragmentablePart (unfragmentablePart); | 360 fragments->SetUnfragmentablePart (unfragmentablePart); |
357 } | 361 } |
358 | 362 |
359 fragments->AddFragment (p, fragmentOffset, moreFragment); | 363 fragments->AddFragment (p, fragmentOffset, moreFragment); |
360 | 364 |
361 if (fragments->IsEntire ()) | 365 if (fragments->IsEntire ()) |
362 { | 366 { |
363 packet = fragments->GetPacket (); | 367 packet = fragments->GetPacket (); |
| 368 fragments->CancelTimeout(); |
| 369 m_fragments.erase(fragmentsId); |
364 isDropped = false; | 370 isDropped = false; |
365 } | 371 } |
366 else· | 372 else· |
367 { | 373 { |
368 NS_LOG_LOGIC ("Fragment. Drop!"); | 374 // the fragment is not "dropped", but Ipv6L3Protocol::LocalDeliver must st
op processing it. |
369 m_dropTrace (packet); | |
370 isDropped = true; | 375 isDropped = true; |
371 } | 376 } |
372 | 377 |
373 return 0; | 378 return 0; |
374 } | 379 } |
375 | 380 |
376 void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
ntSize, std::list<Ptr<Packet> >& listFragments) | 381 void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
ntSize, std::list<Ptr<Packet> >& listFragments) |
377 { | 382 { |
378 Ptr<Packet> p = packet->Copy (); | 383 Ptr<Packet> p = packet->Copy (); |
379 | 384 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 } while (moreFragment); | 537 } while (moreFragment); |
533 | 538 |
534 for (std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> >::iterator it = unfr
agmentablePart.begin (); it != unfragmentablePart.end (); it++) | 539 for (std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> >::iterator it = unfr
agmentablePart.begin (); it != unfragmentablePart.end (); it++) |
535 { | 540 { |
536 delete it->first; | 541 delete it->first; |
537 } | 542 } |
538 | 543 |
539 unfragmentablePart.clear (); | 544 unfragmentablePart.clear (); |
540 } | 545 } |
541 | 546 |
| 547 |
| 548 void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint3
2_t> fragmentsId, Ptr<Fragments> fragments, Ipv6Header & ipHeader) |
| 549 { |
| 550 Ptr<Packet> packet = fragments->GetPartialPacket (); |
| 551 |
| 552 // if we have at least 8 bytes, we can send an ICMP. |
| 553 if ( packet->GetSize () > 8 ) |
| 554 { |
| 555 |
| 556 Ptr<Icmpv6L4Protocol> icmp = GetNode()->GetObject<Icmpv6L4Protocol> (); |
| 557 icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6H
eader::ICMPV6_FRAGTIME); |
| 558 } |
| 559 m_dropTrace (packet); |
| 560 |
| 561 // clear the buffers |
| 562 m_fragments.erase(fragmentsId); |
| 563 } |
| 564 |
542 Ipv6ExtensionFragment::Fragments::Fragments () | 565 Ipv6ExtensionFragment::Fragments::Fragments () |
543 : m_moreFragment (0) | 566 : m_moreFragment (0) |
544 { | 567 { |
545 } | 568 } |
546 | 569 |
547 Ipv6ExtensionFragment::Fragments::~Fragments () | 570 Ipv6ExtensionFragment::Fragments::~Fragments () |
548 { | 571 { |
549 } | 572 } |
550 | 573 |
551 void Ipv6ExtensionFragment::Fragments::AddFragment (Ptr<Packet> fragment, uint16
_t fragmentOffset, bool moreFragment) | 574 void Ipv6ExtensionFragment::Fragments::AddFragment (Ptr<Packet> fragment, uint16
_t fragmentOffset, bool moreFragment) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 Ptr<Packet> p = m_unfragmentable->Copy (); | 624 Ptr<Packet> p = m_unfragmentable->Copy (); |
602 | 625 |
603 for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragm
ents.begin (); it != m_fragments.end (); it++) | 626 for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragm
ents.begin (); it != m_fragments.end (); it++) |
604 { | 627 { |
605 p->AddAtEnd (it->first); | 628 p->AddAtEnd (it->first); |
606 } | 629 } |
607 | 630 |
608 return p; | 631 return p; |
609 } | 632 } |
610 | 633 |
| 634 Ptr<Packet> Ipv6ExtensionFragment::Fragments::GetPartialPacket () const |
| 635 { |
| 636 Ptr<Packet> p; |
| 637 |
| 638 if ( m_unfragmentable ) |
| 639 { |
| 640 p = m_unfragmentable->Copy (); |
| 641 } |
| 642 else |
| 643 { |
| 644 return p; |
| 645 } |
| 646 |
| 647 uint16_t lastEndOffset = 0; |
| 648 |
| 649 for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragm
ents.begin (); it != m_fragments.end (); it++) |
| 650 { |
| 651 if (lastEndOffset != it->second) |
| 652 { |
| 653 break; |
| 654 } |
| 655 p->AddAtEnd (it->first); |
| 656 lastEndOffset += it->first->GetSize (); |
| 657 } |
| 658 |
| 659 return p; |
| 660 } |
| 661 |
| 662 void Ipv6ExtensionFragment::Fragments::SetTimeoutEventId (EventId event) |
| 663 { |
| 664 m_timeoutEventId = event; |
| 665 return; |
| 666 } |
| 667 |
| 668 void Ipv6ExtensionFragment::Fragments::CancelTimeout() |
| 669 { |
| 670 m_timeoutEventId.Cancel (); |
| 671 return; |
| 672 } |
| 673 |
611 | 674 |
612 NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRouting); | 675 NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRouting); |
613 | 676 |
614 TypeId Ipv6ExtensionRouting::GetTypeId () | 677 TypeId Ipv6ExtensionRouting::GetTypeId () |
615 { | 678 { |
616 static TypeId tid = TypeId ("ns3::Ipv6ExtensionRouting") | 679 static TypeId tid = TypeId ("ns3::Ipv6ExtensionRouting") |
617 .SetParent<Ipv6Extension> () | 680 .SetParent<Ipv6Extension> () |
618 .AddConstructor<Ipv6ExtensionRouting> () | 681 .AddConstructor<Ipv6ExtensionRouting> () |
619 ; | 682 ; |
620 return tid; | 683 return tid; |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 { | 1042 { |
980 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader <
< isDropped); | 1043 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader <
< isDropped); |
981 | 1044 |
982 /* TODO */ | 1045 /* TODO */ |
983 | 1046 |
984 return true; | 1047 return true; |
985 } | 1048 } |
986 | 1049 |
987 } /* namespace ns3 */ | 1050 } /* namespace ns3 */ |
988 | 1051 |
OLD | NEW |