aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/outqueue.c
diff options
context:
space:
mode:
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>2018-05-14 13:34:36 -0400
committerDavid S. Miller <davem@davemloft.net>2018-05-14 22:57:14 -0400
commitb9fd683982c9d190cbccd8a32d885bf84bb4a12d (patch)
tree5a7199d94b91d17c06839b624dcc370ebdbd6a41 /net/sctp/outqueue.c
parent98f3697f8d4129366b5215e47719581db2d54df2 (diff)
sctp: add sctp_packet_singleton
Factor out the code for generating singletons. It's used only once, but helps to keep the context contained. The const variables are to ease the reading of subsequent calls in there. Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
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;