OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ndp_entry.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_ndp_entry_hpp
6 #define vnsw_agent_ndp_entry_hpp
7 
8 
9 #include "base/timer.h"
10 #include <boost/statechart/state_machine.hpp>
11 #include <netinet/icmp6.h>
13 
14 namespace sc = boost::statechart;
15 class NdpEntry;
16 
17 namespace fsm {
18 struct NoState;
19 }
20 
21 struct NdpKey {
22  NdpKey(Ip6Address addr, const VrfEntry *ventry) : ip(addr), vrf(ventry) {};
23  NdpKey(const NdpKey &key) : ip(key.ip), vrf(key.vrf) {};
24  bool operator <(const NdpKey &rhs) const {
25  if (vrf != rhs.vrf)
26  return vrf < rhs.vrf;
27  return (ip < rhs.ip);
28  }
29 
31  const VrfEntry *vrf;
32 };
33 
34 typedef boost::function<bool(NdpEntry*)> EvValidate;
35 
36 // Represents each NDP entry maintained by the Icmpv6 module
37 class NdpEntry : public sc::state_machine<NdpEntry, fsm::NoState> {
38 public:
39  NdpEntry(boost::asio::io_context &io, Icmpv6Handler *handler,
40  NdpKey &key, const VrfEntry *vrf, const Interface *itf);
41  virtual ~NdpEntry();
42 
43  typedef boost::function<void(void)> EventCB;
44 
45  static const int kMaxRetries;
46  static const int kMaxUnicastRetries;
47 
48  enum State {
49  NOSTATE = 0,
51  REACHABLE = 2,
52  STALE = 3,
53  DELAY = 4,
54  PROBE = 5
55  };
56 
57  const NdpKey &key() const { return key_; }
58  const Interface *get_interface() const { return interface_.get(); }
59 
60  void StartRetransmitTimer();
61  void StartReachableTimer();
62  void StartDelayTimer();
63  void DeleteAllTimers();
64 
65  const std::string &StateName() const;
66  const std::string &LastStateName() const;
67 
68  struct EventContainer {
69  boost::intrusive_ptr<const sc::event_base> event;
71  };
72 
73  int retry_count() const { return retry_count_; }
76  void retry_count_set(int rc) { retry_count_ = rc; }
77 
78  int retransmit_time() const { return retransmit_time_; }
80  int reachable_time() const { return reachable_time_; }
81  void set_reachable_time(int t) { reachable_time_ = t; }
82 
83  void set_state(State state);
84  State get_state() const { return state_; }
85  const std::string last_state_change_at() const;
86  const uint64_t last_state_change_usecs_at() const;
87  void set_last_event(const std::string &event);
88  const std::string &last_event() const { return last_event_; }
89  MacAddress mac() const { return mac_; }
90  void set_mac(MacAddress mac) { mac_ = mac; }
91 
92  void set_last_notification_in(int code, int subcode,
93  const std::string &reason);
94  void set_last_notification_out(int code, int subcode,
95  const std::string &reason);
96  void reset_last_info();
97  void LogEvent(std::string event_name, std::string msg,
98  SandeshLevel::type log_level = SandeshLevel::SYS_DEBUG);
100  bool ReachableTimerExpired();
101  bool DelayTimerExpired();
102  bool EnqueuePktOut();
103  bool EnqueueTestStateChange(State state, int retry_count);
107  bool EnqueueNaIn(nd_neighbor_advert *na, MacAddress mac);
108  bool EnqueueSolNaIn(nd_neighbor_advert *na, MacAddress mac);
109  bool EnqueueUnsolNaIn(nd_neighbor_advert *na, MacAddress mac);
110  bool EnqueueNsIn(nd_neighbor_solicit *ns, MacAddress mac);
111 
112  template <typename Ev> bool Enqueue(const Ev &event);
113  bool DequeueEvent(EventContainer ec);
114  void DequeueEventDone(bool done);
115  void UpdateFlapCount();
119 
120  bool DeleteNdpRoute();
121  bool IsResolved();
122  void Resync(bool policy, const VnListType &vnlist,
123  const SecurityGroupList &sg,
124  const TagList &tag);
125  void HandleNsRequest(nd_neighbor_solicit *ns, MacAddress mac);
126  void SendNeighborSolicit(bool send_unicast=false);
127  void SendNeighborAdvert(bool solicited);
128 private:
129  void AddNdpRoute(bool resolved);
130  bool IsDerived();
131 
140  bool deleted_;
144  std::string last_event_;
145  uint64_t last_event_at_;
147  std::pair<int, int> last_notification_in_;
150  std::pair<int, int> last_notification_out_;
153  boost::asio::io_context &io_;
156  boost::intrusive_ptr<Icmpv6Handler> handler_;
159 };
160 
161 #endif // vnsw_agent_ndp_entry_hpp
bool EnqueueDelayTimerExpired()
Definition: ndp_entry.cc:712
boost::intrusive_ptr< Icmpv6Handler > handler_
Definition: ndp_entry.h:156
uint64_t last_notification_in_at_
Definition: ndp_entry.h:149
const std::string & LastStateName() const
Definition: ndp_entry.cc:757
bool DeleteNdpRoute()
Definition: ndp_entry.cc:1005
Ip6Address ip
Definition: ndp_entry.h:30
std::pair< int, int > last_notification_out_
Definition: ndp_entry.h:150
Definition: vrf.h:86
std::string last_notification_in_error_
Definition: ndp_entry.h:148
WorkQueue< EventContainer > work_queue_
Definition: ndp_entry.h:132
DISALLOW_COPY_AND_ASSIGN(NdpEntry)
void SendNeighborSolicit(bool send_unicast=false)
Definition: ndp_entry.cc:885
int retry_count() const
Definition: ndp_entry.h:73
int retransmit_time() const
Definition: ndp_entry.h:78
uint64_t last_notification_out_at_
Definition: ndp_entry.h:152
std::vector< int > SecurityGroupList
Definition: agent.h:201
void StartReachableTimer()
Definition: ndp_entry.cc:670
boost::asio::io_context & io_
Definition: ndp_entry.h:153
void StartDelayTimer()
Definition: ndp_entry.cc:661
NdpKey key_
Definition: ndp_entry.h:154
NdpEntry(boost::asio::io_context &io, Icmpv6Handler *handler, NdpKey &key, const VrfEntry *vrf, const Interface *itf)
Definition: ndp_entry.cc:619
std::string last_notification_out_error_
Definition: ndp_entry.h:151
const std::string last_state_change_at() const
Definition: ndp_entry.cc:761
uint64_t last_event_at_
Definition: ndp_entry.h:145
State get_state() const
Definition: ndp_entry.h:84
bool IsResolved()
Definition: ndp_entry.cc:872
bool RetransmitTimerExpired()
Definition: ndp_entry.cc:694
bool EnqueuePktOut()
Definition: ndp_entry.cc:704
boost::function< void(void)> EventCB
Definition: ndp_entry.h:43
void set_mac(MacAddress mac)
Definition: ndp_entry.h:90
void set_last_notification_out(int code, int subcode, const std::string &reason)
Definition: ndp_entry.cc:835
int reachable_time() const
Definition: ndp_entry.h:80
bool operator<(const NdpKey &rhs) const
Definition: ndp_entry.h:24
void Resync(bool policy, const VnListType &vnlist, const SecurityGroupList &sg, const TagList &tag)
Definition: ndp_entry.cc:1033
State last_state_
Definition: ndp_entry.h:142
NdpKey(const NdpKey &key)
Definition: ndp_entry.h:23
bool EnqueueUnsolNaIn(nd_neighbor_advert *na, MacAddress mac)
Definition: ndp_entry.cc:729
Timer * reachable_timer_
Definition: ndp_entry.h:135
static const int kMaxRetries
Definition: ndp_entry.h:45
boost::function< bool(StateMachine *)> EvValidate
Definition: state_machine.h:33
Timer * reachable_timer()
Definition: ndp_entry.h:117
void AddNdpRoute(bool resolved)
Definition: ndp_entry.cc:943
bool EnqueueNsIn(nd_neighbor_solicit *ns, MacAddress mac)
Definition: ndp_entry.cc:716
bool Enqueue(const Ev &event)
Definition: ndp_entry.cc:798
void reset_last_info()
Definition: ndp_entry.cc:859
void UpdateFlapCount()
uint8_t type
Definition: load_balance.h:109
bool EnqueueRetransmitTimerExpired()
Definition: ndp_entry.cc:708
void StartRetransmitTimer()
Definition: ndp_entry.cc:684
Timer * delay_timer_
Definition: ndp_entry.h:133
std::string last_event_
Definition: ndp_entry.h:144
void DeleteAllTimers()
Definition: ndp_entry.cc:655
int delay_time_
Definition: ndp_entry.h:137
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
void set_state(State state)
Definition: ndp_entry.cc:851
bool EnqueueReachableTimerExpired()
State state_
Definition: ndp_entry.h:141
const VrfEntry * vrf
Definition: ndp_entry.h:31
boost::intrusive_ptr< const Interface > InterfaceConstRef
Definition: agent.h:51
const Interface * get_interface() const
Definition: ndp_entry.h:58
NdpKey(Ip6Address addr, const VrfEntry *ventry)
Definition: ndp_entry.h:22
void SendNeighborAdvert(bool solicited)
Definition: ndp_entry.cc:899
bool EnqueueTestStateChange(State state, int retry_count)
Definition: ndp_entry.cc:739
uint64_t last_state_change_at_
Definition: ndp_entry.h:146
bool IsDerived()
Definition: ndp_entry.cc:877
std::set< std::string > VnListType
Definition: agent.h:212
bool DequeueEvent(EventContainer ec)
Definition: ndp_entry.cc:814
const std::string & last_event() const
Definition: ndp_entry.h:88
bool EnqueueSolNaIn(nd_neighbor_advert *na, MacAddress mac)
Definition: ndp_entry.cc:734
void retry_count_inc()
Definition: ndp_entry.h:74
void HandleNsRequest(nd_neighbor_solicit *ns, MacAddress mac)
Definition: ndp_entry.cc:934
void set_last_event(const std::string &event)
Definition: ndp_entry.cc:830
void retry_count_set(int rc)
Definition: ndp_entry.h:76
MacAddress mac_
Definition: ndp_entry.h:143
static const int kMaxUnicastRetries
Definition: ndp_entry.h:46
MacAddress mac() const
Definition: ndp_entry.h:89
int retry_count_
Definition: ndp_entry.h:139
bool DelayTimerExpired()
Definition: ndp_entry.cc:699
void set_retransmit_time(int t)
Definition: ndp_entry.h:79
virtual ~NdpEntry()
Definition: ndp_entry.cc:647
Timer * retransmit_timer()
Definition: ndp_entry.h:116
std::pair< int, int > last_notification_in_
Definition: ndp_entry.h:147
const uint64_t last_state_change_usecs_at() const
Definition: ndp_entry.cc:765
int retransmit_time_
Definition: ndp_entry.h:136
boost::intrusive_ptr< const sc::event_base > event
Definition: ndp_entry.h:69
InterfaceConstRef interface_
Definition: ndp_entry.h:157
Timer * delay_timer()
Definition: ndp_entry.h:118
Definition: timer.h:54
const NdpKey & key() const
Definition: ndp_entry.h:57
int reachable_time_
Definition: ndp_entry.h:138
Timer * retransmit_timer_
Definition: ndp_entry.h:134
const VrfEntry * nh_vrf_
Definition: ndp_entry.h:155
void LogEvent(std::string event_name, std::string msg, SandeshLevel::type log_level=SandeshLevel::SYS_DEBUG)
Definition: ndp_entry.cc:809
void set_last_notification_in(int code, int subcode, const std::string &reason)
Definition: ndp_entry.cc:843
void DequeueEventDone(bool done)
Definition: ndp_entry.cc:827
bool ReachableTimerExpired()
Definition: ndp_entry.cc:679
void retry_count_clear()
Definition: ndp_entry.h:75
bool EnqueueNaIn(nd_neighbor_advert *na, MacAddress mac)
Definition: ndp_entry.cc:720
const std::string & StateName() const
Definition: ndp_entry.cc:753
bool deleted_
Definition: ndp_entry.h:140
void set_reachable_time(int t)
Definition: ndp_entry.h:81
std::vector< int > TagList
Definition: agent.h:202