diff options
author | Xin Long <lucien.xin@gmail.com> | 2017-12-08 08:04:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-11 11:23:05 -0500 |
commit | be4e0ce10dc64b9a8aae42ec3dbd906022f91ec5 (patch) | |
tree | e7da93ea3e3d4ddec4978ddb02cf73a3e720ef06 | |
parent | 94014e8d871ae43d834828710c098518be44b5d9 (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.h | 1 | ||||
-rw-r--r-- | net/sctp/sm_sideeffect.c | 2 | ||||
-rw-r--r-- | net/sctp/stream_interleave.c | 2 |
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 | ||
50 | void sctp_stream_interleave_init(struct sctp_stream *stream); | 51 | void 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 | ||
666 | static struct sctp_stream_interleave sctp_stream_interleave_1 = { | 667 | static 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 | ||
677 | void sctp_stream_interleave_init(struct sctp_stream *stream) | 679 | void sctp_stream_interleave_init(struct sctp_stream *stream) |