Commit da335baf authored by Gerrit Renker's avatar Gerrit Renker Committed by David S. Miller

[DCCP] ccid3: Avoid congestion control on zero-sized data packets

This resolves an `XXX' in ccid3_hc_tx_send_packet().

The function is only called on Data and DataAck packets and returns a negative
result on zero-sized messages. This is a reasonable policy since CCID 3 is a
congestion-control module and congestion control on zero-sized Data(Ack)
packets is in a way pathological.

The patch uses a more suitable error code for this case, it returns the Posix.1
code `EBADMSG' ("Not a data message") instead of `ENOTCONN'.

As a result of ignoring zero-sized packets, a the condition for a warning
"First packet is data" in ccid3_hc_tx_packet_sent is always satisfied; this
message has been removed since it will always be printed.
Signed-off-by: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: default avatarIan McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@mandriva.com>
parent 7da7f456
...@@ -264,13 +264,13 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, ...@@ -264,13 +264,13 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
BUG_ON(hctx == NULL); BUG_ON(hctx == NULL);
/* Check if pure ACK or Terminating*/
/* /*
* XXX: We only call this function for DATA and DATAACK, on, these * This function is called only for Data and DataAck packets. Sending
* packets can have zero length, but why the comment about "pure ACK"? * zero-sized Data(Ack)s is theoretically possible, but for congestion
* control this case is pathological - ignore it.
*/ */
if (unlikely(len == 0)) if (unlikely(len == 0))
return -ENOTCONN; return -EBADMSG;
/* See if last packet allocated was not sent */ /* See if last packet allocated was not sent */
new_packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist); new_packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist);
...@@ -387,11 +387,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len) ...@@ -387,11 +387,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len)
switch (hctx->ccid3hctx_state) { switch (hctx->ccid3hctx_state) {
case TFRC_SSTATE_NO_SENT: case TFRC_SSTATE_NO_SENT:
/* if first wasn't pure ack */ /* fall through */
if (len != 0)
DCCP_CRIT("%s, First packet sent is noted "
"as a data packet", dccp_role(sk));
return;
case TFRC_SSTATE_NO_FBACK: case TFRC_SSTATE_NO_FBACK:
/* t_nom, t_ipi, delta do not change until feedback arrives */ /* t_nom, t_ipi, delta do not change until feedback arrives */
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment