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(
425 if (!gmp_intf->
GetGif()) {
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) {
841 if (!gmp_proto || !gif) {
885 if (!gmp_proto || !gif) {
895 gmp_proto->
GroupNotify(gif, source_addr, group_addr, group_action);
913 if (!gmp_proto || !gif) {
942 if (!gmp_proto || !gif) {
955 source_addr, group_addr);
997 gmp_proto->
SendPacket(gif, pkt, pkt_len, dst_addr);
MulticastHandler * multicast() const
uint32_t gmp_g_del_count_
bool GmpNotificationHandler()
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)
static bool DeleteTaskMap(TaskMap *task_map)
void TriggerMvpnNotification(const VmInterface *vm_intf, bool join, IpAddress source, IpAddress group)
static GmpProto * CreateGmpProto(GmpType::Type type, Agent *agent, const std::string &name, int instance, boost::asio::io_context &io)
void gmp_free_send_buffer(mgm_global_data *gd, gmp_intf *intf, uint8_t *buffer)
bool GmpProcessPkt(const VmInterface *vm_itf, void *rcv_pkt, uint32_t packet_len, IpAddress ip_saddr, IpAddress ip_daddr)
void GmpItfNotify(DBTablePartBase *part, DBEntryBase *entry)
TaskTrigger * gmp_notif_trigger_
DBTableBase::ListenerId itf_listener_id_
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
uint8_t * gmp_get_send_buffer(mgm_global_data *gd, gmp_intf *intf)
const boost::uuids::uuid & GetUuid() const
static bool DeleteGmpProto(GmpProto *gmp_proto)
VrfEntry * FindVrfFromName(const string &name)
VnGmpIntfMap gmp_intf_map_
GmpProto(GmpType::Type type, Agent *agent, const std::string &task_name, int instance, boost::asio::io_context &io)
const VnIpam * GetIpam(const IpAddress &ip) const
uint32_t gmp_sg_add_count_
VnGmpIntfSGList gmp_intf_sg_list_
const IpAddress get_ip_address()
DBTableBase::ListenerId vn_listener_id_
const string & get_vrf_name()
struct gmp_intf_ gmp_intf
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
SandeshTraceBufferPtr MulticastTraceBuf
boost::asio::ip::address IpAddress
AgentDBEntry * FindActiveEntry(const DBEntry *key)
InterfaceTable * interface_table() const
VnTable * vn_table() const
void CreateMulticastVrfSourceGroup(const std::string &vrf_name, const std::string &vn_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
gmp_intf * gmp_attach_intf(mgm_global_data *gd, void *mif_state)
void DeleteVmInterfaceFromVrfSourceGroup(const std::string &vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
VnGmpSGList::iterator VnGmpSGListIter
const string & GetName() const
void SetEvpnMulticastSGFlags(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr, uint32_t flags)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
void UpdateHostInSourceGroup(GmpIntf *gif, bool join, IpAddress host, IpAddress source, IpAddress group)
bool MulticastPolicyCheck(GmpIntf *gif, IpAddress source, IpAddress group)
void DeleteMulticastVrfSourceGroup(const std::string &vrf_name, const Ip4Address &src_addr, const Ip4Address &grp_addr)
void Unregister(ListenerId listener)
void ResyncNotify(GmpIntf *gif, IpAddress source, IpAddress group)
InterfaceConstRef FindVmi(const boost::uuids::uuid &u)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
const std::string & fabric_vrf_name() const
bool mvpn_ipv4_enable() 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 gmp_deinit(mc_af mcast_af)
static TaskScheduler * GetInstance()
boost::intrusive_ptr< const Interface > InterfaceConstRef
mgm_global_data * gmp_init(mc_af mcast_af, task *tp, void *gmp_sm)
bool DeleteIntf(GmpIntf *gif)
const std::vector< VnIpam > & GetVnIpam() const
const VnEntry * vn() const
boolean gmp_update_intf_state(mgm_global_data *gd, gmp_intf *gif, const gmp_addr_string *intf_addr)
uint32_t gmp_sg_del_count_
uint32_t gmp_g_add_count_
void SetGif(gmp_intf *gif)
AgentParam * params() const
boolean gmp_policy_check(mgm_global_data *gd, gmp_intf *intf, gmp_addr_string source, gmp_addr_string group)
#define MGM_GROUP_SRC_REMOVED
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)
static const int kGmpTriggerRestartTimer
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void GmpBufferFree(uint8_t *pkt)
std::vector< boost::uuids::uuid > UuidList
boost::asio::ip::address_v4 Ip4Address
boost::asio::io_context & io_
VrfTable * vrf_table() const
Timer * gmp_trigger_timer_
const Ip4Address & primary_ip_addr() const
bool set_ip_address(const IpAddress &ip_addr)
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)
bool SendPacket(GmpIntf *gif, uint8_t *pkt, uint32_t pkt_len, IpAddress dest)
void gmp_notification_ready(mgm_global_data *gd)
VnGmpIntfSGList::iterator VnGmpSGIntfListIter
VrfEntry * GetVrf() const
VmInterface::VmiType vmi_type() const
bool GmpNotificationTimer()
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
bool set_vrf_name(const std::string &vrf_name)
VmIpInterfaceMap vm_ip_to_vmi_
void gmp_group_notify(mgm_global_data *gd, gmp_intf *gif, int group_action, gmp_addr_string source, gmp_addr_string group)
bool igmp_enabled() const
#define MGM_GROUP_REMOVED
static TaskMap * CreateTaskMap(Agent *agent, const std::string &name, int instance, boost::asio::io_context &io)
void gmp_cache_resync_notify(mgm_global_data *gd, gmp_intf *gif, gmp_addr_string source, gmp_addr_string group)
void GmpIntfSGClear(VnGmpDBState *state, VnGmpDBState::VnGmpIntfState *gmp_intf_state)
const string & GetName() const
void gmp_detach_intf(mgm_global_data *gd, gmp_intf *gif)
DBTablePartBase * get_table_partition() const
MulticastPolicyTable * mp_table() const
const std::string & fabric_vn_name() const
bool set_gmp_querying(bool querying)
const UuidList & mp_list() const
GmpIntf(const GmpProto *)
boolean gmp_notification_handler(mgm_global_data *gd)
const GmpProto * gmp_proto_
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)
void gmp_send_one_packet(mgm_global_data *gd, gmp_intf *intf, uint8_t *pkt, uint32_t pkt_len, gmp_addr_string dest)
SourceGroupInfo::Action GetAction(IpAddress source, IpAddress group) const
void TriggerEvpnNotification(const VmInterface *vm_intf, bool join, IpAddress source, IpAddress group)
void GmpVnNotify(DBTablePartBase *part, DBEntryBase *entry)
void GmpNotificationReady()
boolean gmp_update_intf_querying(mgm_global_data *gd, gmp_intf *gif, boolean query)
void GroupNotify(GmpIntf *gif, IpAddress source, IpAddress group, int group_action)
const std::string & name_
static bool DeleteTimer(Timer *Timer)
void DeleteVmInterfaceFromSourceGroup(const std::string &mvpn_vrf_name, const VmInterface *vm_itf, const Ip4Address &src_addr, const Ip4Address &grp_addr)
const std::string & fabric_policy_vrf_name() const