* [PATCH] SCTP: Flush fragment queue when exiting partial delivery
@ 2007-12-16 7:08 Vlad Yasevich
2007-12-16 22:05 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: Vlad Yasevich @ 2007-12-16 7:08 UTC (permalink / raw)
To: netdev; +Cc: lksctp-developers, Vlad Yasevich
At the end of partial delivery, we may have complete messages
sitting on the fragment queue. These messages are stuck there
until a new fragment arrives. This can comletely stall a
given association. When clearing partial delivery state, flush
any complete messages from the fragment queue and send them on
their way up.
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
net/sctp/ulpqueue.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
index 4908041..1733fa2 100644
--- a/net/sctp/ulpqueue.c
+++ b/net/sctp/ulpqueue.c
@@ -53,6 +53,7 @@ static struct sctp_ulpevent * sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
struct sctp_ulpevent *);
static struct sctp_ulpevent * sctp_ulpq_order(struct sctp_ulpq *,
struct sctp_ulpevent *);
+static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq);
/* 1st Level Abstractions */
@@ -190,6 +191,7 @@ static void sctp_ulpq_set_pd(struct sctp_ulpq *ulpq)
static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq)
{
ulpq->pd_mode = 0;
+ sctp_ulpq_reasm_drain(ulpq);
return sctp_clear_pd(ulpq->asoc->base.sk, ulpq->asoc);
}
@@ -699,6 +701,37 @@ void sctp_ulpq_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 fwd_tsn)
}
}
+/*
+ * Drain the reassembly queue. If we just cleared parted delivery, it
+ * is possible that the reassembly queue will contain already reassembled
+ * messages. Retrieve any such messages and give them to the user.
+ */
+static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq)
+{
+ struct sctp_ulpevent *event = NULL;
+ struct sk_buff_head temp;
+
+ if (skb_queue_empty(&ulpq->reasm))
+ return;
+
+ while ((event = sctp_ulpq_retrieve_reassembled(ulpq)) != NULL) {
+ /* Do ordering if needed. */
+ if ((event) && (event->msg_flags & MSG_EOR)){
+ skb_queue_head_init(&temp);
+ __skb_queue_tail(&temp, sctp_event2skb(event));
+
+ event = sctp_ulpq_order(ulpq, event);
+ }
+
+ /* Send event to the ULP. 'event' is the
+ * sctp_ulpevent for very first SKB on the temp' list.
+ */
+ if (event)
+ sctp_ulpq_tail_event(ulpq, event);
+ }
+}
+
+
/* Helper function to gather skbs that have possibly become
* ordered by an an incoming chunk.
*/
--
1.5.3.5
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] SCTP: Flush fragment queue when exiting partial delivery
2007-12-16 7:08 [PATCH] SCTP: Flush fragment queue when exiting partial delivery Vlad Yasevich
@ 2007-12-16 22:05 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2007-12-16 22:05 UTC (permalink / raw)
To: vladislav.yasevich; +Cc: netdev, lksctp-developers
From: Vlad Yasevich <vladislav.yasevich@hp.com>
Date: Sun, 16 Dec 2007 02:08:36 -0500
> At the end of partial delivery, we may have complete messages
> sitting on the fragment queue. These messages are stuck there
> until a new fragment arrives. This can comletely stall a
> given association. When clearing partial delivery state, flush
> any complete messages from the fragment queue and send them on
> their way up.
>
> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Applied to net-2.6, thanks Vlad!
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-12-16 22:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-16 7:08 [PATCH] SCTP: Flush fragment queue when exiting partial delivery Vlad Yasevich
2007-12-16 22:05 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox