[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Linux-cluster] cman ignores interface setting on ipv4



Hi,

The current ipv4 code in the stable branch for cman completely ignores
the interface="" attribute for multicast. I've attached a minimal patch
that fixes that. 

I've only done minimal testing (ie it works here).. it will probably
break if there is no interface set, etc.. Have fun ;)

-- 
Olivier CrĂȘte
ocrete max-t com
Maximum Throughput Inc.
Index: cman/cman_tool/join.c
===================================================================
RCS file: /cvs/cluster/cluster/cman/cman_tool/join.c,v
retrieving revision 1.12.2.7.4.1
diff -u -r1.12.2.7.4.1 join.c
--- cman/cman_tool/join.c	31 May 2005 15:08:24 -0000	1.12.2.7.4.1
+++ cman/cman_tool/join.c	19 Jul 2005 22:14:45 -0000
@@ -79,6 +79,7 @@
     int ret;
     int he_errno;
     uint32_t bcast;
+    struct ifreq ifr;
 
     memset(&mcast_sin, 0, sizeof(mcast_sin));
     mcast_sin.sin_family = AF_INET;
@@ -148,11 +149,14 @@
 
     /* Join the multicast group */
     if (bhe) {
-	struct ip_mreq mreq;
+	struct ip_mreqn mreq;
 	char mcast_opt;
 
 	memcpy(&mreq.imr_multiaddr, bhe->h_addr, bhe->h_length);
-	memcpy(&mreq.imr_interface, he->h_addr, he->h_length);
+	// memcpy(&mreq.imr_address, he->h_addr, he->h_length);
+	mreq.imr_ifindex = if_nametoindex(comline->interfaces[num]);
+	printf("num %d index %d if %s mcastname %s nodename %s\n", num, mreq.imr_ifindex, comline->interfaces[num], comline->multicast_names[num], comline->nodenames[num]);
+	
 	if (setsockopt(mcast_sock, SOL_IP, IP_ADD_MEMBERSHIP, (void *)&mreq, sizeof(mreq)))
 	    die("Unable to join multicast group %s: %s\n", comline->multicast_names[num], strerror(errno));
 
@@ -162,6 +166,11 @@
 
 	mcast_opt = 0;
 	setsockopt(mcast_sock, SOL_IP, IP_MULTICAST_LOOP, (void *)&mcast_opt, sizeof(mcast_opt));
+
+	if (setsockopt(mcast_sock, SOL_IP, IP_MULTICAST_IF, (void *)&mreq, sizeof(mreq))) {
+		die("Unable to set multicast interface %s\n", comline->interfaces[num]);
+	}
+
     }
 
     /* Local socket */
@@ -169,6 +178,17 @@
     if (local_sock < 0)
 	die("Can't open local socket: %s", strerror(errno));
 
+    strcpy(ifr.ifr_name, comline->interfaces[num]);
+    ifr.ifr_addr.sa_family = AF_INET;
+    
+    if (ioctl(local_sock, SIOCGIFADDR, &ifr ) < 0)
+	    die("Can't find IP ADDR for interface: %s", strerror(errno));
+
+
+    
+    memcpy(&local_sin.sin_addr, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr,
+	   sizeof(local_sin.sin_addr));
+
     if (bind(local_sock, (struct sockaddr *)&local_sin, sizeof(local_sin)))
 	die("Cannot bind local address: %s", strerror(errno));
 

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]