pimd: fix IGMP source address on transmit

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>
This commit is contained in:
Nathan Bahr 2020-08-19 14:42:07 -05:00 committed by Jafar Al-Gharaibeh
parent efe6f18590
commit d05d3f7a6f

View File

@ -995,6 +995,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;
@ -1006,6 +1007,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);