52 boost::asio::io_context &
io) {
90 boost::system::error_code ec;
123 boost::system::error_code ec;
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",
595 for (Route::PathList::const_iterator it = route->
GetPathList().begin();
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));
644 if (new_wait_for_traffic_map.size() > 0) {
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());
boost::asio::ip::address_v6 Ip6Address
boost::asio::ip::address IpAddress
boost::intrusive_ptr< const Interface > InterfaceConstRef
static const uint8_t kMaxV6PrefixLen
uint32_t services_queue_limit()
const PathPreference & path_preference() const
const Peer * peer() const
virtual const NextHop * ComputeNextHop(Agent *agent) const
virtual const PrefixType & prefix_address() const
Returns the value of a stored prefix address (IPv4, IPv6 or MAC address)
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge,...
Base class for all Route entries in agent.
const NextHop * GetActiveNextHop() const
InterfaceTable * interface_table() const
AgentParam * params() const
MacLearningProto * mac_learning_proto() const
VrfTable * vrf_table() const
const Peer * local_peer() const
EventManager * event_manager() const
VnTable * vn_table() const
NextHopTable * nexthop_table() const
IpAddress router_id6() const
InetUnicastAgentRouteTable * fabric_inet4_unicast_table() const
const std::string & fabric_vrf_name() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
DBTablePartBase * get_table_partition() const
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
void Unregister(ListenerId listener)
void WalkAgain(DBTableWalkRef walk)
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
void ReleaseWalker(DBTableWalkRef &walk)
boost::asio::io_context * io_service()
uint8_t prefix_length() const
!
void SendNeighborSolicit(const Ip6Address &sip, const Ip6Address &dip, const VmInterface *vmi, uint32_t vrf, bool send_unicast=false)
bool RouterAdvertisement(Icmpv6Proto *proto)
tbb::atomic< int > refcount_
static const uint32_t kTimeoutMultiplier
Icmpv6PathPreferenceState(Icmpv6VrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
MacAddress mac(void) const
WaitForTrafficIntfMap l3_wait_for_traffic_map_
std::map< uint32_t, InterfaceIcmpv6PathPreferenceInfo > WaitForTrafficIntfMap
Icmpv6VrfState * vrf_state_
~Icmpv6PathPreferenceState()
static const uint32_t kNSTryCount
const IpAddress & ip() const
WaitForTrafficIntfMap evpn_wait_for_traffic_map_
void HandleNA(uint32_t itf)
bool SendNeighborSolicit()
static const uint32_t kTimeout
void SendNeighborSolicitForAllIntf(const AgentRoute *route)
std::set< uint32_t > NDTransmittedIntfMap
static const uint32_t kMaxRetry
Icmpv6VrfState * vrf_state()
void DeleteUnsolNaEntry(NdpEntry *entry)
std::map< NdpKey, NdpEntry * >::iterator NdpIterator
std::pair< NdpKey, NdpEntrySet > UnsolNaCachePair
VmInterfaceMap vm_interfaces_
void VrfNotify(DBTablePartBase *part, DBEntryBase *entry)
Icmpv6Proto(Agent *agent, boost::asio::io_context &io)
InterfaceNdpMap interface_ndp_map_
void IncrementStatsRouterSolicit(VmInterface *vmi)
Icmpv6Stats * VmiToIcmpv6Stats(VmInterface *i)
boost::scoped_ptr< Icmpv6Handler > icmpv6_handler_
Icmpv6VrfState * CreateAndSetVrfState(VrfEntry *vrf)
void IncrementStatsNeighborAdvertUnSolicited(VmInterface *vmi)
bool ValidateAndClearVrfState(VrfEntry *vrf, Icmpv6VrfState *state)
std::pair< NdpKey, NdpEntry * > NdpCachePair
Icmpv6Proto::UnsolNaIterator UnsolNaEntryIterator(const NdpKey &key, bool *key_valid)
bool DeleteNdpEntry(NdpEntry *entry)
NdpEntry * FindNdpEntry(const NdpKey &key)
std::map< NdpKey, NdpEntrySet >::iterator UnsolNaIterator
void IncrementStatsPingResponse(VmInterface *vmi)
void IncrementStatsRouterAdvert(VmInterface *vmi)
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
NdpEntry * UnsolNaEntry(const NdpKey &key, const Interface *intf)
DBTableBase::ListenerId vrf_table_listener_id_
std::set< NdpEntry * > NdpEntrySet
DBTableBase::ListenerId nexthop_listener_id_
void SendIcmpv6Ipc(Icmpv6Proto::Icmpv6MsgType type, Ip6Address ip, const VrfEntry *vrf, InterfaceConstRef itf)
void IncrementStatsPingRequest(VmInterface *vmi)
DBTableBase::ListenerId interface_listener_id_
void IncrementStatsNeighborAdvertSolicited(VmInterface *vmi)
std::pair< uint32_t, InterfaceNdpInfo > InterfaceNdpPair
bool AddNdpEntry(NdpEntry *entry)
void VnNotify(DBEntryBase *entry)
void set_ip_fabric_interface(Interface *itf)
void AddUnsolNaEntry(NdpKey &key)
std::pair< VmInterface *, Icmpv6Stats > VmInterfacePair
Interface * ip_fabric_interface() const
void set_ip_fabric_interface_index(uint32_t ind)
void InterfaceNotify(DBEntryBase *entry)
NdpEntry * FindUnsolNaEntry(NdpKey &key)
void set_ip_fabric_interface_mac(const MacAddress &mac)
UnsolNaCache unsol_na_cache_
void HandlePathPreferenceNA(const VrfEntry *, uint32_t, IpAddress)
static const uint32_t kRouterAdvertTimeout
void IncrementStatsNeighborSolicited(VmInterface *vmi)
void NexthopNotify(DBEntryBase *entry)
void IncrementStatsNeighborSolicit(VmInterface *vmi)
DBTableBase::ListenerId vn_table_listener_id_
Icmpv6RouteState(Icmpv6VrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
void SendNeighborSolicitForAllIntf(const AgentRoute *route)
Icmpv6PathPreferenceStatePtr icmpv6_path_preference_state_
Icmpv6PathPreferenceState * Get(const IpAddress ip)
DBTable::DBTableWalkRef evpn_walk_ref_
static void WalkDone(DBTableBase *partition, Icmpv6VrfState *state)
void Erase(const IpAddress &ip)
bool PreWalkDone(DBTableBase *partition)
bool default_routes_added() const
LifetimeRef< Icmpv6VrfState > table_delete_ref_
Icmpv6PathPreferenceStateMap icmpv6_path_preference_map_
void set_route_table_listener_id(const DBTableBase::ListenerId &id)
AgentRouteTable * rt_table_
void set_evpn_route_table_listener_id(const DBTableBase::ListenerId &id)
DBTable::DBTableWalkRef managed_delete_walk_ref_
DBTable::DBTableWalkRef evpn_walk_ref()
DBTable::DBTableWalkRef managed_delete_walk_ref()
Icmpv6PathPreferenceState * Locate(const IpAddress &ip)
Icmpv6VrfState(Agent *agent, Icmpv6Proto *proto, VrfEntry *vrf, AgentRouteTable *table, AgentRouteTable *evpn_table)
AgentRouteTable * evpn_rt_table_
Icmpv6Proto * icmp_proto_
bool DeleteEvpnRouteState(DBTablePartBase *part, DBEntryBase *entry)
void RouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
bool DeleteRouteState(DBTablePartBase *part, DBEntryBase *entry)
bool evpn_walk_completed_
Icmpv6Proto * icmp_proto() const
void set_default_routes_added(bool value)
void EvpnRouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
LifetimeRef< Icmpv6VrfState > evpn_table_delete_ref_
DBTableBase::ListenerId evpn_route_table_listener_id_
bool l3_walk_completed() const
DBTableBase::ListenerId route_table_listener_id_
bool evpn_walk_completed() const
static void DeleteReq(const Peer *peer, const string &vrf_name, const IpAddress &addr, uint8_t plen, AgentRouteData *data)
virtual Agent::RouteTableType GetTableType() const
uint8_t prefix_length() const
!
const Interface * GetInterface() const
const Interface * FindInterface(size_t index) const
const MacAddress & mac() const
const uint32_t id() const
void Reset(LifetimeActor *actor)
const NdpKey & key() const
const Interface * get_interface() const
const Interface * GetInterface() const
const VrfEntry * GetVrf() const
const IpAddress * GetIp() const
bool IsDependentRt(void) const
const Type GetType() const
void SendMessage(PktModuleName mod, InterTaskMsg *msg)
PktHandler * pkt_handler() const
ProtoWorkQueue work_queue_
const PathList & GetPathList() const
int GetTaskId(const std::string &name)
static TaskScheduler * GetInstance()
static bool DeleteTimer(Timer *Timer)
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)
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
bool Reschedule(int time)
VmInterface::VmiType vmi_type() const
IpAddress GetServiceIp(const IpAddress &ip) const
const Ip6Address & primary_ip6_addr() const
VrfEntry * GetVrf() const
const string & GetName() const
bool layer3_forwarding() const
const string & GetName() const
InetUnicastRouteEntry * GetUcRoute(const IpAddress &addr) const
InetUnicastAgentRouteTable * GetInet6UnicastRouteTable() const
const uint32_t vrf_id() const
AgentRouteTable * GetEvpnRouteTable() const
void SetBounded(bool bounded)
void SetSize(size_t size)
void intrusive_ptr_release(Icmpv6PathPreferenceState *ps)
void intrusive_ptr_add_ref(Icmpv6PathPreferenceState *ps)
#define PKT0_LINKLOCAL_ADDRESS
#define IPV6_ALL_NODES_ADDRESS
#define IPV6_ALL_ROUTERS_ADDRESS
uint32_t icmpv6_neighbor_advert_solicited_
uint32_t icmpv6_neighbor_solicited_
uint32_t icmpv6_router_solicit_
uint32_t icmpv6_neighbor_solicit_
uint32_t icmpv6_ping_response_
uint32_t icmpv6_router_advert_
uint32_t icmpv6_neighbor_advert_unsolicited_
uint32_t icmpv6_ping_request_