52 boost::asio::io_context &io) {
90 boost::system::error_code ec;
123 boost::system::error_code ec;
247 static_cast<const Interface *>(intf_nh->
GetInterface()) : NULL;
419 agent_(agent_ptr), icmp_proto_(proto), vrf_(vrf_entry), rt_table_(table),
420 evpn_rt_table_(evpn_rt_table),
422 evpn_route_table_listener_id_(
DBTableBase::kInvalidId),
423 table_delete_ref_(this, table->
deleter()),
424 evpn_table_delete_ref_(this, evpn_rt_table_->
deleter()),
426 default_routes_added_(false), l3_walk_completed_(false),
427 evpn_walk_completed_(false) {
446 int prev = ps->
refcount_.fetch_and_decrement();
456 vrf_state_(vrf_state), ns_req_timer_(NULL), vrf_id_(vrf_id), vm_ip_(ip),
470 &wait_for_traffic_map,
472 &nd_transmitted_map) {
480 WaitForTrafficIntfMap::iterator it = wait_for_traffic_map.begin();
481 for (;it != wait_for_traffic_map.end(); it++) {
489 bool inserted = nd_transmitted_map.insert(it->first).second;
491 if (inserted ==
false) {
496 GetMacIpLearningTable()->GetPairedMacAddress(
504 GetMacIpLearningTable()->MacIpEntryUnreachable(
555 "Neighbor Solicit Request timer for VM",
590 if (dynamic_cast<const InetUnicastRouteEntry *>(route)) {
591 wait_for_traffic_map = l3_wait_for_traffic_map_;
595 for (Route::PathList::const_iterator it = route->
GetPathList().begin();
613 if (dynamic_cast<const InetUnicastRouteEntry *>(route)) {
625 uint32_t intf_id = intf->
id();
626 WaitForTrafficIntfMap::const_iterator wait_for_traffic_it =
627 wait_for_traffic_map.find(intf_id);
628 if (wait_for_traffic_it == wait_for_traffic_map.end()) {
630 new_wait_for_traffic_map.insert(std::make_pair(intf_id, data));
632 new_wait_for_traffic_map.insert(std::make_pair(intf_id,
633 wait_for_traffic_it->second));
639 if (dynamic_cast<const InetUnicastRouteEntry *>(route)) {
640 l3_wait_for_traffic_map_ = new_wait_for_traffic_map;
642 evpn_wait_for_traffic_map_ = new_wait_for_traffic_map;
644 if (new_wait_for_traffic_map.size() > 0) {
645 SendNeighborSolicit();
727 return *iter->second.begin();
744 iter->second.erase(entry);
746 if (iter->second.empty()) {
757 for (NdpEntrySet::iterator sit = it->second.begin();
758 sit != it->second.end(); sit++) {
779 if (state == NULL || state->
deleted() ==
true)
791 if (state == NULL || state->
deleted() ==
true)
803 NdpKeySet::iterator key_it = intf_entry.
ndp_key_list.find(entry->
key());
uint8_t prefix_length() const
!
std::map< NdpKey, NdpEntrySet >::iterator UnsolNaIterator
DBTable::DBTableWalkRef managed_delete_walk_ref()
void SetBounded(bool bounded)
const Interface * GetInterface() const
int intrusive_ptr_add_ref(const AsPath *cpath)
NdpEntry * FindNdpEntry(const NdpKey &key)
bool l3_walk_completed() const
Icmpv6Proto * icmp_proto_
Icmpv6PathPreferenceState * Locate(const IpAddress &ip)
void HandlePathPreferenceNA(const VrfEntry *, uint32_t, IpAddress)
ProtoWorkQueue work_queue_
bool DeleteNdpEntry(NdpEntry *entry)
void SendMessage(PktModuleName mod, InterTaskMsg *msg)
uint32_t icmpv6_ping_request_
static const uint8_t kMaxV6PrefixLen
static const uint32_t kNSTryCount
std::pair< VmInterface *, Icmpv6Stats > VmInterfacePair
Icmpv6Proto * icmp_proto() const
const PathPreference & path_preference() const
AgentRouteTable * GetEvpnRouteTable() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void VrfNotify(DBTablePartBase *part, DBEntryBase *entry)
DBTable::DBTableWalkRef evpn_walk_ref()
Icmpv6VrfState(Agent *agent, Icmpv6Proto *proto, VrfEntry *vrf, AgentRouteTable *table, AgentRouteTable *evpn_table)
InetUnicastAgentRouteTable * fabric_inet4_unicast_table() const
const uint32_t id() const
NextHopTable * nexthop_table() const
Icmpv6VrfState * vrf_state_
WaitForTrafficIntfMap l3_wait_for_traffic_map_
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.
void IncrementStatsNeighborAdvertUnSolicited(VmInterface *vmi)
void set_route_table_listener_id(const DBTableBase::ListenerId &id)
bool PreWalkDone(DBTableBase *partition)
void SendNeighborSolicitForAllIntf(const AgentRoute *route)
const Interface * GetInterface() const
const IpAddress * GetIp() const
DBTableBase::ListenerId evpn_route_table_listener_id_
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
Icmpv6RouteState(Icmpv6VrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
DBTableBase::ListenerId vrf_table_listener_id_
boost::asio::ip::address IpAddress
MacLearningProto * mac_learning_proto() const
uint32_t icmpv6_neighbor_advert_solicited_
AgentRouteTable * rt_table_
const VrfEntry * GetVrf() const
tbb::atomic< int > refcount_
Icmpv6Stats * VmiToIcmpv6Stats(VmInterface *i)
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
boost::asio::io_context * io_service()
InterfaceTable * interface_table() const
UnsolNaCache unsol_na_cache_
VnTable * vn_table() const
uint32_t icmpv6_neighbor_solicit_
bool RouterAdvertisement(Icmpv6Proto *proto)
Icmpv6PathPreferenceStatePtr icmpv6_path_preference_state_
void SendIcmpv6Ipc(Icmpv6Proto::Icmpv6MsgType type, Ip6Address ip, const VrfEntry *vrf, InterfaceConstRef itf)
bool default_routes_added() const
void set_evpn_route_table_listener_id(const DBTableBase::ListenerId &id)
InetUnicastAgentRouteTable * GetInet6UnicastRouteTable() const
const string & GetName() const
const MacAddress & mac() const
static const uint32_t kTimeoutMultiplier
IpAddress GetServiceIp(const IpAddress &ip) const
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
void IncrementStatsNeighborSolicit(VmInterface *vmi)
Base class for all Route entries in agent.
void set_ip_fabric_interface_mac(const MacAddress &mac)
void Unregister(ListenerId listener)
DBTableBase::ListenerId interface_listener_id_
Icmpv6VrfState * vrf_state()
LifetimeRef< Icmpv6VrfState > evpn_table_delete_ref_
void ReleaseWalker(DBTableWalkRef &walk)
int GetTaskId(const std::string &name)
static const uint32_t kMaxRetry
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
const std::string & fabric_vrf_name() const
const Type GetType() const
void IncrementStatsRouterSolicit(VmInterface *vmi)
void WalkAgain(DBTableWalkRef walk)
void IncrementStatsPingResponse(VmInterface *vmi)
std::set< uint32_t > NDTransmittedIntfMap
static const uint32_t kRouterAdvertTimeout
static void WalkDone(DBTableBase *partition, Icmpv6VrfState *state)
void IncrementStatsNeighborSolicited(VmInterface *vmi)
bool IsDependentRt(void) const
void HandleNA(uint32_t itf)
uint32_t icmpv6_router_advert_
NdpEntry * UnsolNaEntry(const NdpKey &key, const Interface *intf)
void SetSize(size_t size)
void IncrementStatsNeighborAdvertSolicited(VmInterface *vmi)
bool ValidateAndClearVrfState(VrfEntry *vrf, Icmpv6VrfState *state)
void IncrementStatsRouterAdvert(VmInterface *vmi)
static TaskScheduler * GetInstance()
void Reset(LifetimeActor *actor)
#define IPV6_ALL_ROUTERS_ADDRESS
AgentRouteTable * evpn_rt_table_
uint32_t icmpv6_ping_response_
const NextHop * GetActiveNextHop() const
boost::asio::ip::address_v6 Ip6Address
void set_ip_fabric_interface_index(uint32_t ind)
EventManager * event_manager() const
uint32_t icmpv6_neighbor_advert_unsolicited_
Icmpv6PathPreferenceState(Icmpv6VrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
const Peer * peer() const
void set_ip_fabric_interface(Interface *itf)
void NexthopNotify(DBEntryBase *entry)
DBTableBase::ListenerId vn_table_listener_id_
void Erase(const IpAddress &ip)
#define PKT0_LINKLOCAL_ADDRESS
boost::intrusive_ptr< const Interface > InterfaceConstRef
void SendNeighborSolicitForAllIntf(const AgentRoute *route)
const Peer * local_peer() const
PktHandler * pkt_handler() const
DBTable::DBTableWalkRef managed_delete_walk_ref_
uint32_t icmpv6_router_solicit_
std::set< NdpEntry * > NdpEntrySet
const Interface * get_interface() const
void AddUnsolNaEntry(NdpKey &key)
AgentParam * params() const
void DeleteUnsolNaEntry(NdpEntry *entry)
virtual Agent::RouteTableType GetTableType() const
const uint32_t vrf_id() const
static void DeleteReq(const Peer *peer, const string &vrf_name, const IpAddress &addr, uint8_t plen, AgentRouteData *data)
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
Icmpv6Proto::UnsolNaIterator UnsolNaEntryIterator(const NdpKey &key, bool *key_valid)
IpAddress router_id6() const
virtual const PrefixType & prefix_address() const
Returns the value of a stored prefix address (IPv4, IPv6 or MAC address)
std::pair< NdpKey, NdpEntry * > NdpCachePair
boost::scoped_ptr< Icmpv6Handler > icmpv6_handler_
void EvpnRouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip, const VmInterface *vmi, uint32_t vrf, bool send_unicast=false)
std::pair< uint32_t, InterfaceNdpInfo > InterfaceNdpPair
void RouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
VrfTable * vrf_table() const
MacAddress mac(void) const
bool SendNeighborSolicit()
static const uint32_t kTimeout
bool DeleteEvpnRouteState(DBTablePartBase *part, DBEntryBase *entry)
VrfEntry * GetVrf() const
uint32_t services_queue_limit()
uint8_t prefix_length() const
!
NdpEntry * FindUnsolNaEntry(NdpKey &key)
bool layer3_forwarding() const
VmInterface::VmiType vmi_type() const
Icmpv6PathPreferenceState * Get(const IpAddress ip)
VmInterfaceMap vm_interfaces_
const Ip6Address & primary_ip6_addr() const
Icmpv6PathPreferenceStateMap icmpv6_path_preference_map_
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
std::pair< NdpKey, NdpEntrySet > UnsolNaCachePair
std::map< uint32_t, InterfaceIcmpv6PathPreferenceInfo > WaitForTrafficIntfMap
const Interface * FindInterface(size_t index) const
LifetimeRef< Icmpv6VrfState > table_delete_ref_
void intrusive_ptr_release(const AsPath *cpath)
bool AddNdpEntry(NdpEntry *entry)
void set_default_routes_added(bool value)
DBTable::DBTableWalkRef evpn_walk_ref_
InterfaceNdpMap interface_ndp_map_
const IpAddress & ip() const
DBTableBase::ListenerId nexthop_listener_id_
void VnNotify(DBEntryBase *entry)
virtual const NextHop * ComputeNextHop(Agent *agent) const
bool DeleteRouteState(DBTablePartBase *part, DBEntryBase *entry)
const string & GetName() const
DBTablePartBase * get_table_partition() const
uint32_t icmpv6_neighbor_solicited_
void IncrementStatsPingRequest(VmInterface *vmi)
bool Reschedule(int time)
bool evpn_walk_completed_
Icmpv6VrfState * CreateAndSetVrfState(VrfEntry *vrf)
~Icmpv6PathPreferenceState()
const NdpKey & key() const
Icmpv6Proto(Agent *agent, boost::asio::io_context &io)
InetUnicastRouteEntry * GetUcRoute(const IpAddress &addr) const
Interface * ip_fabric_interface() const
#define IPV6_ALL_NODES_ADDRESS
DBTableBase::ListenerId route_table_listener_id_
std::map< NdpKey, NdpEntry * >::iterator NdpIterator
void InterfaceNotify(DBEntryBase *entry)
WaitForTrafficIntfMap evpn_wait_for_traffic_map_
bool evpn_walk_completed() const
static bool DeleteTimer(Timer *Timer)
const PathList & GetPathList() const