Problem:
--------
Currently the inter-packet-interval for the first packet is set to 500msec
instead
of the 1 second specified in RFC 3448 (detailed derivation below).
Furthermore t_ipi is added twice to t_now instead of just once.
Solution:
---------
This patch
* sets the initial value of t_ipi to 1 second, as per [RFC 3448, 4.2]
* simplifies the initial setting of t_ipi and t_delta through a case
analysis
Detailed Derivation:
--------------------
When the first CCID 3 packet is sent in ccid3_hc_tx_send_packet, t_ipi is set
to
hctx->ccid3hctx_t_ipi = TFRC_INITIAL_IPI;
which is USEC_PER_SEC / 4 = 250 msec. This is then added twice to t_0, due to:
case TFRC_SSTATE_NO_SENT:
// ...
/* Set nominal send time for initial packet */
hctx->ccid3hctx_t_nom = now;
timeval_add_usecs(&hctx->ccid3hctx_t_nom,
hctx->ccid3hctx_t_ipi);
rc = 0;
break;
// ...
/* Can we send? if so add options and add to packet history */
if (rc == 0) {
// ...
timeval_add_usecs(&hctx->ccid3hctx_t_nom,
hctx->ccid3hctx_t_ipi);
}
As a result, t_1 = t_0 + t_ipi = t_now + t_ipi
= t_0 + 500msec
This contradicts RFC 3448, due to the following requirements:
a) Section 4.2, "Sender Initialization"
"the value of X[/s] is set to 1 packet/second [...] The
initial values for R (RTT) and t_RTO are undefined"
b) Section 4.5, "Preventing Oscillations
R_sqmean is undefined since R is undefined
Therefore, X_init = X
c) Section 4.6, "Scheduling of Packet Transmissions"
t_ipi = X_init / s = 1 second
A further simplification is possible for the initial `delta' value, which is
defined in [RFC 3448, section 4.6] as
t_delta = min(t_ipi/2, t_gran/2)
t_gran/2 here is TFRC_OPSYS_HALF_TIME_GRAN = USEC_PER_SEC / (2 * HZ).
Since Linux always schedules with a higher granularity than 1 second,
the initial value of t_delta is thus simply
t_delta = min(USEC_PER_SEC / 2 , USEC_PER_SEC / (2 * HZ))
= USEC_PER_SEC / (2 * HZ)
Lastly, TFRC_INITIAL_IPI is not referenced anywhere else and can thus be
removed.
Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
Signed-off-by: Ian McDonald <[EMAIL PROTECTED]>
Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
---
net/dccp/ccids/ccid3.c | 11 ++++++-----
net/dccp/ccids/ccid3.h | 2 --
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index fb21f2d..d7b688e 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -298,13 +298,14 @@ static int ccid3_hc_tx_send_packet(struc
hctx->ccid3hctx_last_win_count = 0;
hctx->ccid3hctx_t_last_win_count = now;
ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK);
- hctx->ccid3hctx_t_ipi = TFRC_INITIAL_IPI;
- /* Set nominal send time for initial packet */
+ /* First timeout, according to [RFC 3448, 4.2], is 1 second */
+ hctx->ccid3hctx_t_ipi = USEC_PER_SEC;
+ /* Initial delta: minimum of 0.5 sec and t_gran/2 */
+ hctx->ccid3hctx_delta = TFRC_OPSYS_HALF_TIME_GRAN;
+
+ /* Set t_0 for initial packet */
hctx->ccid3hctx_t_nom = now;
- timeval_add_usecs(&hctx->ccid3hctx_t_nom,
- hctx->ccid3hctx_t_ipi);
- ccid3_calc_new_delta(hctx);
rc = 0;
break;
case TFRC_SSTATE_NO_FBACK:
diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h
index e2e43c1..4621652 100644
--- a/net/dccp/ccids/ccid3.h
+++ b/net/dccp/ccids/ccid3.h
@@ -49,8 +49,6 @@ #define TFRC_MAX_PACKET_SIZE 65535
/* Two seconds as per CCID3 spec */
#define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC)
-#define TFRC_INITIAL_IPI (USEC_PER_SEC / 4)
-
/* In usecs - half the scheduling granularity as per RFC3448 4.6 */
#define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ))
--
1.4.2.1.g3d5c
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html