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.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index c0a58516d9..5e1aecc3a3 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -281,6 +281,9 @@ static int igmp_recv_query(struct igmp_sock *igmp, int query_version,
uint16_t recv_checksum;
uint16_t checksum;
+ if (igmp->mtrace_only)
+ return 0;
+
memcpy(&group_addr, igmp_msg + 4, sizeof(struct in_addr));
ifp = igmp->interface;
@@ -387,6 +390,9 @@ static int igmp_v1_recv_report(struct igmp_sock *igmp, struct in_addr from,
on_trace(__PRETTY_FUNCTION__, igmp->interface, from);
+ if (igmp->mtrace_only)
+ return 0;
+
if (igmp_msg_len != IGMP_V12_MSG_SIZE) {
zlog_warn(
"Recv IGMP report v1 from %s on %s: size=%d other than correct=%d",
@@ -510,7 +516,6 @@ int pim_igmp_packet(struct igmp_sock *igmp, char *buf, size_t len)
return igmp_mtrace_recv_response(igmp, ip_hdr, ip_hdr->ip_src,
from_str, igmp_msg,
igmp_msg_len);
- break;
case PIM_IGMP_MTRACE_QUERY_REQUEST:
return igmp_mtrace_recv_qry_req(igmp, ip_hdr, ip_hdr->ip_src,
from_str, igmp_msg,
@@ -819,7 +824,7 @@ static int igmp_group_hash_equal(const void *arg1, const void *arg2)
}
static struct igmp_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
- struct interface *ifp)
+ struct interface *ifp, int mtrace_only)
{
struct pim_interface *pim_ifp;
struct igmp_sock *igmp;
@@ -862,6 +867,13 @@ static struct igmp_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
pim_ifp->igmp_default_robustness_variable;
igmp->sock_creation = pim_time_monotonic_sec();
+ if (mtrace_only) {
+ igmp->mtrace_only = mtrace_only;
+ return igmp;
+ }
+
+ igmp->mtrace_only = false;
+
/*
igmp_startup_mode_on() will reset QQI:
@@ -919,7 +931,8 @@ static void igmp_read_on(struct igmp_sock *igmp)
struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
struct in_addr ifaddr,
- struct interface *ifp)
+ struct interface *ifp,
+ bool mtrace_only)
{
struct pim_interface *pim_ifp;
struct igmp_sock *igmp;
@@ -934,7 +947,7 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
return 0;
}
- igmp = igmp_sock_new(fd, ifaddr, ifp);
+ igmp = igmp_sock_new(fd, ifaddr, ifp, mtrace_only);
if (!igmp) {
zlog_err("%s %s: igmp_sock_new() failure", __FILE__,
__PRETTY_FUNCTION__);