src/internet-stack/ipv4-l3-protocol.cc
author Lalith Suresh <suresh.lalith@gmail.com>
Thu, 10 Jun 2010 19:59:22 +0530
changeset 6308 cfc9f271c1e5
parent 6305 c42027138304
permissions -rw-r--r--
Ipv4L3ClickProtocol implemented and integrated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
// -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*-
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
// Copyright (c) 2006 Georgia Tech Research Corporation
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
// This program is free software; you can redistribute it and/or modify
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
// it under the terms of the GNU General Public License version 2 as
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
// published by the Free Software Foundation;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
// This program is distributed in the hope that it will be useful,
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
// GNU General Public License for more details.
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
// You should have received a copy of the GNU General Public License
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
// along with this program; if not, write to the Free Software
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
// Author: George F. Riley<riley@ece.gatech.edu>
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
//
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "ns3/packet.h"
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1451
diff changeset
    22
#include "ns3/log.h"
345
47b41507a45a move channel.cc channel.h to node directory; merge ns-3-tracing from mathieu
Tom Henderson <tomh@tomh.org>
parents: 293
diff changeset
    23
#include "ns3/callback.h"
524
082ffdd8fbd7 move code around
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 514
diff changeset
    24
#include "ns3/ipv4-address.h"
082ffdd8fbd7 move code around
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 514
diff changeset
    25
#include "ns3/ipv4-route.h"
729
b5e744285e92 rename i-node to node
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 728
diff changeset
    26
#include "ns3/node.h"
3124
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 2989
diff changeset
    27
#include "ns3/socket.h"
568
e1660959ecbb use Ptr<> everywhere Object or NsUnknown are used
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 555
diff changeset
    28
#include "ns3/net-device.h"
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    29
#include "ns3/uinteger.h"
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    30
#include "ns3/trace-source-accessor.h"
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    31
#include "ns3/object-vector.h"
3216
b36bb98d766e bug 207: ipv4-header.h needed in src/node module.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3172
diff changeset
    32
#include "ns3/ipv4-header.h"
3235
c2f34dac1b9e add support for attribtues to bug 34
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3216
diff changeset
    33
#include "ns3/boolean.h"
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
    34
#include "ns3/ipv4-routing-table-entry.h"
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
    35
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
    36
#include "loopback-net-device.h"
3172
e661e08c3211 Don't register IPv4 protocol handler for all interfaces, only for IPv4-enabled interfaces.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3153
diff changeset
    37
#include "arp-l3-protocol.h"
733
fb1882e7d785 rename ipv4.h to ipv4-l3-protocol.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 729
diff changeset
    38
#include "ipv4-l3-protocol.h"
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
#include "ipv4-l4-protocol.h"
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
    40
#include "icmpv4-l4-protocol.h"
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
#include "ipv4-interface.h"
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
    42
#include "ipv4-raw-socket-impl.h"
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1451
diff changeset
    44
NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol");
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
namespace ns3 {
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
    48
const uint16_t Ipv4L3Protocol::PROT_NUMBER = 0x0800;
293
007bc9e735f3 remove Ipv4L3Protocol class.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 287
diff changeset
    49
2249
3a1da26d61dc replace ComponentManager::Create and ClassId with InterfaceId::CreateObjest and InterfaceId
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2238
diff changeset
    50
NS_OBJECT_ENSURE_REGISTERED (Ipv4L3Protocol);
3a1da26d61dc replace ComponentManager::Create and ClassId with InterfaceId::CreateObjest and InterfaceId
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2238
diff changeset
    51
2250
18f432098389 InterfaceId -> TypeId
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2249
diff changeset
    52
TypeId 
2251
04963d8cca51 iid (void) -> GetTypeId (void)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2250
diff changeset
    53
Ipv4L3Protocol::GetTypeId (void)
2232
9abd038ee588 replace static const Interface iid; with static InterfaceId iid (void);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2231
diff changeset
    54
{
2602
d9262bff6df2 add back support for introspected doxygen.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2592
diff changeset
    55
  static TypeId tid = TypeId ("ns3::Ipv4L3Protocol")
4377
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
    56
    .SetParent<Ipv4> ()
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    57
    .AddConstructor<Ipv4L3Protocol> ()
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    58
    .AddAttribute ("DefaultTtl", "The TTL value set by default on all outgoing packets generated on this node.",
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2933
diff changeset
    59
                   UintegerValue (64),
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    60
                   MakeUintegerAccessor (&Ipv4L3Protocol::m_defaultTtl),
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    61
                   MakeUintegerChecker<uint8_t> ())
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    62
    .AddTraceSource ("Tx", "Send ipv4 packet to outgoing interface.",
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    63
                   MakeTraceSourceAccessor (&Ipv4L3Protocol::m_txTrace))
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    64
    .AddTraceSource ("Rx", "Receive ipv4 packet from incoming interface.",
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    65
                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_rxTrace))
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    66
    .AddTraceSource ("Drop", "Drop ipv4 packet",
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    67
                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_dropTrace))
2537
c937f3317a1f be consistant in how lists of objects are named.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2503
diff changeset
    68
    .AddAttribute ("InterfaceList", "The set of Ipv4 interfaces associated to this Ipv4 stack.",
2965
4b28e9740e3b get rid of Attribute class. Use AttributeValue subclasses directly.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2933
diff changeset
    69
                   ObjectVectorValue (),
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    70
                   MakeObjectVectorAccessor (&Ipv4L3Protocol::m_interfaces),
2933
c7983cfa2cb3 add ObjectVector::GetItemTypeId
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2834
diff changeset
    71
                   MakeObjectVectorChecker<Ipv4Interface> ())
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
    72
5374
825478d4cf10 Tom's update to Gustavo's patch for bug 676.
Craig Dowell <craigdo@ee.washington.edu>
parents: 5211
diff changeset
    73
    .AddTraceSource ("SendOutgoing", "A newly-generated packet by this node is about to be queued for transmission",
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
    74
                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_sendOutgoingTrace))
5374
825478d4cf10 Tom's update to Gustavo's patch for bug 676.
Craig Dowell <craigdo@ee.washington.edu>
parents: 5211
diff changeset
    75
    .AddTraceSource ("UnicastForward", "A unicast IPv4 packet was received by this node and is being forwarded to another node",
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
    76
                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_unicastForwardTrace))
5374
825478d4cf10 Tom's update to Gustavo's patch for bug 676.
Craig Dowell <craigdo@ee.washington.edu>
parents: 5211
diff changeset
    77
    .AddTraceSource ("LocalDeliver", "An IPv4 packet was received by/for this node, and it is being forward up the stack",
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
    78
                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_localDeliverTrace))
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
    79
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    80
    ;
2252
80595448707a iid -> tid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2251
diff changeset
    81
  return tid;
2232
9abd038ee588 replace static const Interface iid; with static InterfaceId iid (void);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2231
diff changeset
    82
}
9abd038ee588 replace static const Interface iid; with static InterfaceId iid (void);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2231
diff changeset
    83
2498
e01570293b98 convert InternetNode to Attributes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2257
diff changeset
    84
Ipv4L3Protocol::Ipv4L3Protocol()
5487
9485bee6b7eb Ipv4L3Protocol::GetInterface optimization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5380
diff changeset
    85
  : m_identification (0)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
    86
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
    87
  NS_LOG_FUNCTION_NOARGS ();
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
    88
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
    89
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
    90
Ipv4L3Protocol::~Ipv4L3Protocol ()
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
    91
{
3150
7350a68e5856 more logging. Make sure we do dispose attached Ipv4Interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2989
diff changeset
    92
  NS_LOG_FUNCTION (this);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
    93
}
496
894c8380d57b use Dispose more extensively
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
    94
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
    95
void
3588
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
    96
Ipv4L3Protocol::Insert(Ptr<Ipv4L4Protocol> protocol)
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
    97
{
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
    98
  m_protocols.push_back (protocol);
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
    99
}
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   100
Ptr<Ipv4L4Protocol>
3744
bb6876ea0851 constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3588
diff changeset
   101
Ipv4L3Protocol::GetProtocol(int protocolNumber) const
3588
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   102
{
3744
bb6876ea0851 constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3588
diff changeset
   103
  for (L4List_t::const_iterator i = m_protocols.begin(); i != m_protocols.end(); ++i)
3588
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   104
    {
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   105
      if ((*i)->GetProtocolNumber () == protocolNumber)
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   106
	{
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   107
	  return *i;
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   108
	}
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   109
    }
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   110
  return 0;
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   111
}
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   112
void
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   113
Ipv4L3Protocol::Remove (Ptr<Ipv4L4Protocol> protocol)
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   114
{
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   115
  m_protocols.remove (protocol);
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   116
}
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   117
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   118
void
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   119
Ipv4L3Protocol::SetNode (Ptr<Node> node)
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   120
{
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   121
  m_node = node;
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   122
  // Add a LoopbackNetDevice if needed, and an Ipv4Interface on top of it
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   123
  SetupLoopback ();
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   124
}
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   125
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   126
Ptr<Socket> 
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   127
Ipv4L3Protocol::CreateRawSocket (void)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   128
{
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   129
  NS_LOG_FUNCTION (this);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   130
  Ptr<Ipv4RawSocketImpl> socket = CreateObject<Ipv4RawSocketImpl> ();
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   131
  socket->SetNode (m_node);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   132
  m_sockets.push_back (socket);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   133
  return socket;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   134
}
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   135
void 
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   136
Ipv4L3Protocol::DeleteRawSocket (Ptr<Socket> socket)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   137
{
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   138
  NS_LOG_FUNCTION (this << socket);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   139
  for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   140
    {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   141
      if ((*i) == socket)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   142
        {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   143
          m_sockets.erase (i);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   144
          return;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   145
        }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   146
    }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   147
  return;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   148
}
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   149
/*
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   150
 * This method is called by AddAgregate and completes the aggregation
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   151
 * by setting the node in the ipv4 stack
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   152
 */
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   153
void
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   154
Ipv4L3Protocol::NotifyNewAggregate ()
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   155
{
4669
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   156
  if (m_node == 0)
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   157
    {
4669
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   158
      Ptr<Node>node = this->GetObject<Node>();
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   159
      // verify that it's a valid node and that
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   160
      // the node has not been set before
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   161
      if (node != 0)
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   162
        {
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   163
          this->SetNode (node);
8aaa5e83939e avoid excessive calls to GetObject during topology construction
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4616
diff changeset
   164
        }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   165
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   166
  Object::NotifyNewAggregate ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   167
}
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   168
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   169
void 
4481
9250a25ee683 Doxygen cleanup
Tom Henderson <tomh@tomh.org>
parents: 4472
diff changeset
   170
Ipv4L3Protocol::SetRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol)
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   171
{
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   172
  NS_LOG_FUNCTION (this);
4481
9250a25ee683 Doxygen cleanup
Tom Henderson <tomh@tomh.org>
parents: 4472
diff changeset
   173
  m_routingProtocol = routingProtocol;
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   174
  m_routingProtocol->SetIpv4 (this);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   175
}
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   176
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   177
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   178
Ptr<Ipv4RoutingProtocol> 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   179
Ipv4L3Protocol::GetRoutingProtocol (void) const
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   180
{
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   181
  return m_routingProtocol;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   182
}
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   183
496
894c8380d57b use Dispose more extensively
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   184
void 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   185
Ipv4L3Protocol::DoDispose (void)
496
894c8380d57b use Dispose more extensively
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   186
{
3150
7350a68e5856 more logging. Make sure we do dispose attached Ipv4Interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2989
diff changeset
   187
  NS_LOG_FUNCTION (this);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   188
  for (L4List_t::iterator i = m_protocols.begin(); i != m_protocols.end(); ++i)
3588
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   189
    {
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   190
      *i = 0;
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   191
    }
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   192
  m_protocols.clear ();
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   193
4283
5854cddf4493 Bugs 458, swap 2 LOC for 526
Craig Dowell <craigdo@ee.washington.edu>
parents: 4210
diff changeset
   194
  for (Ipv4InterfaceList::iterator i = m_interfaces.begin (); i != m_interfaces.end (); ++i)
3150
7350a68e5856 more logging. Make sure we do dispose attached Ipv4Interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2989
diff changeset
   195
    {
4283
5854cddf4493 Bugs 458, swap 2 LOC for 526
Craig Dowell <craigdo@ee.washington.edu>
parents: 4210
diff changeset
   196
      *i = 0;
3150
7350a68e5856 more logging. Make sure we do dispose attached Ipv4Interface
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2989
diff changeset
   197
    }
496
894c8380d57b use Dispose more extensively
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 487
diff changeset
   198
  m_interfaces.clear ();
5916
8f94a0ca3964 Bug 790: Fix memory leak in routing-aodv-regression
Faker Moatamri <faker.moatamri@sophia.inria.fr>
parents: 5856
diff changeset
   199
  m_sockets.clear ();
555
4d3b2a77bc92 convert Node * to Ptr<Node>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 551
diff changeset
   200
  m_node = 0;
4616
a84f60b6cd12 bug 600: lower the default routing priority of Ipv4GlobalRouting; move to helper
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4607
diff changeset
   201
  m_routingProtocol = 0;
1176
4894ea885c0f implement the Node::ProtocolHandler support.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 983
diff changeset
   202
  Object::DoDispose ();
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   205
void
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   206
Ipv4L3Protocol::SetupLoopback (void)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   207
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   208
  NS_LOG_FUNCTION_NOARGS ();
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   209
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   210
  Ptr<Ipv4Interface> interface = CreateObject<Ipv4Interface> ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   211
  Ptr<LoopbackNetDevice> device = 0;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   212
  // First check whether an existing LoopbackNetDevice exists on the node
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   213
  for (uint32_t i = 0; i < m_node->GetNDevices (); i++)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   214
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   215
      if (device = DynamicCast<LoopbackNetDevice> (m_node->GetDevice (i)))
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   216
        {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   217
          break;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   218
        }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   219
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   220
  if (device == 0)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   221
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   222
      device = CreateObject<LoopbackNetDevice> (); 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   223
      m_node->AddDevice (device);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   224
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   225
  interface->SetDevice (device);
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   226
  interface->SetNode (m_node);
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   227
  Ipv4InterfaceAddress ifaceAddr = Ipv4InterfaceAddress (Ipv4Address::GetLoopback (), Ipv4Mask::GetLoopback ());
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   228
  interface->AddAddress (ifaceAddr);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   229
  uint32_t index = AddIpv4Interface (interface);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   230
  Ptr<Node> node = GetObject<Node> ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   231
  node->RegisterProtocolHandler (MakeCallback (&Ipv4L3Protocol::Receive, this), 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   232
                                 Ipv4L3Protocol::PROT_NUMBER, device);
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   233
  interface->SetUp ();
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   234
  if (m_routingProtocol != 0)
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   235
    {
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   236
      m_routingProtocol->NotifyInterfaceUp (index);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   237
    }
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   238
}
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   239
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
void 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   241
Ipv4L3Protocol::SetDefaultTtl (uint8_t ttl)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   243
  NS_LOG_FUNCTION_NOARGS ();
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
  m_defaultTtl = ttl;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
    
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
uint32_t 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   248
Ipv4L3Protocol::AddInterface (Ptr<NetDevice> device)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   249
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   250
  NS_LOG_FUNCTION (this << &device);
3172
e661e08c3211 Don't register IPv4 protocol handler for all interfaces, only for IPv4-enabled interfaces.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3153
diff changeset
   251
e661e08c3211 Don't register IPv4 protocol handler for all interfaces, only for IPv4-enabled interfaces.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3153
diff changeset
   252
  Ptr<Node> node = GetObject<Node> ();
6308
cfc9f271c1e5 Ipv4L3ClickProtocol implemented and integrated
Lalith Suresh <suresh.lalith@gmail.com>
parents: 6305
diff changeset
   253
  node->RegisterProtocolHandler (MakeCallback (&Ipv4L3Protocol::Receive, this), 
cfc9f271c1e5 Ipv4L3ClickProtocol implemented and integrated
Lalith Suresh <suresh.lalith@gmail.com>
parents: 6305
diff changeset
   254
                                 Ipv4L3Protocol::PROT_NUMBER, device);
cfc9f271c1e5 Ipv4L3ClickProtocol implemented and integrated
Lalith Suresh <suresh.lalith@gmail.com>
parents: 6305
diff changeset
   255
  node->RegisterProtocolHandler (MakeCallback (&ArpL3Protocol::Receive, PeekPointer (GetObject<ArpL3Protocol> ())),
cfc9f271c1e5 Ipv4L3ClickProtocol implemented and integrated
Lalith Suresh <suresh.lalith@gmail.com>
parents: 6305
diff changeset
   256
                                 ArpL3Protocol::PROT_NUMBER, device);
3172
e661e08c3211 Don't register IPv4 protocol handler for all interfaces, only for IPv4-enabled interfaces.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3153
diff changeset
   257
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   258
  Ptr<Ipv4Interface> interface = CreateObject<Ipv4Interface> ();
2592
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   259
  interface->SetNode (m_node);
3ebf97150166 get rid of CreateObjectWith
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2537
diff changeset
   260
  interface->SetDevice (device);
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
   261
  interface->SetForwarding (m_ipForward);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   262
  return AddIpv4Interface (interface);
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   263
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   264
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   265
uint32_t 
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   266
Ipv4L3Protocol::AddIpv4Interface (Ptr<Ipv4Interface>interface)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   267
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   268
  NS_LOG_FUNCTION (this << interface);
5487
9485bee6b7eb Ipv4L3Protocol::GetInterface optimization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5380
diff changeset
   269
  uint32_t index = m_interfaces.size ();
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   270
  m_interfaces.push_back (interface);
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   271
  return index;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   273
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   274
Ptr<Ipv4Interface>
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   275
Ipv4L3Protocol::GetInterface (uint32_t index) const
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   277
  NS_LOG_FUNCTION (this << index);
5487
9485bee6b7eb Ipv4L3Protocol::GetInterface optimization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5380
diff changeset
   278
  if (index < m_interfaces.size ())
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
    {
5487
9485bee6b7eb Ipv4L3Protocol::GetInterface optimization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5380
diff changeset
   280
      return m_interfaces[index];
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
    }
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
  return 0;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   283
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   284
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
uint32_t 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   286
Ipv4L3Protocol::GetNInterfaces (void) const
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   288
  NS_LOG_FUNCTION_NOARGS ();
5487
9485bee6b7eb Ipv4L3Protocol::GetInterface optimization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5380
diff changeset
   289
  return m_interfaces.size ();
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   292
int32_t 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   293
Ipv4L3Protocol::GetInterfaceForAddress (
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   294
  Ipv4Address address) const
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   295
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   296
  NS_LOG_FUNCTION (this << address);
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   297
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   298
  int32_t interface = 0;
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   299
  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   300
       i != m_interfaces.end (); 
4372
d99061f1167c Ipv4::ifIndex -> Ipv4::interface
Tom Henderson <tomh@tomh.org>
parents: 4284
diff changeset
   301
       i++, interface++)
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   302
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   303
      for (uint32_t j = 0; j < (*i)->GetNAddresses (); j++)
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   304
        {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   305
          if ((*i)->GetAddress (j).GetLocal () == address)
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   306
            {
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   307
              return interface;
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   308
            }
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   309
        }
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   310
    }
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   311
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   312
  return -1;
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   313
}
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   314
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   315
int32_t 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   316
Ipv4L3Protocol::GetInterfaceForPrefix (
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   317
  Ipv4Address address, 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   318
  Ipv4Mask mask) const
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   319
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   320
  NS_LOG_FUNCTION (this << address << mask);
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   321
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   322
  int32_t interface = 0;
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   323
  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   324
       i != m_interfaces.end (); 
4372
d99061f1167c Ipv4::ifIndex -> Ipv4::interface
Tom Henderson <tomh@tomh.org>
parents: 4284
diff changeset
   325
       i++, interface++)
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   326
    {
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   327
      for (uint32_t j = 0; j < (*i)->GetNAddresses (); j++)
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   328
        {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   329
          if ((*i)->GetAddress (j).GetLocal ().CombineMask (mask) == address.CombineMask (mask))
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   330
            {
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   331
              return interface;
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   332
            }
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   333
        }
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   334
    }
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   335
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   336
  return -1;
1440
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   337
}
c77745b2731c add ipv4 methods, remove source multicast route requirement, fix udp socket source address prob
Craig Dowell <craigdo@ee.washington.edu>
parents: 1435
diff changeset
   338
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   339
int32_t 
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   340
Ipv4L3Protocol::GetInterfaceForDevice (
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   341
  Ptr<const NetDevice> device) const
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   342
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   343
  NS_LOG_FUNCTION (this << device->GetIfIndex());
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   344
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   345
  int32_t interface = 0;
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   346
  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   347
       i != m_interfaces.end (); 
4372
d99061f1167c Ipv4::ifIndex -> Ipv4::interface
Tom Henderson <tomh@tomh.org>
parents: 4284
diff changeset
   348
       i++, interface++)
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   349
    {
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   350
      if ((*i)->GetDevice () == device)
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   351
        {
4372
d99061f1167c Ipv4::ifIndex -> Ipv4::interface
Tom Henderson <tomh@tomh.org>
parents: 4284
diff changeset
   352
          return interface;
2711
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   353
        }
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   354
    }
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   355
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   356
  return -1;
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   357
}
83addb15f632 ip helper and find ip interface for device method on ipv4
Craig Dowell <craigdo@ee.washington.edu>
parents: 2602
diff changeset
   358
5760
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   359
bool
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   360
Ipv4L3Protocol::IsDestinationAddress (Ipv4Address address, uint32_t iif) const
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   361
{
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   362
  NS_LOG_FUNCTION (this << address << " " << iif);
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   363
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   364
  // First check the incoming interface for a unicast address match
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   365
  for (uint32_t i = 0; i < GetNAddresses (iif); i++)
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   366
    {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   367
      Ipv4InterfaceAddress iaddr = GetAddress (iif, i);
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   368
      if (address == iaddr.GetLocal ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   369
        {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   370
          NS_LOG_LOGIC ("For me (destination " << address << " match)");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   371
          return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   372
        }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   373
      if (address == iaddr.GetBroadcast ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   374
        {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   375
          NS_LOG_LOGIC ("For me (interface broadcast address)");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   376
          return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   377
        }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   378
    }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   379
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   380
  if (address.IsMulticast ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   381
    {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   382
#ifdef NOTYET
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   383
      if (MulticastCheckGroup (iif, address ))
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   384
#endif
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   385
      if (true)
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   386
        {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   387
          NS_LOG_LOGIC ("For me (Ipv4Addr multicast address");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   388
          return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   389
        }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   390
    }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   391
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   392
  if (address.IsBroadcast ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   393
    {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   394
      NS_LOG_LOGIC ("For me (Ipv4Addr broadcast address)");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   395
      return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   396
    }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   397
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   398
  if (GetWeakEsModel ())  // Check other interfaces
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   399
    { 
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   400
      for (uint32_t j = 0; j < GetNInterfaces (); j++)
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   401
        {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   402
          if (j == uint32_t (iif)) continue;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   403
          for (uint32_t i = 0; i < GetNAddresses (j); i++)
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   404
            {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   405
              Ipv4InterfaceAddress iaddr = GetAddress (j, i);
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   406
              if (address == iaddr.GetLocal ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   407
                {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   408
                  NS_LOG_LOGIC ("For me (destination " << address << " match) on another interface");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   409
                  return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   410
                }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   411
              //  This is a small corner case:  match another interface's broadcast address
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   412
              if (address == iaddr.GetBroadcast ())
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   413
                {
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   414
                  NS_LOG_LOGIC ("For me (interface broadcast address on another interface)");
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   415
                  return true;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   416
                }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   417
            }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   418
        }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   419
    }
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   420
  return false;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   421
}
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
   422
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   423
void 
3548
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3461
diff changeset
   424
Ipv4L3Protocol::Receive( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from,
3448
0bd851bb1225 Simplify promiscuous mode API: NetDevices always operate in promiscuous mode, normal receive callbacks receive extra destination address and packet type.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 3260
diff changeset
   425
                         const Address &to, NetDevice::PacketType packetType)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   426
{
3548
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3461
diff changeset
   427
  NS_LOG_FUNCTION (this << &device << p << protocol <<  from);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   428
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   429
  NS_LOG_LOGIC ("Packet from " << from << " received on node " << 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   430
    m_node->GetId ());
1443
580ed7a4dd1e Move MakeMulticastAddress to NetDevice
Craig Dowell <craigdo@ee.washington.edu>
parents: 1442
diff changeset
   431
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   432
  uint32_t interface = 0;
3548
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3461
diff changeset
   433
  Ptr<Packet> packet = p->Copy ();
e5ab96db540e bug 273: constify packet pointers.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3461
diff changeset
   434
1524
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1504
diff changeset
   435
  Ptr<Ipv4Interface> ipv4Interface;
1432
3aef7d7a71c2 more multicast plumbing
Craig Dowell <craigdo@ee.washington.edu>
parents: 1430
diff changeset
   436
  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
3aef7d7a71c2 more multicast plumbing
Craig Dowell <craigdo@ee.washington.edu>
parents: 1430
diff changeset
   437
       i != m_interfaces.end (); 
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   438
       i++, interface++)
457
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   439
    {
1524
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1504
diff changeset
   440
      ipv4Interface = *i;
3ead2b66f2e4 Fix a regression in handling of broadcast packets and UDP sockets (closes bug #51).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1504
diff changeset
   441
      if (ipv4Interface->GetDevice () == device)
457
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   442
        {
3958
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   443
          if (ipv4Interface->IsUp ())
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   444
            {
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   445
              m_rxTrace (packet, m_node->GetObject<Ipv4> (), interface);
3958
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   446
              break;
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   447
            }
3958
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   448
          else
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   449
            {
6030
7b67e0413b57 linearize mixins and make internet stack helper work correctly
Craig Dowell <craigdo@ee.washington.edu>
parents: 6015
diff changeset
   450
              NS_LOG_LOGIC ("Dropping received packet -- interface is down");
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   451
              Ipv4Header ipHeader;
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   452
              packet->RemoveHeader (ipHeader);
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   453
              m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv4> (), interface);
3958
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   454
              return;
7658bcc28d8d Drop packets in Ipv4L3Protocol::Receive if interface is down
Tom Henderson <tomh@tomh.org>
parents: 3956
diff changeset
   455
            }
457
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   456
        }
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   457
    }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   458
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   459
  Ipv4Header ipHeader;
4558
31e9053749bb bug 491: It is painful to enable all checksums
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4502
diff changeset
   460
  if (Node::ChecksumEnabled ())
3235
c2f34dac1b9e add support for attribtues to bug 34
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3216
diff changeset
   461
    {
c2f34dac1b9e add support for attribtues to bug 34
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3216
diff changeset
   462
      ipHeader.EnableChecksum ();
c2f34dac1b9e add support for attribtues to bug 34
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3216
diff changeset
   463
    }
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   464
  packet->RemoveHeader (ipHeader);
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   465
5977
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   466
  // Trim any residual frame padding from underlying devices
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   467
  if (ipHeader.GetPayloadSize () < packet->GetSize ())
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   468
    {
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   469
      packet->RemoveAtEnd (packet->GetSize () - ipHeader.GetPayloadSize ());
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   470
    }
288416b082a4 [bug 806] Remove CSMA padding from IP datagrams
Bill Roome <wdr@bell-labs.com>
parents: 5916
diff changeset
   471
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   472
  if (!ipHeader.IsChecksumOk ()) 
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   473
    {
6030
7b67e0413b57 linearize mixins and make internet stack helper work correctly
Craig Dowell <craigdo@ee.washington.edu>
parents: 6015
diff changeset
   474
      NS_LOG_LOGIC ("Dropping received packet -- checksum not ok");
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   475
      m_dropTrace (ipHeader, packet, DROP_BAD_CHECKSUM, m_node->GetObject<Ipv4> (), interface);
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   476
      return;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   477
    }
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   478
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   479
  for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   480
    {
5529
58b1b656d536 Default TTL of IPv4 broadcast datagrams changed from 1 to 64
Pavel Boyko <boyko@iitp.ru>
parents: 5487
diff changeset
   481
      NS_LOG_LOGIC ("Forwarding to raw socket"); 
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   482
      Ptr<Ipv4RawSocketImpl> socket = *i;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   483
      socket->ForwardUp (packet, ipHeader, device);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   484
    }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   485
5984
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   486
  NS_ASSERT_MSG (m_routingProtocol != 0, "Need a routing protocol object to process packets");
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   487
  m_routingProtocol->RouteInput (packet, ipHeader, device, 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   488
    MakeCallback (&Ipv4L3Protocol::IpForward, this),
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   489
    MakeCallback (&Ipv4L3Protocol::IpMulticastForward, this),
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   490
    MakeCallback (&Ipv4L3Protocol::LocalDeliver, this),
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
   491
    MakeCallback (&Ipv4L3Protocol::RouteInputError, this)
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   492
  );
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   493
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   494
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   495
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   496
Ptr<Icmpv4L4Protocol> 
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   497
Ipv4L3Protocol::GetIcmp (void) const
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   498
{
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   499
  Ptr<Ipv4L4Protocol> prot = GetProtocol (Icmpv4L4Protocol::GetStaticProtocolNumber ());
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   500
  if (prot != 0)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   501
    {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   502
      return prot->GetObject<Icmpv4L4Protocol> ();
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   503
    }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   504
  else
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   505
    {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   506
      return 0;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   507
    }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   508
}
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   509
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   510
bool
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   511
Ipv4L3Protocol::IsUnicast (Ipv4Address ad, Ipv4Mask interfaceMask) const
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   512
{
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   513
  return !ad.IsMulticast () && !ad.IsSubnetDirectedBroadcast (interfaceMask);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   514
}
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   515
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   516
void 
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   517
Ipv4L3Protocol::Send (Ptr<Packet> packet, 
457
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   518
            Ipv4Address source, 
a468fac09924 add context information to tx and rx trace callbacks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   519
            Ipv4Address destination,
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   520
            uint8_t protocol,
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   521
            Ptr<Ipv4Route> route)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   522
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   523
  NS_LOG_FUNCTION (this << packet << source << destination << uint32_t(protocol) << route);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   524
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   525
  Ipv4Header ipHeader;
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   526
  bool mayFragment = true;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   527
  uint8_t ttl = m_defaultTtl;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   528
  SocketIpTtlTag tag;
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4481
diff changeset
   529
  bool found = packet->RemovePacketTag (tag);
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   530
  if (found)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   531
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   532
      ttl = tag.GetTtl ();
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   533
    }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   534
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   535
  // Handle a few cases:
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   536
  // 1) packet is destined to limited broadcast address
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   537
  // 2) packet is destined to a subnet-directed broadcast address
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   538
  // 3) packet is not broadcast, and is passed in with a route entry
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   539
  // 4) packet is not broadcast, and is passed in with a route entry but route->GetGateway is not set (e.g., on-demand)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   540
  // 5) packet is not broadcast, and route is NULL (e.g., a raw socket call, or ICMP)
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   541
  
6181
05727a89b220 bug 857 - Link-Local Multicast handle in Ipv4 Output processing
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6047
diff changeset
   542
  // 1) packet is destined to limited broadcast address or link-local multicast address
05727a89b220 bug 857 - Link-Local Multicast handle in Ipv4 Output processing
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6047
diff changeset
   543
  if (destination.IsBroadcast () || destination.IsLocalMulticast ())
3124
473e59b5e141 Implement IPTTL socket option for UDP
Tom Henderson <tomh@tomh.org>
parents: 2989
diff changeset
   544
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   545
      NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 1:  limited broadcast");
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   546
      ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   547
      uint32_t ifaceIndex = 0;
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   548
      for (Ipv4InterfaceList::iterator ifaceIter = m_interfaces.begin ();
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   549
           ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++)
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   550
        {
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   551
          Ptr<Ipv4Interface> outInterface = *ifaceIter;
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   552
          Ptr<Packet> packetCopy = packet->Copy ();
1308
5c5937a4150d backout 9856d1175cbb:642d6798feaa:27dd3e15308a
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1303
diff changeset
   553
4572
e5dcdf2868df Remove Ipv4Interface::GetMtu ()
Tom Henderson <tomh@tomh.org>
parents: 4571
diff changeset
   554
          NS_ASSERT (packetCopy->GetSize () <= outInterface->GetDevice()->GetMtu ());
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   555
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   556
          m_sendOutgoingTrace (ipHeader, packetCopy, ifaceIndex);
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   557
          packetCopy->AddHeader (ipHeader);
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   558
          m_txTrace (packetCopy, m_node->GetObject<Ipv4> (), ifaceIndex);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   559
          outInterface->Send (packetCopy, destination);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   560
        }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   561
      return;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   562
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   563
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   564
  // 2) check: packet is destined to a subnet-directed broadcast address
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   565
  uint32_t ifaceIndex = 0;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   566
  for (Ipv4InterfaceList::iterator ifaceIter = m_interfaces.begin ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   567
    ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   568
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   569
      Ptr<Ipv4Interface> outInterface = *ifaceIter;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   570
      for (uint32_t j = 0; j < GetNAddresses (ifaceIndex); j++)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   571
        {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   572
          Ipv4InterfaceAddress ifAddr = GetAddress (ifaceIndex, j);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   573
          NS_LOG_LOGIC ("Testing address " << ifAddr.GetLocal () << " with mask " << ifAddr.GetMask ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   574
          if (destination.IsSubnetDirectedBroadcast (ifAddr.GetMask ()) && 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   575
              destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ())   )  
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   576
            {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   577
              NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 2:  subnet directed bcast to " << ifAddr.GetLocal ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   578
              ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   579
              Ptr<Packet> packetCopy = packet->Copy ();
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   580
              m_sendOutgoingTrace (ipHeader, packetCopy, ifaceIndex);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   581
              packetCopy->AddHeader (ipHeader);
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   582
              m_txTrace (packetCopy, m_node->GetObject<Ipv4> (), ifaceIndex);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   583
              outInterface->Send (packetCopy, destination);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   584
              return;
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   585
            }
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   586
        }
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   587
    }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   588
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   589
  // 3) packet is not broadcast, and is passed in with a route entry
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   590
  //    with a valid Ipv4Address as the gateway
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   591
  if (route && route->GetGateway () != Ipv4Address ())
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   592
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   593
      NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 3:  passed in with route");
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   594
      ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   595
      int32_t interface = GetInterfaceForDevice (route->GetOutputDevice ());
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   596
      m_sendOutgoingTrace (ipHeader, packet, interface);
6182
9e060dd421fa bug 868 - invalid packet size after Ipv4L3Protocol::Send
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6181
diff changeset
   597
      SendRealOut (route, packet->Copy (), ipHeader);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   598
      return; 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   599
    } 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   600
  // 4) packet is not broadcast, and is passed in with a route entry but route->GetGateway is not set (e.g., on-demand)
6232
cdf770714461 (bug 867) Minor bug in Ipv4L3Protocol::Send()
Danqi Wang <beyondwdq@gmail.com>
parents: 6182
diff changeset
   601
  if (route && route->GetGateway () == Ipv4Address ())
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   602
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   603
      // This could arise because the synchronous RouteOutput() call
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   604
      // returned to the transport protocol with a source address but
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   605
      // there was no next hop available yet (since a route may need
4571
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   606
      // to be queried).  
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   607
      NS_FATAL_ERROR ("This case not yet implemented");
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   608
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   609
  // 5) packet is not broadcast, and route is NULL (e.g., a raw socket call)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   610
  NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 4:  passed in with no route " << destination);
4567
32ca321e4fe7 Bug 597: Ns-3 doesn't compile under MingWin
Faker Moatamri <faker.moatamri@sophia.inria.fr>
parents: 4565
diff changeset
   611
  Socket::SocketErrno errno_; 
5856
7fd20c798a7d bug 742: Implementation of SO_BINDTODEVICE
Antti M?kel? <zarhan@cc.hut.fi>
parents: 5850
diff changeset
   612
  Ptr<NetDevice> oif (0); // unused for now
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   613
  ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
5984
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   614
  Ptr<Ipv4Route> newRoute;
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   615
  if (m_routingProtocol != 0)
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   616
    {
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   617
      newRoute = m_routingProtocol->RouteOutput (packet, ipHeader, oif, errno_);
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   618
    }
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   619
  else
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   620
    {
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   621
      NS_LOG_ERROR ("Ipv4L3Protocol::Send: m_routingProtocol == 0");
7a60b058e7b4 [bug 804] null pointer references in internet-stack
Bill Roome <wdr@bell-labs.com>
parents: 5977
diff changeset
   622
    }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   623
  if (newRoute)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   624
    {
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   625
      int32_t interface = GetInterfaceForDevice (newRoute->GetOutputDevice ());
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   626
      m_sendOutgoingTrace (ipHeader, packet, interface);
6182
9e060dd421fa bug 868 - invalid packet size after Ipv4L3Protocol::Send
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents: 6181
diff changeset
   627
      SendRealOut (newRoute, packet->Copy (), ipHeader);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   628
    }
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   629
  else
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   630
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   631
      NS_LOG_WARN ("No route to host.  Drop.");
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   632
      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv4> (), 0);
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   633
    }
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   634
}
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   635
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   636
// XXX when should we set ip_id?   check whether we are incrementing
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   637
// m_identification on packets that may later be dropped in this stack
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   638
// and whether that deviates from Linux
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   639
Ipv4Header
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   640
Ipv4L3Protocol::BuildHeader (
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   641
            Ipv4Address source, 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   642
            Ipv4Address destination,
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   643
            uint8_t protocol,
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   644
            uint16_t payloadSize,
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   645
            uint8_t ttl,
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   646
            bool mayFragment)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   647
{
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   648
  NS_LOG_FUNCTION_NOARGS ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   649
  Ipv4Header ipHeader;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   650
  ipHeader.SetSource (source);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   651
  ipHeader.SetDestination (destination);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   652
  ipHeader.SetProtocol (protocol);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   653
  ipHeader.SetPayloadSize (payloadSize);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   654
  ipHeader.SetTtl (ttl);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   655
  if (mayFragment == true)
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   656
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   657
      ipHeader.SetMayFragment ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   658
      ipHeader.SetIdentification (m_identification);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   659
      m_identification ++;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   660
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   661
  else
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   662
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   663
      ipHeader.SetDontFragment ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   664
      // TBD:  set to zero here; will cause traces to change
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   665
      ipHeader.SetIdentification (m_identification);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   666
      m_identification ++;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   667
    }
4558
31e9053749bb bug 491: It is painful to enable all checksums
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4502
diff changeset
   668
  if (Node::ChecksumEnabled ())
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   669
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   670
      ipHeader.EnableChecksum ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   671
    }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   672
  return ipHeader;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   673
}
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   674
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   675
void
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   676
Ipv4L3Protocol::SendRealOut (Ptr<Ipv4Route> route,
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1524
diff changeset
   677
                             Ptr<Packet> packet,
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   678
                             Ipv4Header const &ipHeader)
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   679
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   680
  NS_LOG_FUNCTION (this << packet << &ipHeader);
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   681
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   682
  if (route == 0)
983
47c42bd66fb7 Support dynamic routing and multiple routing protocols; static routing table is refactored as a "routing protocol".
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 979
diff changeset
   683
    {
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1451
diff changeset
   684
      NS_LOG_WARN ("No route to host.  Drop.");
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   685
      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, m_node->GetObject<Ipv4> (), 0);
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   686
      return;
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   687
    }
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   688
  packet->AddHeader (ipHeader);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   689
  Ptr<NetDevice> outDev = route->GetOutputDevice ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   690
  int32_t interface = GetInterfaceForDevice (outDev);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   691
  NS_ASSERT (interface >= 0);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   692
  Ptr<Ipv4Interface> outInterface = GetInterface (interface);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   693
  NS_LOG_LOGIC ("Send via NetDevice ifIndex " << outDev->GetIfIndex () << " ipv4InterfaceIndex " << interface);
1430
25fa26a6533e many debug prints
Craig Dowell <craigdo@ee.washington.edu>
parents: 1429
diff changeset
   694
4572
e5dcdf2868df Remove Ipv4Interface::GetMtu ()
Tom Henderson <tomh@tomh.org>
parents: 4571
diff changeset
   695
  NS_ASSERT (packet->GetSize () <= outInterface->GetDevice ()->GetMtu ());
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   696
  if (!route->GetGateway ().IsEqual (Ipv4Address ("0.0.0.0"))) 
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   697
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   698
      if (outInterface->IsUp ())
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   699
        {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   700
          NS_LOG_LOGIC ("Send to gateway " << route->GetGateway ());
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   701
          m_txTrace (packet, m_node->GetObject<Ipv4> (), interface);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   702
          outInterface->Send (packet, route->GetGateway ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   703
        }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   704
      else
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   705
        {
6030
7b67e0413b57 linearize mixins and make internet stack helper work correctly
Craig Dowell <craigdo@ee.washington.edu>
parents: 6015
diff changeset
   706
          NS_LOG_LOGIC ("Dropping -- outgoing interface is down: " << route->GetGateway ());
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   707
          Ipv4Header ipHeader;
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   708
          packet->RemoveHeader (ipHeader);
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   709
          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv4> (), interface);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   710
        }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   711
    } 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   712
  else 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   713
    {
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   714
      if (outInterface->IsUp ())
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   715
        {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   716
          NS_LOG_LOGIC ("Send to destination " << ipHeader.GetDestination ());
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   717
          m_txTrace (packet, m_node->GetObject<Ipv4> (), interface);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   718
          outInterface->Send (packet, ipHeader.GetDestination ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   719
        }
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   720
      else
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   721
        {
6030
7b67e0413b57 linearize mixins and make internet stack helper work correctly
Craig Dowell <craigdo@ee.washington.edu>
parents: 6015
diff changeset
   722
          NS_LOG_LOGIC ("Dropping -- outgoing interface is down: " << ipHeader.GetDestination ());
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   723
          Ipv4Header ipHeader;
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   724
          packet->RemoveHeader (ipHeader);
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   725
          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv4> (), interface);
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   726
        }
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   727
    }
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   728
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   729
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   730
// This function analogous to Linux ip_mr_forward()
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   731
void
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   732
Ipv4L3Protocol::IpMulticastForward (Ptr<Ipv4MulticastRoute> mrtentry, Ptr<const Packet> p, const Ipv4Header &header)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   733
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   734
  NS_LOG_FUNCTION (mrtentry << p << header);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   735
  NS_LOG_LOGIC ("Multicast forwarding logic for node: " << m_node->GetId ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   736
  // The output interfaces we could forward this onto are encoded
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   737
  // in the OutputTtl of the Ipv4MulticastRoute
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   738
  for (uint32_t i = 0; i < Ipv4MulticastRoute::MAX_INTERFACES; i++)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   739
    {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   740
      if (mrtentry->GetOutputTtl (i) < Ipv4MulticastRoute::MAX_TTL)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   741
        {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   742
          Ptr<Packet> packet = p->Copy ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   743
          Ipv4Header h = header;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   744
          h.SetTtl (header.GetTtl () - 1);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   745
          if (h.GetTtl () == 0)
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   746
            {
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   747
              NS_LOG_WARN ("TTL exceeded.  Drop.");
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   748
              m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv4> (), i);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   749
              return;
4375
db81fdcb06e7 Implementation cut over to use Ipv4InterfaceAddress
Tom Henderson <tomh@tomh.org>
parents: 4373
diff changeset
   750
            }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   751
          NS_LOG_LOGIC ("Forward multicast via interface " << i);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   752
          Ptr<Ipv4Route> rtentry = Create<Ipv4Route> ();
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   753
          rtentry->SetSource (h.GetSource ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   754
          rtentry->SetDestination (h.GetDestination ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   755
          rtentry->SetGateway (Ipv4Address::GetAny ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   756
          rtentry->SetOutputDevice (GetNetDevice (i));
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   757
          SendRealOut (rtentry, packet, h);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   758
          return; 
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   759
        }
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   760
    }
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   761
}
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   762
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   763
// This function analogous to Linux ip_forward()
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   764
void
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   765
Ipv4L3Protocol::IpForward (Ptr<Ipv4Route> rtentry, Ptr<const Packet> p, const Ipv4Header &header)
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   766
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   767
  NS_LOG_FUNCTION (rtentry << p << header);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   768
  NS_LOG_LOGIC ("Forwarding logic for node: " << m_node->GetId ());
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   769
  // Forwarding
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   770
  Ipv4Header ipHeader = header;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   771
  Ptr<Packet> packet = p->Copy ();
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   772
  int32_t interface = GetInterfaceForDevice (rtentry->GetOutputDevice ());
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   773
  ipHeader.SetTtl (ipHeader.GetTtl () - 1);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   774
  if (ipHeader.GetTtl () == 0)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   775
    {
4571
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   776
      // Do not reply to ICMP or to multicast/broadcast IP address 
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   777
      if (ipHeader.GetProtocol () != Icmpv4L4Protocol::PROT_NUMBER && 
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   778
        ipHeader.GetDestination ().IsBroadcast () == false && 
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   779
        ipHeader.GetDestination ().IsMulticast () == false)
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   780
        {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   781
          Ptr<Icmpv4L4Protocol> icmp = GetIcmp ();
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   782
          icmp->SendTimeExceededTtl (ipHeader, packet);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   783
        }
3956
0339a8ad5983 Bug 400: allow /32 addresses to be used on IPv4 interfaces
Tom Henderson <tomh@tomh.org>
parents: 3877
diff changeset
   784
      NS_LOG_WARN ("TTL exceeded.  Drop.");
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
   785
      m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv4> (), interface);
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   786
      return;
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   787
    }
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   788
  m_unicastForwardTrace (ipHeader, packet, interface);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   789
  SendRealOut (rtentry, packet, ipHeader);
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   790
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   791
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   792
void
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   793
Ipv4L3Protocol::LocalDeliver (Ptr<const Packet> packet, Ipv4Header const&ip, uint32_t iif)
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   794
{
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   795
  NS_LOG_FUNCTION (this << packet << &ip);
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   796
  Ptr<Packet> p = packet->Copy (); // need to pass a non-const packet up
1504
36ecc970ba96 checkpoint debug to log
Craig Dowell <craigdo@ee.washington.edu>
parents: 1451
diff changeset
   797
5204
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   798
  m_localDeliverTrace (ip, packet, iif);
cb3087d8f330 Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4669
diff changeset
   799
3588
ad0a36bfdb62 bug 282: remove Ipv4L4Demux
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3548
diff changeset
   800
  Ptr<Ipv4L4Protocol> protocol = GetProtocol (ip.GetProtocol ());
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   801
  if (protocol != 0)
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   802
    {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   803
      // we need to make a copy in the unlikely event we hit the
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   804
      // RX_ENDPOINT_UNREACH codepath
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   805
      Ptr<Packet> copy = p->Copy ();
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   806
      enum Ipv4L4Protocol::RxStatus status = 
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   807
        protocol->Receive (p, ip.GetSource (), ip.GetDestination (), GetInterface (iif));
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   808
      switch (status) {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   809
      case Ipv4L4Protocol::RX_OK:
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   810
        // fall through
5380
3a8177ed2dda Fix for bug 615
Josh Pelkey <jpelkey@gatech.edu>
parents: 5374
diff changeset
   811
      case Ipv4L4Protocol::RX_ENDPOINT_CLOSED:
3a8177ed2dda Fix for bug 615
Josh Pelkey <jpelkey@gatech.edu>
parents: 5374
diff changeset
   812
        // fall through
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   813
      case Ipv4L4Protocol::RX_CSUM_FAILED:
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   814
        break;
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   815
      case Ipv4L4Protocol::RX_ENDPOINT_UNREACH:
4571
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   816
        if (ip.GetDestination ().IsBroadcast () == true || 
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   817
          ip.GetDestination ().IsMulticast () == true)
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   818
          {
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   819
            break;  // Do not reply to broadcast or multicast
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   820
          }
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   821
        // Another case to suppress ICMP is a subnet-directed broadcast
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   822
        bool subnetDirected = false;
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   823
        for (uint32_t i = 0; i < GetNAddresses (iif); i++)
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   824
          {
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   825
            Ipv4InterfaceAddress addr = GetAddress (iif, i);
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   826
            if (addr.GetLocal ().CombineMask (addr.GetMask ()) == ip.GetDestination().CombineMask (addr.GetMask ()) &&
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   827
              ip.GetDestination ().IsSubnetDirectedBroadcast (addr.GetMask ()))
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   828
              {
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   829
                subnetDirected = true;
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   830
              }
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   831
          }
2c9c600270e0 cleanup ip alias unfinished cases (bug 591)
Tom Henderson <tomh@tomh.org>
parents: 4567
diff changeset
   832
        if (subnetDirected == false)
3820
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   833
          {
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   834
            GetIcmp ()->SendDestUnreachPort (ip, copy);
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   835
          }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   836
      }
c04ecfdce1ef apply icmp patch
Craig Dowell <craigdo@ee.washington.edu>
parents: 3744
diff changeset
   837
    }
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   838
}
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   839
4563
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   840
bool
4373
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   841
Ipv4L3Protocol::AddAddress (uint32_t i, Ipv4InterfaceAddress address)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   842
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   843
  NS_LOG_FUNCTION (this << i << address);
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   844
  Ptr<Ipv4Interface> interface = GetInterface (i);
4563
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   845
  bool retVal = interface->AddAddress (address);
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   846
  if (m_routingProtocol != 0)
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   847
    {
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   848
      m_routingProtocol->NotifyAddAddress (i, address);
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   849
    }
4563
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   850
  return retVal;
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   851
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   852
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   853
Ipv4InterfaceAddress 
4373
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   854
Ipv4L3Protocol::GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   855
{
4373
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   856
  NS_LOG_FUNCTION (this << interfaceIndex << addressIndex);
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   857
  Ptr<Ipv4Interface> interface = GetInterface (interfaceIndex);
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   858
  return interface->GetAddress (addressIndex);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   859
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   860
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
   861
uint32_t 
4373
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   862
Ipv4L3Protocol::GetNAddresses (uint32_t interface) const
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   863
{
4373
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   864
  NS_LOG_FUNCTION (this << interface);
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   865
  Ptr<Ipv4Interface> iface = GetInterface (interface);
e493e80274bd implementation and plumbing of Ipv4InterfaceAddress class
Tom Henderson <tomh@tomh.org>
parents: 4372
diff changeset
   866
  return iface->GetNAddresses ();
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   867
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   868
4563
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   869
bool
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   870
Ipv4L3Protocol::RemoveAddress (uint32_t i, uint32_t addressIndex)
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   871
{
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   872
  NS_LOG_FUNCTION (this << i << addressIndex);
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   873
  Ptr<Ipv4Interface> interface = GetInterface (i);
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   874
  Ipv4InterfaceAddress address = interface->RemoveAddress (addressIndex);
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   875
  if (address != Ipv4InterfaceAddress ())
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   876
    {
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   877
      if (m_routingProtocol != 0)
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   878
        {
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   879
          m_routingProtocol->NotifyRemoveAddress (i, address);
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   880
        }
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   881
      return true;
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   882
    }
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   883
  return false;
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   884
}
55948d1baa64 fix for bug 588
Tom Henderson <tomh@tomh.org>
parents: 4561
diff changeset
   885
5850
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   886
Ipv4Address 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   887
Ipv4L3Protocol::SelectSourceAddress (Ptr<const NetDevice> device,
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   888
    Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   889
{
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   890
  NS_LOG_FUNCTION (device << dst << scope);
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   891
  Ipv4Address addr ("0.0.0.0");
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   892
  Ipv4InterfaceAddress iaddr; 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   893
  bool found = false;
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   894
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   895
  if (device != 0)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   896
    {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   897
      int32_t i = GetInterfaceForDevice (device);
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   898
      NS_ASSERT_MSG (i >= 0, "No device found on node");
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   899
      for (uint32_t j = 0; j < GetNAddresses (i); j++)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   900
        {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   901
          iaddr = GetAddress (i, j);
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   902
          if (iaddr.IsSecondary ()) continue;
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   903
          if (iaddr.GetScope () > scope) continue; 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   904
          if (dst.CombineMask (iaddr.GetMask ())  == iaddr.GetLocal ().CombineMask (iaddr.GetMask ()) )  
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   905
            {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   906
              return iaddr.GetLocal ();
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   907
            }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   908
          if (!found)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   909
            {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   910
              addr = iaddr.GetLocal ();
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   911
              found = true;
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   912
            }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   913
        }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   914
    }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   915
  if (found)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   916
    {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   917
      return addr;
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   918
    }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   919
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   920
  // Iterate among all interfaces
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   921
  for (uint32_t i = 0; i < GetNInterfaces (); i++)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   922
    {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   923
      for (uint32_t j = 0; j < GetNAddresses (i); j++)
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   924
        {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   925
          iaddr = GetAddress (i, j);
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   926
          if (iaddr.IsSecondary ()) continue;
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   927
          if (iaddr.GetScope () != Ipv4InterfaceAddress::LINK 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   928
              && iaddr.GetScope () <= scope) 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   929
            {
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   930
              return iaddr.GetLocal ();
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   931
            }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   932
        }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   933
    }
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   934
  NS_LOG_WARN ("Could not find source address for " << dst << " and scope " 
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   935
    << scope << ", returning 0");
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   936
  return addr;  
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   937
}
1a6375ac5431 Fix bug 606: Arp depends on IP routing system
Tom Henderson <tomh@tomh.org>
parents: 5760
diff changeset
   938
1776
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   939
void 
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   940
Ipv4L3Protocol::SetMetric (uint32_t i, uint16_t metric)
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   941
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   942
  NS_LOG_FUNCTION (i << metric);
1776
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   943
  Ptr<Ipv4Interface> interface = GetInterface (i);
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   944
  interface->SetMetric (metric);
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   945
}
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   946
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   947
uint16_t
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   948
Ipv4L3Protocol::GetMetric (uint32_t i) const
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   949
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   950
  NS_LOG_FUNCTION (i);
1776
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   951
  Ptr<Ipv4Interface> interface = GetInterface (i);
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   952
  return interface->GetMetric ();
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   953
}
0d5be0c3d229 Add support for non-unit-cost metrics for Ipv4Interfaces (for use in routing); add example script simple-alternate-routing.cc
Tom Henderson <tomh@tomh.org>
parents: 1524
diff changeset
   954
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   955
uint16_t 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   956
Ipv4L3Protocol::GetMtu (uint32_t i) const
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   957
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   958
  NS_LOG_FUNCTION (this << i);
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   959
  Ptr<Ipv4Interface> interface = GetInterface (i);
4572
e5dcdf2868df Remove Ipv4Interface::GetMtu ()
Tom Henderson <tomh@tomh.org>
parents: 4571
diff changeset
   960
  return interface->GetDevice ()->GetMtu ();
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   961
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   962
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   963
bool 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   964
Ipv4L3Protocol::IsUp (uint32_t i) const
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   965
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   966
  NS_LOG_FUNCTION (this << i);
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   967
  Ptr<Ipv4Interface> interface = GetInterface (i);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   968
  return interface->IsUp ();
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   969
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   970
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   971
void 
734
039fb338b6e9 Ipv4 -> Ipv4L3Protocol
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 733
diff changeset
   972
Ipv4L3Protocol::SetUp (uint32_t i)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   973
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   974
  NS_LOG_FUNCTION (this << i);
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   975
  Ptr<Ipv4Interface> interface = GetInterface (i);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   976
  interface->SetUp ();
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   977
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   978
  if (m_routingProtocol != 0)
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   979
    {
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   980
      m_routingProtocol->NotifyInterfaceUp (i);
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   981
    }
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   982
}
1429
31cb0668defd debug prints to make validation easier
Craig Dowell <craigdo@ee.washington.edu>
parents: 1428
diff changeset
   983
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   984
void 
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   985
Ipv4L3Protocol::SetDown (uint32_t ifaceIndex)
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   986
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2977
diff changeset
   987
  NS_LOG_FUNCTION (this << ifaceIndex);
1341
f685d4bf320f use the Object::GetTraceResolver tracing support rather than the old adhoc tracing code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1333
diff changeset
   988
  Ptr<Ipv4Interface> interface = GetInterface (ifaceIndex);
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   989
  interface->SetDown ();
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   990
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   991
  if (m_routingProtocol != 0)
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   992
    {
4560
2f106fd728ab Remove static routing dependencies in code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4558
diff changeset
   993
      m_routingProtocol->NotifyInterfaceDown (ifaceIndex);
979
cb805f7a2e8d Add patch 49 (add/remove network route when bringing interface up/down)
Tom Henderson <tomh@tomh.org>
parents: 734
diff changeset
   994
    }
444
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   995
}
1647ca57f19d remove ipv4 interface from public API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 345
diff changeset
   996
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
   997
bool 
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
   998
Ipv4L3Protocol::IsForwarding (uint32_t i) const
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
   999
{
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1000
  NS_LOG_FUNCTION (this << i);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1001
  Ptr<Ipv4Interface> interface = GetInterface (i);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1002
  NS_LOG_LOGIC ("Forwarding state: " << interface->IsForwarding ());
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1003
  return interface->IsForwarding ();
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1004
}
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1005
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1006
void 
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1007
Ipv4L3Protocol::SetForwarding (uint32_t i, bool val)
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1008
{
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1009
  NS_LOG_FUNCTION (this << i);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1010
  Ptr<Ipv4Interface> interface = GetInterface (i);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1011
  interface->SetForwarding (val);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1012
}
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1013
4377
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1014
Ptr<NetDevice>
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1015
Ipv4L3Protocol::GetNetDevice (uint32_t i)
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1016
{
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1017
  NS_LOG_FUNCTION (this << i);
4377
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1018
  return GetInterface (i)-> GetDevice ();
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1019
}
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1020
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1021
void 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1022
Ipv4L3Protocol::SetIpForward (bool forward) 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1023
{
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1024
  NS_LOG_FUNCTION (this << forward);
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1025
  m_ipForward = forward;
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1026
  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1027
    {
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1028
      (*i)->SetForwarding (forward);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1029
    }
4472
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1030
}
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1031
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1032
bool 
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1033
Ipv4L3Protocol::GetIpForward (void) const
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1034
{
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1035
  return m_ipForward;
e20a31541404 src/ and utils/ changes for IPv4 routing rework
Tom Henderson <tomh@tomh.org>
parents: 4379
diff changeset
  1036
}
4377
2a05a47dba22 Remove class Ipv4Impl
Tom Henderson <tomh@tomh.org>
parents: 4375
diff changeset
  1037
5760
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1038
void 
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1039
Ipv4L3Protocol::SetWeakEsModel (bool model)
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1040
{
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1041
  m_weakEsModel = model;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1042
}
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1043
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1044
bool 
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1045
Ipv4L3Protocol::GetWeakEsModel (void) const
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1046
{
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1047
  return m_weakEsModel;
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1048
}
4f08a0837018 Add new method for determining whether Ipv4 dest address is mine; add attribute to control RFC1122 behavior
Tom Henderson <tomh@tomh.org>
parents: 5738
diff changeset
  1049
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1050
void
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1051
Ipv4L3Protocol::RouteInputError (Ptr<const Packet> p, const Ipv4Header & ipHeader, Socket::SocketErrno sockErrno)
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1052
{
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1053
  NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1054
  NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno); 
6015
e9e4575cb6f3 clean up internet stack helper tracing
Craig Dowell <craigdo@ee.washington.edu>
parents: 5916
diff changeset
  1055
  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv4> (), 0);
4607
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1056
}
0e15594f67f3 bug 63: allow enabling or disabling ip forwarding on a per-interface basis
Tom Henderson <tomh@tomh.org>
parents: 4603
diff changeset
  1057
236
5673656dc2e7 a basic untested ipv4 implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1058
}//namespace ns3