5 #ifndef SRC_BGP_ROUTING_INSTANCE_SERVICE_CHAINING_H_
6 #define SRC_BGP_ROUTING_INSTANCE_SERVICE_CHAINING_H_
8 #include <boost/ptr_container/ptr_map.hpp>
9 #include <boost/shared_ptr.hpp>
10 #include <tbb/mutex.h>
36 class ShowServicechainInfo;
40 template <
typename T1,
typename T2,
typename T3,
typename T4>
49 InetRoute, InetVpnRoute, Ip4Prefix, Ip4Address> {
53 Inet6Route, Inet6VpnRoute, Inet6Prefix, Ip6Address> {
57 EvpnRoute, InetVpnRoute, EvpnPrefix, Ip4Address> {
61 EvpnRoute, Inet6VpnRoute, EvpnPrefix, Ip6Address> {
122 template <
typename T>
146 const std::vector<std::string> &subnets,
AddressT addr,
bool head,
194 virtual std::string
ToString()
const;
258 bool aggregate,
BgpTable *bgptable);
264 BgpTable *bgptable,
bool aggregate);
318 template <
typename T>
344 bool group_oper_state_up);
352 std::string *reason = NULL)
const;
360 ShowServicechainInfo *info)
const;
391 typedef boost::ptr_map<std::string, ServiceChainGroup>
GroupMap;
413 typename PendingChainList::const_iterator loc =
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
boost::intrusive_ptr< ConditionMatch > ConditionMatchPtr
bool oper_state_up() const
std::set< RoutingInstance * > ServiceChainSet
ServiceChainGroup(IServiceChainMgr *manager, const std::string &name)
void DeleteRoutingInstance(RoutingInstance *rtinstance)
void AddRoutingInstance(RoutingInstance *rtinstance)
ServiceChainSet chain_set_
IServiceChainMgr * manager_
virtual bool IsQueueEmpty() const
PendingChainList pending_chains_
void UpdateServiceChainGroup(ServiceChainGroup *group)
virtual BgpConditionListener * GetListener()
void UpdateServiceChainRoutes(ServiceChainT *chain, const typename ServiceChainT::ConnectedPathIdList &old_path_ids)
boost::scoped_ptr< TaskTrigger > resolve_trigger_
void DeleteServiceChainRoutes(ServiceChainT *chain)
boost::scoped_ptr< DeleteActor > deleter_
bool aggregate_host_route() const
ServiceChainGroup * LocateServiceChainGroup(const std::string &group_name)
Address::Family GetConnectedFamily() const
std::map< RoutingInstance *, ServiceChainPtr > ServiceChainMap
SCAddress::Family GetSCFamily() const
PendingChainState GetPendingServiceChain(RoutingInstance *rtinstance)
virtual void set_aggregate_host_route(bool value)
virtual uint32_t GetDownServiceChainCount() const
std::set< ServiceChainGroup * > GroupSet
virtual void StopServiceChain(RoutingInstance *rtinstance)
bool ProcessServiceChainGroups()
virtual void DisableGroupTrigger()
ServiceChainT * FindServiceChain(const std::string &instance) const
friend class ServiceChainTest
virtual void EnableGroupTrigger()
virtual void EnableResolveTrigger()
virtual bool LocateServiceChain(RoutingInstance *rtinstance, const ServiceChainConfig &config)
std::map< RoutingInstance *, PendingChainState > PendingChainList
boost::ptr_map< std::string, ServiceChainGroup > GroupMap
ServiceChainRequest< T > ServiceChainRequestT
ServiceChainGroup * FindServiceChainGroup(const std::string &group_name)
LifetimeRef< ServiceChainMgr > server_delete_ref_
virtual ~ServiceChainMgr()
bool aggregate_host_route_
ServiceChainGroup * FindServiceChainGroup(RoutingInstance *rtinstance)
void StopServiceChainDone(BgpTable *table, ConditionMatch *info)
ServiceChainMgr(BgpServer *server)
ServiceChain< T > ServiceChainT
static int service_chain_task_id_
BgpConditionListener * listener_
DISALLOW_COPY_AND_ASSIGN(ServiceChainMgr)
virtual size_t ResolvedQueueSize() const
bool ResolvePendingServiceChain()
friend class ServiceChainIntegrationTest
void RoutingInstanceCallback(std::string name, int op)
virtual void DisableQueue()
void Enqueue(ServiceChainRequestT *req)
ServiceChainMap chain_set_
virtual void EnableQueue()
void AddPendingServiceChain(RoutingInstance *rtinstance, ServiceChainGroup *group, std::string reason)
bool RequestHandler(ServiceChainRequestT *req)
virtual void DisableResolveTrigger()
virtual size_t PendingQueueSize() const
void PeerRegistrationCallback(IPeer *peer, BgpTable *table, bool unregister)
virtual void UpdateServiceChain(RoutingInstance *rtinstance, bool group_oper_state_up)
void DeletePendingServiceChain(RoutingInstance *rtinstance)
boost::scoped_ptr< TaskTrigger > group_trigger_
virtual bool FillServiceChainInfo(RoutingInstance *rtinstance, ShowServicechainInfo *info) const
boost::scoped_ptr< WorkQueue< ServiceChainRequestT * > > process_queue_
virtual bool ServiceChainIsPending(RoutingInstance *rtinstance, std::string *reason=NULL) const
virtual bool ServiceChainIsUp(RoutingInstance *rtinstance) const
Address::Family GetFamily() const
SandeshResponse * snh_resp_
ServiceChainRequest(RequestType type, BgpTable *table, BgpRoute *route, PrefixT aggregate_match, ServiceChainPtr info)
DISALLOW_COPY_AND_ASSIGN(ServiceChainRequest)
@ CONNECTED_ROUTE_ADD_CHG
@ EXT_CONNECT_ROUTE_ADD_CHG
@ EXT_CONNECT_ROUTE_DELETE
ServiceChainRequest(RequestType type, SandeshResponse *resp)
ServiceChainState(ServiceChainPtr info)
DISALLOW_COPY_AND_ASSIGN(ServiceChainState)
bool group_oper_state_up() const
const ConnectedPathIdList & GetConnectedPathIds()
SCAddress::Family GetSCFamily() const
AddressT service_chain_addr_
bool dest_table_unregistered() const
bool dest_table_unregistered_
bool IsEvpnType5Route(BgpRoute *route) const
bool aggregate_enable() const
virtual std::string ToString() const
void set_dest_table_unregistered()
PrefixToRouteListMap * prefix_to_route_list_map()
std::set< uint32_t > ConnectedPathIdList
bool AddMoreSpecific(PrefixT aggregate, BgpRoute *more_specific)
ServiceChainMgrT * manager_
bool CompareServiceChainConfig(const ServiceChainConfig &config)
RoutingInstance * connected_routing_instance() const
void DeleteServiceChainRouteInternal(BgpRoute *service_chain_route, DBTablePartition *partition, BgpTable *bgptable, bool aggregate)
BgpRoute * connected_route_
void UpdateServiceChainRouteInternal(const RouteT *orig_route, const ConnectedPathIdList &old_path_ids, BgpRoute *sc_route, DBTablePartition *partition, BgpTable *bgptable, bool aggregate)
BgpRoute * connected_route() const
void RemoveMatchState(BgpRoute *route, ServiceChainState *state)
DISALLOW_COPY_AND_ASSIGN(ServiceChain)
void UpdateServiceChainRoute(PrefixT prefix, const RouteT *orig_route, const ConnectedPathIdList &old_path_ids, bool aggregate)
ServiceChainMgr< T > ServiceChainMgrT
PrefixToRouteListMap prefix_to_routelist_map_
bool connected_table_unregistered_
bool unregistered() const
LifetimeRef< ServiceChain > dest_table_delete_ref_
ServiceChainGroup * group_
virtual bool Match(BgpServer *server, BgpTable *table, BgpRoute *route, bool deleted)
std::map< PrefixT, RouteList > PrefixToRouteListMap
void SetConnectedRoute(BgpRoute *connected)
void FillServiceChainInfo(ShowServicechainInfo *info) const
ServiceChainRequest< T > ServiceChainRequestT
bool DeleteMoreSpecific(PrefixT aggregate, BgpRoute *more_specific)
const ExtConnectRouteList & ext_connecting_routes() const
void ProcessServiceChainPath(uint32_t path_id, BgpPath *path, BgpAttrPtr attr, BgpRoute *&route, DBTablePartition *&partition, bool aggregate, BgpTable *bgptable)
BgpTable * dest_table() const
void set_group_oper_state_up(bool up)
void GetReplicationFamilyInfo(DBTablePartition *&partition, BgpRoute *&route, BgpTable *&table, PrefixT prefix, bool create)
LifetimeRef< ServiceChain > src_table_delete_ref_
bool retain_as_path() const
BgpTable * connected_table() const
ConnectedPathIdList connected_path_ids_
bool IsConnectedRoute(BgpRoute *route, bool is_conn_table=false) const
RoutingInstance * connected_
bool group_oper_state_up_
bool IsMoreSpecific(BgpRoute *route, PrefixT *aggregate_match) const
RoutingInstance * src_routing_instance() const
void set_connected_table_unregistered()
BgpTable * src_table() const
const PrefixToRouteListMap * prefix_to_route_list_map() const
ExtConnectRouteList ext_connect_routes_
LifetimeRef< ServiceChain > connected_table_delete_ref_
bool IsConnectedRouteValid() const
std::set< BgpRoute * > ExtConnectRouteList
ExtConnectRouteList * ext_connecting_routes()
std::set< BgpRoute * > RouteList
ServiceChain(ServiceChainMgrT *manager, ServiceChainGroup *group, RoutingInstance *src, RoutingInstance *dest, RoutingInstance *connected, const std::vector< std::string > &subnets, AddressT addr, bool head, bool retain_as_path)
Address::Family GetConnectedFamily() const
bool IsAggregate(BgpRoute *route) const
RoutingInstance * dest_routing_instance() const
ServiceChainGroup * group() const
Address::Family GetFamily() const
bool connected_table_unregistered() const
void DeleteServiceChainRoute(PrefixT prefix, bool aggregate)
void set_aggregate_enable()
const AddressT & service_chain_addr() const
ServiceChainMgr< ServiceChainInet > ServiceChainMgrInet
ServiceChainMgr< ServiceChainEvpn6 > ServiceChainMgrEvpn6
ServiceChainMgr< ServiceChainEvpn > ServiceChainMgrEvpn
ServiceChainMgr< ServiceChainInet6 > ServiceChainMgrInet6
ConditionMatchPtr ServiceChainPtr
PendingChainState(ServiceChainGroup *group, std::string reason)
ServiceChainGroup * group