OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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.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 class RouteKSyncObject;
25 
27 public:
29  uint32_t index);
30  RouteKSyncEntry(RouteKSyncObject* obj, const AgentRoute *route);
31  virtual ~RouteKSyncEntry();
32 
33  uint32_t prefix_len() const { return prefix_len_; }
34  uint32_t label() const { return label_; }
35  bool proxy_arp() const { return proxy_arp_; }
36  bool flood() const { return flood_; }
37  bool flood_dhcp() const { return flood_dhcp_; }
38  bool wait_for_traffic() const { return wait_for_traffic_; }
39  MacAddress mac() const { return mac_; }
40  NHKSyncEntry* nh() const {
41  return static_cast<NHKSyncEntry *>(nh_.get());
42  }
43  void set_prefix_len(uint32_t len) { prefix_len_ = len; }
44  void set_ip(IpAddress addr) { addr_ = addr; }
45  KSyncDBObject *GetObject() const;
46 
47  void FillObjectLog(sandesh_op::type op, KSyncRouteInfo &info) const;
48  virtual bool IsLess(const KSyncEntry &rhs) const;
49  virtual std::string ToString() const;
51  virtual bool Sync(DBEntry *e);
52  virtual int AddMsg(char *buf, int buf_len);
53  virtual int ChangeMsg(char *buf, int buf_len);
54  virtual int DeleteMsg(char *buf, int buf_len);
55 
56  bool BuildArpFlags(const DBEntry *rt, const AgentPath *path,
57  const MacAddress &mac);
58  uint8_t CopyReplacementData(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt);
59  bool IsLearntRoute() { return is_learnt_route_;}
60 private:
61  int Encode(sandesh_op::type op, uint8_t replace_plen,
62  char *buf, int buf_len);
63  int DeleteInternal(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt,
64  char *buf, int buf_len);
65  bool UcIsLess(const KSyncEntry &rhs) const;
66  bool McIsLess(const KSyncEntry &rhs) const;
67  bool EvpnIsLess(const KSyncEntry &rhs) const;
68  bool L2IsLess(const KSyncEntry &rhs) const;
69  const NextHop *GetActiveNextHop(const AgentRoute *route) const;
70  const AgentPath *GetActivePath(const AgentRoute *route) const;
71 
74  uint32_t vrf_id_;
78  uint32_t prefix_len_;
80  uint32_t label_;
81  uint8_t type_;
82  bool proxy_arp_;
88  bool flood_;
89  uint32_t ethernet_tag_;
91  bool is_learnt_route_; // this does not need to be copied for replacement
92  // data
94  // NOTE: Please update CopyReplacmenetData when any new field is added
95  // here
98 };
99 
101 public:
102  struct VrfState : DBState {
103  VrfState() : DBState(), seen_(false),
105  bool seen_;
106  uint64_t created_;
107  };
108 
110  virtual ~RouteKSyncObject();
111 
112  KSync *ksync() const { return ksync_; }
113 
114  virtual KSyncEntry *Alloc(const KSyncEntry *entry, uint32_t index);
115  virtual KSyncEntry *DBToKSyncEntry(const DBEntry *e);
116  void ManagedDelete();
117  void Unregister();
118  virtual void EmptyTable();
119  DBFilterResp DBEntryFilter(const DBEntry *entry, const KSyncDBEntry *ksync);
120 
121 private:
127 };
128 
129 struct MacBinding {
130  typedef std::map<const MacAddress,
132  typedef std::pair<const MacAddress,
134 
135  MacBinding(const MacBinding &mac_binding):
137 
138  MacBinding(const MacAddress &mac, const PathPreference &pref) {
139  mac_preference_map_[mac] = pref;
140  }
141 
142  const MacAddress& get_mac() const {
143  const MacAddress *mac = &MacAddress::ZeroMac();
144  uint32_t pref = PathPreference::INVALID;
145  for (MacPreferenceMap::const_iterator it = mac_preference_map_.begin();
146  it != mac_preference_map_.end(); it++) {
147  if (*mac == MacAddress::ZeroMac() || pref < it->second.preference()) {
148  mac = &(it->first);
149  pref = it->second.preference();
150  }
151  }
152  return *mac;
153  }
154 
155  void reset_mac(const MacAddress &mac) {
156  mac_preference_map_.erase(mac);
157  }
158 
159  bool can_erase() {
160  if (mac_preference_map_.size() == 0) {
161  return true;
162  }
163  return false;
164  }
165 
166  void set_mac(const PathPreference &pref,
167  const MacAddress &mac) {
168  mac_preference_map_[mac] = pref;
169  }
170 
171  bool WaitForTraffic() const {
172  for (MacPreferenceMap::const_iterator it = mac_preference_map_.begin();
173  it != mac_preference_map_.end(); it++) {
174  if (it->second.wait_for_traffic() == true) {
175  return true;
176  }
177  }
178  return false;
179  }
180 
181 private:
183 };
184 
185 class VrfKSyncObject;
186 
188 public:
189  VrfKSyncEntry(VrfKSyncObject* obj, const VrfKSyncEntry *entry,
190  uint32_t index);
191  VrfKSyncEntry(VrfKSyncObject* obj, const VrfEntry *vrf);
192  virtual ~VrfKSyncEntry();
193 
194  const uint32_t hbf_rintf() const { return hbf_rintf_; }
195  const uint32_t hbf_lintf() const { return hbf_lintf_; }
196  const uint32_t vrf_id() const { return vrf_id_; }
199  KSyncDBObject *GetObject() const;
200 
201  void FillObjectLog(sandesh_op::type op, KSyncVrfInfo &info) const;
202  virtual bool IsLess(const KSyncEntry &rhs) const;
203  virtual std::string ToString() const;
204  virtual KSyncEntry *UnresolvedReference();
205  virtual bool Sync(DBEntry *e);
206  virtual int AddMsg(char *buf, int buf_len);
207  virtual int ChangeMsg(char *buf, int buf_len);
208  virtual int DeleteMsg(char *buf, int buf_len);
209 private:
210  int Encode(sandesh_op::type op, uint8_t replace_plen,
211  char *buf, int buf_len);
212 
214  uint32_t vrf_id_;
215  uint32_t hbf_rintf_;
216  uint32_t hbf_lintf_;
218 };
219 
220 
221 class KSyncRouteWalker;
223 public:
224  // Table to maintain IP - MAC binding. Used to stitch MAC to inet routes
225  typedef std::pair<IpAddress, uint32_t> IpToMacBindingKey;
226  typedef std::map<IpToMacBindingKey, MacBinding> IpToMacBinding;
227 
228  struct VrfState : DBState {
229  VrfState(Agent *agent);
230  bool seen_;
239  };
240 
242  virtual ~VrfKSyncObject();
243 
244  KSync *ksync() const { return ksync_; }
245 
246  void RegisterDBClients();
247  void Shutdown();
248  void VrfNotify(DBTablePartBase *partition, DBEntryBase *e);
249 
250  void EvpnRouteTableNotify(DBTablePartBase *partition, DBEntryBase *e);
251  void UnRegisterEvpnRouteTableListener(const VrfEntry *entry,
252  VrfState *state);
253  void AddIpMacBinding(VrfEntry *vrf, const IpAddress &ip,
254  const MacAddress &mac,
255  uint32_t ethernet_tag,
256  uint32_t pref,
257  bool wait_for_traffic);
258  void DelIpMacBinding(VrfEntry *vrf, const IpAddress &ip,
259  const MacAddress &mac, uint32_t ethernet_tag);
261  const InetUnicastRouteEntry *rt) const;
263  const IpAddress &ip) const;
264  void NotifyUcRoute(VrfEntry *vrf, VrfState *state, const IpAddress &ip);
267  virtual KSyncEntry *Alloc(const KSyncEntry *entry, uint32_t index);
268  virtual KSyncEntry *DBToKSyncEntry(const DBEntry *entry);
269 
270 private:
276 };
277 
279 public:
282  virtual ~KSyncRouteWalker();
283 
284  void NotifyRoutes(VrfEntry *vrf);
285  void EnqueueDelete();
286  virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
287 
288 private:
292 };
293 
294 #endif // vnsw_agent_route_ksync_h
void FillObjectLog(sandesh_op::type op, KSyncRouteInfo &info) const
Definition: route_ksync.cc:526
bool local_vm_peer_route_
Definition: route_ksync.h:87
static const MacAddress & ZeroMac()
Definition: mac_address.h:158
int Encode(sandesh_op::type op, uint8_t replace_plen, char *buf, int buf_len)
Definition: route_ksync.cc:551
KSyncDBObject * GetObject() const
Definition: route_ksync.cc:871
DISALLOW_COPY_AND_ASSIGN(RouteKSyncEntry)
virtual std::string ToString() const
Definition: route_ksync.cc:889
virtual bool IsLess(const KSyncEntry &rhs) const
Definition: route_ksync.cc:875
virtual bool Sync(DBEntry *e)
Definition: route_ksync.cc:896
uint32_t label_
Definition: route_ksync.h:80
bool WaitForTraffic() const
Definition: route_ksync.h:171
DBTableWalker::WalkId RouteWalkerIdList[Agent::ROUTE_TABLE_MAX]
Definition: route_ksync.h:280
Agent * agent() const
uint32_t vrf_id_
Definition: route_ksync.h:74
Definition: vrf.h:86
const AgentPath * GetActivePath(const AgentRoute *route) const
Definition: route_ksync.cc:411
Definition: vrf.h:268
MacAddress mac_
Definition: route_ksync.h:77
void set_mac(const PathPreference &pref, const MacAddress &mac)
Definition: route_ksync.h:166
void FillObjectLog(sandesh_op::type op, KSyncVrfInfo &info) const
Definition: route_ksync.cc:932
VrfKSyncObject * ksync_obj_
Definition: route_ksync.h:213
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge, EVPN (Type2/Type5). This base class contains common code for all types of route tables.
Definition: agent_route.h:109
void set_hbf_lintf(uint32_t hbf_lintf)
Definition: route_ksync.h:198
const uint32_t vrf_id() const
Definition: route_ksync.h:196
boost::asio::ip::address IpAddress
Definition: address.h:13
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
Definition: route_ksync.cc:981
AgentRouteWalkerPtr ksync_route_walker_
Definition: route_ksync.h:237
VrfKSyncObject(KSync *ksync)
RouteKSyncObject * inet4_uc_route_table_
Definition: route_ksync.h:231
int Encode(sandesh_op::type op, uint8_t replace_plen, char *buf, int buf_len)
Definition: route_ksync.cc:909
int ListenerId
Definition: db_table.h:62
void RegisterDBClients()
bool wait_for_traffic_
Definition: route_ksync.h:86
RouteKSyncObject * bridge_route_table_
Definition: route_ksync.h:234
DBTableBase::ListenerId vrf_listener_id() const
Definition: route_ksync.h:266
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
Definition: route_ksync.cc:993
KSyncDBObject * GetObject() const
Definition: route_ksync.cc:110
DBTableBase::ListenerId evpn_rt_table_listener_id_
Definition: route_ksync.h:236
NHKSyncEntry * nh() const
Definition: route_ksync.h:40
virtual KSyncEntry * UnresolvedReference()
Definition: route_ksync.cc:758
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *e)
Definition: route_ksync.cc:828
void set_prefix_len(uint32_t len)
Definition: route_ksync.h:43
Base class for all Route entries in agent.
Definition: agent_route.h:224
Agent::RouteTableType rt_type_
Definition: route_ksync.h:73
const uint32_t hbf_lintf() const
Definition: route_ksync.h:195
bool wait_for_traffic() const
Definition: route_ksync.h:38
void reset_mac(const MacAddress &mac)
Definition: route_ksync.h:155
virtual int DeleteMsg(char *buf, int buf_len)
Definition: route_ksync.cc:960
bool EvpnIsLess(const KSyncEntry &rhs) const
uint32_t prefix_len_
Definition: route_ksync.h:78
MacBinding(const MacBinding &mac_binding)
Definition: route_ksync.h:135
bool GetIpMacWaitForTraffic(VrfEntry *vrf, const IpAddress &ip) const
IpToMacBinding ip_mac_binding_
Definition: route_ksync.h:235
std::pair< const MacAddress, PathPreference > MacPreferencePair
Definition: route_ksync.h:133
KSyncEntryPtr nh_
Definition: route_ksync.h:79
void set_ip(IpAddress addr)
Definition: route_ksync.h:44
bool is_learnt_route_
Definition: route_ksync.h:91
RouteKSyncObject(KSync *ksync, AgentRouteTable *rt_table)
Definition: route_ksync.cc:796
bool RouteNeedsMacBinding(const InetUnicastRouteEntry *rt)
const NextHop * GetActiveNextHop(const AgentRoute *route) const
Definition: route_ksync.cc:400
bool proxy_arp() const
Definition: route_ksync.h:35
KSyncRouteWalker(Agent *agent, VrfKSyncObject::VrfState *state)
VrfTable * vrf_table_
Definition: route_ksync.h:274
bool flood() const
Definition: route_ksync.h:36
virtual KSyncEntry * DBToKSyncEntry(const DBEntry *entry)
Definition: route_ksync.cc:987
bool McIsLess(const KSyncEntry &rhs) const
Definition: route_ksync.cc:127
VrfKSyncEntry(VrfKSyncObject *obj, const VrfKSyncEntry *entry, uint32_t index)
Definition: route_ksync.cc:859
bool BuildArpFlags(const DBEntry *rt, const AgentPath *path, const MacAddress &mac)
Definition: route_ksync.cc:252
uint8_t type
Definition: load_balance.h:109
void NotifyUcRoute(VrfEntry *vrf, VrfState *state, const IpAddress &ip)
Definition: agent.h:358
virtual bool IsLess(const KSyncEntry &rhs) const
Definition: route_ksync.cc:150
DISALLOW_COPY_AND_ASSIGN(VrfKSyncEntry)
DISALLOW_COPY_AND_ASSIGN(VrfKSyncObject)
RouteKSyncObject * ksync_obj_
Definition: route_ksync.h:72
boost::intrusive_ptr< KSyncEntry > KSyncEntryPtr
Definition: ksync_entry.h:68
DBTableBase::ListenerId vrf_listener_id_
Definition: route_ksync.h:272
VrfKSyncEntry * ksync_
Definition: route_ksync.h:238
RouteKSyncEntry(RouteKSyncObject *obj, const RouteKSyncEntry *entry, uint32_t index)
Definition: route_ksync.cc:37
void EvpnRouteTableNotify(DBTablePartBase *partition, DBEntryBase *e)
std::map< const MacAddress, PathPreference > MacPreferenceMap
Definition: route_ksync.h:131
VrfKSyncObject::VrfState * state_
Definition: route_ksync.h:289
DBFilterResp DBEntryFilter(const DBEntry *entry, const KSyncDBEntry *ksync)
Definition: route_ksync.cc:809
bool UcIsLess(const KSyncEntry &rhs) const
Definition: route_ksync.cc:114
KSync * ksync() const
Definition: route_ksync.h:112
virtual ~VrfKSyncObject()
MacAddress GetIpMacBinding(VrfEntry *vrf, const IpAddress &ip, const InetUnicastRouteEntry *rt) const
std::pair< IpAddress, uint32_t > IpToMacBindingKey
Definition: route_ksync.h:225
uint32_t hbf_rintf_
Definition: route_ksync.h:215
void DelIpMacBinding(VrfEntry *vrf, const IpAddress &ip, const MacAddress &mac, uint32_t ethernet_tag)
const uint32_t hbf_rintf() const
Definition: route_ksync.h:194
uint32_t vrf_id_
Definition: route_ksync.h:214
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
virtual ~RouteKSyncEntry()
Definition: route_ksync.cc:107
virtual std::string ToString() const
Definition: route_ksync.cc:190
void AddIpMacBinding(VrfEntry *vrf, const IpAddress &ip, const MacAddress &mac, uint32_t ethernet_tag, uint32_t pref, bool wait_for_traffic)
IpAddress src_addr_
Definition: route_ksync.h:76
LifetimeRef< RouteKSyncObject > table_delete_ref_
Definition: route_ksync.h:125
bool layer2_control_word_
Definition: route_ksync.h:90
uint32_t label() const
Definition: route_ksync.h:34
static uint64_t UTCTimestampUsec()
Definition: time_util.h:13
AgentRouteTable * rt_table_
Definition: route_ksync.h:124
DISALLOW_COPY_AND_ASSIGN(RouteKSyncObject)
bool can_erase()
Definition: route_ksync.h:159
virtual int ChangeMsg(char *buf, int buf_len)
Definition: route_ksync.cc:669
bool IsLearntRoute()
Definition: route_ksync.h:59
virtual ~KSyncRouteWalker()
MacBinding(const MacAddress &mac, const PathPreference &pref)
Definition: route_ksync.h:138
virtual int AddMsg(char *buf, int buf_len)
Definition: route_ksync.cc:945
std::map< IpToMacBindingKey, MacBinding > IpToMacBinding
Definition: route_ksync.h:226
bool flood_dhcp() const
Definition: route_ksync.h:37
MacAddress mac() const
Definition: route_ksync.h:39
virtual bool Sync(DBEntry *e)
Definition: route_ksync.cc:416
IpAddress addr_
Definition: route_ksync.h:75
virtual ~VrfKSyncEntry()
Definition: route_ksync.cc:868
const MacAddress & get_mac() const
Definition: route_ksync.h:142
KSync * ksync() const
Definition: route_ksync.h:244
uint8_t CopyReplacementData(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt)
Definition: route_ksync.cc:720
virtual void EmptyTable()
Definition: route_ksync.cc:847
virtual KSyncEntry * UnresolvedReference()
Definition: route_ksync.cc:968
virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
bool L2IsLess(const KSyncEntry &rhs) const
Definition: route_ksync.cc:140
RouteTableType
Definition: agent.h:415
void set_hbf_rintf(uint32_t hbf_rintf)
Definition: route_ksync.h:197
virtual KSyncEntry * Alloc(const KSyncEntry *entry, uint32_t index)
Definition: route_ksync.cc:822
uint32_t prefix_len() const
Definition: route_ksync.h:33
virtual int DeleteMsg(char *buf, int buf_len)
Definition: route_ksync.cc:677
RouteKSyncObject * inet6_uc_route_table_
Definition: route_ksync.h:233
bool marked_for_deletion_
Definition: route_ksync.h:290
MacPreferenceMap mac_preference_map_
Definition: route_ksync.h:182
uint32_t hbf_lintf_
Definition: route_ksync.h:216
string address_string_
Definition: route_ksync.h:84
RouteKSyncObject * inet4_mc_route_table_
Definition: route_ksync.h:232
void UnRegisterEvpnRouteTableListener(const VrfEntry *entry, VrfState *state)
DISALLOW_COPY_AND_ASSIGN(KSyncRouteWalker)
uint32_t ethernet_tag_
Definition: route_ksync.h:89
virtual int AddMsg(char *buf, int buf_len)
Definition: route_ksync.cc:662
void NotifyRoutes(VrfEntry *vrf)
KSync * ksync_
Definition: route_ksync.h:271
TunnelType::Type tunnel_type_
Definition: route_ksync.h:85
virtual ~RouteKSyncObject()
Definition: route_ksync.cc:803
virtual int ChangeMsg(char *buf, int buf_len)
Definition: route_ksync.cc:952
int DeleteInternal(NHKSyncEntry *nexthop, RouteKSyncEntry *new_rt, char *buf, int buf_len)
Definition: route_ksync.cc:747