|
2610 |
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) |
2610 |
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) |
2611 |
{ |
2611 |
{ |
2612 |
NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination () << " " << oif); |
2612 |
NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination () << " " << oif); |
2613 |
// TBD: oif is unused; can be used to restrict the outgoing interface |
|
|
2614 |
// of the found route if application bound to a source interface |
2615 |
Ptr<Ipv4Route> rtentry; |
2613 |
Ptr<Ipv4Route> rtentry; |
2616 |
RoutingTableEntry entry1, entry2; |
2614 |
RoutingTableEntry entry1, entry2; |
2617 |
if (Lookup (header.GetDestination (), entry1) != 0) |
2615 |
if (Lookup (header.GetDestination (), entry1) != 0) |
|
2621 |
{ |
2619 |
{ |
2622 |
NS_FATAL_ERROR ("FindSendEntry failure"); |
2620 |
NS_FATAL_ERROR ("FindSendEntry failure"); |
2623 |
} |
2621 |
} |
|
|
2622 |
uint32_t interfaceIdx = entry2.interface; |
2623 |
if (oif && m_ipv4->GetInterfaceForDevice (oif) != static_cast<int> (interfaceIdx)) |
2624 |
{ |
2625 |
// We do not attempt to perform a constrained routing search |
2626 |
// if the caller specifies the oif; we just enforce that |
2627 |
// that the found route matches the requested outbound interface |
2628 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2629 |
<< ": RouteOutput for dest=" << header.GetDestination () |
2630 |
<< " Route interface " << interfaceIdx |
2631 |
<< " does not match requested output interface " |
2632 |
<< m_ipv4->GetInterfaceForDevice (oif)); |
2633 |
sockerr = Socket::ERROR_NOROUTETOHOST; |
2634 |
return rtentry; |
2635 |
} |
2624 |
rtentry = Create<Ipv4Route> (); |
2636 |
rtentry = Create<Ipv4Route> (); |
2625 |
rtentry->SetDestination (header.GetDestination ()); |
2637 |
rtentry->SetDestination (header.GetDestination ()); |
2626 |
uint32_t interfaceIdx = entry2.interface; |
|
|
2627 |
// the source address is the interface address that matches |
2638 |
// the source address is the interface address that matches |
2628 |
// the destination address (when multiple are present on the |
2639 |
// the destination address (when multiple are present on the |
2629 |
// outgoing interface, one is selected via scoping rules) |
2640 |
// outgoing interface, one is selected via scoping rules) |