This is the mail archive of the
cluster-cvs@sourceware.org
mailing list for the cluster.
RHEL5 - fence: Add network interface select option for fence_xvmd
- From: Lon Hohberger <lon at fedoraproject dot org>
- To: cluster-cvs-relay at redhat dot com
- Date: Mon, 8 Sep 2008 15:29:18 +0000 (UTC)
- Subject: RHEL5 - fence: Add network interface select option for fence_xvmd
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=a4f4f109ae329a96632f776d1ce166241f5aa1e1
Commit: a4f4f109ae329a96632f776d1ce166241f5aa1e1
Parent: b249c86a31cf414deff450698fb064dcfd3e58e1
Author: Satoru SATOH <satoru.satoh@gmail.com>
AuthorDate: Mon Sep 8 11:27:51 2008 -0400
Committer: Lon Hohberger <lhh@redhat.com>
CommitterDate: Mon Sep 8 11:29:04 2008 -0400
fence: Add network interface select option for fence_xvmd
1. fence_xvmd selects wrong network interface to listen on if host has
multiple interfaces and target interface is not for default route.
As a result, fence_xvmd does not repond to fence_xvm's request.
2. fence_xvmd cannot start if default route is not set.
Ex: fence_xvmd -I <interface_name>
Signed-Off-By: Satoru SATOH <satoru.satoh@gmail.com>
Signed-Off-By: Lon Hohberger <lhh@redhat.com>
---
fence/agents/xvm/fence_xvmd.c | 6 +++---
fence/agents/xvm/mcast.c | 9 +++++----
fence/agents/xvm/mcast.h | 4 ++--
fence/agents/xvm/options.c | 13 +++++++++++++
fence/agents/xvm/options.h | 1 +
fence/man/fence_xvmd.8 | 3 +++
6 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/fence/agents/xvm/fence_xvmd.c b/fence/agents/xvm/fence_xvmd.c
index d7d25ca..1d496d2 100644
--- a/fence/agents/xvm/fence_xvmd.c
+++ b/fence/agents/xvm/fence_xvmd.c
@@ -739,7 +739,7 @@ main(int argc, char **argv)
int mc_sock;
char key[MAX_KEY_LEN];
int key_len = 0, x;
- char *my_options = "dfi:a:p:C:c:k:u?hLXV";
+ char *my_options = "dfi:a:p:I:C:c:k:u?hLXV";
cman_handle_t ch = NULL;
void *h = NULL;
@@ -831,9 +831,9 @@ main(int argc, char **argv)
printf("Checkpoint initialized\n");
}
if (args.family == PF_INET)
- mc_sock = ipv4_recv_sk(args.addr, args.port);
+ mc_sock = ipv4_recv_sk(args.addr, args.port, args.ifindex);
else
- mc_sock = ipv6_recv_sk(args.addr, args.port);
+ mc_sock = ipv6_recv_sk(args.addr, args.port, args.ifindex);
if (mc_sock < 0) {
printf("Could not set up multicast listen socket\n");
return 1;
diff --git a/fence/agents/xvm/mcast.c b/fence/agents/xvm/mcast.c
index e755ec0..274ddb1 100644
--- a/fence/agents/xvm/mcast.c
+++ b/fence/agents/xvm/mcast.c
@@ -47,10 +47,10 @@
Sets up a multicast receive socket
*/
int
-ipv4_recv_sk(char *addr, int port)
+ipv4_recv_sk(char *addr, int port, unsigned int ifindex)
{
int sock;
- struct ip_mreq mreq;
+ struct ip_mreqn mreq;
struct sockaddr_in sin;
/* Store multicast address */
@@ -90,7 +90,7 @@ ipv4_recv_sk(char *addr, int port)
* Join multicast group
*/
/* mreq.imr_multiaddr.s_addr is set above */
- mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+ mreq.imr_ifindex = ifindex;
dbg_printf(4, "Joining multicast group\n");
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&mreq, sizeof(mreq)) == -1) {
@@ -200,7 +200,7 @@ ipv4_send_sk(char *send_addr, char *addr, int port, struct sockaddr *tgt,
Sets up a multicast receive (ipv6) socket
*/
int
-ipv6_recv_sk(char *addr, int port)
+ipv6_recv_sk(char *addr, int port, unsigned int ifindex)
{
int sock, val;
struct ipv6_mreq mreq;
@@ -219,6 +219,7 @@ ipv6_recv_sk(char *addr, int port)
memcpy(&mreq.ipv6mr_multiaddr, &sin.sin6_addr,
sizeof(struct in6_addr));
+ mreq.ipv6mr_interface = ifindex;
/********************************
* SET UP MULTICAST RECV SOCKET *
diff --git a/fence/agents/xvm/mcast.h b/fence/agents/xvm/mcast.h
index 2da33cb..f86ad96 100644
--- a/fence/agents/xvm/mcast.h
+++ b/fence/agents/xvm/mcast.h
@@ -22,10 +22,10 @@
#define IPV4_MCAST_DEFAULT "225.0.0.12"
#define IPV6_MCAST_DEFAULT "ff05::3:1"
-int ipv4_recv_sk(char *addr, int port);
+int ipv4_recv_sk(char *addr, int port, unsigned int ifindex);
int ipv4_send_sk(char *src_addr, char *addr, int port,
struct sockaddr *src, socklen_t slen);
-int ipv6_recv_sk(char *addr, int port);
+int ipv6_recv_sk(char *addr, int port, unsigned int ifindex);
int ipv6_send_sk(char *src_addr, char *addr, int port,
struct sockaddr *src, socklen_t slen);
diff --git a/fence/agents/xvm/options.c b/fence/agents/xvm/options.c
index ec3d763..9490b25 100644
--- a/fence/agents/xvm/options.c
+++ b/fence/agents/xvm/options.c
@@ -107,6 +107,13 @@ assign_port(fence_xvm_args_t *args, struct arg_info *arg, char *value)
static inline void
+assign_interface(fence_xvm_args_t *args, struct arg_info *arg, char *value)
+{
+ args->ifindex = if_nametoindex(value);
+}
+
+
+static inline void
assign_retrans(fence_xvm_args_t *args, struct arg_info *arg, char *value)
{
args->retr_time = atoi(value);
@@ -290,6 +297,10 @@ static struct arg_info _arg_info[] = {
"IP port (default=1229)",
assign_port },
+ { 'I', "-I <interface>", "multicast_address",
+ "Network interface name to listen on",
+ assign_interface },
+
{ 'r', "-r <retrans>", "retrans",
"Multicast retransmit time (in 1/10sec; default=20)",
assign_retrans },
@@ -394,6 +405,7 @@ args_init(fence_xvm_args_t *args)
args->hash = DEFAULT_HASH;
args->auth = DEFAULT_AUTH;
args->port = 1229;
+ args->ifindex = 0;
args->family = PF_INET;
args->timeout = 30;
args->retr_time = 20;
@@ -422,6 +434,7 @@ args_print(fence_xvm_args_t *args)
_pr_int(args->hash);
_pr_int(args->auth);
_pr_int(args->port);
+ _pr_int(args->ifindex);
_pr_int(args->family);
_pr_int(args->timeout);
_pr_int(args->retr_time);
diff --git a/fence/agents/xvm/options.h b/fence/agents/xvm/options.h
index fee3274..96b0d07 100644
--- a/fence/agents/xvm/options.h
+++ b/fence/agents/xvm/options.h
@@ -40,6 +40,7 @@ typedef struct {
fence_hash_t hash;
fence_auth_type_t auth;
int port;
+ unsigned int ifindex;
int family;
int timeout;
int retr_time;
diff --git a/fence/man/fence_xvmd.8 b/fence/man/fence_xvmd.8
index 43a7f7e..ac176b2 100644
--- a/fence/man/fence_xvmd.8
+++ b/fence/man/fence_xvmd.8
@@ -46,6 +46,9 @@ for ipv6)
\fB-p\fP \fIport\fP
Port to use (default=1229)
.TP
+\fB-I\fP \fIinterface\fP
+Network interface to listen on, e.g. eth0.
+.TP
\fB-C\fP \fIauth\fP
Authentication type (none, sha1, sha256, sha512; default=sha256). This
controls the authentication mechanism used to authenticate clients. The