aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXin Long <lucien.xin@gmail.com>2017-12-08 08:04:07 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-11 11:23:05 -0500
commitbe4e0ce10dc64b9a8aae42ec3dbd906022f91ec5 (patch)
treee7da93ea3e3d4ddec4978ddb02cf73a3e720ef06
parent94014e8d871ae43d834828710c098518be44b5d9 (diff)
sctp: implement start_pd for sctp_stream_interleave
start_pd is added as a member of sctp_stream_interleave, used to do partial_delivery for data or idata when datalen >= asoc->rwnd in sctp_eat_data. The codes have been done in last patches, but they need to be extracted into start_pd, so that it could be used for SCTP_CMD_PART_DELIVER cmd as well. Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/sctp/stream_interleave.h1
-rw-r--r--net/sctp/sm_sideeffect.c2
-rw-r--r--net/sctp/stream_interleave.c2
3 files changed, 4 insertions, 1 deletions
diff --git a/include/net/sctp/stream_interleave.h b/include/net/sctp/stream_interleave.h
index 16a71cb2b098..317d9b3a5299 100644
--- a/include/net/sctp/stream_interleave.h
+++ b/include/net/sctp/stream_interleave.h
@@ -45,6 +45,7 @@ struct sctp_stream_interleave {
45 struct sctp_ulpevent *event); 45 struct sctp_ulpevent *event);
46 void (*renege_events)(struct sctp_ulpq *ulpq, 46 void (*renege_events)(struct sctp_ulpq *ulpq,
47 struct sctp_chunk *chunk, gfp_t gfp); 47 struct sctp_chunk *chunk, gfp_t gfp);
48 void (*start_pd)(struct sctp_ulpq *ulpq, gfp_t gfp);
48}; 49};
49 50
50void sctp_stream_interleave_init(struct sctp_stream *stream); 51void sctp_stream_interleave_init(struct sctp_stream *stream);
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
index 2bec17ad7fc9..36710549a4ca 100644
--- a/net/sctp/sm_sideeffect.c
+++ b/net/sctp/sm_sideeffect.c
@@ -1731,7 +1731,7 @@ static int sctp_cmd_interpreter(enum sctp_event event_type,
1731 break; 1731 break;
1732 1732
1733 case SCTP_CMD_PART_DELIVER: 1733 case SCTP_CMD_PART_DELIVER:
1734 sctp_ulpq_partial_delivery(&asoc->ulpq, GFP_ATOMIC); 1734 asoc->stream.si->start_pd(&asoc->ulpq, GFP_ATOMIC);
1735 break; 1735 break;
1736 1736
1737 case SCTP_CMD_RENEGE: 1737 case SCTP_CMD_RENEGE:
diff --git a/net/sctp/stream_interleave.c b/net/sctp/stream_interleave.c
index d62ad5c62092..4dce8d33c5ab 100644
--- a/net/sctp/stream_interleave.c
+++ b/net/sctp/stream_interleave.c
@@ -661,6 +661,7 @@ static struct sctp_stream_interleave sctp_stream_interleave_0 = {
661 .ulpevent_data = sctp_ulpq_tail_data, 661 .ulpevent_data = sctp_ulpq_tail_data,
662 .enqueue_event = sctp_ulpq_tail_event, 662 .enqueue_event = sctp_ulpq_tail_event,
663 .renege_events = sctp_ulpq_renege, 663 .renege_events = sctp_ulpq_renege,
664 .start_pd = sctp_ulpq_partial_delivery,
664}; 665};
665 666
666static struct sctp_stream_interleave sctp_stream_interleave_1 = { 667static struct sctp_stream_interleave sctp_stream_interleave_1 = {
@@ -672,6 +673,7 @@ static struct sctp_stream_interleave sctp_stream_interleave_1 = {
672 .ulpevent_data = sctp_ulpevent_idata, 673 .ulpevent_data = sctp_ulpevent_idata,
673 .enqueue_event = sctp_enqueue_event, 674 .enqueue_event = sctp_enqueue_event,
674 .renege_events = sctp_renege_events, 675 .renege_events = sctp_renege_events,
676 .start_pd = sctp_intl_start_pd,
675}; 677};
676 678
677void sctp_stream_interleave_init(struct sctp_stream *stream) 679void sctp_stream_interleave_init(struct sctp_stream *stream)