aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/outqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/outqueue.c')
-rw-r--r--net/sctp/outqueue.c22
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
779static 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)
789static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp) 803static 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;