[DRBD-cvs] r1904 - branches/drbd-0.7/drbd

www-data www-data at linbit.com
Wed Jul 27 16:49:36 CEST 2005


Author: lars
Date: 2005-07-27 16:49:35 +0200 (Wed, 27 Jul 2005)
New Revision: 1904

Modified:
   branches/drbd-0.7/drbd/drbd_receiver.c
Log:
As suggested on drbd-user by Matthias Weigel,
do an explicit bind() before connect().

This makes sure the outgoing connection has the configured ip locally, which
might make a difference on multi-homed hosts with several routes to the peer,
or on aliased interfaces.


Modified: branches/drbd-0.7/drbd/drbd_receiver.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_receiver.c	2005-07-27 12:06:10 UTC (rev 1903)
+++ branches/drbd-0.7/drbd/drbd_receiver.c	2005-07-27 14:49:35 UTC (rev 1904)
@@ -614,15 +614,37 @@
 {
 	int err;
 	struct socket *sock;
+	struct sockaddr_in src_in;
 
 	err = sock_create(AF_INET, SOCK_STREAM, 0, &sock);
 	if (err) {
 		ERR("sock_creat(..)=%d\n", err);
+		return NULL;
 	}
 
 	sock->sk->SK_(rcvtimeo) =
 	sock->sk->SK_(sndtimeo) =  mdev->conf.try_connect_int*HZ;
 
+       /* explicitly bind to the configured IP as source IP 
+	   for the outgoing connections.
+	   This is needed for multihomed hosts and to be 
+	   able to use lo: interfaces for drbd.
+          Make sure to use 0 as portnumber, so linux selects
+	   a free one dynamically.
+	*/
+	memcpy (&src_in, &(mdev->conf.my_addr), sizeof(struct sockaddr_in));
+	src_in.sin_port = 0; 
+
+	err = sock->ops->bind(sock,
+			      (struct sockaddr * ) &src_in,
+			      sizeof (struct sockaddr_in));
+	if (err) {
+		ERR("Unable to bind source sock (%d)\n", err);
+		sock_release(sock);
+		sock = NULL;
+		return sock;
+	}
+
 	err = sock->ops->connect(sock,
 				 (struct sockaddr *) mdev->conf.other_addr,
 				 mdev->conf.other_addr_len, 0);
@@ -642,7 +664,7 @@
 	err = sock_create(AF_INET, SOCK_STREAM, 0, &sock2);
 	if (err) {
 		ERR("sock_creat(..)=%d\n", err);
-		// FIXME return NULL ?
+		return NULL;
 	}
 
 	sock2->sk->SK_(reuse)    = 1; /* SO_REUSEADDR */
@@ -653,7 +675,7 @@
 			      (struct sockaddr *) mdev->conf.my_addr,
 			      mdev->conf.my_addr_len);
 	if (err) {
-		ERR("Unable to bind (%d)\n", err);
+		ERR("Unable to bind sock2 (%d)\n", err);
 		sock_release(sock2);
 		set_cstate(mdev,Unconnected);
 		return 0;



More information about the drbd-cvs mailing list