From: <xufengzhang.main@gmail.com>
To: <vyasevich@gmail.com>, <sri@us.ibm.com>, <davem@davemloft.net>
Cc: <linux-sctp@vger.kernel.org>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: [PATCH] sctp: Make "Invalid Stream Identifier" ERROR follows SACK when bundling
Date: Thu, 19 Jul 2012 13:57:30 +0800 [thread overview]
Message-ID: <1342677450-21810-1-git-send-email-xufengzhang.main@gmail.com> (raw)
When "Invalid Stream Identifier" ERROR happens after process the
received DATA chunks, this ERROR chunk is enqueued into outqueue
before SACK chunk, so when bundling ERROR chunk with SACK chunk,
the ERROR chunk is always placed first in the packet because of
the chunk's position in the outqueue.
This violates sctp specification:
RFC 4960 6.5. Stream Identifier and Stream Sequence Number
...The endpoint may bundle the ERROR chunk in the same
packet as the SACK as long as the ERROR follows the SACK.
So we must place SACK first when bundling "Invalid Stream Identifier"
ERROR and SACK in one packet.
Although we can do that by enqueue SACK chunk into outqueue before
ERROR chunk, it will violate the side-effect interpreter processing.
It's easy to do this job when dequeue chunks from the outqueue,
by this way, we introduce a flag 'has_isi_err' which indicate
whether or not the "Invalid Stream Identifier" ERROR happens.
Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com>
---
include/net/sctp/structs.h | 2 ++
net/sctp/output.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 88949a9..5adf4de 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -842,6 +842,8 @@ struct sctp_packet {
has_sack:1, /* This packet contains a SACK chunk. */
has_auth:1, /* This packet contains an AUTH chunk */
has_data:1, /* This packet contains at least 1 DATA chunk */
+ has_isi_err:1, /* This packet contains a "Invalid Stream
+ * Identifier" ERROR chunk */
ipfragok:1, /* So let ip fragment this packet */
malloced:1; /* Is it malloced? */
};
diff --git a/net/sctp/output.c b/net/sctp/output.c
index 817174e..77fb1ae 100644
--- a/net/sctp/output.c
+++ b/net/sctp/output.c
@@ -79,6 +79,7 @@ static void sctp_packet_reset(struct sctp_packet *packet)
packet->has_sack = 0;
packet->has_data = 0;
packet->has_auth = 0;
+ packet->has_isi_err = 0;
packet->ipfragok = 0;
packet->auth = NULL;
}
@@ -267,6 +268,7 @@ static sctp_xmit_t sctp_packet_bundle_sack(struct sctp_packet *pkt,
sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
struct sctp_chunk *chunk)
{
+ struct sctp_chunk *lchunk;
sctp_xmit_t retval = SCTP_XMIT_OK;
__u16 chunk_len = WORD_ROUND(ntohs(chunk->chunk_hdr->length));
@@ -316,7 +318,31 @@ sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
packet->has_cookie_echo = 1;
break;
+ case SCTP_CID_ERROR:
+ if (chunk->subh.err_hdr->cause & SCTP_ERROR_INV_STRM)
+ packet->has_isi_err = 1;
+ break;
+
case SCTP_CID_SACK:
+ /* RFC 4960
+ * 6.5 Stream Identifier and Stream Sequence Number
+ * The endpoint may bundle the ERROR chunk in the same
+ * packet as the SACK as long as the ERROR follows the SACK.
+ */
+ if (packet->has_isi_err) {
+ if (list_is_singular(&packet->chunk_list))
+ list_add(&chunk->list, &packet->chunk_list);
+ else {
+ lchunk = list_first_entry(&packet->chunk_list,
+ struct sctp_chunk, list);
+ list_add(&chunk->list, &lchunk->list);
+ }
+ packet->size += chunk_len;
+ chunk->transport = packet->transport;
+ packet->has_sack = 1;
+ goto finish;
+ }
+
packet->has_sack = 1;
break;
--
1.7.0.2
next reply other threads:[~2012-07-19 5:57 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-19 5:57 xufengzhang.main [this message]
2012-07-22 19:45 ` [PATCH] sctp: Make "Invalid Stream Identifier" ERROR follows SACK when bundling David Miller
2012-07-23 0:49 ` Neil Horman
2012-07-23 2:30 ` xufeng zhang
2012-07-23 12:14 ` Neil Horman
2012-07-24 1:53 ` Xufeng Zhang
[not found] ` <500DFF5A.20203@windriver.com>
2012-07-24 11:38 ` Neil Horman
2012-07-25 2:34 ` Xufeng Zhang
2012-07-25 11:15 ` Neil Horman
2012-07-23 5:16 ` xufeng zhang
2012-07-24 2:27 ` Vlad Yasevich
2012-07-24 3:02 ` xufeng zhang
2012-07-24 14:05 ` Vlad Yasevich
2012-07-25 2:28 ` Xufeng Zhang
2012-07-25 7:16 ` Vlad Yasevich
2012-07-25 8:05 ` Xufeng Zhang
2012-07-25 9:22 ` Xufeng Zhang
2012-07-25 11:27 ` Neil Horman
2012-07-26 1:34 ` Xufeng Zhang
2012-07-25 15:00 ` Vlad Yasevich
2012-07-26 1:30 ` Xufeng Zhang
2012-07-26 2:45 ` Vlad Yasevich
2012-07-26 2:50 ` Xufeng Zhang
2012-07-26 2:55 ` Vlad Yasevich
2012-07-26 3:12 ` Xufeng Zhang
2012-07-27 21:22 ` Vlad Yasevich
2012-07-30 4:58 ` Xufeng Zhang
2012-07-30 5:47 ` Xufeng Zhang
2012-07-31 6:17 ` Xufeng Zhang
2012-07-31 6:51 ` xufeng zhang
2012-08-02 21:17 ` Vlad Yasevich
2012-08-03 2:24 ` xufeng zhang
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=1342677450-21810-1-git-send-email-xufengzhang.main@gmail.com \
--to=xufengzhang.main@gmail.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sctp@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=sri@us.ibm.com \
--cc=vyasevich@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).