[CCID 3]: Fix packet tardiness BUG This fixes a bug introduced by myself. A huge lot of thanks to Ian McDonald who identified this bug. Problem: -------- Due to packet scheduling in CCID 3, it can happen that the actual send time of a packet is later than t_now: in this case t_nom < t_now. This case brings the entire packet scheduling out of sync, since the next packet is scheduled at t_nom + t_ipi, and t_nom is in the past. Fix: ---- Update t_nom to t_now whenever a packet is late due to scheduling (and then t_nom < t_now). This update takes place in ccid3_hc_tx_ send_packet. In between calls to this function, it is irrelevant if t_nom < t_now (since it will be caught eventually). Signed-off-by: Gerrit Renker <gerrit@xxxxxxxxxxxxxx> --- net/dccp/ccids/ccid3.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c @@ -349,7 +349,9 @@ static int ccid3_hc_tx_send_packet(struc case TFRC_SSTATE_NO_FBACK: case TFRC_SSTATE_FBACK: delay = timeval_delta(&hctx->ccid3hctx_t_nom, &now); - ccid3_pr_debug("delay=%ld\n", (long)delay); + /* handle packet tardiness: synchronise t_nom with send time */ + if (delay < 0) + hctx->ccid3hctx_t_nom = now; /* * Scheduling of packet transmissions [RFC 3448, 4.6] * @@ -358,7 +360,7 @@ static int ccid3_hc_tx_send_packet(struc * else * // send the packet in (t_nom - t_now) milliseconds. */ - if (delay - (suseconds_t)hctx->ccid3hctx_delta >= 0) + else if (delay - (suseconds_t)hctx->ccid3hctx_delta >= 0) return delay / 1000L; ccid3_hc_tx_update_win_count(hctx, &now); - To unsubscribe from this list: send the line "unsubscribe dccp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html