OpenSDN source code
arp_proto.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_arp_proto_hpp
6 #define vnsw_agent_arp_proto_hpp
7 
8 #include <atomic>
9 
10 #include "pkt/proto.h"
11 #include "services/arp_handler.h"
12 #include "services/arp_entry.h"
13 
14 #define ARP_TRACE(obj, ...) \
15 do { \
16  Arp##obj::TraceMsg(ArpTraceBuf, __FILE__, __LINE__, ##__VA_ARGS__); \
17 } while (false) \
18 
19 struct ArpVrfState;
20 
21 class ArpProto : public Proto {
22 public:
23  static const uint16_t kGratRetries = 2;
24  static const uint16_t kMaxFailures = 3;
25  static const uint32_t kGratRetryTimeout = 2000; // milli seconds
26  static const uint16_t kMaxRetries = 8;
27  static const uint32_t kRetryTimeout = 2000; // milli seconds
28  static const uint32_t kAgingTimeout = (5 * 60 * 1000); // milli seconds
29 
30  typedef std::map<ArpKey, ArpEntry *> ArpCache;
31  typedef std::pair<ArpKey, ArpEntry *> ArpCachePair;
32  typedef std::map<ArpKey, ArpEntry *>::iterator ArpIterator;
33  typedef std::set<ArpKey> ArpKeySet;
34  typedef std::set<ArpEntry *> ArpEntrySet;
35  typedef std::map<ArpKey, ArpEntrySet> GratuitousArpCache;
36  typedef std::pair<ArpKey, ArpEntrySet> GratuitousArpCachePair;
37  typedef std::map<ArpKey, ArpEntrySet>::iterator GratuitousArpIterator;
38 
39  enum ArpMsgType {
46  };
47 
48  struct ArpIpc : InterTaskMsg {
50  : InterTaskMsg(msg), key(akey), interface_(itf) {}
51  ArpIpc(ArpProto::ArpMsgType msg, in_addr_t ip, const VrfEntry *vrf,
52  InterfaceConstRef itf) :
53  InterTaskMsg(msg), key(ip, vrf), interface_(itf) {}
54 
57  };
58 
59  struct ArpStats {
60  ArpStats() { Reset(); }
61  void Reset() {
67  }
68 
69  uint32_t arp_req;
70  uint32_t arp_replies;
71  uint32_t arp_gratuitous;
72  uint32_t resolved;
74  uint32_t errors;
77  uint32_t arp_invalid_vrf;
79  uint32_t vm_arp_req;
80  uint32_t vm_garp_req;
81  uint32_t agent_not_inst;
83  };
84 
89  };
90  typedef std::map<uint32_t, InterfaceArpInfo> InterfaceArpMap;
91  typedef std::pair<uint32_t, InterfaceArpInfo> InterfaceArpPair;
92 
93  void Shutdown();
94  ArpProto(Agent *agent, boost::asio::io_context &io, bool run_with_vrouter);
95  virtual ~ArpProto();
96 
97  ProtoHandler *AllocProtoHandler(boost::shared_ptr<PktInfo> info,
98  boost::asio::io_context &io);
99  bool TimerExpiry(ArpKey &key, uint32_t timer_type, const Interface *itf);
100 
101  bool AddArpEntry(ArpEntry *entry);
102  bool DeleteArpEntry(ArpEntry *entry);
103  ArpEntry *FindArpEntry(const ArpKey &key);
104  std::size_t GetArpCacheSize() { return arp_cache_.size(); }
105  const ArpCache& arp_cache() { return arp_cache_; }
108 
110  uint32_t ip_fabric_interface_index() const {
112  }
115  }
117  void set_ip_fabric_interface_index(uint32_t ind) {
119  }
122  }
123 
124  void AddGratuitousArpEntry(ArpKey &key);
125  void DeleteGratuitousArpEntry(ArpEntry *entry);
126  ArpEntry* GratuitousArpEntry (const ArpKey &key, const Interface *intf);
128  GratuitousArpEntryIterator(const ArpKey &key, bool *key_valid);
140  }
144  }
148  }
152  }
153 
155 
156  const ArpStats &GetStats() const { return arp_stats_; }
158 
159  void IncrementStatsArpRequest(uint32_t idx);
160  void IncrementStatsArpReply(uint32_t idx);
161  void IncrementStatsResolved(uint32_t idx);
162  InterfaceArpInfo& ArpMapIndexToEntry(uint32_t idx);
163  uint32_t ArpRequestStatsCounter(uint32_t idx);
164  uint32_t ArpReplyStatsCounter(uint32_t idx);
165  uint32_t ArpResolvedStatsCounter(uint32_t idx);
166  void ClearInterfaceArpStats(uint32_t idx);
167 
168  uint16_t max_retries() const { return max_retries_; }
169  uint32_t retry_timeout() const { return retry_timeout_; }
170  uint32_t aging_timeout() const { return aging_timeout_; }
171  void set_max_retries(uint16_t retries) { max_retries_ = retries; }
172  void set_retry_timeout(uint32_t timeout) { retry_timeout_ = timeout; }
173  void set_aging_timeout(uint32_t timeout) { aging_timeout_ = timeout; }
174  void SendArpIpc(ArpProto::ArpMsgType type, in_addr_t ip,
175  const VrfEntry *vrf, InterfaceConstRef itf);
176  bool ValidateAndClearVrfState(VrfEntry *vrf, const ArpVrfState *vrf_state);
179  void HandlePathPreferenceArpReply(const VrfEntry *vrf, uint32_t itf,
180  Ip4Address sip);
181 
183  return vrf_table_listener_id_;
184  }
187  }
188 private:
189  void VrfNotify(DBTablePartBase *part, DBEntryBase *entry);
190  void NextHopNotify(DBEntryBase *entry);
191  void InterfaceNotify(DBEntryBase *entry);
193  InterfaceConstRef itf);
195 
207 
208  uint16_t max_retries_;
209  uint32_t retry_timeout_; // milli seconds
210  uint32_t aging_timeout_; // milli seconds
211 
213 };
214 
217  uint8_t plen;
218  ArpPathPreferenceStateKey(const IpAddress &addr, uint8_t len) :
219  ip(addr), plen(len) {}
220  bool IsLess(const ArpPathPreferenceStateKey &key) const {
221  if (ip != key.ip) {
222  return ip < key.ip;
223  }
224  return plen < key.plen;
225  }
226 };
227 
229  /* When prefix-len is less than 32 we send ARP request for all IPs in the
230  * prefix. Whoever responds last, his IP will stored in field
231  * prev_responded_ip. Subsequently periodic ARP requests will be sent
232  * only for this IP instead of whole subnet. We will fallback to whole
233  * subnet when prev_responded_ip does not respond for kMaxFailures times */
235  uint32_t arp_reply_count;
237  uint32_t arp_send_count;
238  uint32_t arp_retry_count; //used by UT
239  uint32_t arp_try_count;
242  arp_try_count(0) {
243  }
244 };
245 //Stucture used to retry ARP queries when a particular route is in
246 //backup state.
248 public:
249  static const uint32_t kMaxRetry = 30 * 5; //retries upto 5 minutes,
250  //30 tries/per minutes
251  static const uint32_t kTimeout = 2000;
252  static const uint32_t kArpTryCount = 9;
253  typedef std::map<uint32_t, InterfaceArpPathPreferenceInfo>
255  typedef std::pair<uint32_t, InterfaceArpPathPreferenceInfo>
257  typedef std::set<uint32_t> ArpTransmittedIntfMap;
258 
259  ArpPathPreferenceState(ArpVrfState *state, uint32_t vrf_id,
260  const IpAddress &vm_ip, uint8_t plen);
262 
263  bool SendArpRequest();
264  bool SendArpRequest(WaitForTrafficIntfMap &wait_for_traffic_map,
265  ArpTransmittedIntfMap &arp_transmitted_intf_map);
266  void SendArpRequestForAllIntf(const AgentRoute *route);
267  void StartTimer();
268 
270  return vrf_state_;
271  }
272 
273  const IpAddress& ip() const { return vm_ip_; }
274  uint8_t plen() const { return plen_; }
276  MacAddress mac(void) const { return mac_; }
277  uint32_t vrf_id() const { return vrf_id_; }
278  void HandleArpReply(Ip4Address sip, uint32_t itf);
279 
280 
281  bool IntfPresentInIpMap(uint32_t id) {
282  if (l3_wait_for_traffic_map_.find(id) ==
283  l3_wait_for_traffic_map_.end()) {
284  return false;
285  }
286  return true;
287  }
288 
289  bool IntfPresentInEvpnMap(uint32_t id) {
290  if (evpn_wait_for_traffic_map_.find(id) ==
292  return false;
293  }
294  return true;
295  }
296 
297  uint32_t IntfRetryCountInIpMap(uint32_t id) {
299  }
300 
301  uint32_t IntfRetryCountInEvpnMap(uint32_t id) {
303  }
304 
305 private:
306  uint32_t GetRetryCount(uint32_t id, WaitForTrafficIntfMap &imap) {
307  WaitForTrafficIntfMap::iterator it = imap.find(id);
308  if (it == imap.end()) {
309  return 0;
310  }
311  return it->second.arp_retry_count;
312  }
317  uint32_t vrf_id_;
319  uint8_t plen_;
323  std::atomic<int> refcount_;
324 };
325 
326 typedef boost::intrusive_ptr<ArpPathPreferenceState> ArpPathPreferenceStatePtr;
327 
330 
333  const ArpPathPreferenceStateKey &rhs) const {
334  return lhs.IsLess(rhs);
335  }
336 };
337 
338 struct ArpVrfState : public DBState {
339 public:
340  typedef std::map<ArpPathPreferenceStateKey,
343  typedef std::pair<ArpPathPreferenceStateKey,
346  AgentRouteTable *table, AgentRouteTable *evpn_table);
347  ~ArpVrfState();
348  void RouteUpdate(DBTablePartBase *part, DBEntryBase *entry);
349  void EvpnRouteUpdate(DBTablePartBase *part, DBEntryBase *entry);
350  void ManagedDelete() { deleted = true;}
351  void Delete();
352  bool DeleteRouteState(DBTablePartBase *part, DBEntryBase *entry);
354  bool PreWalkDone(DBTableBase *partition);
355  static void WalkDone(DBTableBase *partition, ArpVrfState *state);
356 
357  ArpPathPreferenceState* Locate(const IpAddress &ip, uint8_t plen);
358  void Erase(const IpAddress &ip, uint8_t plen);
359  ArpPathPreferenceState* Get(const IpAddress ip, uint8_t plen=32);
360 
361  bool l3_walk_completed() const {
362  return l3_walk_completed_;
363  }
364 
365  bool evpn_walk_completed() const {
366  return evpn_walk_completed_;
367  }
368 
378  bool deleted;
384  friend class ArpProto;
385 };
386 
387 class ArpDBState : public DBState {
388 public:
389  static const uint32_t kMaxRetry = 30 * 5; //retries upto 5 minutes,
390  //30 tries/per minutes
391  static const uint32_t kTimeout = 2000;
392 
393  ArpDBState(ArpVrfState *vrf_state, uint32_t vrf_id,
394  IpAddress vm_ip_addr, uint8_t plen);
395  ~ArpDBState();
396  void UpdateMac(const InterfaceNH *nh);
397  void Update(const AgentRoute *route);
398  void UpdateArpRoutes(const InetUnicastRouteEntry *route);
399  void Delete(const InetUnicastRouteEntry *rt);
400 private:
404  bool policy_;
408 };
409 
410 class ArpInterfaceState : public DBState {
411 public:
414  void SetVrf(VrfEntry *vrf, VrfEntry *fabric_vrf);
415 
416 private:
417  void WalkDone(DBTableBase *part);
418  bool WalkNotify(DBTablePartBase *partition, DBEntryBase *entry);
419 
424 };
425 #endif // vnsw_agent_arp_proto_hpp
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
boost::intrusive_ptr< const Interface > InterfaceConstRef
Definition: agent.h:51
std::vector< int > TagList
Definition: agent.h:202
std::vector< int > SecurityGroupList
Definition: agent.h:201
std::set< std::string > VnListType
Definition: agent.h:212
boost::intrusive_ptr< Interface > InterfaceRef
Definition: agent.h:49
void intrusive_ptr_add_ref(ArpPathPreferenceState *aps)
Definition: arp_proto.cc:116
void intrusive_ptr_release(ArpPathPreferenceState *aps)
Definition: arp_proto.cc:120
boost::intrusive_ptr< ArpPathPreferenceState > ArpPathPreferenceStatePtr
Definition: arp_proto.h:326
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
ArpDBState(ArpVrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
Definition: arp_proto.cc:315
void Delete(const InetUnicastRouteEntry *rt)
Definition: arp_proto.cc:354
bool resolve_route_
Definition: arp_proto.h:405
ArpVrfState * vrf_state_
Definition: arp_proto.h:401
static const uint32_t kMaxRetry
Definition: arp_proto.h:389
bool policy_
Definition: arp_proto.h:404
ArpPathPreferenceStatePtr arp_path_preference_state_
Definition: arp_proto.h:407
SecurityGroupList sg_list_
Definition: arp_proto.h:402
TagList tag_list_
Definition: arp_proto.h:403
static const uint32_t kTimeout
Definition: arp_proto.h:391
void Update(const AgentRoute *route)
Definition: arp_proto.cc:374
void UpdateMac(const InterfaceNH *nh)
Definition: arp_proto.cc:326
void UpdateArpRoutes(const InetUnicastRouteEntry *route)
Definition: arp_proto.cc:336
VnListType vn_list_
Definition: arp_proto.h:406
void SetVrf(VrfEntry *vrf, VrfEntry *fabric_vrf)
Definition: arp_proto.cc:987
DBTable::DBTableWalkRef walk_ref_
Definition: arp_proto.h:423
bool WalkNotify(DBTablePartBase *partition, DBEntryBase *entry)
Definition: arp_proto.cc:1022
VrfEntryRef vrf_
Definition: arp_proto.h:421
void WalkDone(DBTableBase *part)
Definition: arp_proto.cc:1019
VrfEntryRef fabric_vrf_
Definition: arp_proto.h:422
InterfaceRef intf_
Definition: arp_proto.h:420
ArpInterfaceState(Interface *intf)
Definition: arp_proto.cc:977
std::map< uint32_t, InterfaceArpPathPreferenceInfo > WaitForTrafficIntfMap
Definition: arp_proto.h:254
friend void intrusive_ptr_add_ref(ArpPathPreferenceState *aps)
Definition: arp_proto.cc:116
void SendArpRequestForAllIntf(const AgentRoute *route)
Definition: arp_proto.cc:254
std::atomic< int > refcount_
Definition: arp_proto.h:323
uint32_t IntfRetryCountInIpMap(uint32_t id)
Definition: arp_proto.h:297
std::set< uint32_t > ArpTransmittedIntfMap
Definition: arp_proto.h:257
friend void intrusive_ptr_release(ArpPathPreferenceState *aps)
Definition: arp_proto.cc:120
std::pair< uint32_t, InterfaceArpPathPreferenceInfo > WaitForTrafficIntfPair
Definition: arp_proto.h:256
MacAddress mac(void) const
Definition: arp_proto.h:276
void set_mac(MacAddress mac)
Definition: arp_proto.h:275
uint32_t vrf_id() const
Definition: arp_proto.h:277
WaitForTrafficIntfMap evpn_wait_for_traffic_map_
Definition: arp_proto.h:322
bool IntfPresentInEvpnMap(uint32_t id)
Definition: arp_proto.h:289
static const uint32_t kArpTryCount
Definition: arp_proto.h:252
static const uint32_t kMaxRetry
Definition: arp_proto.h:249
void HandleArpReply(Ip4Address sip, uint32_t itf)
Definition: arp_proto.cc:935
static const uint32_t kTimeout
Definition: arp_proto.h:251
const IpAddress & ip() const
Definition: arp_proto.h:273
bool IntfPresentInIpMap(uint32_t id)
Definition: arp_proto.h:281
WaitForTrafficIntfMap l3_wait_for_traffic_map_
Definition: arp_proto.h:321
uint8_t plen() const
Definition: arp_proto.h:274
ArpPathPreferenceState(ArpVrfState *state, uint32_t vrf_id, const IpAddress &vm_ip, uint8_t plen)
Definition: arp_proto.cc:129
uint32_t IntfRetryCountInEvpnMap(uint32_t id)
Definition: arp_proto.h:301
ArpVrfState * vrf_state_
Definition: arp_proto.h:315
ArpVrfState * vrf_state()
Definition: arp_proto.h:269
uint32_t GetRetryCount(uint32_t id, WaitForTrafficIntfMap &imap)
Definition: arp_proto.h:306
std::size_t GetArpCacheSize()
Definition: arp_proto.h:104
void IncrementStatsInvalidAddress()
Definition: arp_proto.h:149
std::map< ArpKey, ArpEntry * > ArpCache
Definition: arp_proto.h:30
uint32_t retry_timeout_
Definition: arp_proto.h:209
const InterfaceArpMap & interface_arp_map()
Definition: arp_proto.h:107
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Definition: arp_proto.cc:62
std::map< uint32_t, InterfaceArpInfo > InterfaceArpMap
Definition: arp_proto.h:90
bool DeleteArpEntry(ArpEntry *entry)
Definition: arp_proto.cc:864
InterfaceArpMap interface_arp_map_
Definition: arp_proto.h:206
ArpIterator FindUpperBoundArpEntry(const ArpKey &key)
Definition: arp_proto.cc:926
bool ValidateAndClearVrfState(VrfEntry *vrf, const ArpVrfState *vrf_state)
Definition: arp_proto.cc:892
DBTableBase::ListenerId vrf_table_listener_id() const
Definition: arp_proto.h:182
void IncrementStatsArpReq()
Definition: arp_proto.h:129
bool AddArpEntry(ArpEntry *entry)
Definition: arp_proto.cc:838
const ArpStats & GetStats() const
Definition: arp_proto.h:156
static const uint16_t kMaxRetries
Definition: arp_proto.h:26
void InterfaceNotify(DBEntryBase *entry)
Definition: arp_proto.cc:599
void IncrementStatsArpRequest(uint32_t idx)
Definition: arp_proto.cc:704
GratuitousArpCache gratuitous_arp_cache_
Definition: arp_proto.h:198
uint32_t aging_timeout() const
Definition: arp_proto.h:170
uint16_t max_retries_
Definition: arp_proto.h:208
virtual ~ArpProto()
Definition: arp_proto.cc:38
Interface * ip_fabric_interface_
Definition: arp_proto.h:202
void IncrementStatsErrors()
Definition: arp_proto.h:134
std::pair< ArpKey, ArpEntrySet > GratuitousArpCachePair
Definition: arp_proto.h:36
DISALLOW_COPY_AND_ASSIGN(ArpProto)
std::pair< ArpKey, ArpEntry * > ArpCachePair
Definition: arp_proto.h:31
DBTableBase::ListenerId nexthop_table_listener_id_
Definition: arp_proto.h:205
const ArpCache & arp_cache()
Definition: arp_proto.h:105
void IncrementStatsArpReplies()
Definition: arp_proto.h:130
Interface * ip_fabric_interface() const
Definition: arp_proto.h:109
uint32_t ip_fabric_interface_index_
Definition: arp_proto.h:200
void set_retry_timeout(uint32_t timeout)
Definition: arp_proto.h:172
void ClearInterfaceArpStats(uint32_t idx)
Definition: arp_proto.cc:734
void set_max_retries(uint16_t retries)
Definition: arp_proto.h:171
static const uint32_t kAgingTimeout
Definition: arp_proto.h:28
std::map< ArpKey, ArpEntrySet > GratuitousArpCache
Definition: arp_proto.h:35
void AddGratuitousArpEntry(ArpKey &key)
Definition: arp_proto.cc:771
void VrfNotify(DBTablePartBase *part, DBEntryBase *entry)
Definition: arp_proto.cc:67
InterfaceArpInfo & ArpMapIndexToEntry(uint32_t idx)
Definition: arp_proto.cc:692
uint32_t ip_fabric_interface_index() const
Definition: arp_proto.h:110
void IncrementStatsMaxRetries()
Definition: arp_proto.h:133
std::set< ArpEntry * > ArpEntrySet
Definition: arp_proto.h:34
void HandlePathPreferenceArpReply(const VrfEntry *vrf, uint32_t itf, Ip4Address sip)
Definition: arp_proto.cc:954
uint16_t max_retries() const
Definition: arp_proto.h:168
bool TimerExpiry(ArpKey &key, uint32_t timer_type, const Interface *itf)
Definition: arp_proto.cc:760
MacAddress ip_fabric_interface_mac_
Definition: arp_proto.h:201
static const uint32_t kGratRetryTimeout
Definition: arp_proto.h:25
void IncrementStatsVmArpReq()
Definition: arp_proto.h:136
void set_ip_fabric_interface_mac(const MacAddress &mac)
Definition: arp_proto.h:120
uint32_t ArpResolvedStatsCounter(uint32_t idx)
Definition: arp_proto.cc:729
ArpEntry * GratuitousArpEntry(const ArpKey &key, const Interface *intf)
Definition: arp_proto.cc:793
void DeleteGratuitousArpEntry(ArpEntry *entry)
Definition: arp_proto.cc:776
void IncrementStatsResolved()
Definition: arp_proto.h:132
void NextHopNotify(DBEntryBase *entry)
Definition: arp_proto.cc:739
ArpIterator FindLowerBoundArpEntry(const ArpKey &key)
Definition: arp_proto.cc:931
void IncrementStatsInvalidPackets()
Definition: arp_proto.h:137
void IncrementStatsInvalidVrf()
Definition: arp_proto.h:145
void IncrementStatsInvalidInterface()
Definition: arp_proto.h:141
void SendArpIpc(ArpProto::ArpMsgType type, in_addr_t ip, const VrfEntry *vrf, InterfaceConstRef itf)
Definition: arp_proto.cc:826
void Shutdown()
Definition: arp_proto.cc:41
static const uint32_t kRetryTimeout
Definition: arp_proto.h:27
void IncrementStatsIPFabricNotInst()
Definition: arp_proto.h:154
ArpProto::GratuitousArpIterator GratuitousArpEntryIterator(const ArpKey &key, bool *key_valid)
Definition: arp_proto.cc:809
bool run_with_vrouter_
Definition: arp_proto.h:199
void set_ip_fabric_interface_index(uint32_t ind)
Definition: arp_proto.h:117
DBTableBase::ListenerId interface_table_listener_id_
Definition: arp_proto.h:204
ArpEntry * FindArpEntry(const ArpKey &key)
Definition: arp_proto.cc:885
std::map< ArpKey, ArpEntry * >::iterator ArpIterator
Definition: arp_proto.h:32
static const uint16_t kGratRetries
Definition: arp_proto.h:23
void IncrementStatsGratuitous()
Definition: arp_proto.h:131
uint32_t aging_timeout_
Definition: arp_proto.h:210
uint32_t ArpRequestStatsCounter(uint32_t idx)
Definition: arp_proto.cc:719
std::pair< uint32_t, InterfaceArpInfo > InterfaceArpPair
Definition: arp_proto.h:91
std::set< ArpKey > ArpKeySet
Definition: arp_proto.h:33
void set_aging_timeout(uint32_t timeout)
Definition: arp_proto.h:173
void IncrementStatsArpReply(uint32_t idx)
Definition: arp_proto.cc:709
void ClearStats()
Definition: arp_proto.h:157
ArpStats arp_stats_
Definition: arp_proto.h:197
const GratuitousArpCache & gratuitous_arp_cache()
Definition: arp_proto.h:106
DBTableBase::ListenerId vrf_table_listener_id_
Definition: arp_proto.h:203
ArpProto(Agent *agent, boost::asio::io_context &io, bool run_with_vrouter)
Definition: arp_proto.cc:19
uint32_t ArpReplyStatsCounter(uint32_t idx)
Definition: arp_proto.cc:724
ArpCache arp_cache_
Definition: arp_proto.h:196
void set_ip_fabric_interface(Interface *itf)
Definition: arp_proto.h:116
std::map< ArpKey, ArpEntrySet >::iterator GratuitousArpIterator
Definition: arp_proto.h:37
@ GRATUITOUS_TIMER_EXPIRED
Definition: arp_proto.h:45
@ ARP_RESOLVE
Definition: arp_proto.h:40
@ RETRY_TIMER_EXPIRED
Definition: arp_proto.h:43
@ AGING_TIMER_EXPIRED
Definition: arp_proto.h:44
@ ARP_DELETE
Definition: arp_proto.h:41
@ ARP_SEND_GRATUITOUS
Definition: arp_proto.h:42
const MacAddress & ip_fabric_interface_mac() const
Definition: arp_proto.h:113
static const uint16_t kMaxFailures
Definition: arp_proto.h:24
uint32_t retry_timeout() const
Definition: arp_proto.h:169
void IncrementStatsVmGarpReq()
Definition: arp_proto.h:135
DBTableBase::ListenerId interface_table_listener_id() const
Definition: arp_proto.h:185
int ListenerId
Definition: db_table.h:62
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
Definition: db_table.h:169
Definition: timer.h:57
Definition: vrf.h:89
uint8_t type
Definition: load_balance.h:2
Definition: io_utils.cc:11
bool operator()(const ArpPathPreferenceStateKey &lhs, const ArpPathPreferenceStateKey &rhs) const
Definition: arp_proto.h:332
ArpPathPreferenceStateKey(const IpAddress &addr, uint8_t len)
Definition: arp_proto.h:218
bool IsLess(const ArpPathPreferenceStateKey &key) const
Definition: arp_proto.h:220
ArpIpc(ArpProto::ArpMsgType msg, in_addr_t ip, const VrfEntry *vrf, InterfaceConstRef itf)
Definition: arp_proto.h:51
ArpIpc(ArpProto::ArpMsgType msg, ArpKey &akey, InterfaceConstRef itf)
Definition: arp_proto.h:49
InterfaceConstRef interface_
Definition: arp_proto.h:56
uint32_t resolved
Definition: arp_proto.h:72
uint32_t arp_replies
Definition: arp_proto.h:70
uint32_t ipfabric_not_inst
Definition: arp_proto.h:82
uint32_t agent_not_inst
Definition: arp_proto.h:81
uint32_t arp_gratuitous
Definition: arp_proto.h:71
uint32_t arp_invalid_address
Definition: arp_proto.h:78
uint32_t vm_garp_req
Definition: arp_proto.h:80
uint32_t arp_invalid_packets
Definition: arp_proto.h:75
uint32_t errors
Definition: arp_proto.h:74
uint32_t arp_req
Definition: arp_proto.h:69
uint32_t arp_invalid_interface
Definition: arp_proto.h:76
uint32_t max_retries_exceeded
Definition: arp_proto.h:73
uint32_t vm_arp_req
Definition: arp_proto.h:79
uint32_t arp_invalid_vrf
Definition: arp_proto.h:77
ArpPathPreferenceState * Get(const IpAddress ip, uint8_t plen=32)
Definition: arp_proto.cc:569
std::pair< ArpPathPreferenceStateKey, ArpPathPreferenceState * > ArpPathPreferenceStatePair
Definition: arp_proto.h:344
ArpPathPreferenceState * Locate(const IpAddress &ip, uint8_t plen)
Definition: arp_proto.cc:547
static void WalkDone(DBTableBase *partition, ArpVrfState *state)
Definition: arp_proto.cc:518
bool l3_walk_completed_
Definition: arp_proto.h:382
bool deleted
Definition: arp_proto.h:378
bool DeleteRouteState(DBTablePartBase *part, DBEntryBase *entry)
Definition: arp_proto.cc:496
Agent * agent
Definition: arp_proto.h:369
ArpVrfState(Agent *agent, ArpProto *proto, VrfEntry *vrf, AgentRouteTable *table, AgentRouteTable *evpn_table)
Definition: arp_proto.cc:578
bool DeleteEvpnRouteState(DBTablePartBase *part, DBEntryBase *entry)
Definition: arp_proto.cc:501
DBTable::DBTableWalkRef managed_delete_walk_ref
Definition: arp_proto.h:380
ArpProto * arp_proto
Definition: arp_proto.h:370
LifetimeRef< ArpVrfState > table_delete_ref
Definition: arp_proto.h:376
DBTableBase::ListenerId evpn_route_table_listener_id
Definition: arp_proto.h:375
VrfEntry * vrf
Definition: arp_proto.h:371
LifetimeRef< ArpVrfState > evpn_table_delete_ref
Definition: arp_proto.h:377
bool PreWalkDone(DBTableBase *partition)
Definition: arp_proto.cc:534
DBTableBase::ListenerId route_table_listener_id
Definition: arp_proto.h:374
void Erase(const IpAddress &ip, uint8_t plen)
Definition: arp_proto.cc:560
void Delete()
Definition: arp_proto.cc:508
void RouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
Definition: arp_proto.cc:437
AgentRouteTable * rt_table
Definition: arp_proto.h:372
bool evpn_walk_completed() const
Definition: arp_proto.h:365
void EvpnRouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
Definition: arp_proto.cc:410
void ManagedDelete()
Definition: arp_proto.h:350
bool l3_walk_completed() const
Definition: arp_proto.h:361
ArpPathPreferenceStateMap arp_path_preference_map_
Definition: arp_proto.h:381
DBTable::DBTableWalkRef evpn_walk_ref_
Definition: arp_proto.h:379
bool evpn_walk_completed_
Definition: arp_proto.h:383
AgentRouteTable * evpn_rt_table
Definition: arp_proto.h:373
std::map< ArpPathPreferenceStateKey, ArpPathPreferenceState *, ArpPathPreferenceCmp > ArpPathPreferenceStateMap
Definition: arp_proto.h:342