[Linux-cluster] [PATCH] Add network interface select option for fence_xvmd
Fabio M. Di Nitto
fdinitto at redhat.com
Tue Aug 26 06:58:01 UTC 2008
Lon,
any take on this one?
Fabio
On Tue, 5 Aug 2008, Satoru SATOH wrote:
> Hello,
>
>
> # I sent this before but it looks disappered somewhere so that resend it
> # again. Excuse me if you received the same mail twice.
>
> It should be useful that fence_xvmd listen on a certain network
> interface which manually specified under some conditions such as a
> system has multiple network interfaces and the one to default route is
> not prefered choice, I think.
>
> The following patch adds the option "-I <interface_name>" to select
> network interface fence_xvmd to listen on.
>
> - satoru
>
>
> fence/agents/xvm/fence_xvmd.c | 8 ++++----
> fence/agents/xvm/mcast.c | 21 ++++++++++++++++++---
> 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, 41 insertions(+), 9 deletions(-)
>
> diff --git a/fence/agents/xvm/fence_xvmd.c b/fence/agents/xvm/fence_xvmd.c
> index 888f24b..1dc5eba 100644
> --- a/fence/agents/xvm/fence_xvmd.c
> +++ b/fence/agents/xvm/fence_xvmd.c
> @@ -921,7 +921,7 @@ main(int argc, char **argv)
> unsigned int logmode = 0;
> char key[MAX_KEY_LEN];
> int key_len = 0, x;
> - char *my_options = "dfi:a:p:C:U:c:k:u?hLXV";
> + char *my_options = "dfi:a:I:p:C:U:c:k:u?hLXV";
> cman_handle_t ch = NULL;
> void *h = NULL;
>
> @@ -1031,9 +1031,9 @@ main(int argc, char **argv)
> }
>
> 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) {
> log_printf(LOG_ERR,
> "Could not set up multicast listen socket\n");
> @@ -1049,5 +1049,5 @@ main(int argc, char **argv)
>
> //malloc_dump_table();
>
> - return 0;
> + exit(errno);
> }
> diff --git a/fence/agents/xvm/mcast.c b/fence/agents/xvm/mcast.c
> index db46328..001e3ac 100644
> --- a/fence/agents/xvm/mcast.c
> +++ b/fence/agents/xvm/mcast.c
> @@ -31,11 +31,12 @@ LOGSYS_DECLARE_SUBSYS ("XVM", SYSLOGLEVEL);
> 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 sockaddr_in sin;
> + struct ifreq ifreq;
>
> /* Store multicast address */
> if (inet_pton(PF_INET, addr,
> @@ -74,7 +75,20 @@ 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);
> + if (ifindex > 0 && if_indextoname(ifindex, ifreq.ifr_name) != NULL) {
> + ifreq.ifr_addr.sa_family = AF_INET;
> + if (ioctl(sock, SIOCGIFADDR, &ifreq) < 0) {
> + printf("Failed to get address of the interface %d\n",
> + ifindex);
> + mreq.imr_interface.s_addr = htonl(INADDR_ANY);
> + } else {
> + memcpy(&mreq.imr_interface,
> + &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,
> + sizeof(struct in_addr));
> + }
> + } else {
> + mreq.imr_interface.s_addr = htonl(INADDR_ANY);
> + }
> dbg_printf(4, "Joining multicast group\n");
> if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
> &mreq, sizeof(mreq)) == -1) {
> @@ -184,7 +198,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;
> @@ -203,6 +217,7 @@ ipv6_recv_sk(char *addr, int port)
> memcpy(&mreq.ipv6mr_multiaddr, &sin.sin6_addr,
> sizeof(struct in6_addr));
>
> + mreq.ipv6mr_interface = (ifindex > 0) ? ifindex : 0;
>
> /********************************
> * SET UP MULTICAST RECV SOCKET *
> diff --git a/fence/agents/xvm/mcast.h b/fence/agents/xvm/mcast.h
> index 5113f04..08fd6de 100644
> --- a/fence/agents/xvm/mcast.h
> +++ b/fence/agents/xvm/mcast.h
> @@ -4,11 +4,11 @@
> #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 ttl);
> -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,
> int ttl);
> diff --git a/fence/agents/xvm/options.c b/fence/agents/xvm/options.c
> index 969ca8d..519f57e 100644
> --- a/fence/agents/xvm/options.c
> +++ b/fence/agents/xvm/options.c
> @@ -82,6 +82,13 @@ assign_address(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_ttl(fence_xvm_args_t *args, struct arg_info *arg, char *value)
> {
> int ttl;
> @@ -299,6 +306,10 @@ static struct arg_info _arg_info[] = {
> "Multicast address (default=225.0.0.12 / ff02::3:1)",
> assign_address },
>
> + { 'I', "-I <interface>", NULL,
> + "Network interface to listen on (default=auto; kernel selects)",
> + assign_interface },
> +
> { 'T', "-T <ttl>", "multicast_ttl",
> "Multicast time-to-live (in hops; default=2)",
> assign_ttl },
> @@ -422,6 +433,7 @@ args_init(fence_xvm_args_t *args)
> args->flags = 0;
> args->debug = 0;
> args->ttl = DEFAULT_TTL;
> + args->ifindex = 0;
> }
>
>
> @@ -439,6 +451,7 @@ args_print(fence_xvm_args_t *args)
> {
> dbg_printf(1, "-- args @ %p --\n", args);
> _pr_str(args->addr);
> + _pr_int(args->ifindex);
> _pr_str(args->domain);
> _pr_str(args->key_file);
> _pr_int(args->op);
> diff --git a/fence/agents/xvm/options.h b/fence/agents/xvm/options.h
> index 7a2dcca..8720366 100644
> --- a/fence/agents/xvm/options.h
> +++ b/fence/agents/xvm/options.h
> @@ -29,6 +29,7 @@ typedef struct {
> arg_flags_t flags;
> int debug;
> int ttl;
> + unsigned int ifindex;
> } fence_xvm_args_t;
>
> /* Private structure for commandline / stdin fencing args */
> diff --git a/fence/man/fence_xvmd.8 b/fence/man/fence_xvmd.8
> index 5a47211..05d4720 100644
> --- a/fence/man/fence_xvmd.8
> +++ b/fence/man/fence_xvmd.8
> @@ -36,6 +36,9 @@ IP family to use (auto, ipv4, or ipv6; default = auto)
> Multicast address to listen on (default=225.0.0.12 for ipv4, ff02::3:1
> for ipv6)
> .TP
> +\fB-I\fP \fIinterface\fP
> +Network interface to use; e.g. eth0 (default: one[s] kernel choosed)
> +.TP
> \fB-p\fP \fIport\fP
> Port to use (default=1229)
> .TP
>
> --
> Linux-cluster mailing list
> Linux-cluster at redhat.com
> https://www.redhat.com/mailman/listinfo/linux-cluster
>
--
I'm going to make him an offer he can't refuse.
More information about the Linux-cluster
mailing list