From: Nebojsa Miljanovic <neb@alcatel-lucent.com>
To: linux-kernel@vger.kernel.org
Cc: "Kittlitz, Edward (Ned)" <nkittlitz@alcatel-lucent.com>,
asweeney@alcatel-lucent.com, "Polhemus,
William (Bart)" <bpolhemus@alcatel-lucent.com>
Subject: SO_REUSEADDR not allowing server and client to use same port
Date: Thu, 28 Feb 2008 12:15:06 -0600 [thread overview]
Message-ID: <47C6FA2A.5030302@alcatel-lucent.com> (raw)
Hello all,
I have seen similar complaints about this issue before in the list archive, but
I have not seen any resolution. So, I am posting the question again in hope of
getting some replies.
Currently, Linux does not allow reuse of same local port for both TCP server and
TCP client. I understand that there may be a need to prevent two servers from
binding to the same local port, but having 1 server and 1 outgoing client use it
should be allowed. Other Unix like operating systems do allow it. Further more,
Linux SCTP socket API allows for this to happen. And, I can't imagine why this
restriction would exists for TCP and not for SCTP.
This issue is caused by tcp_v4_get_port() function (same check is in IPV6
version of this function). It does does not allow for "tb->fastreuse" bit to be
set when passed socket is in listening state. Suggested code change below would
allow for port reuse by a single listening socket and multiple client sockets.
[neb@mvista ipv4]$ cvs diff -u20 -p -w -b tcp_ipv4.c
Index: tcp_ipv4.c
===================================================================
RCS file:
/cvs/cvsroot/Repository/TelicaRoot/components/mvlinux/cge/devkit/lsp/7xx/linux/net/ipv4/tcp_ipv4.c,v
retrieving revision 1.1.1.2
diff -u -2 -0 -p -w -b -r1.1.1.2 tcp_ipv4.c
--- tcp_ipv4.c 27 Apr 2007 12:34:39 -0000 1.1.1.2
+++ tcp_ipv4.c 28 Feb 2008 18:10:16 -0000
@@ -258,46 +258,54 @@ static int tcp_v4_get_port(struct sock *
tb = NULL;
goto tb_not_found;
tb_found:
if (!hlist_empty(&tb->owners)) {
if (sk->sk_reuse > 1)
goto success;
if (tb->fastreuse > 0 &&
sk->sk_reuse && sk->sk_state != TCP_LISTEN) {
goto success;
} else {
ret = 1;
if (tcp_bind_conflict(sk, tb))
goto fail_unlock;
}
}
tb_not_found:
ret = 1;
if (!tb && (tb = tcp_bucket_create(head, snum)) == NULL)
goto fail_unlock;
if (hlist_empty(&tb->owners)) {
+#if 1 /* Do not check for TCP_LISTEN state */
+ if (sk->sk_reuse)
+#else
if (sk->sk_reuse && sk->sk_state != TCP_LISTEN)
+#endif
tb->fastreuse = 1;
else
tb->fastreuse = 0;
} else if (tb->fastreuse &&
+#if 1 /* Do not check for TCP_LISTEN state */
+ (!sk->sk_reuse))
+#else
(!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
+#endif
tb->fastreuse = 0;
success:
if (!tcp_sk(sk)->bind_hash)
tcp_bind_hash(sk, tb, snum);
BUG_TRAP(tcp_sk(sk)->bind_hash == tb);
ret = 0;
fail_unlock:
spin_unlock(&head->lock);
fail:
local_bh_enable();
return ret;
}
Thanks,
Neb Miljanovic
Alcatel-Lucent
next reply other threads:[~2008-02-28 18:25 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-28 18:15 Nebojsa Miljanovic [this message]
2008-02-28 18:30 ` SO_REUSEADDR not allowing server and client to use same port Phil Oester
2008-02-28 20:19 ` Alan Cox
2008-02-28 20:41 ` Willy Tarreau
2008-03-13 19:18 ` Nebojsa Miljanovic
2008-03-15 13:34 ` Alan Cox
2008-03-17 16:43 ` Nebojsa Miljanovic
2008-03-17 17:30 ` Alan Cox
2008-03-17 18:17 ` Nebojsa Miljanovic
2008-03-18 5:48 ` Willy Tarreau
2008-02-28 20:36 ` Willy Tarreau
2008-02-28 20:44 ` Nebojsa Miljanovic
-- strict thread matches above, loose matches on Subject: below --
2008-02-28 19:00 Nebojsa Miljanovic
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=47C6FA2A.5030302@alcatel-lucent.com \
--to=neb@alcatel-lucent.com \
--cc=asweeney@alcatel-lucent.com \
--cc=bpolhemus@alcatel-lucent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nkittlitz@alcatel-lucent.com \
/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.