From: lhh@sourceware.org <lhh@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/magma/lib magmamsg.h memberlist.c mess ...
Date: 26 Oct 2007 20:23:48 -0000 [thread overview]
Message-ID: <20071026202348.11818.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL4
Changes by: lhh at sourceware.org 2007-10-26 20:23:47
Modified files:
magma/lib : magmamsg.h memberlist.c message.c
Log message:
Fix bugzilla #298831 - apps using magmamsg don't connect from correct source IP on multi-homed hosts
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/magmamsg.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5&r2=1.5.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/memberlist.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.6&r2=1.6.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/message.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.3&r2=1.9.2.4
--- cluster/magma/lib/Attic/magmamsg.h 2004/11/02 20:11:38 1.5
+++ cluster/magma/lib/Attic/magmamsg.h 2007/10/26 20:23:46 1.5.2.1
@@ -22,6 +22,7 @@
#include <magma.h>
int msg_update(cluster_member_list_t *membership);
+int msg_set_nodeid(uint64_t nodeid);
void msg_shutdown(void);
ssize_t msg_receive_timeout(int fd, void *buf, ssize_t count,
unsigned int timeout);
--- cluster/magma/lib/Attic/memberlist.c 2004/11/02 20:11:38 1.6
+++ cluster/magma/lib/Attic/memberlist.c 2007/10/26 20:23:46 1.6.2.1
@@ -234,7 +234,7 @@
{
int x;
- if (!list)
+ if (!list || nodeid == NODE_ID_NONE)
return NULL;
for (x = 0; x < list->cml_count; x++) {
--- cluster/magma/lib/Attic/message.c 2005/04/21 17:28:29 1.9.2.3
+++ cluster/magma/lib/Attic/message.c 2007/10/26 20:23:46 1.9.2.4
@@ -61,6 +61,7 @@
*/
static pthread_mutex_t ml_mutex = PTHREAD_MUTEX_INITIALIZER;
static cluster_member_list_t *ml_membership;
+static uint64_t _local_id = NODE_ID_NONE;
/* Mutex to prevent
thread1 thread2
@@ -104,6 +105,16 @@
}
+int
+msg_set_nodeid(uint64_t my_node_id)
+{
+ pthread_mutex_lock(&ml_mutex);
+ _local_id = my_node_id;
+ pthread_mutex_unlock(&ml_mutex);
+ return 0;
+}
+
+
/**
Shut down the mssage subsystem. Closes all file descriptors and cleans up
the membership list.
@@ -300,9 +311,12 @@
@see connect_nb, ipv4_connect
*/
static int
-ipv6_connect(struct in6_addr *in6_addr, uint16_t port, int timeout)
+ipv6_connect(struct in6_addr *in6_addr, uint16_t port, int timeout,
+ cluster_member_t *me)
{
struct sockaddr_in6 _sin6;
+ struct sockaddr_in6 srcaddr;
+ struct addrinfo *ai;
int fd, ret;
fd = socket(PF_INET6, SOCK_STREAM, 0);
@@ -315,6 +329,29 @@
_sin6.sin6_flowinfo = 0;
memcpy(&_sin6.sin6_addr, in6_addr, sizeof(_sin6.sin6_addr));
+ if (me) {
+ /* if we know the local node, bind to its resolved
+ interface so other nodes don't reject the connection
+ due to improper source-routing */
+ memset(&srcaddr, 0, sizeof(srcaddr));
+ srcaddr.sin6_family = AF_INET6;
+
+ for (ai = me->cm_addrs; ai; ai = ai->ai_next) {
+ if (ai->ai_family != AF_INET6)
+ continue;
+
+ if (ai->ai_socktype != SOCK_STREAM)
+ continue;
+
+ memcpy(&((struct sockaddr_in6 *)&srcaddr)->sin6_addr,
+ &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr,
+ sizeof(struct in6_addr));
+
+ bind(fd, (struct sockaddr *)&srcaddr,
+ sizeof(srcaddr));
+ }
+ }
+
ret = connect_nb(fd, (struct sockaddr *)&_sin6, sizeof(_sin6), timeout);
if (ret < 0) {
close(fd);
@@ -335,15 +372,41 @@
@see connect_nb, ipv6_connect
*/
static int
-ipv4_connect(struct in_addr *in_addr, uint16_t port, int timeout)
+ipv4_connect(struct in_addr *in_addr, uint16_t port, int timeout,
+ cluster_member_t *me)
{
struct sockaddr_in _sin;
+ struct sockaddr_in srcaddr;
+ struct addrinfo *ai;
int fd, ret;
fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0)
return -1;
+ if (me) {
+ /* if we know the local node, bind to its resolved
+ interface so other nodes don't reject the connection
+ due to improper source-routing */
+ memset(&srcaddr, 0, sizeof(srcaddr));
+ srcaddr.sin_family = AF_INET;
+
+ for (ai = me->cm_addrs; ai; ai = ai->ai_next) {
+ if (ai->ai_family != AF_INET)
+ continue;
+
+ if (ai->ai_socktype != SOCK_STREAM)
+ continue;
+
+ memcpy(&((struct sockaddr_in *)&srcaddr)->sin_addr,
+ &((struct sockaddr_in *)ai->ai_addr)->sin_addr,
+ sizeof(struct in_addr));
+
+ bind(fd, (struct sockaddr *)&srcaddr,
+ sizeof(srcaddr));
+ }
+ }
+
_sin.sin_family = AF_INET;
_sin.sin_port = htons(port);
memcpy(&_sin.sin_addr, in_addr, sizeof(_sin.sin_addr));
@@ -377,6 +440,7 @@
{
int fd;
cluster_member_t *nodep;
+ cluster_member_t *me;
struct addrinfo *ai;
pthread_mutex_lock(&ml_mutex);
@@ -387,6 +451,10 @@
return -1;
}
+ me = memb_id_to_p(ml_membership, _local_id);
+ if (me)
+ memb_resolve(me);
+
/* Try to resolve if we haven't done so */
if (!nodep->cm_addrs && (memb_resolve(nodep) < 0)) {
pthread_mutex_unlock(&ml_mutex);
@@ -404,7 +472,7 @@
fd = ipv6_connect(
&((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr,
- baseport + IPV6_PORT_OFFSET, timeout);
+ baseport + IPV6_PORT_OFFSET, timeout, me);
if (fd >= 0) {
pthread_mutex_unlock(&ml_mutex);
@@ -428,7 +496,7 @@
fd = ipv4_connect(
&((struct sockaddr_in *)ai->ai_addr)->sin_addr,
- baseport, timeout);
+ baseport, timeout, me );
if (fd >= 0) {
pthread_mutex_unlock(&ml_mutex);
reply other threads:[~2007-10-26 20:23 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071026202348.11818.qmail@sourceware.org \
--to=lhh@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.