* [PATCH v2] lksctp-tools: Add sctp_peeloff_flags function
@ 2017-07-03 20:13 Neil Horman
2017-07-03 20:29 ` Marcelo Ricardo Leitner
0 siblings, 1 reply; 2+ messages in thread
From: Neil Horman @ 2017-07-03 20:13 UTC (permalink / raw)
To: linux-sctp
From: Neil Horman <nhorman@tuxdriver.com>
With the addition of the SCTP_SOCKOPT_PEELOFF_FLAGS socket option for
linux, this patch adds a library function to support its use. For non
linux systems, when the call is used with a 0 flag set, the behavior
will be identical to sctp_peeloff, and with a non-zero flag set for
non-linux operating systems, a runtime error will be returned.
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Vlad Yasevich <vyasevic@redhat.com>
CC: Daniel Borkmann <dborkman@redhat.com>
---
Change Notes
v2)
* Cleaned up man page documentation
* Consolodated if (flags) check
---
man/sctp_peeloff.3 | 16 ++++++++++++++++
src/include/netinet/sctp.h | 6 ++++++
src/lib/peeloff.c | 45 +++++++++++++++++++++++++++++++--------------
3 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/man/sctp_peeloff.3 b/man/sctp_peeloff.3
index 7cbde5d..6ad2cfd 100644
--- a/man/sctp_peeloff.3
+++ b/man/sctp_peeloff.3
@@ -15,6 +15,7 @@ sctp_peeloff \- Branch off an association into a separate socket.
.B #include <netinet/sctp.h>
.sp
.BI "int sctp_peeloff(int " sd ", sctp_assoc_t " assoc_id );
+.BI "int sctp_peeloff_flags(int " sd ", sctp_assoc_t " assoc_id ", unsigned " flags );
.fi
.SH DESCRIPTION
.B sctp_peeloff
@@ -28,6 +29,18 @@ This is particularly desirable when, for instance, the application wishes to
have a number of sporadic message senders/receivers remain under the original
one-to-many style socket, but branch off those assocations carrying high volume
data traffic into their own separate socket descriptors.
+
+.B sctp_peeloff_flags
+is a variant of sctp_peeloff, in which flags describing the behavior of
+the newly peeled off socket can be specified. Currently the supported flags
+are:
+.TP
+.B SOCK_NONBLOCK
+Specifies that the new socket should not block on io operations.
+.TP
+.B SOCK_CLOEXEC
+Specifies that the new socket should be closed when the owning process calls
+exec.
.SH "RETURN VALUE"
On success, the new socket descriptor representing the branched-off asociation is returned.
On error, \-1 is returned, and
@@ -44,6 +57,9 @@ The assoc id passed is invalid or if the socket is a one-to-one style socket.
.TP
.B ENOTSOCK
Argument is a descriptor for a file, not a socket.
+.SH NOTES
+.TP
+sctp_peeloff_flags is a linux specific variant of sctp_peeloff. While it will compile on other systems, its use will result in an error return. Portable code should use sctp_peeloff.
.SH "SEE ALSO"
.BR sctp (7)
.BR sctp_bindx (3),
diff --git a/src/include/netinet/sctp.h b/src/include/netinet/sctp.h
index 47571cd..560ca33 100644
--- a/src/include/netinet/sctp.h
+++ b/src/include/netinet/sctp.h
@@ -111,6 +111,7 @@ typedef __s32 sctp_assoc_t;
/* SCTP socket option used to read per endpoint association statistics. */
#define SCTP_GET_ASSOC_STATS 112 /* Read only */
+#define SCTP_SOCKOPT_PEELOFF_FLAGS 122
/*
* 5.2.1 SCTP Initiation Structure (SCTP_INIT)
@@ -802,6 +803,10 @@ typedef struct {
int sd;
} sctp_peeloff_arg_t;
+typedef struct {
+ sctp_peeloff_arg_t p_arg;
+ unsigned flags;
+} sctp_peeloff_flags_arg_t;
int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, int flags);
@@ -809,6 +814,7 @@ int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt,
sctp_assoc_t *id);
int sctp_peeloff(int sd, sctp_assoc_t assoc_id);
+int sctp_peeloff_flags(int sd, sctp_assoc_t assoc_id, unsigned flags);
/* Prototype for the library function sctp_opt_info defined in
* API 7. Socket Options.
diff --git a/src/lib/peeloff.c b/src/lib/peeloff.c
index a870050..edd75a0 100644
--- a/src/lib/peeloff.c
+++ b/src/lib/peeloff.c
@@ -23,25 +23,42 @@
#include <netinet/sctp.h> /* SCTP_SOCKOPT_BINDX_* */
#include <errno.h>
-/* Branch off an association into a seperate socket. This is a new SCTP API
- * described in the section 8.2 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
int
-sctp_peeloff(int fd, sctp_assoc_t associd)
+sctp_peeloff_flags(int fd, sctp_assoc_t associd, unsigned flags)
{
- sctp_peeloff_arg_t peeloff;
- socklen_t peeloff_size = sizeof(peeloff);
+ sctp_peeloff_flags_arg_t peeloff;
+ socklen_t peeloff_size;
int err;
- peeloff.associd = associd;
- peeloff.sd = 0;
- err = getsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_PEELOFF, &peeloff,
- &peeloff_size);
- if (err < 0) {
- return err;
+ peeloff.p_arg.associd = associd;
+ peeloff.p_arg.sd = 0;
+ peeloff.flags = flags;
+
+
+ if (flags) {
+ peeloff_size = sizeof(sctp_peeloff_flags_arg_t);
+ err = getsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_PEELOFF_FLAGS, &peeloff,
+ &peeloff_size);
+ } else {
+ peeloff_size = sizeof(sctp_peeloff_arg_t);
+ err = getsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_PEELOFF, &peeloff.p_arg,
+ &peeloff_size);
}
- return peeloff.sd;
+ if (err < 0)
+ return err;
+
+ return peeloff.p_arg.sd;
} /* sctp_peeloff() */
+
+/* Branch off an association into a seperate socket. This is a new SCTP API
+ * described in the section 8.2 of the Sockets API Extensions for SCTP.
+ * This is implemented using the getsockopt() interface.
+ */
+int
+sctp_peeloff(int fd, sctp_assoc_t associd)
+{
+ return sctp_peeloff_flags(fd, associd, 0);
+}
+
--
2.9.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] lksctp-tools: Add sctp_peeloff_flags function
2017-07-03 20:13 [PATCH v2] lksctp-tools: Add sctp_peeloff_flags function Neil Horman
@ 2017-07-03 20:29 ` Marcelo Ricardo Leitner
0 siblings, 0 replies; 2+ messages in thread
From: Marcelo Ricardo Leitner @ 2017-07-03 20:29 UTC (permalink / raw)
To: linux-sctp
On Mon, Jul 03, 2017 at 04:13:30PM -0400, Neil Horman wrote:
> From: Neil Horman <nhorman@tuxdriver.com>
>
> With the addition of the SCTP_SOCKOPT_PEELOFF_FLAGS socket option for
> linux, this patch adds a library function to support its use. For non
> linux systems, when the call is used with a 0 flag set, the behavior
> will be identical to sctp_peeloff, and with a non-zero flag set for
> non-linux operating systems, a runtime error will be returned.
>
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Vlad Yasevich <vyasevic@redhat.com>
> CC: Daniel Borkmann <dborkman@redhat.com>
Applied, thanks Neil.
Marcelo
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-07-03 20:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-03 20:13 [PATCH v2] lksctp-tools: Add sctp_peeloff_flags function Neil Horman
2017-07-03 20:29 ` Marcelo Ricardo Leitner
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.