5 #include "sandesh/sandesh_types.h"
6 #include "sandesh/sandesh.h"
20 bool run_with_vrouter) :
22 run_with_vrouter_(run_with_vrouter), ip_fabric_interface_index_(-1),
23 ip_fabric_interface_(NULL), max_retries_(kMaxRetries),
24 retry_timeout_(kRetryTimeout), aging_timeout_(kAgingTimeout) {
49 for (ArpEntrySet::iterator sit = it->second.begin();
50 sit != it->second.end();) {
52 it->second.erase(sit++);
63 boost::asio::io_context &
io) {
87 for (ArpEntrySet::iterator sit = it->second.begin();
88 sit != it->second.end();) {
90 it->second.erase(sit++);
108 GetInet4UnicastRouteTable()->
122 int prev = aps->
refcount_.fetch_and_decrement();
133 vrf_state_(state), arp_req_timer_(NULL), vrf_id_(vrf_id),
134 vm_ip_(ip), plen_(plen) {
150 "Arp Entry timer for VM",
160 &wait_for_traffic_map,
162 &arp_transmitted_map) {
170 WaitForTrafficIntfMap::iterator it = wait_for_traffic_map.begin();
171 for (;it != wait_for_traffic_map.end(); it++) {
179 bool inserted = arp_transmitted_map.insert(it->first).second;
181 if (inserted ==
false) {
200 GetMacIpLearningTable()->GetPairedMacAddress(
208 GetMacIpLearningTable()->MacIpEntryUnreachable(
262 for (Route::PathList::const_iterator it = route->
GetPathList().begin();
290 uint32_t intf_id = intf->
id();
291 WaitForTrafficIntfMap::const_iterator wait_for_traffic_it =
292 wait_for_traffic_map.find(intf_id);
293 if (wait_for_traffic_it == wait_for_traffic_map.end()) {
299 wait_for_traffic_it->second));
309 if (new_wait_for_traffic_map.size() > 0) {
316 uint8_t plen) : vrf_state_(vrf_state),
317 sg_list_(), tag_list_(), policy_(false), resolve_route_(false) {
346 start_iter->first.vrf == rt->
vrf() &&
364 start_iter->first.vrf == rt->
vrf() &&
368 if (tmp->second->DeleteArpRoute()) {
580 agent(agent_ptr), arp_proto(proto), vrf(vrf_entry), rt_table(table),
581 evpn_rt_table(evpn_table), route_table_listener_id(
DBTableBase::kInvalidId),
582 evpn_route_table_listener_id(
DBTableBase::kInvalidId),
583 table_delete_ref(this, table->
deleter()),
584 evpn_table_delete_ref(this, evpn_table->
deleter()),
586 l3_walk_completed_(false), evpn_walk_completed_(false) {
608 ArpKeySet::iterator key_it = intf_entry.
arp_key_list.begin();
632 ArpKeySet::iterator key_it = intf_entry.
arp_key_list.begin();
638 ArpEntry *arp_entry = arp_it->second;
650 (itf)->primary_ip_addr().to_ulong(), itf->
vrf());
684 if (vm_intf->
vrf()) {
687 state->
SetVrf(vm_intf->
vrf(), forwarding_vrf);
696 std::pair<InterfaceArpMap::iterator, bool> ret;
698 return ret.first->second;
785 iter->second.erase(entry);
787 if (iter->second.empty()) {
798 for (ArpEntrySet::iterator sit = it->second.begin();
799 sit != it->second.end(); sit++) {
820 if (state == NULL || state->
deleted ==
true)
844 if (state == NULL || state->
deleted ==
true)
856 ArpKeySet::iterator key_it = intf_entry.
arp_key_list.find(entry->
key());
895 ARP_TRACE(
Trace,
"ARP state not cleared - VRF is not delete marked",
910 ARP_TRACE(
Trace,
"ARP state not cleared - Route table walk not complete",
978 intf_(intf), vrf_(NULL), fabric_vrf_(NULL), walk_ref_(NULL) {
1012 if (
vrf_->vn() &&
vrf_->vn()->bridging()) {
1048 if (
vrf_->forwarding_vrf() == NULL) {
boost::asio::ip::address IpAddress
boost::asio::ip::address_v4 Ip4Address
bool IsIp4SubnetMember(const Ip4Address &ip, const Ip4Address &prefix_ip, uint16_t plen)
boost::intrusive_ptr< const Interface > InterfaceConstRef
std::vector< int > TagList
std::vector< int > SecurityGroupList
void intrusive_ptr_add_ref(ArpPathPreferenceState *aps)
void intrusive_ptr_release(ArpPathPreferenceState *aps)
#define ARP_TRACE(obj,...)
uint32_t services_queue_limit()
bool is_health_check_service() const
const VnListType & dest_vn_list() const
const PathPreference & path_preference() const
const SecurityGroupList & sg_list() const
const Peer * peer() const
const TagList & tag_list() const
const IpAddress subnet_service_ip() 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 AgentPath * GetActivePath() const
const NextHop * GetActiveNextHop() const
InterfaceTable * interface_table() const
AgentParam * params() const
MacLearningProto * mac_learning_proto() const
VrfTable * vrf_table() const
EventManager * event_manager() const
ArpProto * GetArpProto() const
NextHopTable * nexthop_table() const
const std::string & fabric_interface_name() const
const std::string & fabric_vrf_name() const
Ip4Address router_id() const
ArpDBState(ArpVrfState *vrf_state, uint32_t vrf_id, IpAddress vm_ip_addr, uint8_t plen)
void Delete(const InetUnicastRouteEntry *rt)
ArpPathPreferenceStatePtr arp_path_preference_state_
SecurityGroupList sg_list_
void Update(const AgentRoute *route)
void UpdateMac(const InterfaceNH *nh)
void UpdateArpRoutes(const InetUnicastRouteEntry *route)
const Interface * get_interface() const
const ArpKey & key() const
void SetState(State state)
void SendArpRequestByPlen(const VmInterface *vm_interface, const MacAddress &smac, const ArpPathPreferenceState *data, const Ip4Address &tpa)
void SendArp(uint16_t op, const MacAddress &smac, in_addr_t sip, const MacAddress &tmac, const MacAddress &dmac, in_addr_t tip, uint32_t itf, uint32_t vrf)
void SetVrf(VrfEntry *vrf, VrfEntry *fabric_vrf)
DBTable::DBTableWalkRef walk_ref_
bool WalkNotify(DBTablePartBase *partition, DBEntryBase *entry)
void WalkDone(DBTableBase *part)
ArpInterfaceState(Interface *intf)
const Ip4Address * GetIp() const
const Interface * GetInterface() const
const VrfEntry * GetVrf() const
std::map< uint32_t, InterfaceArpPathPreferenceInfo > WaitForTrafficIntfMap
~ArpPathPreferenceState()
void SendArpRequestForAllIntf(const AgentRoute *route)
std::set< uint32_t > ArpTransmittedIntfMap
std::pair< uint32_t, InterfaceArpPathPreferenceInfo > WaitForTrafficIntfPair
MacAddress mac(void) const
WaitForTrafficIntfMap evpn_wait_for_traffic_map_
static const uint32_t kArpTryCount
static const uint32_t kMaxRetry
void HandleArpReply(Ip4Address sip, uint32_t itf)
static const uint32_t kTimeout
tbb::atomic< int > refcount_
const IpAddress & ip() const
WaitForTrafficIntfMap l3_wait_for_traffic_map_
ArpPathPreferenceState(ArpVrfState *state, uint32_t vrf_id, const IpAddress &vm_ip, uint8_t plen)
ArpVrfState * vrf_state()
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
bool DeleteArpEntry(ArpEntry *entry)
InterfaceArpMap interface_arp_map_
ArpIterator FindUpperBoundArpEntry(const ArpKey &key)
bool ValidateAndClearVrfState(VrfEntry *vrf, const ArpVrfState *vrf_state)
bool AddArpEntry(ArpEntry *entry)
void InterfaceNotify(DBEntryBase *entry)
void IncrementStatsArpRequest(uint32_t idx)
GratuitousArpCache gratuitous_arp_cache_
std::pair< ArpKey, ArpEntrySet > GratuitousArpCachePair
std::pair< ArpKey, ArpEntry * > ArpCachePair
DBTableBase::ListenerId nexthop_table_listener_id_
const ArpCache & arp_cache()
Interface * ip_fabric_interface() const
void ClearInterfaceArpStats(uint32_t idx)
void AddGratuitousArpEntry(ArpKey &key)
void VrfNotify(DBTablePartBase *part, DBEntryBase *entry)
InterfaceArpInfo & ArpMapIndexToEntry(uint32_t idx)
std::set< ArpEntry * > ArpEntrySet
void HandlePathPreferenceArpReply(const VrfEntry *vrf, uint32_t itf, Ip4Address sip)
bool TimerExpiry(ArpKey &key, uint32_t timer_type, const Interface *itf)
void set_ip_fabric_interface_mac(const MacAddress &mac)
uint32_t ArpResolvedStatsCounter(uint32_t idx)
ArpEntry * GratuitousArpEntry(const ArpKey &key, const Interface *intf)
void DeleteGratuitousArpEntry(ArpEntry *entry)
void IncrementStatsResolved()
void NextHopNotify(DBEntryBase *entry)
ArpIterator FindLowerBoundArpEntry(const ArpKey &key)
void SendArpIpc(ArpProto::ArpMsgType type, in_addr_t ip, const VrfEntry *vrf, InterfaceConstRef itf)
ArpProto::GratuitousArpIterator GratuitousArpEntryIterator(const ArpKey &key, bool *key_valid)
void set_ip_fabric_interface_index(uint32_t ind)
DBTableBase::ListenerId interface_table_listener_id_
ArpEntry * FindArpEntry(const ArpKey &key)
std::map< ArpKey, ArpEntry * >::iterator ArpIterator
uint32_t ArpRequestStatsCounter(uint32_t idx)
std::pair< uint32_t, InterfaceArpInfo > InterfaceArpPair
void IncrementStatsArpReply(uint32_t idx)
DBTableBase::ListenerId vrf_table_listener_id_
ArpProto(Agent *agent, boost::asio::io_context &io, bool run_with_vrouter)
uint32_t ArpReplyStatsCounter(uint32_t idx)
void set_ip_fabric_interface(Interface *itf)
std::map< ArpKey, ArpEntrySet >::iterator GratuitousArpIterator
static const uint16_t kMaxFailures
void IncrementStatsVmGarpReq()
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
DBTableBase * get_table() 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
!
const MacAddress & mac() const
uint8_t prefix_length() const
!
const Interface * GetInterface() const
const MacAddress & GetDMac() const
const Interface * FindInterface(size_t index) const
const MacAddress & mac() const
bool os_oper_state() const
const std::string & name() const
const uint32_t id() const
void Reset(LifetimeActor *actor)
bool PolicyEnabled() 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
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
const MacAddress & GetVifMac(const Agent *) const
const MacAddress & vm_mac() const
const string & GetName() const
InetUnicastRouteEntry * GetUcRoute(const IpAddress &addr) const
InetUnicastAgentRouteTable * GetInet4UnicastRouteTable() const
const uint32_t vrf_id() const
AgentRouteTable * GetEvpnRouteTable() const
VrfEntry * forwarding_vrf() const
void SetBounded(bool bounded)
void SetSize(size_t size)
ArpPathPreferenceState * Get(const IpAddress ip, uint8_t plen=32)
std::pair< ArpPathPreferenceStateKey, ArpPathPreferenceState * > ArpPathPreferenceStatePair
ArpPathPreferenceState * Locate(const IpAddress &ip, uint8_t plen)
static void WalkDone(DBTableBase *partition, ArpVrfState *state)
bool DeleteRouteState(DBTablePartBase *part, DBEntryBase *entry)
ArpVrfState(Agent *agent, ArpProto *proto, VrfEntry *vrf, AgentRouteTable *table, AgentRouteTable *evpn_table)
bool DeleteEvpnRouteState(DBTablePartBase *part, DBEntryBase *entry)
DBTable::DBTableWalkRef managed_delete_walk_ref
LifetimeRef< ArpVrfState > table_delete_ref
DBTableBase::ListenerId evpn_route_table_listener_id
LifetimeRef< ArpVrfState > evpn_table_delete_ref
bool PreWalkDone(DBTableBase *partition)
DBTableBase::ListenerId route_table_listener_id
void Erase(const IpAddress &ip, uint8_t plen)
void RouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
AgentRouteTable * rt_table
bool evpn_walk_completed() const
void EvpnRouteUpdate(DBTablePartBase *part, DBEntryBase *entry)
bool l3_walk_completed() const
ArpPathPreferenceStateMap arp_path_preference_map_
DBTable::DBTableWalkRef evpn_walk_ref_
bool evpn_walk_completed_
AgentRouteTable * evpn_rt_table
Ip4Address prev_responded_ip
uint32_t arp_failure_count