Typically, multiple routing protocols are supported in user space and coordinate to write a single forwarding table in the kernel. Presently in ns-3, the implementation allows for multiple routing protocols to build/keep their own routing state, and the IPv4 implementation will query each one of these routing protocols (in some order determined by the simulation author) until a route is found. This may better faciliate the integration of disparate routing approaches that may be difficult to coordinate the writing to a single table, approaches where more information than destination IP address (e.g., source routing) is used to determine the next hop, and on-demand routing approaches where packets must be cached.
There are presently two routing protocols defined:
void Ipv4L3Protocol::Lookup ( uint32_t ifIndex, Ipv4Header const &ipHeader, Packet packet, Ipv4RoutingProtocol::RouteReplyCallback routeReply) { NS_LOG_FUNCTION; NS_LOG_PARAM ("(" << ifIndex << ", " << &ipHeader << ", " << &packet << &routeReply << ")"); for (Ipv4RoutingProtocolList::const_iterator rprotoIter = m_routingProtocols.begin (); rprotoIter != m_routingProtocols.end (); rprotoIter++) { NS_LOG_LOGIC ("Requesting route"); if ((*rprotoIter).second->RequestRoute (ifIndex, ipHeader, packet, routeReply)) return; } if (ipHeader.GetDestination ().IsMulticast () && ifIndex == Ipv4RoutingProtocol::IF_INDEX_ANY) { NS_LOG_LOGIC ("Multicast destination with local source"); Ipv4L3Protocol::Lookup (Ipv4Header const &ipHeader, Packet packet, pv4Route *route = m_staticRouting->GetDefaultRoute (); if (route) { NS_LOG_LOGIC ("Local source. Using unicast default route for " "multicast packet"); routeReply (true, *route, packet, ipHeader); return; } } // // No route found // routeReply (false, Ipv4Route (), packet, ipHeader); }