diff options
Diffstat (limited to 'net/sctp/outqueue.c')
-rw-r--r-- | net/sctp/outqueue.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index dee7cbd54831..300bd0dfc7c1 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -776,6 +776,20 @@ void sctp_outq_uncork(struct sctp_outq *q, gfp_t gfp) | |||
776 | sctp_outq_flush(q, 0, gfp); | 776 | sctp_outq_flush(q, 0, gfp); |
777 | } | 777 | } |
778 | 778 | ||
779 | static int sctp_packet_singleton(struct sctp_transport *transport, | ||
780 | struct sctp_chunk *chunk, gfp_t gfp) | ||
781 | { | ||
782 | const struct sctp_association *asoc = transport->asoc; | ||
783 | const __u16 sport = asoc->base.bind_addr.port; | ||
784 | const __u16 dport = asoc->peer.port; | ||
785 | const __u32 vtag = asoc->peer.i.init_tag; | ||
786 | struct sctp_packet singleton; | ||
787 | |||
788 | sctp_packet_init(&singleton, transport, sport, dport); | ||
789 | sctp_packet_config(&singleton, vtag, 0); | ||
790 | sctp_packet_append_chunk(&singleton, chunk); | ||
791 | return sctp_packet_transmit(&singleton, gfp); | ||
792 | } | ||
779 | 793 | ||
780 | /* | 794 | /* |
781 | * Try to flush an outqueue. | 795 | * Try to flush an outqueue. |
@@ -789,10 +803,7 @@ void sctp_outq_uncork(struct sctp_outq *q, gfp_t gfp) | |||
789 | static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp) | 803 | static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp) |
790 | { | 804 | { |
791 | struct sctp_packet *packet; | 805 | struct sctp_packet *packet; |
792 | struct sctp_packet singleton; | ||
793 | struct sctp_association *asoc = q->asoc; | 806 | struct sctp_association *asoc = q->asoc; |
794 | __u16 sport = asoc->base.bind_addr.port; | ||
795 | __u16 dport = asoc->peer.port; | ||
796 | __u32 vtag = asoc->peer.i.init_tag; | 807 | __u32 vtag = asoc->peer.i.init_tag; |
797 | struct sctp_transport *transport = NULL; | 808 | struct sctp_transport *transport = NULL; |
798 | struct sctp_transport *new_transport; | 809 | struct sctp_transport *new_transport; |
@@ -905,10 +916,7 @@ static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp) | |||
905 | case SCTP_CID_INIT: | 916 | case SCTP_CID_INIT: |
906 | case SCTP_CID_INIT_ACK: | 917 | case SCTP_CID_INIT_ACK: |
907 | case SCTP_CID_SHUTDOWN_COMPLETE: | 918 | case SCTP_CID_SHUTDOWN_COMPLETE: |
908 | sctp_packet_init(&singleton, transport, sport, dport); | 919 | error = sctp_packet_singleton(transport, chunk, gfp); |
909 | sctp_packet_config(&singleton, vtag, 0); | ||
910 | sctp_packet_append_chunk(&singleton, chunk); | ||
911 | error = sctp_packet_transmit(&singleton, gfp); | ||
912 | if (error < 0) { | 920 | if (error < 0) { |
913 | asoc->base.sk->sk_err = -error; | 921 | asoc->base.sk->sk_err = -error; |
914 | return; | 922 | return; |