Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e7d0c88586a66cf03e70750a8119d984fdedf2aa
Commit:     e7d0c88586a66cf03e70750a8119d984fdedf2aa
Parent:     30cfd0baf0a0c4329fff1ef4b622919297969ec8
Author:     Stephen Hemminger <[EMAIL PROTECTED]>
AuthorDate: Wed Jul 25 23:50:06 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Tue Jul 31 02:27:58 2007 -0700

    [TCP]: cubic - eliminate use of receive time stamp
    
    Remove use of received timestamp option value from RTT calculation in Cubic.
    A hostile receiver may be returning a larger timestamp option than the 
original
    value. This would cause the sender to believe the malevolent receiver had
    a larger RTT and because Cubic tries to provide some RTT friendliness, the
    sender would then favor the liar.
    
    Instead, use the jiffie resolutionRTT value already computed and
    passed back after ack.
    
    Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv4/tcp_cubic.c |   46 ++++++++++++++++++----------------------------
 1 files changed, 18 insertions(+), 28 deletions(-)

diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
index 0c44bb6..485d7ea 100644
--- a/net/ipv4/tcp_cubic.c
+++ b/net/ipv4/tcp_cubic.c
@@ -246,38 +246,12 @@ static inline void bictcp_update(struct bictcp *ca, u32 
cwnd)
                ca->cnt = 1;
 }
 
-
-/* Keep track of minimum rtt */
-static inline void measure_delay(struct sock *sk)
-{
-       const struct tcp_sock *tp = tcp_sk(sk);
-       struct bictcp *ca = inet_csk_ca(sk);
-       u32 delay;
-
-       /* No time stamp */
-       if (!(tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) ||
-            /* Discard delay samples right after fast recovery */
-           (s32)(tcp_time_stamp - ca->epoch_start) < HZ)
-               return;
-
-       delay = (tcp_time_stamp - tp->rx_opt.rcv_tsecr)<<3;
-       if (delay == 0)
-               delay = 1;
-
-       /* first time call or link delay decreases */
-       if (ca->delay_min == 0 || ca->delay_min > delay)
-               ca->delay_min = delay;
-}
-
 static void bictcp_cong_avoid(struct sock *sk, u32 ack,
                              u32 in_flight, int data_acked)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        struct bictcp *ca = inet_csk_ca(sk);
 
-       if (data_acked)
-               measure_delay(sk);
-
        if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
@@ -337,14 +311,30 @@ static void bictcp_state(struct sock *sk, u8 new_state)
 static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)
 {
        const struct inet_connection_sock *icsk = inet_csk(sk);
+       struct bictcp *ca = inet_csk_ca(sk);
+       u32 delay;
 
        if (cnt > 0 && icsk->icsk_ca_state == TCP_CA_Open) {
-               struct bictcp *ca = inet_csk_ca(sk);
                cnt -= ca->delayed_ack >> ACK_RATIO_SHIFT;
                ca->delayed_ack += cnt;
        }
-}
 
+       /* Some calls are for duplicates without timetamps */
+       if (rtt_us < 0)
+               return;
+
+       /* Discard delay samples right after fast recovery */
+       if ((s32)(tcp_time_stamp - ca->epoch_start) < HZ)
+               return;
+
+       delay = usecs_to_jiffies(rtt_us) << 3;
+       if (delay == 0)
+               delay = 1;
+
+       /* first time call or link delay decreases */
+       if (ca->delay_min == 0 || ca->delay_min > delay)
+               ca->delay_min = delay;
+}
 
 static struct tcp_congestion_ops cubictcp = {
        .init           = bictcp_init,
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to