[prev in list] [next in list] [prev in thread] [next in thread] 

List:       keepalived-devel
Subject:    [Keepalived-devel] [PATCH 01/12] Fix socket setup code for IPv4 multicast
From:       quentin () armitage ! org ! uk (Quentin Armitage)
Date:       2015-11-01 21:46:02
Message-ID: 20151101214603.04DE2C357B () samson ! armitage ! org ! uk
[Download RAW message or body]

if_setsockopt_mcast_if was only doing anything for IPv6 interfaces.
Make it work also for IPv4 interfaces, and then don't need to
call if_setsockopt_bindtodevice for multicast.

Is it still necessary to call it for unicast?

Signed-off-by: Quentin Armitage <quentin@armitage.org.uk>
---
 keepalived/vrrp/vrrp.c    |   16 ++++++++++------
 keepalived/vrrp/vrrp_if.c |   15 +++++++++++----
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/keepalived/vrrp/vrrp.c b/keepalived/vrrp/vrrp.c
index bb42a44..b9299fe 100644
--- a/keepalived/vrrp/vrrp.c
+++ b/keepalived/vrrp/vrrp.c
@@ -1446,9 +1446,12 @@ open_vrrp_send_socket(sa_family_t family, int proto, int idx, \
int unicast)  if (family == AF_INET) {
 		/* Set v4 related */
 		if_setsockopt_hdrincl(&fd);
-		if_setsockopt_bindtodevice(&fd, ifp);
-		if (!unicast)
+		if (unicast)
+			if_setsockopt_bindtodevice(&fd, ifp);
+		else {
+			if_setsockopt_mcast_if(family, &fd, ifp);
 			if_setsockopt_mcast_loop(family, &fd);
+		}
 		if_setsockopt_priority(&fd);
 		if (fd < 0)
 			return -1;
@@ -1496,13 +1499,14 @@ open_vrrp_socket(sa_family_t family, int proto, int idx,
 	if (!unicast) {
 		if_join_vrrp_group(family, &fd, ifp, proto);
 	}
+	else if (family == AF_INET) {
+		/* Bind inbound stream */
+		if_setsockopt_bindtodevice(&fd, ifp);
+	}
 	if (fd < 0)
 		return -1;
 
-	if (family == AF_INET) {
-		/* Bind inbound stream */
-		if_setsockopt_bindtodevice(&fd, ifp);
-	} else if (family == AF_INET6) {
+	if (family == AF_INET6) {
 		/* Let kernel calculate checksum. */
 		if_setsockopt_ipv6_checksum(&fd);
 	}
diff --git a/keepalived/vrrp/vrrp_if.c b/keepalived/vrrp/vrrp_if.c
index e186d9a..8374df1 100644
--- a/keepalived/vrrp/vrrp_if.c
+++ b/keepalived/vrrp/vrrp_if.c
@@ -644,15 +644,22 @@ if_setsockopt_mcast_if(sa_family_t family, int *sd, interface_t \
*ifp)  int ret;
 	unsigned int ifindex;
 
-	/* Not applicable for IPv4 */
-	if (*sd < 0 || family == AF_INET)
+	if (*sd < 0)
 		return -1;
 
 	/* Set interface for sending outbound datagrams */
 	ifindex = IF_INDEX(ifp);
-	ret = setsockopt(*sd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex));
+	if ( family == AF_INET)
+	{
+		struct ip_mreqn imr ;
+		imr.imr_ifindex = IF_INDEX(ifp);
+		ret = setsockopt(*sd, IPPROTO_IP, IP_MULTICAST_IF, &imr, sizeof(imr));
+	}
+	else
+		ret = setsockopt(*sd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex));
+
 	if (ret < 0) {
-		log_message(LOG_INFO, "cant set IPV6_MULTICAST_IF IP option. errno=%d (%m)", \
errno); +		log_message(LOG_INFO, "cant set IP%s_MULTICAST_IF IP option. errno=%d \
(%m)", (family == AF_INET) ? "" : "V6", errno);  close(*sd);
 		*sd = -1;
 	}
-- 
1.7.7.6


------------------------------------------------------------------------------
_______________________________________________
Keepalived-devel mailing list
Keepalived-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/keepalived-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic