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