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 |