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