summaryrefslogtreecommitdiff
path: root/pimd/pim_igmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_igmp.c')
-rw-r--r--pimd/pim_igmp.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index 8d39d7e800..461c2698d5 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -753,6 +753,39 @@ static void igmp_group_free(struct igmp_group *group)
XFREE(MTYPE_PIM_IGMP_GROUP, group);
}
+static void igmp_group_count_incr(struct igmp_sock *igmp)
+{
+ struct pim_interface *pim_ifp = igmp->interface->info;
+
+ if (!pim_ifp)
+ return;
+
+ ++pim_ifp->pim->igmp_group_count;
+ if (pim_ifp->pim->igmp_group_count
+ == pim_ifp->pim->igmp_watermark_limit) {
+ zlog_warn(
+ "IGMP group count reached watermark limit: %u(vrf: %s)",
+ pim_ifp->pim->igmp_group_count,
+ VRF_LOGNAME(pim_ifp->pim->vrf));
+ }
+}
+
+static void igmp_group_count_decr(struct igmp_sock *igmp)
+{
+ struct pim_interface *pim_ifp = igmp->interface->info;
+
+ if (!pim_ifp)
+ return;
+
+ if (pim_ifp->pim->igmp_group_count == 0) {
+ zlog_warn("Cannot decrement igmp group count below 0(vrf: %s)",
+ VRF_LOGNAME(pim_ifp->pim->vrf));
+ return;
+ }
+
+ --pim_ifp->pim->igmp_group_count;
+}
+
void igmp_group_delete(struct igmp_group *group)
{
struct listnode *src_node;
@@ -778,6 +811,7 @@ void igmp_group_delete(struct igmp_group *group)
}
group_timer_off(group);
+ igmp_group_count_decr(group->group_igmp_sock);
listnode_delete(group->group_igmp_sock->igmp_group_list, group);
hash_release(group->group_igmp_sock->igmp_group_hash, group);
@@ -1158,6 +1192,8 @@ struct igmp_group *igmp_add_group_by_addr(struct igmp_sock *igmp,
group_str, igmp->fd, igmp->interface->name);
}
+ igmp_group_count_incr(igmp);
+
/*
RFC 3376: 6.2.2. Definition of Group Timers