All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next] sctp: add support for SCTP_REUSE_PORT sockopt
@ 2018-05-19  7:44 ` Xin Long
  0 siblings, 0 replies; 33+ messages in thread
From: Xin Long @ 2018-05-19  7:44 UTC (permalink / raw)
  To: network dev, linux-sctp; +Cc: Marcelo Ricardo Leitner, Neil Horman, davem

This feature is actually already supported by sk->sk_reuse which can be
set by SO_REUSEADDR. But it's not working exactly as RFC6458 demands in
section 8.1.27, like:

  - This option only supports one-to-one style SCTP sockets
  - This socket option must not be used after calling bind()
    or sctp_bindx().

Besides, SCTP_REUSE_PORT sockopt should be provided for user's programs.
Otherwise, the programs with SCTP_REUSE_PORT from other systems will not
work in linux.

This patch reuses sk->sk_reuse and works pretty much as SO_REUSEADDR,
just with some extra setup limitations that are neeeded when it is being
enabled.

"It should be noted that the behavior of the socket-level socket option
to reuse ports and/or addresses for SCTP sockets is unspecified", so it
leaves SO_REUSEADDR as is for the compatibility.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 include/uapi/linux/sctp.h |  1 +
 net/sctp/socket.c         | 48 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h
index b64d583..c02986a 100644
--- a/include/uapi/linux/sctp.h
+++ b/include/uapi/linux/sctp.h
@@ -100,6 +100,7 @@ typedef __s32 sctp_assoc_t;
 #define SCTP_RECVNXTINFO	33
 #define SCTP_DEFAULT_SNDINFO	34
 #define SCTP_AUTH_DEACTIVATE_KEY	35
+#define SCTP_REUSE_PORT		36
 
 /* Internal Socket Options. Some of the sctp library functions are
  * implemented using these socket options.
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 1b4593b..8dfcc79 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4170,6 +4170,28 @@ static int sctp_setsockopt_interleaving_supported(struct sock *sk,
 	return retval;
 }
 
+static int sctp_setsockopt_reuse_port(struct sock *sk, char __user *optval,
+				      unsigned int optlen)
+{
+	int val;
+
+	if (!sctp_style(sk, TCP))
+		return -EOPNOTSUPP;
+
+	if (sctp_sk(sk)->ep->base.bind_addr.port)
+		return -EFAULT;
+
+	if (optlen < sizeof(int))
+		return -EINVAL;
+
+	if (get_user(val, (int __user *)optval))
+		return -EFAULT;
+
+	sk->sk_reuse = val ? SK_CAN_REUSE : SK_NO_REUSE;
+
+	return 0;
+}
+
 /* API 6.2 setsockopt(), getsockopt()
  *
  * Applications use setsockopt() and getsockopt() to set or retrieve
@@ -4364,6 +4386,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname,
 		retval = sctp_setsockopt_interleaving_supported(sk, optval,
 								optlen);
 		break;
+	case SCTP_REUSE_PORT:
+		retval = sctp_setsockopt_reuse_port(sk, optval, optlen);
+		break;
 	default:
 		retval = -ENOPROTOOPT;
 		break;
@@ -7175,6 +7200,26 @@ static int sctp_getsockopt_interleaving_supported(struct sock *sk, int len,
 	return retval;
 }
 
+static int sctp_getsockopt_reuse_port(struct sock *sk, int len,
+				      char __user *optval,
+				      int __user *optlen)
+{
+	int val = 0;
+
+	if (len < sizeof(int))
+		return -EINVAL;
+
+	len = sizeof(int);
+	if (sk->sk_reuse != SK_NO_REUSE)
+		val = 1;
+	if (put_user(len, optlen))
+		return -EFAULT;
+	if (copy_to_user(optval, &val, len))
+		return -EFAULT;
+
+	return 0;
+}
+
 static int sctp_getsockopt(struct sock *sk, int level, int optname,
 			   char __user *optval, int __user *optlen)
 {
@@ -7370,6 +7415,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,
 		retval = sctp_getsockopt_interleaving_supported(sk, len, optval,
 								optlen);
 		break;
+	case SCTP_REUSE_PORT:
+		retval = sctp_getsockopt_reuse_port(sk, len, optval, optlen);
+		break;
 	default:
 		retval = -ENOPROTOOPT;
 		break;
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2018-05-23  9:49 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-19  7:44 [PATCH net-next] sctp: add support for SCTP_REUSE_PORT sockopt Xin Long
2018-05-19  7:44 ` Xin Long
2018-05-19 20:26 ` Marcelo Ricardo Leitner
2018-05-19 20:26   ` Marcelo Ricardo Leitner
2018-05-20 19:44 ` Tom Herbert
2018-05-20 19:44   ` Tom Herbert
2018-05-21  0:50 ` Neil Horman
2018-05-21  0:50   ` Neil Horman
2018-05-21  1:54   ` Marcelo Ricardo Leitner
2018-05-21  1:54     ` Marcelo Ricardo Leitner
2018-05-21  3:59     ` Tom Herbert
2018-05-21  3:59       ` Tom Herbert
2018-05-21  7:46     ` Xin Long
2018-05-21  7:46       ` Xin Long
2018-05-21 11:39     ` Neil Horman
2018-05-21 11:39       ` Neil Horman
2018-05-21 12:16       ` Michael Tuexen
2018-05-21 12:16         ` Michael Tuexen
2018-05-21 13:48         ` Neil Horman
2018-05-21 13:48           ` Neil Horman
2018-05-21 14:09           ` Michael Tuexen
2018-05-21 14:09             ` Michael Tuexen
2018-05-21 15:51             ` Marcelo Ricardo Leitner
2018-05-21 15:51               ` Marcelo Ricardo Leitner
2018-05-22 15:36               ` David Laight
2018-05-22  7:07           ` Xin Long
2018-05-22  7:07             ` Xin Long
2018-05-22 11:51             ` Neil Horman
2018-05-22 11:51               ` Neil Horman
2018-05-23  7:04               ` Xin Long
2018-05-23  7:04                 ` Xin Long
2018-05-23  9:48                 ` Neil Horman
2018-05-23  9:48                   ` Neil Horman

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.