src/internet/model/ipv6-l3-protocol.cc
author Tommaso Pecorella <tommaso.pecorella@unifi.it>
Fri, 24 Jul 2015 08:59:57 +0200
changeset 11542 457d8732ca24
parent 11463 60d4486a863a
permissions -rw-r--r--
Bug 2148 - Ipv6Interface::SetUp doesn't re-create the Link-Local addresses
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7385
10beb0e53130 standardize emacs c++ mode comments
Vedran Miletić <rivanvx@gmail.com>
parents: 7256
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     2
/*
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     3
 * Copyright (c) 2007-2009 Strasbourg University
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     4
 *
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     8
 *
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    13
 *
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    17
 *
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    18
 * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    19
 */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    20
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    21
#include "ns3/log.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    22
#include "ns3/node.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    23
#include "ns3/uinteger.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    24
#include "ns3/vector.h"
7793
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
    25
#include "ns3/boolean.h"
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    26
#include "ns3/callback.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    27
#include "ns3/trace-source-accessor.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    28
#include "ns3/object-vector.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    29
#include "ns3/ipv6-routing-protocol.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    30
#include "ns3/ipv6-route.h"
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
    31
#include "ns3/mac16-address.h"
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
    32
#include "ns3/mac64-address.h"
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    33
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    34
#include "loopback-net-device.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    35
#include "ipv6-l3-protocol.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    36
#include "ipv6-interface.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    37
#include "ipv6-raw-socket-impl.h"
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    38
#include "ipv6-autoconfigured-prefix.h"
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
    39
#include "ipv6-extension-demux.h"
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
    40
#include "ipv6-extension.h"
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
    41
#include "ipv6-extension-header.h"
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
    42
#include "ipv6-option-demux.h"
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
    43
#include "ipv6-option.h"
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    44
#include "icmpv6-l4-protocol.h"
5217
8a9dbc333e76 Export more IPv6 includes.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5213
diff changeset
    45
#include "ndisc-cache.h"
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    46
10158
971f362648c3 Link to RFC num with \RFC{num}
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10127
diff changeset
    47
/// Minimum IPv6 MTU, as defined by \RFC{2460}
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
    48
#define IPV6_MIN_MTU 1280
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
    49
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
    50
namespace ns3 {
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    51
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10878
diff changeset
    52
NS_LOG_COMPONENT_DEFINE ("Ipv6L3Protocol");
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    53
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10878
diff changeset
    54
NS_OBJECT_ENSURE_REGISTERED (Ipv6L3Protocol);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    55
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    56
const uint16_t Ipv6L3Protocol::PROT_NUMBER = 0x86DD;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    57
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    58
TypeId Ipv6L3Protocol::GetTypeId ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    59
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    60
  static TypeId tid = TypeId ("ns3::Ipv6L3Protocol")
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    61
    .SetParent<Ipv6> ()
11259
ea2f6a3ed14e SetGroupName for internet module
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 11086
diff changeset
    62
    .SetGroupName ("Internet")
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    63
    .AddConstructor<Ipv6L3Protocol> ()
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    64
    .AddAttribute ("DefaultTtl",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    65
                   "The TTL value set by default on all "
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    66
                   "outgoing packets generated on this node.",
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    67
                   UintegerValue (64),
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    68
                   MakeUintegerAccessor (&Ipv6L3Protocol::m_defaultTtl),
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
    69
                   MakeUintegerChecker<uint8_t> ())
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    70
    .AddAttribute ("DefaultTclass",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    71
                   "The TCLASS value set by default on all "
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    72
                   "outgoing packets generated on this node.",
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
    73
                   UintegerValue (0),
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
    74
                   MakeUintegerAccessor (&Ipv6L3Protocol::m_defaultTclass),
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
    75
                   MakeUintegerChecker<uint8_t> ())
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    76
    .AddAttribute ("InterfaceList",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    77
                   "The set of IPv6 interfaces associated to this IPv6 stack.",
5375
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5217
diff changeset
    78
                   ObjectVectorValue (),
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5217
diff changeset
    79
                   MakeObjectVectorAccessor (&Ipv6L3Protocol::m_interfaces),
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5217
diff changeset
    80
                   MakeObjectVectorChecker<Ipv6Interface> ())
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    81
    .AddAttribute ("SendIcmpv6Redirect",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    82
                   "Send the ICMPv6 Redirect when appropriate.",
7793
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
    83
                   BooleanValue (true),
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
    84
                   MakeBooleanAccessor (&Ipv6L3Protocol::SetSendIcmpv6Redirect,
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
    85
                                        &Ipv6L3Protocol::GetSendIcmpv6Redirect),
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
    86
                   MakeBooleanChecker ())
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    87
    .AddTraceSource ("Tx",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    88
                     "Send IPv6 packet to outgoing interface.",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    89
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_txTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    90
                     "ns3::Ipv6L3Protocol::TxRxTracedCallback")
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    91
    .AddTraceSource ("Rx",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    92
                     "Receive IPv6 packet from incoming interface.",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    93
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_rxTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    94
                     "ns3::Ipv6L3Protocol::TxRxTracedCallback")
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    95
    .AddTraceSource ("Drop",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    96
                     "Drop IPv6 packet",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    97
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_dropTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    98
                     "ns3::Ipv6L3Protocol::DropTracedCallback")
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
    99
11086
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   100
    .AddTraceSource ("SendOutgoing",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   101
                     "A newly-generated packet by this node is "
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   102
                     "about to be queued for transmission",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   103
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_sendOutgoingTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   104
                     "ns3::Ipv6L3Protocol::SentTracedCallback")
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   105
    .AddTraceSource ("UnicastForward",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   106
                     "A unicast IPv6 packet was received by this node "
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   107
                     "and is being forwarded to another node",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   108
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_unicastForwardTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   109
                     "ns3::Ipv6L3Protocol::SentTracedCallback")
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   110
    .AddTraceSource ("LocalDeliver",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   111
                     "An IPv6 packet was received by/for this node, "
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   112
                     "and it is being forward up the stack",
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   113
                     MakeTraceSourceAccessor (&Ipv6L3Protocol::m_localDeliverTrace),
65914b1ed5b3 TracedCallback function signatures, the rest.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
   114
                     "ns3::Ipv6L3Protocol::SentTracedCallback")
7176
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   115
  ;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   116
  return tid;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   117
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   118
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   119
Ipv6L3Protocol::Ipv6L3Protocol ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   120
  : m_nInterfaces (0)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   121
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   122
  NS_LOG_FUNCTION_NOARGS ();
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   123
  m_pmtuCache = CreateObject<Ipv6PmtuCache> ();
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   124
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   125
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   126
Ipv6L3Protocol::~Ipv6L3Protocol ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   127
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   128
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   129
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   130
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   131
void Ipv6L3Protocol::DoDispose ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   132
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   133
  NS_LOG_FUNCTION_NOARGS ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   134
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   135
  /* clear protocol and interface list */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   136
  for (L4List_t::iterator it = m_protocols.begin (); it != m_protocols.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   137
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   138
      *it = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   139
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   140
  m_protocols.clear ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   141
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   142
  /* remove interfaces */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   143
  for (Ipv6InterfaceList::iterator it = m_interfaces.begin (); it != m_interfaces.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   144
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   145
      *it = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   146
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   147
  m_interfaces.clear ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   148
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   149
  /* remove raw sockets */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   150
  for (SocketList::iterator it = m_sockets.begin (); it != m_sockets.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   151
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   152
      *it = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   153
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   154
  m_sockets.clear ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   155
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   156
  /* remove list of prefix */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   157
  for (Ipv6AutoconfiguredPrefixListI it = m_prefixes.begin (); it != m_prefixes.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   158
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   159
      (*it)->StopValidTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   160
      (*it)->StopPreferredTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   161
      (*it) = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   162
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   163
  m_prefixes.clear ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   164
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   165
  m_node = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   166
  m_routingProtocol = 0;
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   167
  m_pmtuCache = 0;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   168
  Object::DoDispose ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   169
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   170
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   171
void Ipv6L3Protocol::SetRoutingProtocol (Ptr<Ipv6RoutingProtocol> routingProtocol)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   172
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   173
  NS_LOG_FUNCTION (this << routingProtocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   174
  m_routingProtocol = routingProtocol;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   175
  m_routingProtocol->SetIpv6 (this);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   176
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   177
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   178
Ptr<Ipv6RoutingProtocol> Ipv6L3Protocol::GetRoutingProtocol () const
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   179
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   180
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   181
  return m_routingProtocol;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   182
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   183
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   184
uint32_t Ipv6L3Protocol::AddInterface (Ptr<NetDevice> device)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   185
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   186
  NS_LOG_FUNCTION (this << device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   187
  Ptr<Node> node = GetObject<Node> ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   188
  Ptr<Ipv6Interface> interface = CreateObject<Ipv6Interface> ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   189
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   190
  node->RegisterProtocolHandler (MakeCallback (&Ipv6L3Protocol::Receive, this), Ipv6L3Protocol::PROT_NUMBER, device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   191
  interface->SetNode (m_node);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   192
  interface->SetDevice (device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   193
  interface->SetForwarding (m_ipForward);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   194
  return AddIpv6Interface (interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   195
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   196
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   197
uint32_t Ipv6L3Protocol::AddIpv6Interface (Ptr<Ipv6Interface> interface)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   198
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   199
  NS_LOG_FUNCTION (this << interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   200
  uint32_t index = m_nInterfaces;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   201
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   202
  m_interfaces.push_back (interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   203
  m_nInterfaces++;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   204
  return index;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   205
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   206
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   207
Ptr<Ipv6Interface> Ipv6L3Protocol::GetInterface (uint32_t index) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   208
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   209
  NS_LOG_FUNCTION (this << index);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   210
  uint32_t tmp = 0;
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   211
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   212
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   213
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   214
      if (index == tmp)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   215
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   216
          return *it;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   217
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   218
      tmp++;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   219
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   220
  return 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   221
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   222
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   223
uint32_t Ipv6L3Protocol::GetNInterfaces () const
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   224
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   225
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   226
  return m_nInterfaces;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   227
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   228
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   229
int32_t Ipv6L3Protocol::GetInterfaceForAddress (Ipv6Address address) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   230
{
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   231
  NS_LOG_FUNCTION (this << address);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   232
  int32_t index = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   233
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   234
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   235
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   236
      uint32_t j = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   237
      uint32_t max = (*it)->GetNAddresses ();
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   238
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   239
      for (j = 0; j < max; j++)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   240
        {
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   241
          if ((*it)->GetAddress (j).GetAddress () == address)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   242
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   243
              return index;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   244
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   245
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   246
      index++;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   247
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   248
  return -1;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   249
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   250
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   251
int32_t Ipv6L3Protocol::GetInterfaceForPrefix (Ipv6Address address, Ipv6Prefix mask) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   252
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   253
  NS_LOG_FUNCTION (this << address << mask);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   254
  int32_t index = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   255
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   256
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   257
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   258
      uint32_t j = 0;
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   259
      for (j = 0; j < (*it)->GetNAddresses (); j++)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   260
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   261
          if ((*it)->GetAddress (j).GetAddress ().CombinePrefix (mask) == address.CombinePrefix (mask))
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   262
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   263
              return index;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   264
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   265
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   266
      index++;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   267
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   268
  return -1;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   269
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   270
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   271
Ptr<NetDevice> Ipv6L3Protocol::GetNetDevice (uint32_t i)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   272
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   273
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   274
  return GetInterface (i)->GetDevice ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   275
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   276
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   277
int32_t Ipv6L3Protocol::GetInterfaceForDevice (Ptr<const NetDevice> device) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   278
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   279
  NS_LOG_FUNCTION (this << device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   280
  int32_t index = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   281
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   282
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   283
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   284
      if ((*it)->GetDevice () == device)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   285
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   286
          return index;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   287
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   288
      index++;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   289
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   290
  return -1;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   291
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   292
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   293
void Ipv6L3Protocol::AddAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, Ipv6Address defaultRouter)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   294
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   295
  NS_LOG_FUNCTION (this << interface << network << mask << (uint32_t)flags << validTime << preferredTime);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   296
  Ipv6InterfaceAddress address;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   297
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   298
  Address addr = GetInterface (interface)->GetDevice ()->GetAddress ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   299
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   300
  if (flags & (1 << 6)) /* auto flag */
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   301
    {
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   302
      // In case of new MacAddress types, remember to change Ipv6L3Protocol::RemoveAutoconfiguredAddress as well
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   303
      if (Mac64Address::IsMatchingType (addr))
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   304
        {
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   305
          address = Ipv6InterfaceAddress (Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), network));
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   306
        }
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   307
      else if (Mac48Address::IsMatchingType (addr))
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   308
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   309
          address = Ipv6InterfaceAddress (Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), network));
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   310
        }
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   311
      else if (Mac16Address::IsMatchingType (addr))
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   312
        {
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   313
          address = Ipv6InterfaceAddress (Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), network));
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   314
        }
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   315
      else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   316
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   317
          NS_FATAL_ERROR ("Unknown method to make autoconfigured address for this kind of device.");
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   318
          return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   319
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   320
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   321
      /* see if we have already the prefix */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   322
      for (Ipv6AutoconfiguredPrefixListI it = m_prefixes.begin (); it != m_prefixes.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   323
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   324
          if ((*it)->GetInterface () == interface && (*it)->GetPrefix () == network && (*it)->GetMask () == mask)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   325
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   326
              (*it)->StopPreferredTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   327
              (*it)->StopValidTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   328
              (*it)->StartPreferredTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   329
              return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   330
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   331
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   332
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   333
      /* no prefix found, add autoconfigured address and the prefix */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   334
      NS_LOG_INFO ("Autoconfigured address is :" << address.GetAddress ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   335
      AddAddress (interface, address);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   336
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   337
      /* add default router
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   338
       * if a previous default route exists, the new ones is simply added
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   339
       */
9817
cfb7c304cf2d Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9784
diff changeset
   340
      if (!defaultRouter.IsAny())
cfb7c304cf2d Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9784
diff changeset
   341
        {
cfb7c304cf2d Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9784
diff changeset
   342
          GetRoutingProtocol ()->NotifyAddRoute (Ipv6Address::GetAny (), Ipv6Prefix ((uint8_t)0), defaultRouter, interface, network);
cfb7c304cf2d Bug 1689 - IPv6 shouldn't add a default gateway without checking the Router lifetime
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9784
diff changeset
   343
        }
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   344
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   345
      Ptr<Ipv6AutoconfiguredPrefix> aPrefix = CreateObject<Ipv6AutoconfiguredPrefix> (m_node, interface, network, mask, preferredTime, validTime, defaultRouter);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   346
      aPrefix->StartPreferredTimer ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   347
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   348
      m_prefixes.push_back (aPrefix);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   349
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   350
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   351
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   352
void Ipv6L3Protocol::RemoveAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   353
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   354
  NS_LOG_FUNCTION (this << interface << network << mask);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   355
  Ptr<Ipv6Interface> iface = GetInterface (interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   356
  Address addr = iface->GetDevice ()->GetAddress ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   357
  uint32_t max = iface->GetNAddresses ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   358
  uint32_t i = 0;
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   359
  Ipv6Address toFound;
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   360
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   361
  if (Mac64Address::IsMatchingType (addr))
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   362
    {
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   363
      toFound = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), network);
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   364
    }
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   365
  else if (Mac48Address::IsMatchingType (addr))
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   366
    {
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   367
      toFound = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), network);
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   368
    }
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   369
  else if (Mac16Address::IsMatchingType (addr))
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   370
    {
9955
d97de2f9fbe5 Fix address parsing from Mac[16,48.64]Address
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9946
diff changeset
   371
      toFound = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), network);
9946
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   372
    }
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   373
  else
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   374
    {
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   375
      NS_FATAL_ERROR ("Unknown method to make autoconfigured address for this kind of device.");
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   376
      return;
df4a7e93c13d Mac16Address added, Mac64Address refactored, and Mac[16,64]Address can be used in IPv6
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9919
diff changeset
   377
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   378
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   379
  for (i = 0; i < max; i++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   380
    {
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   381
      if (iface->GetAddress (i).GetAddress () == toFound)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   382
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   383
          RemoveAddress (interface, i);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   384
          break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   385
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   386
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   387
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   388
  /* remove from list of autoconfigured address */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   389
  for (Ipv6AutoconfiguredPrefixListI it = m_prefixes.begin (); it != m_prefixes.end (); ++it)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   390
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   391
      if ((*it)->GetInterface () == interface && (*it)->GetPrefix () == network && (*it)->GetMask () == mask)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   392
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   393
          *it = 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   394
          m_prefixes.erase (it);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   395
          break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   396
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   397
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   398
4761
8c0b3a413f4b Add metric and longest prefix match support for IPv6.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 4731
diff changeset
   399
  GetRoutingProtocol ()->NotifyRemoveRoute (Ipv6Address::GetAny (), Ipv6Prefix ((uint8_t)0), defaultRouter, interface, network);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   400
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   401
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   402
bool Ipv6L3Protocol::AddAddress (uint32_t i, Ipv6InterfaceAddress address)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   403
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   404
  NS_LOG_FUNCTION (this << i << address);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   405
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   406
  bool ret = interface->AddAddress (address);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   407
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   408
  if (m_routingProtocol != 0)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   409
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   410
      m_routingProtocol->NotifyAddAddress (i, address);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   411
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   412
  return ret;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   413
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   414
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   415
uint32_t Ipv6L3Protocol::GetNAddresses (uint32_t i) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   416
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   417
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   418
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   419
  return interface->GetNAddresses ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   420
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   421
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   422
Ipv6InterfaceAddress Ipv6L3Protocol::GetAddress (uint32_t i, uint32_t addressIndex) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   423
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   424
  NS_LOG_FUNCTION (this << i << addressIndex);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   425
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   426
  return interface->GetAddress (addressIndex);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   427
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   428
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   429
bool Ipv6L3Protocol::RemoveAddress (uint32_t i, uint32_t addressIndex)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   430
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   431
  NS_LOG_FUNCTION (this << i << addressIndex);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   432
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   433
  Ipv6InterfaceAddress address = interface->RemoveAddress (addressIndex);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   434
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   435
  if (address != Ipv6InterfaceAddress ())
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   436
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   437
      if (m_routingProtocol != 0)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   438
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   439
          m_routingProtocol->NotifyRemoveAddress (i, address);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   440
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   441
      return true;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   442
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   443
  return false;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   444
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   445
9915
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   446
bool 
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   447
Ipv6L3Protocol::RemoveAddress (uint32_t i, Ipv6Address address)
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   448
{
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   449
  NS_LOG_FUNCTION (this << i << address);
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   450
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   451
  if (address == Ipv6Address::GetLoopback())
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   452
    {
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   453
      NS_LOG_WARN ("Cannot remove loopback address.");
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   454
      return false;
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   455
    }
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   456
  Ptr<Ipv6Interface> interface = GetInterface (i);
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   457
  Ipv6InterfaceAddress ifAddr = interface->RemoveAddress (address);
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   458
  if (ifAddr != Ipv6InterfaceAddress ())
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   459
  {
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   460
    if (m_routingProtocol != 0)
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   461
    {
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   462
      m_routingProtocol->NotifyRemoveAddress (i, ifAddr);
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   463
    }
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   464
    return true;
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   465
  }
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   466
  return false;
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   467
}
d4c2228d3c30 Bug 760 - IP address removal can be painful
Alexander D'souza (moijes12@gmail.com)
parents: 9894
diff changeset
   468
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   469
void Ipv6L3Protocol::SetMetric (uint32_t i, uint16_t metric)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   470
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   471
  NS_LOG_FUNCTION (this << i << metric);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   472
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   473
  interface->SetMetric (metric);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   474
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   475
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   476
uint16_t Ipv6L3Protocol::GetMetric (uint32_t i) const
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   477
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   478
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   479
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   480
  return interface->GetMetric ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   481
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   482
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   483
uint16_t Ipv6L3Protocol::GetMtu (uint32_t i) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   484
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   485
  NS_LOG_FUNCTION (this << i);
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   486
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   487
  // RFC 1981, if PMTU is disabled, return the minimum MTU
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   488
  if (!m_mtuDiscover)
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   489
    {
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   490
      return IPV6_MIN_MTU;
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   491
    }
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   492
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   493
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   494
  return interface->GetDevice ()->GetMtu ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   495
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   496
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   497
void Ipv6L3Protocol::SetPmtu (Ipv6Address dst, uint32_t pmtu)
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   498
{
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   499
  NS_LOG_FUNCTION (this << dst << int(pmtu));
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   500
  m_pmtuCache->SetPmtu (dst, pmtu);
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   501
}
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   502
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   503
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   504
bool Ipv6L3Protocol::IsUp (uint32_t i) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   505
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   506
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   507
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   508
  return interface->IsUp ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   509
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   510
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   511
void Ipv6L3Protocol::SetUp (uint32_t i)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   512
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   513
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   514
  Ptr<Ipv6Interface> interface = GetInterface (i);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   515
10512
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   516
  // RFC 2460, Section 5, pg. 24:
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   517
  //  IPv6 requires that every link in the internet have an MTU of 1280
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   518
  //  octets or greater.  On any link that cannot convey a 1280-octet
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   519
  //  packet in one piece, link-specific fragmentation and reassembly must
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   520
  //  be provided at a layer below IPv6.
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   521
  if (interface->GetDevice ()->GetMtu () >= 1280)
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   522
    {
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   523
      interface->SetUp ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   524
10512
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   525
      if (m_routingProtocol != 0)
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   526
        {
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   527
          m_routingProtocol->NotifyInterfaceUp (i);
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   528
        }
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   529
    }
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   530
  else
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   531
    {
10512
f222d52c616f Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10496
diff changeset
   532
      NS_LOG_LOGIC ("Interface " << int(i) << " is set to be down for IPv6. Reason: not respecting minimum IPv6 MTU (1280 octects)");
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   533
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   534
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   535
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   536
void Ipv6L3Protocol::SetDown (uint32_t i)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   537
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   538
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   539
  Ptr<Ipv6Interface> interface = GetInterface (i);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   540
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   541
  interface->SetDown ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   542
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   543
  if (m_routingProtocol != 0)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   544
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   545
      m_routingProtocol->NotifyInterfaceDown (i);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   546
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   547
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   548
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   549
void Ipv6L3Protocol::SetupLoopback ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   550
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   551
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   552
  Ptr<Ipv6Interface> interface = CreateObject<Ipv6Interface> ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   553
  Ptr<LoopbackNetDevice> device = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   554
  uint32_t i = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   555
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   556
  /* see if we have already an loopback NetDevice */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   557
  for (i = 0; i < m_node->GetNDevices (); i++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   558
    {
7739
b521459d9d27 Bug 1368 - [LLVM] error: added parentheses
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7717
diff changeset
   559
      if ((device = DynamicCast<LoopbackNetDevice> (m_node->GetDevice (i))))
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   560
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   561
          break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   562
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   563
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   564
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   565
  if (device == 0)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   566
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   567
      device = CreateObject<LoopbackNetDevice> ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   568
      m_node->AddDevice (device);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   569
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   570
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   571
  interface->SetDevice (device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   572
  interface->SetNode (m_node);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   573
  Ipv6InterfaceAddress ifaceAddr = Ipv6InterfaceAddress (Ipv6Address::GetLoopback (), Ipv6Prefix (128));
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   574
  interface->AddAddress (ifaceAddr);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   575
  uint32_t index = AddIpv6Interface (interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   576
  Ptr<Node> node = GetObject<Node> ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   577
  node->RegisterProtocolHandler (MakeCallback (&Ipv6L3Protocol::Receive, this), Ipv6L3Protocol::PROT_NUMBER, device);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   578
  interface->SetUp ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   579
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   580
  if (m_routingProtocol != 0)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   581
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   582
      m_routingProtocol->NotifyInterfaceUp (index);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   583
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   584
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   585
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   586
bool Ipv6L3Protocol::IsForwarding (uint32_t i) const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   587
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   588
  NS_LOG_FUNCTION (this << i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   589
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   590
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   591
  NS_LOG_LOGIC ("Forwarding state: " << interface->IsForwarding ());
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   592
  return interface->IsForwarding ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   593
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   594
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   595
void Ipv6L3Protocol::SetForwarding (uint32_t i, bool val)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   596
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   597
  NS_LOG_FUNCTION (this << i << val);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   598
  Ptr<Ipv6Interface> interface = GetInterface (i);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   599
  interface->SetForwarding (val);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   600
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   601
10664
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   602
Ipv6Address Ipv6L3Protocol::SourceAddressSelection (uint32_t interface, Ipv6Address dest)
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   603
{
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   604
  NS_LOG_FUNCTION (this << interface << dest);
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   605
  Ipv6Address ret;
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   606
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   607
  if (dest.IsLinkLocal () || dest.IsLinkLocalMulticast ())
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   608
    {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   609
      for (uint32_t i = 0; i < GetNAddresses (interface); i++)
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   610
        {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   611
          Ipv6InterfaceAddress test = GetAddress (interface, i);
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   612
          if (test.GetScope () == Ipv6InterfaceAddress::LINKLOCAL)
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   613
            {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   614
              return test.GetAddress ();
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   615
            }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   616
        }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   617
      NS_ASSERT_MSG (false, "No link-local address found on interface " << interface);
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   618
    }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   619
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   620
  for (uint32_t i = 0; i < GetNAddresses (interface); i++)
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   621
    {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   622
      Ipv6InterfaceAddress test = GetAddress (interface, i);
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   623
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   624
      if (test.GetScope () == Ipv6InterfaceAddress::GLOBAL)
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   625
        {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   626
          if (test.IsInSameSubnet (dest))
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   627
            {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   628
              return test.GetAddress ();
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   629
            }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   630
          else
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   631
            {
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   632
              ret = test.GetAddress ();
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   633
            }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   634
        }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   635
    }
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   636
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   637
  // no specific match found. Use a global address (any useful is fine).
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   638
  return ret;
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   639
}
2bb07b08e681 Move SourceAddressSelection to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   640
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   641
void Ipv6L3Protocol::SetIpForward (bool forward)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   642
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   643
  NS_LOG_FUNCTION (this << forward);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   644
  m_ipForward = forward;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   645
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   646
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   647
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   648
      (*it)->SetForwarding (forward);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   649
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   650
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   651
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   652
bool Ipv6L3Protocol::GetIpForward () const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   653
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   654
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   655
  return m_ipForward;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   656
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   657
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   658
void Ipv6L3Protocol::SetMtuDiscover (bool mtuDiscover)
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   659
{
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   660
  NS_LOG_FUNCTION (this << int(mtuDiscover));
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   661
  m_mtuDiscover = mtuDiscover;
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   662
}
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   663
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   664
bool Ipv6L3Protocol::GetMtuDiscover () const
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   665
{
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   666
  NS_LOG_FUNCTION (this);
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   667
  return m_mtuDiscover;
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   668
}
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   669
7793
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   670
void Ipv6L3Protocol::SetSendIcmpv6Redirect (bool sendIcmpv6Redirect)
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   671
{
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   672
  NS_LOG_FUNCTION (this << sendIcmpv6Redirect);
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   673
  m_sendIcmpv6Redirect = sendIcmpv6Redirect;
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   674
}
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   675
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   676
bool Ipv6L3Protocol::GetSendIcmpv6Redirect () const
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   677
{
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   678
  NS_LOG_FUNCTION_NOARGS ();
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   679
  return m_sendIcmpv6Redirect;
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   680
}
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
   681
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   682
void Ipv6L3Protocol::NotifyNewAggregate ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   683
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   684
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   685
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   686
  if (m_node == 0)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   687
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   688
      Ptr<Node> node = this->GetObject<Node> ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   689
      // verify that it's a valid node and that
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   690
      // the node has not been set before
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   691
      if (node != 0)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   692
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   693
          this->SetNode (node);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   694
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   695
    }
11463
60d4486a863a bug 2125: subclasses must chain up to their base class NotifyNewAggregate() method (patch due to nlmills)
Tom Henderson <tomh@tomh.org>
parents: 11259
diff changeset
   696
  Ipv6::NotifyNewAggregate ();
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   697
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   698
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   699
void Ipv6L3Protocol::SetNode (Ptr<Node> node)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   700
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   701
  NS_LOG_FUNCTION (this << node);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   702
  m_node = node;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   703
  /* add LoopbackNetDevice if needed, and an Ipv6Interface on top of it */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   704
  SetupLoopback ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   705
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   706
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
   707
void Ipv6L3Protocol::Insert (Ptr<IpL4Protocol> protocol)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   708
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   709
  NS_LOG_FUNCTION (this << protocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   710
  m_protocols.push_back (protocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   711
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   712
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
   713
void Ipv6L3Protocol::Remove (Ptr<IpL4Protocol> protocol)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   714
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   715
  NS_LOG_FUNCTION (this << protocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   716
  m_protocols.remove (protocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   717
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   718
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
   719
Ptr<IpL4Protocol> Ipv6L3Protocol::GetProtocol (int protocolNumber) const
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   720
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   721
  NS_LOG_FUNCTION (this << protocolNumber);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   722
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   723
  for (L4List_t::const_iterator i = m_protocols.begin (); i != m_protocols.end (); ++i)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   724
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   725
      if ((*i)->GetProtocolNumber () == protocolNumber)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   726
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   727
          return *i;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   728
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   729
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   730
  return 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   731
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   732
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   733
Ptr<Socket> Ipv6L3Protocol::CreateRawSocket ()
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   734
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   735
  NS_LOG_FUNCTION_NOARGS ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   736
  Ptr<Ipv6RawSocketImpl> sock = CreateObject<Ipv6RawSocketImpl> ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   737
  sock->SetNode (m_node);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   738
  m_sockets.push_back (sock);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   739
  return sock;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   740
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   741
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   742
void Ipv6L3Protocol::DeleteRawSocket (Ptr<Socket> socket)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   743
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   744
  NS_LOG_FUNCTION (this << socket);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   745
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   746
  for (SocketList::iterator it = m_sockets.begin (); it != m_sockets.end (); ++it)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   747
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   748
      if ((*it) == socket)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   749
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   750
          m_sockets.erase (it);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   751
          return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   752
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   753
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   754
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   755
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   756
Ptr<Icmpv6L4Protocol> Ipv6L3Protocol::GetIcmpv6 () const
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   757
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   758
  NS_LOG_FUNCTION_NOARGS ();
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
   759
  Ptr<IpL4Protocol> protocol = GetProtocol (Icmpv6L4Protocol::GetStaticProtocolNumber ());
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   760
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   761
  if (protocol)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   762
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   763
      return protocol->GetObject<Icmpv6L4Protocol> ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   764
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   765
  else
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   766
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   767
      return 0;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   768
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   769
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   770
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   771
void Ipv6L3Protocol::SetDefaultTtl (uint8_t ttl)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   772
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   773
  NS_LOG_FUNCTION (this << ttl);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   774
  m_defaultTtl = ttl;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   775
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   776
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   777
void Ipv6L3Protocol::SetDefaultTclass (uint8_t tclass)
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   778
{
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   779
  NS_LOG_FUNCTION (this << tclass);
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   780
  m_defaultTclass = tclass;
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   781
}
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   782
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   783
void Ipv6L3Protocol::Send (Ptr<Packet> packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr<Ipv6Route> route)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   784
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   785
  NS_LOG_FUNCTION (this << packet << source << destination << (uint32_t)protocol << route);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   786
  Ipv6Header hdr;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   787
  uint8_t ttl = m_defaultTtl;
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   788
  SocketIpv6HopLimitTag tag;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   789
  bool found = packet->RemovePacketTag (tag);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   790
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   791
  if (found)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   792
    {
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   793
      ttl = tag.GetHopLimit ();
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   794
    }
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   795
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   796
  SocketIpv6TclassTag tclassTag;
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   797
  uint8_t tclass = m_defaultTclass;
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   798
  found = packet->RemovePacketTag (tclassTag);
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   799
  
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   800
  if (found)
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   801
    {
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   802
      tclass = tclassTag.GetTclass ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   803
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   804
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   805
  /* Handle 3 cases:
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   806
   * 1) Packet is passed in with a route entry
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   807
   * 2) Packet is passed in with a route entry but route->GetGateway is not set (e.g., same network)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   808
   * 3) route is NULL (e.g., a raw socket call or ICMPv6)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   809
   */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   810
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   811
  /* 1) */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   812
  if (route && route->GetGateway () != Ipv6Address::GetZero ())
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   813
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   814
      NS_LOG_LOGIC ("Ipv6L3Protocol::Send case 1: passed in with a route");
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   815
      hdr = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, tclass);
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   816
      int32_t interface = GetInterfaceForDevice (route->GetOutputDevice ());
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   817
      m_sendOutgoingTrace (hdr, packet, interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   818
      SendRealOut (route, packet, hdr);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   819
      return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   820
    }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   821
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   822
  /* 2) */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   823
  if (route && route->GetGateway () == Ipv6Address::GetZero ())
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   824
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   825
      NS_LOG_LOGIC ("Ipv6L3Protocol::Send case 1: probably sent to machine on same IPv6 network");
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   826
      /* NS_FATAL_ERROR ("This case is not yet implemented"); */
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   827
      hdr = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, tclass);
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   828
      int32_t interface = GetInterfaceForDevice (route->GetOutputDevice ());
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   829
      m_sendOutgoingTrace (hdr, packet, interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   830
      SendRealOut (route, packet, hdr);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   831
      return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   832
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   833
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   834
  /* 3) */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   835
  NS_LOG_LOGIC ("Ipv6L3Protocol::Send case 3: passed in with no route " << destination);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   836
  Socket::SocketErrno err;
5856
7fd20c798a7d bug 742: Implementation of SO_BINDTODEVICE
Antti Mäkelä <zarhan@cc.hut.fi>
parents: 5796
diff changeset
   837
  Ptr<NetDevice> oif (0);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   838
  Ptr<Ipv6Route> newRoute = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   839
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
   840
  hdr = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, tclass);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   841
5863
a4b21e0ee84c Bug 759: Ipv6 uses wrong outgoing interface.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5856
diff changeset
   842
  //for link-local traffic, we need to determine the interface
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   843
  if (source.IsLinkLocal ()
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   844
      || destination.IsLinkLocal ()
10878
fa974e035729 Improve IPv6 LL multicast interface selection
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10692
diff changeset
   845
      || destination.IsLinkLocalMulticast ())
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   846
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   847
      int32_t index = GetInterfaceForAddress (source);
10878
fa974e035729 Improve IPv6 LL multicast interface selection
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10692
diff changeset
   848
      NS_ASSERT_MSG (index >= 0, "Can not find an outgoing interface for a packet with src " << source << " and dst " << destination);
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7252
diff changeset
   849
      oif = GetNetDevice (index);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   850
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   851
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   852
  newRoute = m_routingProtocol->RouteOutput (packet, hdr, oif, err);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   853
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   854
  if (newRoute)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   855
    {
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   856
      int32_t interface = GetInterfaceForDevice (newRoute->GetOutputDevice ());
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
   857
      m_sendOutgoingTrace (hdr, packet, interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   858
      SendRealOut (newRoute, packet, hdr);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   859
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   860
  else
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   861
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   862
      NS_LOG_WARN ("No route to host, drop!");
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7252
diff changeset
   863
      m_dropTrace (hdr, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv6> (), GetInterfaceForDevice (oif));
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   864
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   865
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   866
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   867
void Ipv6L3Protocol::Receive (Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   868
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   869
  NS_LOG_FUNCTION (this << device << p << protocol << from << to << packetType);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   870
  NS_LOG_LOGIC ("Packet from " << from << " received on node " << m_node->GetId ());
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   871
  uint32_t interface = 0;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   872
  Ptr<Packet> packet = p->Copy ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   873
  Ptr<Ipv6Interface> ipv6Interface = 0;
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   874
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   875
  for (Ipv6InterfaceList::const_iterator it = m_interfaces.begin (); it != m_interfaces.end (); it++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   876
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   877
      ipv6Interface = *it;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   878
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   879
      if (ipv6Interface->GetDevice () == device)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   880
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   881
          if (ipv6Interface->IsUp ())
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   882
            {
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
   883
              m_rxTrace (packet, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   884
              break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   885
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   886
          else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   887
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   888
              NS_LOG_LOGIC ("Dropping received packet-- interface is down");
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   889
              Ipv6Header hdr;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   890
              packet->RemoveHeader (hdr);
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
   891
              m_dropTrace (hdr, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   892
              return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   893
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   894
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   895
      interface++;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   896
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   897
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   898
  Ipv6Header hdr;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   899
  packet->RemoveHeader (hdr);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   900
5977
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   901
  // Trim any residual frame padding from underlying devices
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   902
  if (hdr.GetPayloadLength () < packet->GetSize ())
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   903
    {
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   904
      packet->RemoveAtEnd (packet->GetSize () - hdr.GetPayloadLength ());
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   905
    }
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5891
diff changeset
   906
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   907
  /* forward up to IPv6 raw sockets */
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7176
diff changeset
   908
  for (SocketList::iterator it = m_sockets.begin (); it != m_sockets.end (); ++it)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   909
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   910
      Ptr<Ipv6RawSocketImpl> socket = *it;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   911
      socket->ForwardUp (packet, hdr, device);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   912
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   913
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   914
  Ptr<Ipv6ExtensionDemux> ipv6ExtensionDemux = m_node->GetObject<Ipv6ExtensionDemux> ();
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   915
  Ptr<Ipv6Extension> ipv6Extension = 0;
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   916
  uint8_t nextHeader = hdr.GetNextHeader ();
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   917
  bool stopProcessing = false;
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   918
  bool isDropped = false;
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   919
  DropReason dropReason;
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   920
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   921
  if (nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   922
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   923
      ipv6Extension = ipv6ExtensionDemux->GetExtension (nextHeader);
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   924
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   925
      if (ipv6Extension)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   926
        {
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   927
          ipv6Extension->Process (packet, 0, hdr, hdr.GetDestinationAddress (), (uint8_t *)0, stopProcessing, isDropped, dropReason);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   928
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   929
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   930
      if (isDropped)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   931
        {
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   932
          m_dropTrace (hdr, packet, dropReason, m_node->GetObject<Ipv6> (), interface);
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   933
        }
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   934
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   935
      if (stopProcessing)
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
   936
        {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   937
          return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   938
        }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   939
    }
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   940
7176
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   941
  if (!m_routingProtocol->RouteInput (packet, hdr, device,
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   942
                                      MakeCallback (&Ipv6L3Protocol::IpForward, this),
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   943
                                      MakeCallback (&Ipv6L3Protocol::IpMulticastForward, this),
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   944
                                      MakeCallback (&Ipv6L3Protocol::LocalDeliver, this),
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 7161
diff changeset
   945
                                      MakeCallback (&Ipv6L3Protocol::RouteInputError, this)))
6300
bd1da3a75496 bug 861: Log drop traces for forwarding failures into IPv4 and IPv6 ascii traces
Tom Henderson <tomh@tomh.org>
parents: 5977
diff changeset
   946
    {
bd1da3a75496 bug 861: Log drop traces for forwarding failures into IPv4 and IPv6 ascii traces
Tom Henderson <tomh@tomh.org>
parents: 5977
diff changeset
   947
      NS_LOG_WARN ("No route found for forwarding packet.  Drop.");
10588
4010ae93e5e6 Bug 1846 - IPv6 should send Destination Unreachable if no route is available
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10512
diff changeset
   948
      GetIcmpv6 ()->SendErrorDestinationUnreachable (p->Copy (), hdr.GetSourceAddress (), Icmpv6Header::ICMPV6_NO_ROUTE);
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
   949
      m_dropTrace (hdr, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv6> (), interface);
6300
bd1da3a75496 bug 861: Log drop traces for forwarding failures into IPv4 and IPv6 ascii traces
Tom Henderson <tomh@tomh.org>
parents: 5977
diff changeset
   950
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   951
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   952
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   953
void Ipv6L3Protocol::SendRealOut (Ptr<Ipv6Route> route, Ptr<Packet> packet, Ipv6Header const& ipHeader)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   954
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   955
  NS_LOG_FUNCTION (this << route << packet << ipHeader);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   956
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   957
  if (!route)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   958
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   959
      NS_LOG_LOGIC ("No route to host, drop!.");
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   960
      return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   961
    }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   962
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   963
  Ptr<NetDevice> dev = route->GetOutputDevice ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   964
  int32_t interface = GetInterfaceForDevice (dev);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   965
  NS_ASSERT (interface >= 0);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   966
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   967
  Ptr<Ipv6Interface> outInterface = GetInterface (interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   968
  NS_LOG_LOGIC ("Send via NetDevice ifIndex " << dev->GetIfIndex () << " Ipv6InterfaceIndex " << interface);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
   969
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   970
  // Check packet size
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   971
  std::list<Ptr<Packet> > fragments;
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   972
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   973
  // Check if we have a Path MTU stored. If so, use it. Else, use the link MTU.
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   974
  size_t targetMtu = (size_t)(m_pmtuCache->GetPmtu (ipHeader.GetDestinationAddress()));
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   975
  if (targetMtu == 0)
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   976
    {
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   977
      targetMtu = dev->GetMtu ();
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   978
    }
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   979
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
   980
  if (packet->GetSize () > targetMtu + 40) /* 40 => size of IPv6 header */
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
   981
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   982
      // Router => drop
9856
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   983
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   984
      bool fromMe = false;
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   985
      for (uint32_t i=0; i<GetNInterfaces(); i++ )
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   986
        {
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   987
          for (uint32_t j=0; j<GetNAddresses(i); j++ )
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   988
            {
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   989
              if (GetAddress(i,j).GetAddress() == ipHeader.GetSourceAddress())
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   990
                {
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   991
                  fromMe = true;
9857
73a0f8924167 Bug 1720 - IPv6 Fragmentation cause crashes (tweak, thanks Peter)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9856
diff changeset
   992
                  break;
9856
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   993
                }
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   994
            }
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   995
        }
afdc6ca1a1e4 Bug 1720 - IPv6 Fragmentation cause crashes (better fix)
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9855
diff changeset
   996
      if (!fromMe)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
   997
        {
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   998
          Ptr<Icmpv6L4Protocol> icmpv6 = GetIcmpv6 ();
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
   999
          if ( icmpv6 )
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1000
            {
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1001
              packet->AddHeader(ipHeader);
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1002
              icmpv6->SendErrorTooBig (packet, ipHeader.GetSourceAddress (), dev->GetMtu ());
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1003
            }
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1004
          return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1005
        }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1006
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1007
      Ptr<Ipv6ExtensionDemux> ipv6ExtensionDemux = m_node->GetObject<Ipv6ExtensionDemux> ();
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1008
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1009
      packet->AddHeader (ipHeader);
5785
5d433b13a9c1 IPv6 Fragmentation support.
Sebastien Vincent <sebastien.vincent@turnserver.org>
parents: 5784
diff changeset
  1010
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1011
      // To get specific method GetFragments from Ipv6ExtensionFragmentation
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1012
      Ipv6ExtensionFragment *ipv6Fragment = dynamic_cast<Ipv6ExtensionFragment *> (PeekPointer (ipv6ExtensionDemux->GetExtension (Ipv6Header::IPV6_EXT_FRAGMENTATION)));
9784
740a983ed25b [Coverity] Unchecked dynamic_cast (FORWARD_NULL)
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9255
diff changeset
  1013
      NS_ASSERT (ipv6Fragment != 0);
10127
f4cee68de571 Bug 1721 - Path MTU isn't handled properly
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9955
diff changeset
  1014
      ipv6Fragment->GetFragments (packet, targetMtu, fragments);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1015
    }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1016
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1017
  if (!route->GetGateway ().IsEqual (Ipv6Address::GetAny ()))
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1018
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1019
      if (outInterface->IsUp ())
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1020
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1021
          NS_LOG_LOGIC ("Send to gateway " << route->GetGateway ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1022
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1023
          if (fragments.size () != 0)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1024
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1025
              std::ostringstream oss;
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1026
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1027
              /* IPv6 header is already added in fragments */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1028
              for (std::list<Ptr<Packet> >::const_iterator it = fragments.begin (); it != fragments.end (); it++)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1029
                {
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1030
                  m_txTrace (*it, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1031
                  outInterface->Send (*it, route->GetGateway ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1032
                }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1033
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1034
          else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1035
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1036
              packet->AddHeader (ipHeader);
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1037
              m_txTrace (packet, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1038
              outInterface->Send (packet, route->GetGateway ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1039
            }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1040
        }
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1041
      else
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1042
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1043
          NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << route->GetGateway ());
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1044
          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1045
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1046
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1047
  else
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1048
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1049
      if (outInterface->IsUp ())
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1050
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1051
          NS_LOG_LOGIC ("Send to destination " << ipHeader.GetDestinationAddress ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1052
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1053
          if (fragments.size () != 0)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1054
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1055
              std::ostringstream oss;
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1056
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1057
              /* IPv6 header is already added in fragments */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1058
              for (std::list<Ptr<Packet> >::const_iterator it = fragments.begin (); it != fragments.end (); it++)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1059
                {
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1060
                  m_txTrace (*it, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1061
                  outInterface->Send (*it, ipHeader.GetDestinationAddress ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1062
                }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1063
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1064
          else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1065
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1066
              packet->AddHeader (ipHeader);
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1067
              m_txTrace (packet, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1068
              outInterface->Send (packet, ipHeader.GetDestinationAddress ());
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1069
            }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1070
        }
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1071
      else
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1072
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1073
          NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestinationAddress ());
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1074
          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1075
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1076
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1077
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1078
9849
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1079
void Ipv6L3Protocol::IpForward (Ptr<const NetDevice> idev, Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1080
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1081
  NS_LOG_FUNCTION (this << rtentry << p << header);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1082
  NS_LOG_LOGIC ("Forwarding logic for node: " << m_node->GetId ());
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1083
9919
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1084
  // Drop RFC 3849 packets: 2001:db8::/32
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1085
  if (header.GetDestinationAddress().IsDocumentation())
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1086
    {
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1087
      NS_LOG_WARN ("Received a packet for 2001:db8::/32 (documentation class).  Drop.");
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1088
      m_dropTrace (header, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1089
      return;
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1090
    }
5596934962c2 RFC 3849 - IPv6 Address Prefix Reserved for Documentation
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9915
diff changeset
  1091
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1092
  // Forwarding
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1093
  Ipv6Header ipHeader = header;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1094
  Ptr<Packet> packet = p->Copy ();
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1095
  ipHeader.SetHopLimit (ipHeader.GetHopLimit () - 1);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1096
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1097
  if (ipHeader.GetSourceAddress ().IsLinkLocal ())
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1098
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1099
      /* no forward for link-local address */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1100
      return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1101
    }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1102
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1103
  if (ipHeader.GetHopLimit () == 0)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1104
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1105
      NS_LOG_WARN ("TTL exceeded.  Drop.");
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1106
      m_dropTrace (ipHeader, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv6> (), 0);
10588
4010ae93e5e6 Bug 1846 - IPv6 should send Destination Unreachable if no route is available
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10512
diff changeset
  1107
      // Do not reply to multicast IPv6 address
4010ae93e5e6 Bug 1846 - IPv6 should send Destination Unreachable if no route is available
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10512
diff changeset
  1108
      if (ipHeader.GetDestinationAddress ().IsMulticast () == false)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1109
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1110
          packet->AddHeader (ipHeader);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1111
          GetIcmpv6 ()->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_HOPLIMIT);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1112
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1113
      return;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1114
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1115
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1116
  /* ICMPv6 Redirect */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1117
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1118
  /* if we forward to a machine on the same network as the source,
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1119
   * we send him an ICMPv6 redirect message to notify him that a short route
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1120
   * exists.
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1121
   */
7793
1c81a8a91b1e Add SendIcmpv6Redirect attribute to Ipv6L3Protocol
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7790
diff changeset
  1122
9849
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1123
  /* Theoretically we should also check if the redirect target is on the same network
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1124
   * as the source node. On the other hand, we are sure that the router we're redirecting to
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1125
   * used a link-local address. As a consequence, they MUST be on the same network, the link-local net.
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1126
   */
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1127
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1128
  if (m_sendIcmpv6Redirect && (rtentry->GetOutputDevice ()==idev))
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1129
    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1130
      NS_LOG_LOGIC ("ICMPv6 redirect!");
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1131
      Ptr<Icmpv6L4Protocol> icmpv6 = GetIcmpv6 ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1132
      Address hardwareTarget;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1133
      Ipv6Address dst = header.GetDestinationAddress ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1134
      Ipv6Address src = header.GetSourceAddress ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1135
      Ipv6Address target = rtentry->GetGateway ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1136
      Ptr<Packet> copy = p->Copy ();
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1137
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1138
      if (target.IsAny ())
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1139
        {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1140
          target = dst;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1141
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1142
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1143
      copy->AddHeader (header);
9833
a12922454a0c bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local
Guowang Shi <shiguowang2007@gmail.com>
parents: 9817
diff changeset
  1144
      Ipv6Address linkLocal = GetInterface (GetInterfaceForDevice (rtentry->GetOutputDevice ()))->GetLinkLocalAddress ().GetAddress ();
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1145
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1146
      if (icmpv6->Lookup (target, rtentry->GetOutputDevice (), 0, &hardwareTarget))
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1147
        {
9833
a12922454a0c bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local
Guowang Shi <shiguowang2007@gmail.com>
parents: 9817
diff changeset
  1148
          icmpv6->SendRedirection (copy, linkLocal, src, target, dst, hardwareTarget);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1149
        }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1150
      else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1151
        {
9833
a12922454a0c bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local
Guowang Shi <shiguowang2007@gmail.com>
parents: 9817
diff changeset
  1152
          icmpv6->SendRedirection (copy, linkLocal, src, target, dst, Address ());
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1153
        }
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1154
    }
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
  1155
  int32_t interface = GetInterfaceForDevice (rtentry->GetOutputDevice ());
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
  1156
  m_unicastForwardTrace (ipHeader, packet, interface);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1157
  SendRealOut (rtentry, packet, ipHeader);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1158
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1159
9849
b3ec74c99612 Bug 1697 - ICMPv6 Redirect trigger contains multiple bugs
Guowang Shi <shiguowang2007@gmail.com>
parents: 9833
diff changeset
  1160
void Ipv6L3Protocol::IpMulticastForward (Ptr<const NetDevice> idev, Ptr<Ipv6MulticastRoute> mrtentry, Ptr<const Packet> p, const Ipv6Header& header)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1161
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1162
  NS_LOG_FUNCTION (this << mrtentry << p << header);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1163
  NS_LOG_LOGIC ("Multicast forwarding logic for node: " << m_node->GetId ());
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1164
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7252
diff changeset
  1165
  std::map<uint32_t, uint32_t> ttlMap = mrtentry->GetOutputTtlMap ();
7161
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1166
  std::map<uint32_t, uint32_t>::iterator mapIter;
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1167
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7252
diff changeset
  1168
  for (mapIter = ttlMap.begin (); mapIter != ttlMap.end (); mapIter++)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1169
    {
7161
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1170
      uint32_t interfaceId = mapIter->first;
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1171
      //uint32_t outputTtl = mapIter->second;  // Unused for now
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1172
      Ptr<Packet> packet = p->Copy ();
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1173
      Ipv6Header h = header;
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1174
      h.SetHopLimit (header.GetHopLimit () - 1);
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1175
      if (h.GetHopLimit () == 0)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1176
        {
7161
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1177
          NS_LOG_WARN ("TTL exceeded.  Drop.");
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1178
          m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv6> (), interfaceId);
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1179
          return;
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1180
        }
7161
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1181
      NS_LOG_LOGIC ("Forward multicast via interface " << interfaceId);
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1182
      Ptr<Ipv6Route> rtentry = Create<Ipv6Route> ();
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1183
      rtentry->SetSource (h.GetSourceAddress ());
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1184
      rtentry->SetDestination (h.GetDestinationAddress ());
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1185
      rtentry->SetGateway (Ipv6Address::GetAny ());
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1186
      rtentry->SetOutputDevice (GetNetDevice (interfaceId));
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1187
      SendRealOut (rtentry, packet, h);
7cc4506fb853 bug 1047: Multicast routes on nodes with >16 interfaces
Ken Renard <kenneth.renard@arl.army.mil>
parents: 7158
diff changeset
  1188
      continue;
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1189
    }
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1190
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1191
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1192
void Ipv6L3Protocol::LocalDeliver (Ptr<const Packet> packet, Ipv6Header const& ip, uint32_t iif)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1193
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1194
  NS_LOG_FUNCTION (this << packet << ip << iif);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1195
  Ptr<Packet> p = packet->Copy ();
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1196
  Ptr<IpL4Protocol> protocol = 0;
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1197
  Ptr<Ipv6ExtensionDemux> ipv6ExtensionDemux = m_node->GetObject<Ipv6ExtensionDemux> ();
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1198
  Ptr<Ipv6Extension> ipv6Extension = 0;
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1199
  Ipv6Address src = ip.GetSourceAddress ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1200
  Ipv6Address dst = ip.GetDestinationAddress ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1201
  uint8_t nextHeader = ip.GetNextHeader ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1202
  uint8_t nextHeaderPosition = 0;
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1203
  bool isDropped = false;
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1204
  bool stopProcessing = false;
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1205
  DropReason dropReason;
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1206
9255
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1207
  // check for a malformed hop-by-hop extension
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1208
  // this is a common case when forging IPv6 raw packets
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1209
  if (nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1210
    {
9255
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1211
      uint8_t buf;
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1212
      p->CopyData (&buf, 1);
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1213
      if (buf == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1214
        {
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1215
          NS_LOG_WARN("Double Ipv6Header::IPV6_EXT_HOP_BY_HOP in packet, dropping packet");
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1216
          return;
e407ed747d1c Bug #1318 (Reopened) - Ipv6L3Protocol::LocalDeliver can get stuck in an infinite loop trying to decode a malformed packet
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 9145
diff changeset
  1217
        }
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1218
    }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1219
5796
cd4576c14476 Update.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5791
diff changeset
  1220
  /* process all the extensions found and the layer 4 protocol */
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1221
  do
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1222
    {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1223
      /* it return 0 for non-extension (i.e. layer 4 protocol) */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1224
      ipv6Extension = ipv6ExtensionDemux->GetExtension (nextHeader);
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1225
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1226
      if (ipv6Extension)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1227
        {
7680
722145d57c8a Bug 1318 - Asserts for IPv6 malformed packets
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7385
diff changeset
  1228
          uint8_t nextHeaderStep = 0;
7701
c96a01de2973 Bug 1357 - IPv6 fragmentation fails due to checks about malformed extensions
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7680
diff changeset
  1229
          uint8_t curHeader = nextHeader;
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1230
          nextHeaderStep = ipv6Extension->Process (p, nextHeaderPosition, ip, dst, &nextHeader, stopProcessing, isDropped, dropReason);
7680
722145d57c8a Bug 1318 - Asserts for IPv6 malformed packets
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7385
diff changeset
  1231
          nextHeaderPosition += nextHeaderStep;
722145d57c8a Bug 1318 - Asserts for IPv6 malformed packets
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7385
diff changeset
  1232
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1233
          if (isDropped)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1234
            {
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1235
              m_dropTrace (ip, packet, dropReason, m_node->GetObject<Ipv6> (), iif);
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1236
            }
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1237
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1238
          if (stopProcessing)
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1239
            {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1240
              return;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1241
            }
7701
c96a01de2973 Bug 1357 - IPv6 fragmentation fails due to checks about malformed extensions
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7680
diff changeset
  1242
          NS_ASSERT_MSG (nextHeaderStep != 0 || curHeader == Ipv6Header::IPV6_EXT_FRAGMENTATION,
c96a01de2973 Bug 1357 - IPv6 fragmentation fails due to checks about malformed extensions
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 7680
diff changeset
  1243
                         "Zero-size IPv6 Option Header, aborting" << *packet );
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1244
        }
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1245
      else
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1246
        {
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1247
          protocol = GetProtocol (nextHeader);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1248
          // For ICMPv6 Error packets
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1249
          Ptr<Packet> malformedPacket  = packet->Copy ();
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1250
          malformedPacket->AddHeader (ip);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1251
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1252
          if (!protocol)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1253
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1254
              NS_LOG_LOGIC ("Unknown Next Header. Drop!");
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1255
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1256
              if (nextHeaderPosition == 0)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1257
                {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1258
                  GetIcmpv6 ()->SendErrorParameterError (malformedPacket, dst, Icmpv6Header::ICMPV6_UNKNOWN_NEXT_HEADER, 40);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1259
                }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1260
              else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1261
                {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1262
                  GetIcmpv6 ()->SendErrorParameterError (malformedPacket, dst, Icmpv6Header::ICMPV6_UNKNOWN_NEXT_HEADER, ip.GetSerializedSize () + nextHeaderPosition);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1263
                }
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1264
              m_dropTrace (ip, p, DROP_UNKNOWN_PROTOCOL, m_node->GetObject<Ipv6> (), iif);
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1265
              break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1266
            }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1267
          else
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1268
            {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1269
              p->RemoveAtStart (nextHeaderPosition);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1270
              /* protocol->Receive (p, src, dst, incomingInterface); */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1271
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1272
              /* L4 protocol */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1273
              Ptr<Packet> copy = p->Copy ();
10692
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
  1274
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
  1275
              m_localDeliverTrace (ip, p, iif);
bdf59f5ace93 Bug 1818: FlowMonitor needs IPv6 support
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10669
diff changeset
  1276
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
  1277
              enum IpL4Protocol::RxStatus status = protocol->Receive (p, ip, GetInterface (iif));
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1278
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1279
              switch (status)
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1280
                {
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
  1281
                case IpL4Protocol::RX_OK:
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
  1282
                  break;
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
  1283
                case IpL4Protocol::RX_CSUM_FAILED:
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1284
                  break;
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
  1285
                case IpL4Protocol::RX_ENDPOINT_CLOSED:
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1286
                  break;
7717
cfa1741013dd Add support for IPv6 transport protocols
Ken Renard <kdrenard2@gmail.com>
parents: 7704
diff changeset
  1287
                case IpL4Protocol::RX_ENDPOINT_UNREACH:
5891
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1288
                  if (ip.GetDestinationAddress ().IsMulticast ())
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1289
                    {
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1290
                      /* do not rely on multicast address */
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1291
                      break;
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1292
                    }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1293
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1294
                  copy->AddHeader (ip);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1295
                  GetIcmpv6 ()->SendErrorDestinationUnreachable (copy, ip.GetSourceAddress (), Icmpv6Header::ICMPV6_PORT_UNREACHABLE);
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1296
                }
09a575cdf8db Indent correctly IPv6 code.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5863
diff changeset
  1297
            }
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1298
        }
7790
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1299
    }
47d6d575412c Bug 1362 - ICMPv6 does not forward ICMPs to upper layers
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 7739
diff changeset
  1300
  while (ipv6Extension);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1301
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1302
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1303
void Ipv6L3Protocol::RouteInputError (Ptr<const Packet> p, const Ipv6Header& ipHeader, Socket::SocketErrno sockErrno)
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1304
{
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1305
  NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1306
  NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno);
7158
4fe055d32d78 bug 1054: ipv6 InternetStackHelper EnablePcapIpv6All() broken
Tom Henderson <tomh@tomh.org>
parents: 6834
diff changeset
  1307
  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1308
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1309
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
  1310
Ipv6Header Ipv6L3Protocol::BuildHeader (Ipv6Address src, Ipv6Address dst, uint8_t protocol, uint16_t payloadSize, uint8_t ttl, uint8_t tclass)
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1311
{
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
  1312
  NS_LOG_FUNCTION (this << src << dst << (uint32_t)protocol << (uint32_t)payloadSize << (uint32_t)ttl << (uint32_t)tclass);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1313
  Ipv6Header hdr;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1314
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1315
  hdr.SetSourceAddress (src);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1316
  hdr.SetDestinationAddress (dst);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1317
  hdr.SetNextHeader (protocol);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1318
  hdr.SetPayloadLength (payloadSize);
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1319
  hdr.SetHopLimit (ttl);
9145
5752b425cdf5 Bug 1361 - Set TOS from Application level (sockets)
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7793
diff changeset
  1320
  hdr.SetTrafficClass (tclass);
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1321
  return hdr;
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1322
}
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1323
5784
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1324
void Ipv6L3Protocol::RegisterExtensions ()
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1325
{
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1326
  Ptr<Ipv6ExtensionDemux> ipv6ExtensionDemux = CreateObject<Ipv6ExtensionDemux> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1327
  ipv6ExtensionDemux->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1328
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1329
  Ptr<Ipv6ExtensionHopByHop> hopbyhopExtension = CreateObject<Ipv6ExtensionHopByHop> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1330
  hopbyhopExtension->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1331
  Ptr<Ipv6ExtensionDestination> destinationExtension = CreateObject<Ipv6ExtensionDestination> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1332
  destinationExtension->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1333
  Ptr<Ipv6ExtensionFragment> fragmentExtension = CreateObject<Ipv6ExtensionFragment> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1334
  fragmentExtension->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1335
  Ptr<Ipv6ExtensionRouting> routingExtension = CreateObject<Ipv6ExtensionRouting> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1336
  routingExtension->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1337
  // Ptr<Ipv6ExtensionESP> espExtension = CreateObject<Ipv6ExtensionESP> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1338
  // Ptr<Ipv6ExtensionAH> ahExtension = CreateObject<Ipv6ExtensionAH> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1339
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1340
  ipv6ExtensionDemux->Insert (hopbyhopExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1341
  ipv6ExtensionDemux->Insert (destinationExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1342
  ipv6ExtensionDemux->Insert (fragmentExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1343
  ipv6ExtensionDemux->Insert (routingExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1344
  // ipv6ExtensionDemux->Insert (espExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1345
  // ipv6ExtensionDemux->Insert (ahExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1346
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1347
  Ptr<Ipv6ExtensionRoutingDemux> routingExtensionDemux = CreateObject<Ipv6ExtensionRoutingDemux> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1348
  routingExtensionDemux->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1349
  Ptr<Ipv6ExtensionLooseRouting> looseRoutingExtension = CreateObject<Ipv6ExtensionLooseRouting> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1350
  looseRoutingExtension->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1351
  routingExtensionDemux->Insert (looseRoutingExtension);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1352
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1353
  m_node->AggregateObject (routingExtensionDemux);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1354
  m_node->AggregateObject (ipv6ExtensionDemux);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1355
}
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1356
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1357
void Ipv6L3Protocol::RegisterOptions ()
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1358
{
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1359
  Ptr<Ipv6OptionDemux> ipv6OptionDemux = CreateObject<Ipv6OptionDemux> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1360
  ipv6OptionDemux->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1361
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1362
  Ptr<Ipv6OptionPad1> pad1Option = CreateObject<Ipv6OptionPad1> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1363
  pad1Option->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1364
  Ptr<Ipv6OptionPadn> padnOption = CreateObject<Ipv6OptionPadn> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1365
  padnOption->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1366
  Ptr<Ipv6OptionJumbogram> jumbogramOption = CreateObject<Ipv6OptionJumbogram> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1367
  jumbogramOption->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1368
  Ptr<Ipv6OptionRouterAlert> routerAlertOption = CreateObject<Ipv6OptionRouterAlert> ();
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1369
  routerAlertOption->SetNode (m_node);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1370
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1371
  ipv6OptionDemux->Insert (pad1Option);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1372
  ipv6OptionDemux->Insert (padnOption);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1373
  ipv6OptionDemux->Insert (jumbogramOption);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1374
  ipv6OptionDemux->Insert (routerAlertOption);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1375
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1376
  m_node->AggregateObject (ipv6OptionDemux);
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1377
}
512909f442f7 More on IPv6 extensions support.
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents: 5375
diff changeset
  1378
10669
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1379
void Ipv6L3Protocol::ReportDrop (Ipv6Header ipHeader, Ptr<Packet> p, DropReason dropReason)
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1380
{
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1381
  m_dropTrace (ipHeader, p, dropReason, m_node->GetObject<Ipv6> (), 0);
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1382
}
46c9391bc38b Bug 1843 - IPv6 extensions dropped packets do not fire L3 drop trace
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10664
diff changeset
  1383
4731
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1384
} /* namespace ns3 */
510db8599bfb second phase of IPv6 checkins from Univ. of Strasbourg team
Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
parents:
diff changeset
  1385