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.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index a8612f91fa..20f339d43f 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -310,7 +310,7 @@ static int igmp_recv_query(struct igmp_sock *igmp, int query_version,
return 0;
}
- if (if_lookup_address(&from, AF_INET, ifp->vrf_id)) {
+ if (if_lookup_exact_address(&from, AF_INET, ifp->vrf_id)) {
if (PIM_DEBUG_IGMP_PACKETS)
zlog_debug("Recv IGMP query on interface: %s from ourself %s",
ifp->name, from_str);
@@ -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);