OpenSDN source code
route_ksync.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_route_ksync_h
6 #define vnsw_agent_route_ksync_h
7 
8 #include <boost/asio.hpp>
9 #include <boost/bind/bind.hpp>
10 
11 #include <db/db_entry.h>
12 #include <db/db_table.h>
13 #include <db/db_table_partition.h>
14 #include <base/lifetime.h>
15 #include <ksync/ksync_entry.h>
16 #include <ksync/ksync_object.h>
17 #include <ksync/ksync_netlink.h>
18 #include "oper/nexthop.h"
19 #include "oper/route_common.h"
21 #include "vrouter/ksync/agent_ksync_types.h"
23 
24 using namespace boost::placeholders;
25 
26 class RouteKSyncObject;
27 
29 public:
31  uint32_t index);
32  RouteKSyncEntry(RouteKSyncObject* obj, const AgentRoute *route);
33  virtual ~RouteKSyncEntry();
34 
35  uint32_t prefix_len() const { return prefix_len_; }
36  uint32_t label() const { return label_; }
37  bool proxy_arp() const { return proxy_arp_; }
38  bool flood() const { return flood_; }
39  bool flood_dhcp() const { return flood_dhcp_; }
40  bool wait_for_traffic() const { return wait_for_traffic_; }
41  MacAddress mac() const { return mac_; }
42  NHKSyncEntry* nh() const {
43  return static_cast<NHKSyncEntry *>(nh_.get());
44  }
45  void set_prefix_len(uint32_t len) { prefix_len_ = len; }
46  void set_ip(IpAddress addr) { addr_ = addr; }
47  KSyncDBObject *GetObject() const;
48 
49  void FillObjectLog(sandesh_op::type op, KSyncRouteInfo &info) const;
50  virtual bool IsLess(const KSyncEntry &rhs) const;
51  virtual std::string ToString() const;
52  virtual KSyncEntry *UnresolvedReference();
53  virtual bool Sync(DBEntry *e);
54  virtual int AddMsg(char *buf, int buf_len);
55  virtual int ChangeMsg(char *buf, int buf_len);
56  virtual int DeleteMsg(char *buf, int buf_len);
57 
58  bool BuildArpFlags(const DBEntry *rt, const AgentPath *path,
59  const MacAddress &mac);
60  uint8_t CopyReplacementData(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt);
61  bool IsLearntRoute() { return is_learnt_route_;}
62 private:
63  int Encode(sandesh_op::type op, uint8_t replace_plen,
64  char *buf, int buf_len);
65  int DeleteInternal(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt,
66  char *buf, int buf_len);
67  bool UcIsLess(const KSyncEntry &rhs) const;
68  bool McIsLess(const KSyncEntry &rhs) const;
69  bool EvpnIsLess(const KSyncEntry &rhs) const;
70  bool L2IsLess(const KSyncEntry &rhs) const;
71  const NextHop *GetActiveNextHop(const AgentRoute *route) const;
72  const AgentPath *GetActivePath(const AgentRoute *route) const;
73 
76  uint32_t vrf_id_;
80  uint32_t prefix_len_;
82  uint32_t label_;
83  uint8_t type_;
84  bool proxy_arp_;
90  bool flood_;
91  uint32_t ethernet_tag_;
93  bool is_learnt_route_; // this does not need to be copied for replacement
94  // data
96  // NOTE: Please update CopyReplacmenetData when any new field is added
97  // here
100 };
101 
103 public:
104  struct VrfState : DBState {
105  VrfState() : DBState(), seen_(false),
106  created_(UTCTimestampUsec()) {};
107  bool seen_;
108  uint64_t created_;
109  };
110 
111  RouteKSyncObject(KSync *ksync, AgentRouteTable *rt_table);
112  virtual ~RouteKSyncObject();
113 
114  KSync *ksync() const { return ksync_; }
115 
116  virtual KSyncEntry *Alloc(const KSyncEntry *entry, uint32_t index);
117  virtual KSyncEntry *DBToKSyncEntry(const DBEntry *e);
118  void ManagedDelete();
119  void Unregister();
120  virtual void EmptyTable();
121  DBFilterResp DBEntryFilter(const DBEntry *entry, const KSyncDBEntry *ksync);
122 
123 private:
129 };
130 
131 struct MacBinding {
132  typedef std::map<const MacAddress,
134  typedef std::pair<const MacAddress,
136 
137  MacBinding(const MacBinding &mac_binding):
138  mac_preference_map_(mac_binding.mac_preference_map_) {}
139 
140  MacBinding(const MacAddress &mac, const PathPreference &pref) {
141  mac_preference_map_[mac] = pref;
142  }
143 
144  const MacAddress& get_mac() const {
145  const MacAddress *mac = &MacAddress::ZeroMac();
146  uint32_t pref = PathPreference::INVALID;
147  for (MacPreferenceMap::const_iterator it = mac_preference_map_.begin();
148  it != mac_preference_map_.end(); it++) {
149  if (*mac == MacAddress::ZeroMac() || pref < it->second.preference()) {
150  mac = &(it->first);
151  pref = it->second.preference();
152  }
153  }
154  return *mac;
155  }
156 
157  void reset_mac(const MacAddress &mac) {
158  mac_preference_map_.erase(mac);
159  }
160 
161  bool can_erase() {
162  if (mac_preference_map_.size() == 0) {
163  return true;
164  }
165  return false;
166  }
167 
168  void set_mac(const PathPreference &pref,
169  const MacAddress &mac) {
170  mac_preference_map_[mac] = pref;
171  }
172 
173  bool WaitForTraffic() const {
174  for (MacPreferenceMap::const_iterator it = mac_preference_map_.begin();
175  it != mac_preference_map_.end(); it++) {
176  if (it->second.wait_for_traffic() == true) {
177  return true;
178  }
179  }
180  return false;
181  }
182 
183 private:
185 };
186 
187 class VrfKSyncObject;
188 
190 public:
191  VrfKSyncEntry(VrfKSyncObject* obj, const VrfKSyncEntry *entry,
192  uint32_t index);
193  VrfKSyncEntry(VrfKSyncObject* obj, const VrfEntry *vrf);
194  virtual ~VrfKSyncEntry();
195 
196  const uint32_t hbf_rintf() const { return hbf_rintf_; }
197  const uint32_t hbf_lintf() const { return hbf_lintf_; }
198  const uint32_t vrf_id() const { return vrf_id_; }
199  void set_hbf_rintf(uint32_t hbf_rintf) { hbf_rintf_ = hbf_rintf_; }
200  void set_hbf_lintf(uint32_t hbf_lintf) { hbf_lintf_ = hbf_lintf_; }
201  KSyncDBObject *GetObject() const;
202 
203  void FillObjectLog(sandesh_op::type op, KSyncVrfInfo &info) const;
204  virtual bool IsLess(const KSyncEntry &rhs) const;
205  virtual std::string ToString() const;
206  virtual KSyncEntry *UnresolvedReference();
207  virtual bool Sync(DBEntry *e);
208  virtual int AddMsg(char *buf, int buf_len);
209  virtual int ChangeMsg(char *buf, int buf_len);
210  virtual int DeleteMsg(char *buf, int buf_len);
211 private:
212  int Encode(sandesh_op::type op, uint8_t replace_plen,
213  char *buf, int buf_len);
214 
216  uint32_t vrf_id_;
217  uint32_t hbf_rintf_;
218  uint32_t hbf_lintf_;
220 };
221 
222 
223 class KSyncRouteWalker;
225 public:
226  // Table to maintain IP - MAC binding. Used to stitch MAC to inet routes
227  typedef std::pair<IpAddress, uint32_t> IpToMacBindingKey;
228  typedef std::map<IpToMacBindingKey, MacBinding> IpToMacBinding;
229 
230  struct VrfState : DBState {
231  VrfState(Agent *agent);
232  bool seen_;
241  };
242 
243  VrfKSyncObject(KSync *ksync);
244  virtual ~VrfKSyncObject();
245 
246  KSync *ksync() const { return ksync_; }
247 
248  void RegisterDBClients();
249  void Shutdown();
250  void VrfNotify(DBTablePartBase *partition, DBEntryBase *e);
251 
252  void EvpnRouteTableNotify(DBTablePartBase *partition, DBEntryBase *e);
253  void UnRegisterEvpnRouteTableListener(const VrfEntry *entry,
254  VrfState *state);
255  void AddIpMacBinding(VrfEntry *vrf, const IpAddress &ip,
256  const MacAddress &mac,
257  uint32_t ethernet_tag,
258  uint32_t pref,
259  bool wait_for_traffic);
260  void DelIpMacBinding(VrfEntry *vrf, const IpAddress &ip,
261  const MacAddress &mac, uint32_t ethernet_tag);
262  MacAddress GetIpMacBinding(VrfEntry *vrf, const IpAddress &ip,
263  const InetUnicastRouteEntry *rt) const;
264  bool GetIpMacWaitForTraffic(VrfEntry *vrf,
265  const IpAddress &ip) const;
266  void NotifyUcRoute(VrfEntry *vrf, VrfState *state, const IpAddress &ip);
267  bool RouteNeedsMacBinding(const InetUnicastRouteEntry *rt);
268  DBTableBase::ListenerId vrf_listener_id() const {return vrf_listener_id_;}
269  virtual KSyncEntry *Alloc(const KSyncEntry *entry, uint32_t index);
270  virtual KSyncEntry *DBToKSyncEntry(const DBEntry *entry);
271 
272 private:
278 };
279 
281 public:
282  typedef DBTableWalker::WalkId RouteWalkerIdList[Agent::ROUTE_TABLE_MAX];
284  virtual ~KSyncRouteWalker();
285 
286  void NotifyRoutes(VrfEntry *vrf);
287  void EnqueueDelete();
288  virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
289 
290 private:
294 };
295 
296 #endif // vnsw_agent_route_ksync_h
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
static bool IsLess(const ShowRoute &lhs, const ShowRoute &rhs, const BgpSandeshContext *bsc, const string &table_name)
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge,...
Definition: agent_route.h:109
Base class for all Route entries in agent.
Definition: agent_route.h:224
Definition: agent.h:360
RouteTableType
Definition: agent.h:417
@ ROUTE_TABLE_MAX
Definition: agent.h:425
int ListenerId
Definition: db_table.h:62
boost::intrusive_ptr< KSyncEntry > KSyncEntryPtr
Definition: ksync_entry.h:68
VrfKSyncObject::VrfState * state_
Definition: route_ksync.h:291
DISALLOW_COPY_AND_ASSIGN(KSyncRouteWalker)
bool marked_for_deletion_
Definition: route_ksync.h:292
static const MacAddress & ZeroMac()
Definition: mac_address.h:158
IpAddress src_addr_
Definition: route_ksync.h:78
bool IsLearntRoute()
Definition: route_ksync.h:61
uint32_t label_
Definition: route_ksync.h:82
IpAddress addr_
Definition: route_ksync.h:77
bool flood() const
Definition: route_ksync.h:38
bool layer2_control_word_
Definition: route_ksync.h:92
NHKSyncEntry * nh() const
Definition: route_ksync.h:42
uint32_t label() const
Definition: route_ksync.h:36
bool wait_for_traffic() const
Definition: route_ksync.h:40
uint32_t prefix_len() const
Definition: route_ksync.h:35
MacAddress mac_
Definition: route_ksync.h:79
KSyncEntryPtr nh_
Definition: route_ksync.h:81
void set_prefix_len(uint32_t len)
Definition: route_ksync.h:45
uint32_t prefix_len_
Definition: route_ksync.h:80
MacAddress mac() const
Definition: route_ksync.h:41
RouteKSyncObject * ksync_obj_
Definition: route_ksync.h:74
bool proxy_arp() const
Definition: route_ksync.h:37
string address_string_
Definition: route_ksync.h:86
uint32_t ethernet_tag_
Definition: route_ksync.h:91
void set_ip(IpAddress addr)
Definition: route_ksync.h:46
DISALLOW_COPY_AND_ASSIGN(RouteKSyncEntry)
TunnelType::Type tunnel_type_
Definition: route_ksync.h:87
bool EvpnIsLess(const KSyncEntry &rhs) const
bool wait_for_traffic_
Definition: route_ksync.h:88
bool is_learnt_route_
Definition: route_ksync.h:93
bool flood_dhcp() const
Definition: route_ksync.h:39
bool local_vm_peer_route_
Definition: route_ksync.h:89
Agent::RouteTableType rt_type_
Definition: route_ksync.h:75
uint32_t vrf_id_
Definition: route_ksync.h:76
KSync * ksync() const
Definition: route_ksync.h:114
DISALLOW_COPY_AND_ASSIGN(RouteKSyncObject)
AgentRouteTable * rt_table_
Definition: route_ksync.h:126
LifetimeRef< RouteKSyncObject > table_delete_ref_
Definition: route_ksync.h:127
Definition: vrf.h:89
const uint32_t hbf_lintf() const
Definition: route_ksync.h:197
uint32_t hbf_lintf_
Definition: route_ksync.h:218
DISALLOW_COPY_AND_ASSIGN(VrfKSyncEntry)
VrfKSyncObject * ksync_obj_
Definition: route_ksync.h:215
uint32_t hbf_rintf_
Definition: route_ksync.h:217
void set_hbf_rintf(uint32_t hbf_rintf)
Definition: route_ksync.h:199
void set_hbf_lintf(uint32_t hbf_lintf)
Definition: route_ksync.h:200
const uint32_t vrf_id() const
Definition: route_ksync.h:198
const uint32_t hbf_rintf() const
Definition: route_ksync.h:196
uint32_t vrf_id_
Definition: route_ksync.h:216
KSync * ksync() const
Definition: route_ksync.h:246
std::map< IpToMacBindingKey, MacBinding > IpToMacBinding
Definition: route_ksync.h:228
KSync * ksync_
Definition: route_ksync.h:273
std::pair< IpAddress, uint32_t > IpToMacBindingKey
Definition: route_ksync.h:227
DISALLOW_COPY_AND_ASSIGN(VrfKSyncObject)
DBTableBase::ListenerId vrf_listener_id_
Definition: route_ksync.h:274
DBTableBase::ListenerId vrf_listener_id() const
Definition: route_ksync.h:268
VrfTable * vrf_table_
Definition: route_ksync.h:276
Definition: vrf.h:271
uint8_t type
Definition: load_balance.h:2
static string ToString(PhysicalDevice::ManagementProtocol proto)
bool WaitForTraffic() const
Definition: route_ksync.h:173
MacBinding(const MacBinding &mac_binding)
Definition: route_ksync.h:137
void reset_mac(const MacAddress &mac)
Definition: route_ksync.h:157
MacPreferenceMap mac_preference_map_
Definition: route_ksync.h:184
std::map< const MacAddress, PathPreference > MacPreferenceMap
Definition: route_ksync.h:133
const MacAddress & get_mac() const
Definition: route_ksync.h:144
MacBinding(const MacAddress &mac, const PathPreference &pref)
Definition: route_ksync.h:140
std::pair< const MacAddress, PathPreference > MacPreferencePair
Definition: route_ksync.h:135
void set_mac(const PathPreference &pref, const MacAddress &mac)
Definition: route_ksync.h:168
bool can_erase()
Definition: route_ksync.h:161
AgentRouteWalkerPtr ksync_route_walker_
Definition: route_ksync.h:239
VrfKSyncEntry * ksync_
Definition: route_ksync.h:240
RouteKSyncObject * inet6_uc_route_table_
Definition: route_ksync.h:235
IpToMacBinding ip_mac_binding_
Definition: route_ksync.h:237
DBTableBase::ListenerId evpn_rt_table_listener_id_
Definition: route_ksync.h:238
RouteKSyncObject * inet4_mc_route_table_
Definition: route_ksync.h:234
RouteKSyncObject * inet4_uc_route_table_
Definition: route_ksync.h:233
RouteKSyncObject * bridge_route_table_
Definition: route_ksync.h:236
static uint64_t UTCTimestampUsec()
Definition: time_util.h:13