/
static_route.h
92 lines (70 loc) · 2.62 KB
/
static_route.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/
#ifndef SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_
#define SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_
#include <map>
#include <set>
#include "bgp/bgp_condition_listener.h"
#include "bgp/inet/inet_route.h"
class StaticRoute;
class StaticRouteConfig;
typedef ConditionMatchPtr StaticRoutePtr;
struct StaticRouteRequest {
enum RequestType {
NEXTHOP_ADD_CHG,
NEXTHOP_DELETE,
DELETE_STATIC_ROUTE_DONE
};
StaticRouteRequest(RequestType type, BgpTable *table, BgpRoute *route,
StaticRoutePtr info)
: type_(type), table_(table), rt_(route), info_(info) {
}
RequestType type_;
BgpTable *table_;
BgpRoute *rt_;
StaticRoutePtr info_;
private:
DISALLOW_COPY_AND_ASSIGN(StaticRouteRequest);
};
class StaticRouteMgr {
public:
// Map of Static Route prefix to the StaticRoute match object
typedef std::map<Ip4Prefix, StaticRoutePtr> StaticRouteMap;
explicit StaticRouteMgr(RoutingInstance *instance);
~StaticRouteMgr();
// Config
void ProcessStaticRouteConfig();
void UpdateStaticRouteConfig();
void FlushStaticRouteConfig();
void LocateStaticRoutePrefix(const StaticRouteConfig &cfg);
void RemoveStaticRoutePrefix(const Ip4Prefix &static_route);
void StopStaticRouteDone(BgpTable *table, ConditionMatch *info);
// Work Queue
static int static_route_task_id_;
void EnqueueStaticRouteReq(StaticRouteRequest *req);
bool StaticRouteEventCallback(StaticRouteRequest *req);
bool ResolvePendingStaticRouteConfig();
void NotifyAllRoutes();
uint32_t GetRouteCount() const;
uint32_t GetDownRouteCount() const;
RoutingInstance *routing_instance() { return instance_; }
const StaticRouteMap &static_route_map() const {
return static_route_map_;
}
private:
friend class StaticRouteTest;
RoutingInstance *instance_;
BgpConditionListener *listener_;
StaticRouteMap static_route_map_;
void DisableResolveTrigger() { resolve_trigger_->set_disable(); }
void EnableResolveTrigger() { resolve_trigger_->set_enable(); }
void DisableQueue() { static_route_queue_->set_disable(true); }
void EnableQueue() { static_route_queue_->set_disable(false); }
bool IsQueueEmpty() { return static_route_queue_->IsQueueEmpty(); }
WorkQueue<StaticRouteRequest *> *static_route_queue_;
// Task trigger to resolve any pending static route config commit
boost::scoped_ptr<TaskTrigger> resolve_trigger_;
DISALLOW_COPY_AND_ASSIGN(StaticRouteMgr);
};
#endif // SRC_BGP_ROUTING_INSTANCE_STATIC_ROUTE_H_