From b5c4f68f973349fb816f3fec79d42e64a52e2ef2 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Fri, 19 Feb 2021 02:27:11 +0000 Subject: [PATCH] internet: avoid route duplication in Ipv[4,6]StaticRouting --- src/internet/model/ipv4-static-routing.cc | 29 +++++++++++++++++-- src/internet/model/ipv4-static-routing.h | 8 ++++++ src/internet/model/ipv6-static-routing.cc | 34 +++++++++++++++++++++-- src/internet/model/ipv6-static-routing.h | 8 ++++++ 4 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/internet/model/ipv4-static-routing.cc b/src/internet/model/ipv4-static-routing.cc index c6b06ebab..41144c40d 100644 --- a/src/internet/model/ipv4-static-routing.cc +++ b/src/internet/model/ipv4-static-routing.cc @@ -72,7 +72,10 @@ Ipv4StaticRouting::AddNetworkRouteTo (Ipv4Address network, networkMask, nextHop, interface); - m_networkRoutes.push_back (make_pair (route,metric)); + if (!LookupRoute (route, metric)) + { + m_networkRoutes.push_back (make_pair (route,metric)); + } } void @@ -86,7 +89,10 @@ Ipv4StaticRouting::AddNetworkRouteTo (Ipv4Address network, *route = Ipv4RoutingTableEntry::CreateNetworkRouteTo (network, networkMask, interface); - m_networkRoutes.push_back (make_pair (route,metric)); + if (!LookupRoute (route, metric)) + { + m_networkRoutes.push_back (make_pair (route,metric)); + } } void @@ -219,6 +225,25 @@ Ipv4StaticRouting::RemoveMulticastRoute (uint32_t index) } } +bool +Ipv4StaticRouting::LookupRoute (Ipv4RoutingTableEntry *route, uint32_t metric) +{ + for (NetworkRoutesI j = m_networkRoutes.begin (); j != m_networkRoutes.end (); j++) + { + Ipv4RoutingTableEntry* rtentry = j->first; + + if (rtentry->GetDest () == route->GetDest () && + rtentry->GetDestNetworkMask () == route->GetDestNetworkMask () && + rtentry->GetGateway () == route->GetGateway () && + rtentry->GetInterface () == route->GetInterface () && + j->second == metric) + { + return true; + } + } + return false; +} + Ptr Ipv4StaticRouting::LookupStatic (Ipv4Address dest, Ptr oif) { diff --git a/src/internet/model/ipv4-static-routing.h b/src/internet/model/ipv4-static-routing.h index eb2c940b4..472878a8c 100644 --- a/src/internet/model/ipv4-static-routing.h +++ b/src/internet/model/ipv4-static-routing.h @@ -376,6 +376,14 @@ private: /// Iterator for container for the multicast routes typedef std::list::iterator MulticastRoutesI; + /** + * \brief Checks if a route is already present in the forwarding table. + * \param route route + * \param metric metric of route + * \return true if the route/metric is already in the forwarding table + */ + bool LookupRoute (Ipv4RoutingTableEntry *route, uint32_t metric); + /** * \brief Lookup in the forwarding table for destination. * \param dest destination address diff --git a/src/internet/model/ipv6-static-routing.cc b/src/internet/model/ipv6-static-routing.cc index 2649741a0..3004162b7 100644 --- a/src/internet/model/ipv6-static-routing.cc +++ b/src/internet/model/ipv6-static-routing.cc @@ -151,7 +151,10 @@ void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix netwo NS_LOG_FUNCTION (this << network << networkPrefix << nextHop << interface << metric); Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry (); *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface); - m_networkRoutes.push_back (std::make_pair (route, metric)); + if (!LookupRoute (route, metric)) + { + m_networkRoutes.push_back (std::make_pair (route, metric)); + } } void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric) @@ -164,7 +167,10 @@ void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix netwo Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry (); *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface, prefixToUse); - m_networkRoutes.push_back (std::make_pair (route, metric)); + if (!LookupRoute (route, metric)) + { + m_networkRoutes.push_back (std::make_pair (route, metric)); + } } void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, uint32_t interface, uint32_t metric) @@ -172,7 +178,10 @@ void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix netwo NS_LOG_FUNCTION (this << network << networkPrefix << interface); Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry (); *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, interface); - m_networkRoutes.push_back (std::make_pair (route, metric)); + if (!LookupRoute (route, metric)) + { + m_networkRoutes.push_back (std::make_pair (route, metric)); + } } void Ipv6StaticRouting::SetDefaultRoute (Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric) @@ -281,6 +290,25 @@ bool Ipv6StaticRouting::HasNetworkDest (Ipv6Address network, uint32_t interfaceI return false; } +bool Ipv6StaticRouting::LookupRoute (Ipv6RoutingTableEntry *route, uint32_t metric) +{ + for (NetworkRoutesI j = m_networkRoutes.begin (); j != m_networkRoutes.end (); j++) + { + Ipv6RoutingTableEntry* rtentry = j->first; + + if (rtentry->GetDest () == route->GetDest () && + rtentry->GetDestNetworkPrefix () == route->GetDestNetworkPrefix () && + rtentry->GetGateway () == route->GetGateway () && + rtentry->GetInterface () == route->GetInterface () && + rtentry->GetPrefixToUse () == route->GetPrefixToUse () && + j->second == metric) + { + return true; + } + } + return false; +} + Ptr Ipv6StaticRouting::LookupStatic (Ipv6Address dst, Ptr interface) { NS_LOG_FUNCTION (this << dst << interface); diff --git a/src/internet/model/ipv6-static-routing.h b/src/internet/model/ipv6-static-routing.h index ee49e064d..3f341747f 100644 --- a/src/internet/model/ipv6-static-routing.h +++ b/src/internet/model/ipv6-static-routing.h @@ -264,6 +264,14 @@ private: /// Iterator for container for the multicast routes typedef std::list::iterator MulticastRoutesI; + /** + * \brief Checks if a route is already present in the forwarding table. + * \param route route + * \param metric metric of route + * \return true if the route/metric is already in the forwarding table + */ + bool LookupRoute (Ipv6RoutingTableEntry *route, uint32_t metric); + /** * \brief Lookup in the forwarding table for destination. * \param dest destination address