sctp: rework switch cases in sctp_outq_flush_data

Remove an inner one, which tended to be error prone due to the cascading
and it can be replaced by a simple if ().

Rework the outer one so that the actual flush code is not inside it. Now
we first validate if we can or cannot send data, return if not, and then
the flush code.

Suggested-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Marcelo Ricardo Leitner
2018-05-14 14:34:43 -03:00
committed by David S. Miller
parent 6605f69482
commit 4fdbb0efb9
+11 -16
View File
@@ -1058,12 +1058,19 @@ static void sctp_outq_flush_data(struct sctp_outq *q,
* chunk. * chunk.
*/ */
if (!packet || !packet->has_cookie_echo) if (!packet || !packet->has_cookie_echo)
break; return;
/* fallthru */ /* fallthru */
case SCTP_STATE_ESTABLISHED: case SCTP_STATE_ESTABLISHED:
case SCTP_STATE_SHUTDOWN_PENDING: case SCTP_STATE_SHUTDOWN_PENDING:
case SCTP_STATE_SHUTDOWN_RECEIVED: case SCTP_STATE_SHUTDOWN_RECEIVED:
break;
default:
/* Do nothing. */
return;
}
/* /*
* RFC 2960 6.1 Transmission of DATA Chunks * RFC 2960 6.1 Transmission of DATA Chunks
* *
@@ -1076,7 +1083,7 @@ static void sctp_outq_flush_data(struct sctp_outq *q,
if (!list_empty(&q->retransmit)) { if (!list_empty(&q->retransmit)) {
if (!sctp_outq_flush_rtx(q, _transport, transport_list, if (!sctp_outq_flush_rtx(q, _transport, transport_list,
rtx_timeout, gfp)) rtx_timeout, gfp))
break; return;
/* We may have switched current transport */ /* We may have switched current transport */
transport = *_transport; transport = *_transport;
packet = &transport->packet; packet = &transport->packet;
@@ -1123,13 +1130,7 @@ static void sctp_outq_flush_data(struct sctp_outq *q,
/* Add the chunk to the packet. */ /* Add the chunk to the packet. */
status = sctp_packet_transmit_chunk(packet, chunk, 0, gfp); status = sctp_packet_transmit_chunk(packet, chunk, 0, gfp);
switch (status) { if (status != SCTP_XMIT_OK) {
case SCTP_XMIT_OK:
break;
case SCTP_XMIT_PMTU_FULL:
case SCTP_XMIT_RWND_FULL:
case SCTP_XMIT_DELAY:
/* We could not append this chunk, so put /* We could not append this chunk, so put
* the chunk back on the output queue. * the chunk back on the output queue.
*/ */
@@ -1138,7 +1139,7 @@ static void sctp_outq_flush_data(struct sctp_outq *q,
status); status);
sctp_outq_head_data(q, chunk); sctp_outq_head_data(q, chunk);
return; break;
} }
/* The sender is in the SHUTDOWN-PENDING state, /* The sender is in the SHUTDOWN-PENDING state,
@@ -1169,12 +1170,6 @@ static void sctp_outq_flush_data(struct sctp_outq *q,
if (packet->has_cookie_echo) if (packet->has_cookie_echo)
break; break;
} }
break;
default:
/* Do nothing. */
break;
}
} }
static void sctp_outq_flush_transports(struct sctp_outq *q, static void sctp_outq_flush_transports(struct sctp_outq *q,