aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2006-11-27 09:26:57 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-03 00:30:39 -0500
commitda335baf9e788edfb00ee3b96f7b9526b6b2f8a9 (patch)
tree1eea49e2f94f359d9293025c64f381d43dd5922f
parent7da7f456d7bc0e52009f882e8af0ac910293e157 (diff)
[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: Gerrit Renker <gerrit@erg.abdn.ac.uk> Signed-off-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
-rw-r--r--net/dccp/ccids/ccid3.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 2745d835f037..62c304200eda 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -264,13 +264,13 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
264 264
265 BUG_ON(hctx == NULL); 265 BUG_ON(hctx == NULL);
266 266
267 /* Check if pure ACK or Terminating*/
268 /* 267 /*
269 * XXX: We only call this function for DATA and DATAACK, on, these 268 * This function is called only for Data and DataAck packets. Sending
270 * packets can have zero length, but why the comment about "pure ACK"? 269 * zero-sized Data(Ack)s is theoretically possible, but for congestion
270 * control this case is pathological - ignore it.
271 */ 271 */
272 if (unlikely(len == 0)) 272 if (unlikely(len == 0))
273 return -ENOTCONN; 273 return -EBADMSG;
274 274
275 /* See if last packet allocated was not sent */ 275 /* See if last packet allocated was not sent */
276 new_packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist); 276 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 387
388 switch (hctx->ccid3hctx_state) { 388 switch (hctx->ccid3hctx_state) {
389 case TFRC_SSTATE_NO_SENT: 389 case TFRC_SSTATE_NO_SENT:
390 /* if first wasn't pure ack */ 390 /* fall through */
391 if (len != 0)
392 DCCP_CRIT("%s, First packet sent is noted "
393 "as a data packet", dccp_role(sk));
394 return;
395 case TFRC_SSTATE_NO_FBACK: 391 case TFRC_SSTATE_NO_FBACK:
396 /* t_nom, t_ipi, delta do not change until feedback arrives */ 392 /* t_nom, t_ipi, delta do not change until feedback arrives */
397 return; 393 return;