sctp: fix the sendmsg() flag SCTP_EOF to comply to spec
Subsystems (2)
PATCH 1/1 sctp: fix the sendmsg() flag SCTP_EOF to comply to spec
It should be possible to send a message and set the SCTP_EOF flag at the same time, but we don't support it yet. This patch fix the sendmsg() flag SCTP_EOF to comply to spec.
--- net/sctp/socket.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-)
net/sctp/socket.c +10 -5
@@ -1540,13 +1540,12 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, goto out_nounlock; } -/* If SCTP_EOF is set, no data can be sent. Disallow sending zero -* length messages when SCTP_EOF|SCTP_ABORT is not set. +/* Disallow sending zero length messages when SCTP_EOF|SCTP_ABORT +* is not set. * If SCTP_ABORT is set, the message length could be non zero with * the msg_iov set to the user abort reason. */ -if (((sinfo_flags &SCTP_EOF ) && (msg_len >0 )) || - (!(sinfo_flags & (SCTP_EOF |SCTP_ABORT )) && (msg_len =0 ))) { +if (!(sinfo_flags & (SCTP_EOF |SCTP_ABORT )) && (msg_len =0 )) { err = -EINVAL ; goto out_nounlock; }
@@ -1603,7 +1602,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, goto out_unlock; } -if (sinfo_flags &SCTP_EOF ) { +if ((sinfo_flags &SCTP_EOF ) && msg_len =0 ) {SCTP_DEBUG_PRINTK ("Shutting down association: %p\n" , asoc);sctp_primitive_SHUTDOWN (asoc,NULL );
@@ -1835,6 +1834,12 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,else err = msg_len; +if (sinfo_flags &SCTP_EOF ) { +SCTP_DEBUG_PRINTK ("Shutting down association: %p\n" , + asoc); +sctp_primitive_SHUTDOWN (asoc,NULL ); + } +/* If we are already past ASSOCIATE, the lower * layers are responsible for association cleanup. */
Signature · 1 line
1.6.2.2
Quoted 3 lines · Wei Yongjun
It should be possible to send a message and set the
SCTP_EOFflag at the same time, but we don't support it yet. This patch fix thesendmsg()flagSCTP_EOFto comply to spec.
Hi Wei
Good start, but I don't think this will work with implicit connection.
We are going to attempt to associate, queue the DATA, and then issue a shutdown, which will call sctp_sf_cookie_wait_prm_shutdown() thus never sending.
Also, we might want to forbid this combination on non-blocking sockets since we would essentially need to run the whole thing in a separate task.
-vlad
Quoted 49 lines
Signed-off-by Wei Yongjun <[email protected]>--- net/sctp/socket.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-)net/sctp/socket.c +10
-5@@ -1540,13 +1540,12 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, goto out_nounlock; } -/* If SCTP_EOF is set, no data can be sent. Disallow sending zero -* length messages when SCTP_EOF|SCTP_ABORT is not set. +/* Disallow sending zero length messages when SCTP_EOF|SCTP_ABORT +* is not set. * If SCTP_ABORT is set, the message length could be non zero with * the msg_iov set to the user abort reason. */ -if (((sinfo_flags &SCTP_EOF ) && (msg_len >0 )) || - (!(sinfo_flags & (SCTP_EOF |SCTP_ABORT )) && (msg_len =0 ))) { +if (!(sinfo_flags & (SCTP_EOF |SCTP_ABORT )) && (msg_len =0 )) { err = -EINVAL ; goto out_nounlock; }@@ -1603,7 +1602,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, goto out_unlock; } -if (sinfo_flags &SCTP_EOF ) { +if ((sinfo_flags &SCTP_EOF ) && msg_len =0 ) {SCTP_DEBUG_PRINTK ("Shutting down association: %p\n" , asoc);sctp_primitive_SHUTDOWN (asoc,NULL );@@ -1835,6 +1834,12 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,else err = msg_len; +if (sinfo_flags &SCTP_EOF ) { +SCTP_DEBUG_PRINTK ("Shutting down association: %p\n" , + asoc); +sctp_primitive_SHUTDOWN (asoc,NULL ); + } +/* If we are already past ASSOCIATE, the lower * layers are responsible for association cleanup. */