]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: fix IGMP source address on transmit
authorNathan Bahr <nbahr@atcorp.com>
Wed, 19 Aug 2020 19:42:07 +0000 (14:42 -0500)
committerJafar Al-Gharaibeh <jafar@atcorp.com>
Wed, 26 Aug 2020 16:14:41 +0000 (11:14 -0500)
IGMP queries should contain the source address of the IGMP socket
they are being sent from.
Added binding the IGMP sockets to their specific source, otherwise
interfaces with multiple addresses will send multiple queries using
the same source, which is determined by the kernel.

Signed-off-by: Nathan Bahr <nbahr@atcorp.com>
Reviewed-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
pimd/pim_igmp.c

index 851b00b2ac2dec0fd5a9b2a770c82f9f55f7de7b..62954400f1857777227a434cf988cac8ebd7dd64 100644 (file)
@@ -997,6 +997,7 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
 {
        struct pim_interface *pim_ifp;
        struct igmp_sock *igmp;
+       struct sockaddr_in sin;
        int fd;
 
        pim_ifp = ifp->info;
@@ -1008,6 +1009,15 @@ struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
                return 0;
        }
 
+       sin.sin_family = AF_INET;
+       sin.sin_addr = ifaddr;
+       sin.sin_port = 0;
+       if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) != 0) {
+               zlog_warn("Could not bind IGMP socket for %s on %s",
+                         inet_ntoa(ifaddr), ifp->name);
+               return 0;
+       }
+
        igmp = igmp_sock_new(fd, ifaddr, ifp, mtrace_only);
 
        igmp_read_on(igmp);