OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_table.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_BGP_TABLE_H_
6 #define SRC_BGP_BGP_TABLE_H_
7 
8 #include <tbb/atomic.h>
9 
10 #include <map>
11 #include <string>
12 #include <vector>
13 
14 #include "base/lifetime.h"
15 #include "bgp/bgp_rib_policy.h"
16 #include "db/db_table_walker.h"
17 #include "route/table.h"
18 #include "bgp/bgp_ribout.h"
19 
20 class BgpServer;
21 class BgpRoute;
22 class BgpPath;
23 class BgpUpdateSender;
24 class IPeer;
25 class Path;
26 class PathResolver;
27 class RibOut;
28 class RibPeerSet;
29 class Route;
30 class RoutingInstance;
31 class ShowRibOutStatistics;
32 class UpdateInfoSList;
33 struct UpdateInfo;
34 
35 class BgpTable : public RouteTable {
36 public:
37  typedef std::map<RibExportPolicy, RibOut *> RibOutMap;
38  typedef std::set<BgpTable *> TableSet;
39 
41  virtual const IPeer *GetPeer() const = 0;
42  };
43 
45  struct NextHop {
47  : flags_(0),
48  address_(Ip4Address(0)),
49  label_(0),
50  l3_label_(0) {
51  }
52  NextHop(uint32_t flags, IpAddress address, uint32_t label,
53  uint32_t l3_label = 0)
54  : flags_(flags),
55  address_(address),
56  label_(label),
57  l3_label_(l3_label) {
58  }
59 
60  uint32_t flags_;
62  uint32_t label_;
63  uint32_t l3_label_;
64  };
65 
66  RequestData(const BgpAttrPtr &attrs, uint32_t flags, uint32_t label,
67  uint32_t l3_label, uint64_t subscription_gen_id)
68  : attrs_(attrs),
69  nexthop_(flags, attrs ? attrs->nexthop() : Ip4Address(0),
70  label, l3_label),
71  subscription_gen_id_(subscription_gen_id) {
72  }
73 
74  RequestData(const BgpAttrPtr &attrs, uint32_t flags, uint32_t label,
75  uint32_t l3_label = 0)
76  : attrs_(attrs),
77  nexthop_(flags, attrs ? attrs->nexthop() : Ip4Address(0),
78  label, l3_label),
80  }
81 
82  const NextHop &nexthop() { return nexthop_; }
83  BgpAttrPtr &attrs() { return attrs_; }
87  }
88  uint64_t subscription_gen_id() const { return subscription_gen_id_; }
89 
90  private:
94  };
95 
96  BgpTable(DB *db, const std::string &name);
97  ~BgpTable();
98 
99  const RibOutMap &ribout_map() { return ribout_map_; }
100  RibOut *RibOutFind(const RibExportPolicy &policy);
102  const RibExportPolicy &policy);
103  void RibOutDelete(const RibExportPolicy &policy);
104 
105  virtual bool Export(RibOut *ribout, Route *route,
106  const RibPeerSet &peerset,
107  UpdateInfoSList &uinfo_slist) = 0;
108 
109  virtual Address::Family family() const = 0;
110  virtual bool IsVpnTable() const { return false; }
111  virtual bool IsRoutingPolicySupported() const { return false; }
112  virtual bool IsRouteAggregationSupported() const { return false; }
113  virtual std::unique_ptr<DBEntry> AllocEntryStr(
114  const std::string &key) const = 0;
115 
116  virtual BgpRoute *RouteReplicate(BgpServer *server, BgpTable *table,
117  BgpRoute *src, const BgpPath *path,
118  ExtCommunityPtr community) = 0;
119 
120  static bool PathSelection(const Path &path1, const Path &path2);
121  void CheckAggregatorAttr(BgpAttr *attr) const;
122  void CreateAsPath4Byte(BgpAttr *attr, as_t local_as) const;
123  void CreateAsPath2Byte(BgpAttr *attr) const;
124  void CreateAs4Path(BgpAttr *attr) const;
125  bool Has4ByteAsn(BgpAttr *attr) const;
126  void PrependAsToAsPath4Byte(BgpAttr *attr, as_t asn) const;
127  void PrependAsToAsPath2Byte(BgpAttr *attr, as_t asn) const;
128  void PrependAsToAsPath2Byte(BgpAttr *attr, as2_t asn) const;
129  void PrependAsToAs4Path(BgpAttr* attr, as_t asn) const;
130  UpdateInfo *GetUpdateInfo(RibOut *ribout, BgpRoute *route,
131  const RibPeerSet &peerset);
132  void ProcessDefaultTunnelEncapsulation(const RibOut *ribout,
133  ExtCommunityDB *extcomm_db, BgpAttr *attr) const;
134 
136  TableSet *secondary_tables) {
137  }
138 
139  void ManagedDelete();
140  virtual void RetryDelete();
141  void Shutdown();
142  virtual bool MayDelete() const;
143  bool IsDeleted() const { return deleter()->IsDeleted(); }
144  virtual PathResolver *CreatePathResolver();
145  void LocatePathResolver();
146  void DestroyPathResolver();
147 
149  const RoutingInstance *routing_instance() const { return rtinstance_; }
150  virtual void set_routing_instance(RoutingInstance *rtinstance);
151  BgpServer *server();
152  const BgpServer *server() const;
154  const PathResolver *path_resolver() const { return path_resolver_; }
155 
157  const LifetimeActor *deleter() const;
158  size_t GetPendingRiboutsCount(size_t *markers) const;
159 
160  void UpdatePathCount(const BgpPath *path, int count);
161  const uint64_t GetPrimaryPathCount() const { return primary_path_count_; }
162  const uint64_t GetSecondaryPathCount() const {
163  return secondary_path_count_;
164  }
165  const uint64_t GetInfeasiblePathCount() const {
166  return infeasible_path_count_;
167  }
168  const uint64_t GetStalePathCount() const { return stale_path_count_; }
169  const uint64_t GetLlgrStalePathCount() const {
170  return llgr_stale_path_count_;
171  }
172  void UpdateStalePathCount(int count) { stale_path_count_ += count; }
173  void UpdateLlgrStalePathCount(int count) {
174  llgr_stale_path_count_ += count;
175  }
176 
177  // Check whether the route is aggregate route
178  bool IsAggregateRoute(const BgpRoute *route) const;
179 
180  // Check whether the route is contributing route to aggregate route
181  bool IsContributingRoute(const BgpRoute *route) const;
182 
183  bool DeletePath(DBTablePartBase *root, BgpRoute *rt, BgpPath *path);
184  virtual void Input(DBTablePartition *root, DBClient *client,
185  DBRequest *req);
186  bool InputCommon(DBTablePartBase *root, BgpRoute *rt, BgpPath *path,
187  const IPeer *peer, DBRequest *req,
189  uint32_t path_id, uint32_t flags, uint32_t label,
190  uint32_t l3_label);
192  bool notify_rt);
193 
195  std::vector<ShowRibOutStatistics> *sros_list) const;
196 
198  const IPeer *peer) {
199  return attrp;
200  };
201 private:
202  friend class BgpTableTest;
203 
204  class DeleteActor;
205 
206  void PrependLocalAs(const RibOut *ribout, BgpAttr *attr, const IPeer*) const;
207  void ProcessAsOverride(const RibOut *ribout, BgpAttr *attr) const;
208  void ProcessRemovePrivate(const RibOut *ribout, BgpAttr *attr) const;
209  void RemovePrivateAs(const RibOut *ribout, BgpAttr *attr) const;
210  void RemovePrivate4ByteAs(const RibOut *ribout, BgpAttr *attr) const;
211  void RemovePrivateAs4(const RibOut *ribout, BgpAttr *attr) const;
212  void ProcessLlgrState(const RibOut *ribout, const BgpPath *path,
213  BgpAttr *attr, bool llgr_stale_comm);
214  virtual BgpRoute *TableFind(DBTablePartition *rtp,
215  const DBRequestKey *prefix) = 0;
216 
220 
221  boost::scoped_ptr<DeleteActor> deleter_;
223  tbb::atomic<uint64_t> primary_path_count_;
224  tbb::atomic<uint64_t> secondary_path_count_;
225  tbb::atomic<uint64_t> infeasible_path_count_;
226  tbb::atomic<uint64_t> stale_path_count_;
227  tbb::atomic<uint64_t> llgr_stale_path_count_;
228 
230 };
231 
232 #endif // SRC_BGP_BGP_TABLE_H_
void UpdatePathCount(const BgpPath *path, int count)
Definition: bgp_table.cc:1116
tbb::atomic< uint64_t > stale_path_count_
Definition: bgp_table.h:226
void PrependLocalAs(const RibOut *ribout, BgpAttr *attr, const IPeer *) const
Definition: bgp_table.cc:148
void RemovePrivate4ByteAs(const RibOut *ribout, BgpAttr *attr) const
Definition: bgp_table.cc:199
void set_subscription_gen_id(uint64_t subscription_gen_id)
Definition: bgp_table.h:85
void ProcessLlgrState(const RibOut *ribout, const BgpPath *path, BgpAttr *attr, bool llgr_stale_comm)
Definition: bgp_table.cc:306
void CheckAggregatorAttr(BgpAttr *attr) const
Definition: bgp_table.cc:132
void CreateAsPath2Byte(BgpAttr *attr) const
Definition: bgp_table.cc:462
void InputCommonPostProcess(DBTablePartBase *root, BgpRoute *rt, bool notify_rt)
Definition: bgp_table.cc:1006
UpdateInfo * GetUpdateInfo(RibOut *ribout, BgpRoute *route, const RibPeerSet &peerset)
Definition: bgp_table.cc:578
void CreateAs4Path(BgpAttr *attr) const
Definition: bgp_table.cc:428
virtual bool Export(RibOut *ribout, Route *route, const RibPeerSet &peerset, UpdateInfoSList &uinfo_slist)=0
virtual BgpRoute * RouteReplicate(BgpServer *server, BgpTable *table, BgpRoute *src, const BgpPath *path, ExtCommunityPtr community)=0
virtual void Input(DBTablePartition *root, DBClient *client, DBRequest *req)
Definition: bgp_table.cc:934
void PrependAsToAsPath2Byte(BgpAttr *attr, as_t asn) const
Definition: bgp_table.cc:382
RoutingInstance * rtinstance_
Definition: bgp_table.h:217
virtual bool IsVpnTable() const
Definition: bgp_table.h:110
RoutingInstance * routing_instance()
Definition: bgp_table.h:148
Family
Definition: address.h:24
virtual BgpRoute * TableFind(DBTablePartition *rtp, const DBRequestKey *prefix)=0
boost::asio::ip::address IpAddress
Definition: address.h:13
const uint64_t GetLlgrStalePathCount() const
Definition: bgp_table.h:169
void RemovePrivateAs(const RibOut *ribout, BgpAttr *attr) const
Definition: bgp_table.cc:167
Definition: route.h:14
void ProcessRemovePrivate(const RibOut *ribout, BgpAttr *attr) const
Definition: bgp_table.cc:244
void ProcessAsOverride(const RibOut *ribout, BgpAttr *attr) const
Definition: bgp_table.cc:261
void LocatePathResolver()
Definition: bgp_table.cc:1074
NextHop(uint32_t flags, IpAddress address, uint32_t label, uint32_t l3_label=0)
Definition: bgp_table.h:52
virtual PathResolver * CreatePathResolver()
Definition: bgp_table.cc:1070
void PrependAsToAs4Path(BgpAttr *attr, as_t asn) const
Definition: bgp_table.cc:413
const PathResolver * path_resolver() const
Definition: bgp_table.h:154
virtual Address::Family family() const =0
uint32_t as_t
Definition: bgp_common.h:21
Definition: ipeer.h:186
tbb::atomic< uint64_t > infeasible_path_count_
Definition: bgp_table.h:225
tbb::atomic< uint64_t > llgr_stale_path_count_
Definition: bgp_table.h:227
virtual const IPeer * GetPeer() const =0
const RoutingInstance * routing_instance() const
Definition: bgp_table.h:149
bool IsDeleted() const
Definition: bgp_table.h:143
Definition: db.h:24
BgpAttrPtr attrs_
Definition: bgp_table.h:91
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
RibOutMap ribout_map_
Definition: bgp_table.h:219
bool IsAggregateRoute(const BgpRoute *route) const
Definition: bgp_table.cc:1137
BgpTable(DB *db, const std::string &name)
Definition: bgp_table.cc:59
const RibOutMap & ribout_map()
Definition: bgp_table.h:99
friend class BgpTableTest
Definition: bgp_table.h:200
virtual bool IsRoutingPolicySupported() const
Definition: bgp_table.h:111
const uint64_t GetInfeasiblePathCount() const
Definition: bgp_table.h:165
virtual bool MayDelete() const
Definition: bgp_table.cc:1017
bool IsDeleted() const
Definition: lifetime.h:131
Definition: path.h:10
uint16_t as2_t
Definition: bgp_common.h:22
std::map< RibExportPolicy, RibOut * > RibOutMap
Definition: bgp_table.h:37
virtual void RetryDelete()
Definition: bgp_table.cc:1064
BgpAttrPtr & attrs()
Definition: bgp_table.h:83
boost::scoped_ptr< DeleteActor > deleter_
Definition: bgp_table.h:221
boost::intrusive_ptr< const ExtCommunity > ExtCommunityPtr
Definition: community.h:448
void ManagedDelete()
Definition: bgp_table.cc:1055
void RemovePrivateAs4(const RibOut *ribout, BgpAttr *attr) const
Definition: bgp_table.cc:220
std::set< BgpTable * > TableSet
Definition: bgp_table.h:38
void DestroyPathResolver()
Definition: bgp_table.cc:1081
virtual void UpdateSecondaryTablesForReplication(BgpRoute *rt, TableSet *secondary_tables)
Definition: bgp_table.h:135
RibOut * RibOutLocate(BgpUpdateSender *sender, const RibExportPolicy &policy)
Definition: bgp_table.cc:109
tbb::atomic< uint64_t > primary_path_count_
Definition: bgp_table.h:223
RibOut * RibOutFind(const RibExportPolicy &policy)
Definition: bgp_table.cc:99
void UpdateStalePathCount(int count)
Definition: bgp_table.h:172
LifetimeRef< BgpTable > instance_delete_ref_
Definition: bgp_table.h:222
virtual bool IsRouteAggregationSupported() const
Definition: bgp_table.h:112
const std::string & name() const
Definition: db_table.h:110
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
size_t GetPendingRiboutsCount(size_t *markers) const
Definition: bgp_table.cc:1088
BgpServer * server()
Definition: bgp_table.cc:88
DISALLOW_COPY_AND_ASSIGN(BgpTable)
void Shutdown()
Definition: bgp_table.cc:1051
tbb::atomic< uint64_t > secondary_path_count_
Definition: bgp_table.h:224
const uint64_t GetPrimaryPathCount() const
Definition: bgp_table.h:161
bool IsContributingRoute(const BgpRoute *route) const
Definition: bgp_table.cc:1142
void UpdateLlgrStalePathCount(int count)
Definition: bgp_table.h:173
RequestData(const BgpAttrPtr &attrs, uint32_t flags, uint32_t label, uint32_t l3_label=0)
Definition: bgp_table.h:74
static bool PathSelection(const Path &path1, const Path &path2)
Definition: bgp_table.cc:821
void FillRibOutStatisticsInfo(std::vector< ShowRibOutStatistics > *sros_list) const
Definition: bgp_table.cc:1146
uint64_t subscription_gen_id_
Definition: bgp_table.h:93
bool InputCommon(DBTablePartBase *root, BgpRoute *rt, BgpPath *path, const IPeer *peer, DBRequest *req, DBRequest::DBOperation oper, BgpAttrPtr attrs, uint32_t path_id, uint32_t flags, uint32_t label, uint32_t l3_label)
Definition: bgp_table.cc:836
uint64_t subscription_gen_id() const
Definition: bgp_table.h:88
LifetimeActor * deleter()
Definition: bgp_table.cc:1108
virtual void set_routing_instance(RoutingInstance *rtinstance)
Definition: bgp_table.cc:81
void PrependAsToAsPath4Byte(BgpAttr *attr, as_t asn) const
Definition: bgp_table.cc:399
void RibOutDelete(const RibExportPolicy &policy)
Definition: bgp_table.cc:124
RequestData(const BgpAttrPtr &attrs, uint32_t flags, uint32_t label, uint32_t l3_label, uint64_t subscription_gen_id)
Definition: bgp_table.h:66
virtual std::unique_ptr< DBEntry > AllocEntryStr(const std::string &key) const =0
void CreateAsPath4Byte(BgpAttr *attr, as_t local_as) const
Definition: bgp_table.cc:503
void ProcessDefaultTunnelEncapsulation(const RibOut *ribout, ExtCommunityDB *extcomm_db, BgpAttr *attr) const
Definition: bgp_table.cc:351
const NextHop & nexthop()
Definition: bgp_table.h:82
bool Has4ByteAsn(BgpAttr *attr) const
Definition: bgp_table.cc:447
~BgpTable()
Definition: bgp_table.cc:76
bool DeletePath(DBTablePartBase *root, BgpRoute *rt, BgpPath *path)
Definition: bgp_table.cc:831
const uint64_t GetStalePathCount() const
Definition: bgp_table.h:168
virtual BgpAttrPtr GetAttributes(BgpRoute *rt, BgpAttrPtr attrp, const IPeer *peer)
Definition: bgp_table.h:197
void set_attrs(BgpAttrPtr attrs)
Definition: bgp_table.h:84
PathResolver * path_resolver_
Definition: bgp_table.h:218
PathResolver * path_resolver()
Definition: bgp_table.h:153
const uint64_t GetSecondaryPathCount() const
Definition: bgp_table.h:162