[TCP]: Allow minimum RTO to be configurable via routing metrics.

Cell phone networks do link layer retransmissions and other
things that cause unnecessary timeout retransmits. So allow
the minimum RTO to be inflated per-route to deal with this.

Signed-off-by: David S. Miller <davem@davemloft.net>

+14 -2
+2
include/linux/rtnetlink.h
··· 351 #define RTAX_INITCWND RTAX_INITCWND 352 RTAX_FEATURES, 353 #define RTAX_FEATURES RTAX_FEATURES 354 __RTAX_MAX 355 }; 356
··· 351 #define RTAX_INITCWND RTAX_INITCWND 352 RTAX_FEATURES, 353 #define RTAX_FEATURES RTAX_FEATURES 354 + RTAX_RTO_MIN, 355 + #define RTAX_RTO_MIN RTAX_RTO_MIN 356 __RTAX_MAX 357 }; 358
+12 -2
net/ipv4/tcp_input.c
··· 555 tcp_grow_window(sk, skb); 556 } 557 558 /* Called to compute a smoothed rtt estimate. The data fed to this 559 * routine either comes from timestamps, or from segments that were 560 * known _not_ to have been retransmitted [see Karn/Partridge ··· 626 if (tp->mdev_max < tp->rttvar) 627 tp->rttvar -= (tp->rttvar-tp->mdev_max)>>2; 628 tp->rtt_seq = tp->snd_nxt; 629 - tp->mdev_max = TCP_RTO_MIN; 630 } 631 } else { 632 /* no previous measure. */ 633 tp->srtt = m<<3; /* take the measured time to be rtt */ 634 tp->mdev = m<<1; /* make sure rto = 3*rtt */ 635 - tp->mdev_max = tp->rttvar = max(tp->mdev, TCP_RTO_MIN); 636 tp->rtt_seq = tp->snd_nxt; 637 } 638 }
··· 555 tcp_grow_window(sk, skb); 556 } 557 558 + static u32 tcp_rto_min(struct sock *sk) 559 + { 560 + struct dst_entry *dst = __sk_dst_get(sk); 561 + u32 rto_min = TCP_RTO_MIN; 562 + 563 + if (dst_metric_locked(dst, RTAX_RTO_MIN)) 564 + rto_min = dst->metrics[RTAX_RTO_MIN-1]; 565 + return rto_min; 566 + } 567 + 568 /* Called to compute a smoothed rtt estimate. The data fed to this 569 * routine either comes from timestamps, or from segments that were 570 * known _not_ to have been retransmitted [see Karn/Partridge ··· 616 if (tp->mdev_max < tp->rttvar) 617 tp->rttvar -= (tp->rttvar-tp->mdev_max)>>2; 618 tp->rtt_seq = tp->snd_nxt; 619 + tp->mdev_max = tcp_rto_min(sk); 620 } 621 } else { 622 /* no previous measure. */ 623 tp->srtt = m<<3; /* take the measured time to be rtt */ 624 tp->mdev = m<<1; /* make sure rto = 3*rtt */ 625 + tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk)); 626 tp->rtt_seq = tp->snd_nxt; 627 } 628 }