[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[Linux-cluster] cman ignores interface setting on ipv4
- From: Olivier Crete <ocrete max-t com>
- To: linux clustering <linux-cluster redhat com>
- Subject: [Linux-cluster] cman ignores interface setting on ipv4
- Date: Tue, 19 Jul 2005 18:22:23 -0400
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]