[DCCP] ccid3: Sanity-check RTT samples
authorGerrit Renker <gerrit@erg.abdn.ac.uk>
Sun, 10 Dec 2006 02:06:32 +0000 (00:06 -0200)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 11 Dec 2006 22:34:51 +0000 (14:34 -0800)
CCID3 performance depends much on the accuracy of RTT samples.  If RTT
samples grow too large, performance can be catastrophically poor.

To limit the amount of possible damage in such cases, the patch
 * introduces an upper limit which identifies a maximum `sane' RTT value;
 * uses a macro to enforce this upper limit.

Using a macro was given preference, since it is necessary to identify the
calling function in the warning message. Since exceeding this threshold
identifies a critical condition, DCCP_CRIT is used and not DCCP_WARN.

Many thanks to Ian McDonald for collaboration on this issue.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
net/dccp/ccids/ccid3.c
net/dccp/ccids/ccid3.h

index 7618d51aa2d20c3d45c96c266064ff8560457ace..122a716eb877f9a4269da57a80e5b2054a100802 100644 (file)
@@ -456,8 +456,9 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
                                  r_sample, t_elapsed);
                else
                        r_sample -= t_elapsed;
+               CCID3_RTT_SANITY_CHECK(r_sample);
 
-               /* Update RTT estimate by 
+               /* Update RTT estimate by
                 * If (No feedback recv)
                 *    R = R_sample;
                 * Else
@@ -1000,6 +1001,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
                                  r_sample, t_elapsed);
                else
                        r_sample -= t_elapsed;
+               CCID3_RTT_SANITY_CHECK(r_sample);
 
                if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
                        hcrx->ccid3hcrx_rtt = r_sample;
index da0ca3c0a7b3efcd202f1a1bb9341dcf5532a245..3fa0f69ed3209ec2563e13c11e5dba3a31a60750 100644 (file)
 /* Parameter t_mbi from [RFC 3448, 4.3]: backoff interval in seconds */
 #define TFRC_T_MBI                64
 
+/* What we think is a reasonable upper limit on RTT values */
+#define CCID3_SANE_RTT_MAX        (4 * USEC_PER_SEC)
+
+#define CCID3_RTT_SANITY_CHECK(rtt)                    do {               \
+               if (rtt > CCID3_SANE_RTT_MAX) {                            \
+                       DCCP_CRIT("RTT (%ld) too large, substituting %ld", \
+                                 rtt, CCID3_SANE_RTT_MAX);                \
+                       rtt = CCID3_SANE_RTT_MAX;                          \
+               }                                       } while (0)
+
 enum ccid3_options {
        TFRC_OPT_LOSS_EVENT_RATE = 192,
        TFRC_OPT_LOSS_INTERVALS  = 193,