[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