76 Ptr<VirtualNetDevice> m_n1Tap; |
76 Ptr<VirtualNetDevice> m_n1Tap; |
77 Ptr<VirtualNetDevice> m_n3Tap; |
77 Ptr<VirtualNetDevice> m_n3Tap; |
78 |
78 |
79 |
79 |
80 bool |
80 bool |
81 N0N1VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) |
81 N0VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) |
82 { |
82 { |
83 m_n3Socket->SendTo (packet, 0, InetSocketAddress (m_n3Address, 667)); |
83 m_n0Socket->SendTo (packet, 0, InetSocketAddress (m_n3Address, 667)); |
|
84 return true; |
|
85 } |
|
86 |
|
87 bool |
|
88 N1VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) |
|
89 { |
|
90 m_n1Socket->SendTo (packet, 0, InetSocketAddress (m_n3Address, 667)); |
84 return true; |
91 return true; |
85 } |
92 } |
86 |
93 |
87 bool |
94 bool |
88 N3VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) |
95 N3VirtualSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) |
89 { |
96 { |
90 |
|
91 if (m_rng.GetValue () < 0.25) |
97 if (m_rng.GetValue () < 0.25) |
92 { |
98 { |
93 m_n0Socket->SendTo (packet, 0, InetSocketAddress (m_n0Address, 667)); |
99 m_n3Socket->SendTo (packet, 0, InetSocketAddress (m_n0Address, 667)); |
94 } |
100 } |
95 else |
101 else |
96 { |
102 { |
97 m_n1Socket->SendTo (packet, 0, InetSocketAddress (m_n1Address, 667)); |
103 m_n3Socket->SendTo (packet, 0, InetSocketAddress (m_n1Address, 667)); |
98 } |
104 } |
99 return true; |
105 return true; |
100 } |
106 } |
101 |
107 |
102 void N3SocketRecv (Ptr<Socket> socket) |
108 void N3SocketRecv (Ptr<Socket> socket) |
142 m_n1Socket->SetRecvCallback (MakeCallback (&Tunnel::N1SocketRecv, this)); |
148 m_n1Socket->SetRecvCallback (MakeCallback (&Tunnel::N1SocketRecv, this)); |
143 |
149 |
144 // n0 tap device |
150 // n0 tap device |
145 m_n0Tap = CreateObject<VirtualNetDevice> (); |
151 m_n0Tap = CreateObject<VirtualNetDevice> (); |
146 m_n0Tap->SetAddress (Mac48Address ("11:00:01:02:03:01")); |
152 m_n0Tap->SetAddress (Mac48Address ("11:00:01:02:03:01")); |
147 m_n0Tap->SetSendCallback (MakeCallback (&Tunnel::N0N1VirtualSend, this)); |
153 m_n0Tap->SetSendCallback (MakeCallback (&Tunnel::N0VirtualSend, this)); |
148 n0->AddDevice (m_n0Tap); |
154 n0->AddDevice (m_n0Tap); |
149 Ptr<Ipv4> ipv4 = n0->GetObject<Ipv4> (); |
155 Ptr<Ipv4> ipv4 = n0->GetObject<Ipv4> (); |
150 uint32_t i = ipv4->AddInterface (m_n0Tap); |
156 uint32_t i = ipv4->AddInterface (m_n0Tap); |
151 ipv4->AddAddress (i, Ipv4InterfaceAddress (Ipv4Address ("11.0.0.1"), Ipv4Mask ("255.255.255.0"))); |
157 ipv4->AddAddress (i, Ipv4InterfaceAddress (Ipv4Address ("11.0.0.1"), Ipv4Mask ("255.255.255.0"))); |
152 ipv4->SetUp (i); |
158 ipv4->SetUp (i); |
153 |
159 |
154 // n1 tap device |
160 // n1 tap device |
155 m_n1Tap = CreateObject<VirtualNetDevice> (); |
161 m_n1Tap = CreateObject<VirtualNetDevice> (); |
156 m_n1Tap->SetAddress (Mac48Address ("11:00:01:02:03:02")); |
162 m_n1Tap->SetAddress (Mac48Address ("11:00:01:02:03:02")); |
157 m_n1Tap->SetSendCallback (MakeCallback (&Tunnel::N0N1VirtualSend, this)); |
163 m_n1Tap->SetSendCallback (MakeCallback (&Tunnel::N1VirtualSend, this)); |
158 n1->AddDevice (m_n1Tap); |
164 n1->AddDevice (m_n1Tap); |
159 ipv4 = n1->GetObject<Ipv4> (); |
165 ipv4 = n1->GetObject<Ipv4> (); |
160 i = ipv4->AddInterface (m_n1Tap); |
166 i = ipv4->AddInterface (m_n1Tap); |
161 ipv4->AddAddress (i, Ipv4InterfaceAddress (Ipv4Address ("11.0.0.1"), Ipv4Mask ("255.255.255.0"))); |
167 ipv4->AddAddress (i, Ipv4InterfaceAddress (Ipv4Address ("11.0.0.1"), Ipv4Mask ("255.255.255.0"))); |
162 ipv4->SetUp (i); |
168 ipv4->SetUp (i); |