src/internet-node/internet-node.cc
changeset 1198 ac0801202d42
parent 1119 520de3dc31a9
parent 1194 b8e957eb0a94
child 1229 e4cfe4094c10
equal deleted inserted replaced
1157:972fca2f2b04 1198:ac0801202d42
    21 // Implementation of the InternetNode class for ns3.
    21 // Implementation of the InternetNode class for ns3.
    22 // George F. Riley, Georgia Tech, Fall 2006
    22 // George F. Riley, Georgia Tech, Fall 2006
    23 
    23 
    24 #include "ns3/composite-trace-resolver.h"
    24 #include "ns3/composite-trace-resolver.h"
    25 #include "ns3/net-device.h"
    25 #include "ns3/net-device.h"
       
    26 #include "ns3/callback.h"
    26 
    27 
    27 #include "l3-demux.h"
       
    28 #include "ipv4-l4-demux.h"
    28 #include "ipv4-l4-demux.h"
    29 #include "internet-node.h"
    29 #include "internet-node.h"
    30 #include "udp-l4-protocol.h"
    30 #include "udp-l4-protocol.h"
    31 #include "ipv4-l3-protocol.h"
    31 #include "ipv4-l3-protocol.h"
    32 #include "arp-l3-protocol.h"
    32 #include "arp-l3-protocol.h"
    33 #include "udp-impl.h"
    33 #include "udp-impl.h"
    34 #include "arp-private.h"
       
    35 #include "ipv4-impl.h"
    34 #include "ipv4-impl.h"
    36 #include "ipv4-private.h"
       
    37 
    35 
    38 namespace ns3 {
    36 namespace ns3 {
    39 
    37 
    40 InternetNode::InternetNode()
    38 InternetNode::InternetNode()
    41 {
    39 {
    53 void
    51 void
    54 InternetNode::Construct (void)
    52 InternetNode::Construct (void)
    55 {
    53 {
    56   Ptr<Ipv4L3Protocol> ipv4 = Create<Ipv4L3Protocol> (this);
    54   Ptr<Ipv4L3Protocol> ipv4 = Create<Ipv4L3Protocol> (this);
    57   Ptr<ArpL3Protocol> arp = Create<ArpL3Protocol> (this);
    55   Ptr<ArpL3Protocol> arp = Create<ArpL3Protocol> (this);
       
    56   // XXX remove the PeekPointer below.
       
    57   RegisterProtocolHandler (MakeCallback (&Ipv4L3Protocol::Receive, PeekPointer (ipv4)), 
       
    58                            Ipv4L3Protocol::PROT_NUMBER, 0);
       
    59   RegisterProtocolHandler (MakeCallback (&ArpL3Protocol::Receive, PeekPointer (arp)),
       
    60                            ArpL3Protocol::PROT_NUMBER, 0);
       
    61 
       
    62 
       
    63   Ptr<Ipv4L4Demux> ipv4L4Demux = Create<Ipv4L4Demux> (this);
    58   Ptr<UdpL4Protocol> udp = Create<UdpL4Protocol> (this);
    64   Ptr<UdpL4Protocol> udp = Create<UdpL4Protocol> (this);
    59 
       
    60   Ptr<L3Demux> l3Demux = Create<L3Demux> (this);
       
    61   Ptr<Ipv4L4Demux> ipv4L4Demux = Create<Ipv4L4Demux> (this);
       
    62 
       
    63   l3Demux->Insert (ipv4);
       
    64   l3Demux->Insert (arp);
       
    65   ipv4L4Demux->Insert (udp);
    65   ipv4L4Demux->Insert (udp);
    66 
    66 
    67   Ptr<UdpImpl> udpImpl = Create<UdpImpl> (udp);
    67   Ptr<UdpImpl> udpImpl = Create<UdpImpl> (udp);
    68   Ptr<ArpPrivate> arpPrivate = Create<ArpPrivate> (arp);
       
    69   Ptr<Ipv4Impl> ipv4Impl = Create<Ipv4Impl> (ipv4);
    68   Ptr<Ipv4Impl> ipv4Impl = Create<Ipv4Impl> (ipv4);
    70   Ptr<Ipv4Private> ipv4Private = Create<Ipv4Private> (ipv4);
       
    71 
    69 
    72   Object::AddInterface (ipv4Private);
    70   Object::AddInterface (ipv4);
       
    71   Object::AddInterface (arp);
    73   Object::AddInterface (ipv4Impl);
    72   Object::AddInterface (ipv4Impl);
    74   Object::AddInterface (arpPrivate);
       
    75   Object::AddInterface (udpImpl);
    73   Object::AddInterface (udpImpl);
    76   Object::AddInterface (l3Demux);
       
    77   Object::AddInterface (ipv4L4Demux);
    74   Object::AddInterface (ipv4L4Demux);
    78 }
    75 }
    79 
    76 
    80 TraceResolver *
    77 void
    81 InternetNode::DoCreateTraceResolver (TraceContext const &context)
    78 InternetNode::DoFillTraceResolver (CompositeTraceResolver &resolver)
    82 {
    79 {
    83   CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
    80   Node::DoFillTraceResolver (resolver);
    84   Ptr<Ipv4Private> ipv4 = QueryInterface<Ipv4Private> (Ipv4Private::iid);
    81   Ptr<Ipv4L3Protocol> ipv4 = QueryInterface<Ipv4L3Protocol> (Ipv4L3Protocol::iid);
    85   resolver->Add ("ipv4",
    82   resolver.Add ("ipv4",
    86                  MakeCallback (&Ipv4Private::CreateTraceResolver, PeekPointer (ipv4)),
    83                 MakeCallback (&Ipv4L3Protocol::CreateTraceResolver, PeekPointer (ipv4)),
    87                  InternetNode::IPV4);
    84                 InternetNode::IPV4);
    88 
       
    89   return resolver;
       
    90 }
    85 }
    91 
    86 
    92 void 
    87 void 
    93 InternetNode::DoDispose()
    88 InternetNode::DoDispose()
    94 {
    89 {
    95   Node::DoDispose ();
    90   Node::DoDispose ();
    96 }
    91 }
    97 
    92 
    98 void 
       
    99 InternetNode::DoAddDevice (Ptr<NetDevice> device)
       
   100 {
       
   101   device->SetReceiveCallback (MakeCallback (&InternetNode::ReceiveFromDevice, this));
       
   102 }
       
   103 
       
   104 bool
       
   105 InternetNode::ReceiveFromDevice (Ptr<NetDevice> device, const Packet &p, uint16_t protocolNumber) const
       
   106 {
       
   107   Ptr<L3Demux> demux = QueryInterface<L3Demux> (L3Demux::iid);
       
   108   Ptr<L3Protocol> target = demux->GetProtocol (protocolNumber);
       
   109   if (target != 0) 
       
   110     {
       
   111       Packet packet = p;
       
   112       target->Receive(packet, device);
       
   113       return true;
       
   114     }
       
   115   return false;
       
   116 }
       
   117 
       
   118 
       
   119 }//namespace ns3
    93 }//namespace ns3