OpenSDN source code
static_route.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_
6 #define SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_
7 
8 #include <map>
9 #include <set>
10 #include <mutex>
11 
13 
14 #include "base/queue_task.h"
16 #include "bgp/bgp_config.h"
17 #include "bgp/inet/inet_route.h"
18 #include "bgp/inet6/inet6_route.h"
19 
20 class InetVpnRoute;
21 class Inet6VpnRoute;
22 class StaticRouteConfig;
23 
24 template <typename T> class StaticRoute;
25 
26 template <typename T1, typename T2, typename T3, typename T4>
28  typedef T1 RouteT;
29  typedef T2 VpnRouteT;
30  typedef T3 PrefixT;
31  typedef T4 AddressT;
32 };
33 
35  InetRoute, InetVpnRoute, Ip4Prefix, Ip4Address> {
36 };
37 
39  Inet6Route, Inet6VpnRoute, Inet6Prefix, Ip6Address> {
40 };
41 
43 
45  enum RequestType {
48  };
49 
51  StaticRoutePtr info)
52  : type_(type), table_(table), rt_(route), info_(info) {
53  }
54 
59 
60 private:
62 };
63 
64 template <typename T>
66 public:
67  typedef typename T::RouteT RouteT;
68  typedef typename T::VpnRouteT VpnRouteT;
69  typedef typename T::PrefixT PrefixT;
70  typedef typename T::AddressT AddressT;
72 
73  struct RouteKey {
76  }
77 
78  bool operator<(const RouteKey &rhs) const {
81  return false;
82  }
83 
86  };
87 
88  // Map of Static Route prefix to the StaticRoute match object
89  typedef std::map<RouteKey, StaticRoutePtr> StaticRouteMap;
90 
91  explicit StaticRouteMgr(RoutingInstance *instance);
93 
94  // Config
95  virtual void ProcessStaticRouteConfig();
96  virtual void UpdateStaticRouteConfig();
97  virtual void FlushStaticRouteConfig();
98 
101 
102  virtual void NotifyAllRoutes();
103  virtual void UpdateAllRoutes();
104  virtual uint32_t GetRouteCount() const;
105  virtual uint32_t GetDownRouteCount() const;
106  virtual bool FillStaticRouteInfo(RoutingInstance *rtinstance,
107  StaticRouteEntriesInfo *info) const;
108 
111 
112 private:
113  template <typename U> friend class StaticRouteTest;
114  typedef std::set<StaticRoutePtr> StaticRouteProcessList;
116 
117  // All static route related actions are performed in the context
118  // of this task. This task has exclusion with db::DBTable task.
120 
121  int CompareStaticRoute(typename StaticRouteMap::iterator loc,
122  StaticRouteConfigList::iterator it);
123  void AddStaticRoute(StaticRouteConfigList::iterator it);
124  void DelStaticRoute(typename StaticRouteMap::iterator loc);
125  void UpdateStaticRoute(typename StaticRouteMap::iterator loc,
126  StaticRouteConfigList::iterator it);
127 
128  void LocateStaticRoutePrefix(const StaticRouteConfig &config);
129  void RemoveStaticRoutePrefix(const RouteKey &static_route);
130  void StopStaticRouteDone(BgpTable *table, ConditionMatch *info);
133 
134  bool ProcessUnregisterList();
135 
136  virtual void DisableUnregisterTrigger();
137  virtual void EnableUnregisterTrigger();
138 
139  virtual void DisableQueue() { static_route_queue_->set_disable(true); }
140  virtual void EnableQueue() { static_route_queue_->set_disable(false); }
141  virtual bool IsQueueEmpty() { return static_route_queue_->IsQueueEmpty(); }
143 
148  std::mutex mutex_;
150  boost::scoped_ptr<TaskTrigger> unregister_list_trigger_;
151 
153 };
154 
157 
158 #endif // SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::intrusive_ptr< ConditionMatch > ConditionMatchPtr
Family
Definition: address.h:24
std::set< StaticRouteConfig > StaticRouteList
Definition: bgp_config.h:425
void StopStaticRouteDone(BgpTable *table, ConditionMatch *info)
const StaticRouteMap & static_route_map() const
Definition: static_route.h:100
virtual uint32_t GetRouteCount() const
int CompareStaticRoute(typename StaticRouteMap::iterator loc, StaticRouteConfigList::iterator it)
virtual void UpdateStaticRouteConfig()
virtual void DisableUnregisterTrigger()
virtual bool IsQueueEmpty()
Definition: static_route.h:141
virtual void ProcessStaticRouteConfig()
virtual bool FillStaticRouteInfo(RoutingInstance *rtinstance, StaticRouteEntriesInfo *info) const
Address::Family GetFamily() const
void EnqueueStaticRouteReq(StaticRouteRequest *req)
BgpConditionListener * listener_
Definition: static_route.h:145
BgpInstanceConfig::StaticRouteList StaticRouteConfigList
Definition: static_route.h:115
StaticRouteProcessList unregister_static_route_list_
Definition: static_route.h:149
virtual uint32_t GetDownRouteCount() const
friend class StaticRouteTest
Definition: static_route.h:113
T::RouteT RouteT
Definition: static_route.h:67
virtual void EnableUnregisterTrigger()
T::AddressT AddressT
Definition: static_route.h:70
virtual void FlushStaticRouteConfig()
std::map< RouteKey, StaticRoutePtr > StaticRouteMap
Definition: static_route.h:89
void DelStaticRoute(typename StaticRouteMap::iterator loc)
RoutingInstance * rtinstance_
Definition: static_route.h:144
void LocateStaticRoutePrefix(const StaticRouteConfig &config)
bool ProcessUnregisterList()
DISALLOW_COPY_AND_ASSIGN(StaticRouteMgr)
AddressT GetAddress(IpAddress addr) const
virtual void UpdateAllRoutes()
void AddStaticRoute(StaticRouteConfigList::iterator it)
StaticRouteMap static_route_map_
Definition: static_route.h:146
virtual void NotifyAllRoutes()
StaticRouteMgr(RoutingInstance *instance)
void UpdateStaticRoute(typename StaticRouteMap::iterator loc, StaticRouteConfigList::iterator it)
std::mutex mutex_
Definition: static_route.h:148
std::set< StaticRoutePtr > StaticRouteProcessList
Definition: static_route.h:114
void RemoveStaticRoutePrefix(const RouteKey &static_route)
boost::scoped_ptr< TaskTrigger > unregister_list_trigger_
Definition: static_route.h:150
T::VpnRouteT VpnRouteT
Definition: static_route.h:68
T::PrefixT PrefixT
Definition: static_route.h:69
virtual void EnableQueue()
Definition: static_route.h:140
RoutingInstance * routing_instance()
Definition: static_route.h:142
bool StaticRouteEventCallback(StaticRouteRequest *req)
WorkQueue< StaticRouteRequest * > * static_route_queue_
Definition: static_route.h:147
StaticRoute< T > StaticRouteT
Definition: static_route.h:71
static int static_route_task_id_
Definition: static_route.h:119
virtual void DisableQueue()
Definition: static_route.h:139
void UnregisterAndResolveStaticRoute(StaticRoutePtr entry)
void set_disable(bool disabled)
Definition: queue_task.h:319
bool IsQueueEmpty() const
Definition: queue_task.h:352
uint8_t type
Definition: load_balance.h:2
StaticRouteMgr< StaticRouteInet6 > StaticRouteMgrInet6
Definition: static_route.h:156
StaticRouteMgr< StaticRouteInet > StaticRouteMgrInet
Definition: static_route.h:155
ConditionMatchPtr StaticRoutePtr
Definition: static_route.h:42
RouteKey(const PrefixT &prefix, const IpAddress &nexthop)
Definition: static_route.h:74
bool operator<(const RouteKey &rhs) const
Definition: static_route.h:78
BgpTable * table_
Definition: static_route.h:56
StaticRouteRequest(RequestType type, BgpTable *table, BgpRoute *route, StaticRoutePtr info)
Definition: static_route.h:50
StaticRoutePtr info_
Definition: static_route.h:58
DISALLOW_COPY_AND_ASSIGN(StaticRouteRequest)
RequestType type_
Definition: static_route.h:55
#define BOOL_KEY_COMPARE(x, y)
Definition: util.h:64