203 NS_LOG_FUNCTION (this << *p << dest); |
214 NS_LOG_FUNCTION (this << *p << dest); |
204 if (!IsUp ()) |
215 if (!IsUp ()) |
205 { |
216 { |
206 return; |
217 return; |
207 } |
218 } |
208 // Check for a loopback device |
219 |
|
220 // Check for a loopback device, if it's the case we don't pass through |
|
221 // traffic control layer |
209 if (DynamicCast<LoopbackNetDevice> (m_device)) |
222 if (DynamicCast<LoopbackNetDevice> (m_device)) |
210 { |
223 { |
211 /// \todo additional checks needed here (such as whether multicast |
224 /// \todo additional checks needed here (such as whether multicast |
212 /// goes to loopback)? |
225 /// goes to loopback)? |
213 m_device->Send (p, m_device->GetBroadcast (), |
226 m_device->Send (p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); |
214 Ipv4L3Protocol::PROT_NUMBER); |
|
215 return; |
227 return; |
216 } |
228 } |
|
229 |
|
230 NS_ASSERT (m_tc != 0); |
|
231 |
217 // is this packet aimed at a local interface ? |
232 // is this packet aimed at a local interface ? |
218 for (Ipv4InterfaceAddressListCI i = m_ifaddrs.begin (); i != m_ifaddrs.end (); ++i) |
233 for (Ipv4InterfaceAddressListCI i = m_ifaddrs.begin (); i != m_ifaddrs.end (); ++i) |
219 { |
234 { |
220 if (dest == (*i).GetLocal ()) |
235 if (dest == (*i).GetLocal ()) |
221 { |
236 { |
222 Ptr<Ipv4L3Protocol> ipv4 = m_node->GetObject<Ipv4L3Protocol> (); |
237 m_tc->Receive (m_device, p, Ipv4L3Protocol::PROT_NUMBER, |
223 |
|
224 ipv4->Receive (m_device, p, Ipv4L3Protocol::PROT_NUMBER, |
|
225 m_device->GetBroadcast (), |
238 m_device->GetBroadcast (), |
226 m_device->GetBroadcast (), |
239 m_device->GetBroadcast (), |
227 NetDevice::PACKET_HOST // note: linux uses PACKET_LOOPBACK here |
240 NetDevice::PACKET_HOST); |
228 ); |
|
229 return; |
241 return; |
230 } |
242 } |
231 } |
243 } |
232 if (m_device->NeedsArp ()) |
244 if (m_device->NeedsArp ()) |
233 { |
245 { |
271 } |
283 } |
272 |
284 |
273 if (found) |
285 if (found) |
274 { |
286 { |
275 NS_LOG_LOGIC ("Address Resolved. Send."); |
287 NS_LOG_LOGIC ("Address Resolved. Send."); |
276 m_device->Send (p, hardwareDestination, |
288 m_tc->Send (m_device, p, hardwareDestination, Ipv4L3Protocol::PROT_NUMBER); |
277 Ipv4L3Protocol::PROT_NUMBER); |
|
278 } |
289 } |
279 } |
290 } |
280 else |
291 else |
281 { |
292 { |
282 NS_LOG_LOGIC ("Doesn't need ARP"); |
293 NS_LOG_LOGIC ("Doesn't need ARP"); |
283 m_device->Send (p, m_device->GetBroadcast (), |
294 m_tc->Send (m_device, p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); |
284 Ipv4L3Protocol::PROT_NUMBER); |
|
285 } |
295 } |
286 } |
296 } |
287 |
297 |
288 uint32_t |
298 uint32_t |
289 Ipv4Interface::GetNAddresses (void) const |
299 Ipv4Interface::GetNAddresses (void) const |