diff --git a/src/bgp/routing-instance/static_route.cc b/src/bgp/routing-instance/static_route.cc index cd5f2deccbe..064437de594 100644 --- a/src/bgp/routing-instance/static_route.cc +++ b/src/bgp/routing-instance/static_route.cc @@ -10,6 +10,7 @@ #include #include +#include "base/map_util.h" #include "base/task_annotations.h" #include "base/task_trigger.h" #include "bgp/bgp_config.h" @@ -797,42 +798,16 @@ bool CompareStaticRouteConfig(const StaticRouteConfig &lhs, template void StaticRouteMgr::UpdateStaticRouteConfig() { CHECK_CONCURRENCY("bgp::Config"); - typedef BgpInstanceConfig::StaticRouteList StaticRouteList; - StaticRouteList static_route_list = + StaticRouteConfigList config_list = routing_instance()->config()->static_routes(GetFamily()); + sort(config_list.begin(), config_list.end(), CompareStaticRouteConfig); - sort(static_route_list.begin(), static_route_list.end(), - CompareStaticRouteConfig); - - StaticRouteList::const_iterator static_route_cfg_it = - static_route_list.begin(); - typename StaticRouteMap::iterator oper_it = static_route_map_.begin(); - - while ((static_route_cfg_it != static_route_list.end()) && - (oper_it != static_route_map_.end())) { - AddressT address = this->GetAddress(static_route_cfg_it->address); - PrefixT static_route_prefix( - address, static_route_cfg_it->prefix_length); - if (static_route_prefix < oper_it->first) { - LocateStaticRoutePrefix(*static_route_cfg_it); - static_route_cfg_it++; - } else if (static_route_prefix > oper_it->first) { - RemoveStaticRoutePrefix(oper_it->first); - oper_it++; - } else { - LocateStaticRoutePrefix(*static_route_cfg_it); - static_route_cfg_it++; - oper_it++; - } - } - - for (; oper_it != static_route_map_.end(); oper_it++) { - RemoveStaticRoutePrefix(oper_it->first); - } - for (; static_route_cfg_it != static_route_list.end(); - static_route_cfg_it++) { - LocateStaticRoutePrefix(*static_route_cfg_it); - } + map_difference(&static_route_map_, + config_list.begin(), config_list.end(), + boost::bind(&StaticRouteMgr::CompareStaticRoute, this, _1, _2), + boost::bind(&StaticRouteMgr::AddStaticRoute, this, _1), + boost::bind(&StaticRouteMgr::DelStaticRoute, this, _1), + boost::bind(&StaticRouteMgr::UpdateStaticRoute, this, _1, _2)); } template @@ -844,6 +819,32 @@ void StaticRouteMgr::FlushStaticRouteConfig() { } } +template +int StaticRouteMgr::CompareStaticRoute( + typename StaticRouteMap::iterator loc, + StaticRouteConfigList::iterator it) { + AddressT address = this->GetAddress(it->address); + PrefixT prefix(address, it->prefix_length); + KEY_COMPARE(loc->first, prefix); + return 0; +} + +template +void StaticRouteMgr::AddStaticRoute(StaticRouteConfigList::iterator it) { + LocateStaticRoutePrefix(*it); +} + +template +void StaticRouteMgr::DelStaticRoute(typename StaticRouteMap::iterator loc) { + RemoveStaticRoutePrefix(loc->first); +} + +template +void StaticRouteMgr::UpdateStaticRoute(typename StaticRouteMap::iterator loc, + StaticRouteConfigList::iterator it) { + LocateStaticRoutePrefix(*it); +} + template void StaticRouteMgr::NotifyAllRoutes() { CHECK_CONCURRENCY("bgp::Config"); diff --git a/src/bgp/routing-instance/static_route.h b/src/bgp/routing-instance/static_route.h index f2619fe7b71..ff3ac4c6297 100644 --- a/src/bgp/routing-instance/static_route.h +++ b/src/bgp/routing-instance/static_route.h @@ -12,6 +12,7 @@ #include "base/queue_task.h" #include "bgp/bgp_condition_listener.h" +#include "bgp/bgp_config.h" #include "bgp/inet/inet_route.h" #include "bgp/inet6/inet6_route.h" @@ -95,11 +96,19 @@ class StaticRouteMgr : public IStaticRouteMgr { private: template friend class StaticRouteTest; + typedef BgpInstanceConfig::StaticRouteList StaticRouteConfigList; // All static route related actions are performed in the context // of this task. This task has exclusion with db::DBTable task. static int static_route_task_id_; + int CompareStaticRoute(typename StaticRouteMap::iterator loc, + StaticRouteConfigList::iterator it); + void AddStaticRoute(StaticRouteConfigList::iterator it); + void DelStaticRoute(typename StaticRouteMap::iterator loc); + void UpdateStaticRoute(typename StaticRouteMap::iterator loc, + StaticRouteConfigList::iterator it); + void LocateStaticRoutePrefix(const StaticRouteConfig &cfg); void RemoveStaticRoutePrefix(const PrefixT &static_route); void StopStaticRouteDone(BgpTable *table, ConditionMatch *info);