31 vrf_name_(), ip_addr_() {
45 uint32_t intf_addr = htonl(
ip_addr_.to_v4().to_ulong());
70 return ret ? true :
false;
77 const std::string &task_name,
int instance,
78 boost::asio::io_context &
io) :
79 type_(
type), agent_(agent), name_(task_name), instance_(instance), io_(
io) {
174 std::set<GmpSourceGroup *> sg_to_delete;
181 MCTRACE(LogSG,
"Delete Mcast VRF SG for VN ",
183 gmp_sg->
source_.to_v4().to_string(),
184 gmp_sg->
group_.to_v4().to_string(), 0);
187 sg_to_delete.insert(gmp_sg);
197 for(std::set<GmpSourceGroup *>::iterator sg_it = sg_to_delete.begin();
198 sg_it != sg_to_delete.end(); sg_it++) {
227 VnGmpDBState::VnGmpIntfMap::iterator it = state->
gmp_intf_map_.begin();
229 gmp_intf_state = it->second;
235 delete gmp_intf_state;
262 VnGmpDBState::VnGmpIntfMap::iterator it = state->
gmp_intf_map_.begin();
265 if ((ipam != NULL) && ((ipam->
default_gw == it->first) ||
270 gmp_intf_state = it->second;
276 delete gmp_intf_state;
281 const std::vector<VnIpam> &ipam = vn->
GetVnIpam();
282 for (
unsigned int i = 0; i < ipam.size(); ++i) {
283 if (!ipam[i].IsV4()) {
292 VnGmpDBState::VnGmpIntfMap::const_iterator it;
296 gmp_address = ipam[i].dns_server;
300 (ipam[i].default_gw != ipam[i].dns_server)) {
301 gmp_intf_state = it->second;
308 delete gmp_intf_state;
312 gmp_address = ipam[i].default_gw;
321 std::pair<IpAddress,VnGmpDBState::VnGmpIntfState*>
322 (gmp_address, gmp_intf_state));
324 gmp_intf_state = it->second;
326 if (gmp_intf_state) {
354 MCTRACE(IgmpIntf,
"Itf Notify, no VMI state ",
360 MCTRACE(IgmpIntf,
"Itf Notify, VMI delete or IGMP disable ",
376 MCTRACE(IgmpIntf,
"Itf Notify, VMI create or IGMP enable",
380 if (vmi_state == NULL) {
389 DeleteVmInterfaceFromVrfSourceGroup(
403 DeleteVmInterfaceFromVrfSourceGroup(
444 void *rcv_pkt, uint32_t packet_len,
460 VnGmpDBState::VnGmpIntfMap::const_iterator it =
472 addr = htonl(ip_saddr.to_v4().to_ulong());
474 addr = htonl(ip_daddr.to_v4().to_ulong());
478 packet_len, &src_addr, &dst_addr);
480 return ret ? true :
false;
494 boolean pending =
FALSE;
566 VnGmpDBState::VnGmpIntfMap::iterator gif_it = state->
gmp_intf_map_.begin();
569 gmp_intf_state = gif_it->second;
584 if ((gmp_sg->
source_ == source) || (gmp_sg->
group_ == group)) {
597 bool created =
false;
620 source.to_string(), group.to_string(), 0);
622 vn->
GetName(), source.to_v4(), group.to_v4());
624 source.to_v4(), group.to_v4(), gmp_sg->
flags_);
638 source.to_string(), group.to_string(), 0);
640 source.to_v4(), group.to_v4());
673 MCTRACE(Info,
"igmp_trace: No host found", host.to_string());
681 MCTRACE(Info,
"igmp_trace: No VM Interface for host", host.to_string());
701 src_addr = htonl(source.to_v4().to_ulong());
708 source.to_v4(), group.to_v4());
712 source.to_v4(), group.to_v4());
730 MCTRACE(LogSG,
"Add VM Mcast VRF SG ",
732 source.to_string(), group.to_string(), 0);
736 source.to_v4(), group.to_v4());
738 MCTRACE(LogSG,
"Delete VM Mcast VRF SG ",
740 source.to_string(), group.to_string(), 0);
743 source.to_v4(), group.to_v4());
765 if (!mp_list.size()) {
769 UuidList::const_iterator it = mp_list.begin();
771 while (it != mp_list.end()) {
805 const std::string &task_name,
int instance,
806 boost::asio::io_context &
io) {
851 bool permit =
gmp_proto->MulticastPolicyCheck(gif, source_addr, group_addr);
895 gmp_proto->GroupNotify(gif, source_addr, group_addr, group_action);
923 gmp_proto->ResyncNotify(gif, source_addr, group_addr);
954 gmp_proto->UpdateHostInSourceGroup(gif, join ?
true :
false, host_addr,
955 source_addr, group_addr);
997 gmp_proto->SendPacket(gif, pkt, pkt_len, dst_addr);
boost::asio::ip::address IpAddress
boost::asio::ip::address_v4 Ip4Address
std::vector< boost::uuids::uuid > UuidList
boost::intrusive_ptr< const Interface > InterfaceConstRef
AgentDBEntry * FindActiveEntry(const DBEntry *key)
bool mvpn_ipv4_enable() const
InterfaceTable * interface_table() const
AgentParam * params() const
const std::string & fabric_policy_vrf_name() const
VrfTable * vrf_table() const
const std::string & fabric_vn_name() const
MulticastPolicyTable * mp_table() const
VnTable * vn_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)
bool set_gmp_querying(bool querying)
const string & get_vrf_name()
GmpIntf(const GmpProto *)
const GmpProto * gmp_proto_
bool set_ip_address(const IpAddress &ip_addr)
bool set_vrf_name(const std::string &vrf_name)
const IpAddress get_ip_address()
static bool DeleteGmpProto(GmpProto *gmp_proto)
static GmpProto * CreateGmpProto(GmpType::Type type, Agent *agent, const std::string &name, int instance, boost::asio::io_context &io)
void GmpBufferFree(uint8_t *pkt)
bool SendPacket(GmpIntf *gif, uint8_t *pkt, uint32_t pkt_len, IpAddress dest)
bool DeleteIntf(GmpIntf *gif)
bool GmpNotificationHandler()
void TriggerMvpnNotification(const VmInterface *vm_intf, bool join, IpAddress source, IpAddress group)
VmIpInterfaceMap vm_ip_to_vmi_
bool GmpProcessPkt(const VmInterface *vm_itf, void *rcv_pkt, uint32_t packet_len, IpAddress ip_saddr, IpAddress ip_daddr)
Timer * gmp_trigger_timer_
static const int kGmpTriggerRestartTimer
void TriggerEvpnNotification(const VmInterface *vm_intf, bool join, IpAddress source, IpAddress group)
boost::asio::io_context & io_
TaskTrigger * gmp_notif_trigger_
DBTableBase::ListenerId vn_listener_id_
GmpProto(GmpType::Type type, Agent *agent, const std::string &task_name, int instance, boost::asio::io_context &io)
void GroupNotify(GmpIntf *gif, IpAddress source, IpAddress group, int group_action)
const std::string & name_
DBTableBase::ListenerId itf_listener_id_
void GmpNotificationReady()
void GmpVnNotify(DBTablePartBase *part, DBEntryBase *entry)
bool GmpNotificationTimer()
void GmpItfNotify(DBTablePartBase *part, DBEntryBase *entry)
void UpdateHostInSourceGroup(GmpIntf *gif, bool join, IpAddress host, IpAddress source, IpAddress group)
void GmpIntfSGClear(VnGmpDBState *state, VnGmpDBState::VnGmpIntfState *gmp_intf_state)
bool MulticastPolicyCheck(GmpIntf *gif, IpAddress source, IpAddress group)
void ResyncNotify(GmpIntf *gif, IpAddress source, IpAddress group)
InterfaceConstRef FindVmi(const boost::uuids::uuid &u)
const boost::uuids::uuid & GetUuid() const
bool AddVmInterfaceToVrfSourceGroup(const std::string &vrf_name, const std::string &vn_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void AddVmInterfaceToSourceGroup(const std::string &mvpn_vrf_name, const std::string &vn_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void DeleteMulticastVrfSourceGroup(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void DeleteVmInterfaceFromVrfSourceGroup(const std::string &vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void CreateMulticastVrfSourceGroup(const std::string &vrf_name, const std::string &vn_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void SetEvpnMulticastSGFlags(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, uint32_t flags)
SourceGroupInfo::Action GetAction(IpAddress source, IpAddress group) const
MulticastHandler * multicast() const
static TaskMap * CreateTaskMap(Agent *agent, const std::string &name, int instance, boost::asio::io_context &io)
static bool DeleteTaskMap(TaskMap *task_map)
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 igmp_enabled() const
VmInterface::VmiType vmi_type() const
const VnEntry * vn() const
const Ip4Address & primary_ip_addr() const
const UuidList & mp_list() const
const std::vector< VnIpam > & GetVnIpam() const
VrfEntry * GetVrf() const
const string & GetName() const
const VnIpam * GetIpam(const IpAddress &ip) const
VnGmpIntfSGList gmp_intf_sg_list_
VnGmpIntfSGList::iterator VnGmpSGIntfListIter
VnGmpIntfMap gmp_intf_map_
VnGmpSGList::iterator VnGmpSGListIter
const string & GetName() const
VrfEntry * FindVrfFromName(const string &name)
struct gmp_intf_ gmp_intf
boolean gmp_update_intf_querying(mgm_global_data *gd, gmp_intf *gif, boolean query)
gmp_intf * gmp_attach_intf(mgm_global_data *gd, void *mif_state)
boolean gmp_update_intf_state(mgm_global_data *gd, gmp_intf *gif, const gmp_addr_string *intf_addr)
boolean gmp_notification_handler(mgm_global_data *gd)
mgm_global_data * gmp_init(mc_af mcast_af, task *tp, void *gmp_sm)
boolean gmp_process_pkt(mgm_global_data *gd, gmp_intf *gif, void *rcv_pkt, u_int32_t packet_len, const gmp_addr_string *src_addr, const gmp_addr_string *dst_addr)
void gmp_detach_intf(mgm_global_data *gd, gmp_intf *gif)
void gmp_deinit(mc_af mcast_af)
#define MGM_GROUP_SRC_REMOVED
#define MGM_GROUP_REMOVED
SandeshTraceBufferPtr MulticastTraceBuf
void gmp_notification_ready(mgm_global_data *gd)
void gmp_send_one_packet(mgm_global_data *gd, gmp_intf *intf, uint8_t *pkt, uint32_t pkt_len, gmp_addr_string dest)
void gmp_host_update(mgm_global_data *gd, gmp_intf *intf, boolean join, gmp_addr_string host, gmp_addr_string source, gmp_addr_string group)
boolean gmp_policy_check(mgm_global_data *gd, gmp_intf *intf, gmp_addr_string source, gmp_addr_string group)
void gmp_free_send_buffer(mgm_global_data *gd, gmp_intf *intf, uint8_t *buffer)
void gmp_cache_resync_notify(mgm_global_data *gd, gmp_intf *intf, gmp_addr_string source, gmp_addr_string group)
void gmp_group_notify(mgm_global_data *gd, gmp_intf *intf, int group_action, gmp_addr_string source, gmp_addr_string group)
uint8_t * gmp_get_send_buffer(mgm_global_data *gd, gmp_intf *intf)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
uint32_t gmp_g_del_count_
uint32_t gmp_sg_del_count_
uint32_t gmp_g_add_count_
uint32_t gmp_sg_add_count_