]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_igmp.c
pimd: mtrace only IGMP sockets
[mirror_frr.git] / pimd / pim_igmp.c
index c0a58516d993ec24c61135639acbe2e2e5fd1204..5e1aecc3a389cec533e495815141c8bd545ad022 100644 (file)
@@ -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__);