aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/tcp.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net/tcp.h')
-rw-r--r--include/net/tcp.h66
1 files changed, 41 insertions, 25 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 218235de8963..646dbe3962ea 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -41,6 +41,7 @@
41#include <net/ip.h> 41#include <net/ip.h>
42#include <net/tcp_states.h> 42#include <net/tcp_states.h>
43#include <net/inet_ecn.h> 43#include <net/inet_ecn.h>
44#include <net/dst.h>
44 45
45#include <linux/seq_file.h> 46#include <linux/seq_file.h>
46 47
@@ -481,7 +482,16 @@ static inline void tcp_clear_xmit_timers(struct sock *sk)
481} 482}
482 483
483extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu); 484extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu);
484extern unsigned int tcp_current_mss(struct sock *sk, int large); 485extern unsigned int tcp_current_mss(struct sock *sk);
486
487/* Bound MSS / TSO packet size with the half of the window */
488static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize)
489{
490 if (tp->max_window && pktsize > (tp->max_window >> 1))
491 return max(tp->max_window >> 1, 68U - tp->tcp_header_len);
492 else
493 return pktsize;
494}
485 495
486/* tcp.c */ 496/* tcp.c */
487extern void tcp_get_info(struct sock *, struct tcp_info *); 497extern void tcp_get_info(struct sock *, struct tcp_info *);
@@ -521,6 +531,17 @@ static inline void tcp_fast_path_check(struct sock *sk)
521 tcp_fast_path_on(tp); 531 tcp_fast_path_on(tp);
522} 532}
523 533
534/* Compute the actual rto_min value */
535static inline u32 tcp_rto_min(struct sock *sk)
536{
537 struct dst_entry *dst = __sk_dst_get(sk);
538 u32 rto_min = TCP_RTO_MIN;
539
540 if (dst && dst_metric_locked(dst, RTAX_RTO_MIN))
541 rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN);
542 return rto_min;
543}
544
524/* Compute the actual receive window we are currently advertising. 545/* Compute the actual receive window we are currently advertising.
525 * Rcv_nxt can be after the window if our peer push more data 546 * Rcv_nxt can be after the window if our peer push more data
526 * than the offered window. 547 * than the offered window.
@@ -607,21 +628,6 @@ static inline int tcp_skb_mss(const struct sk_buff *skb)
607 return skb_shinfo(skb)->gso_size; 628 return skb_shinfo(skb)->gso_size;
608} 629}
609 630
610static inline void tcp_dec_pcount_approx_int(__u32 *count, const int decr)
611{
612 if (*count) {
613 *count -= decr;
614 if ((int)*count < 0)
615 *count = 0;
616 }
617}
618
619static inline void tcp_dec_pcount_approx(__u32 *count,
620 const struct sk_buff *skb)
621{
622 tcp_dec_pcount_approx_int(count, tcp_skb_pcount(skb));
623}
624
625/* Events passed to congestion control interface */ 631/* Events passed to congestion control interface */
626enum tcp_ca_event { 632enum tcp_ca_event {
627 CA_EVENT_TX_START, /* first transmit when no packets in flight */ 633 CA_EVENT_TX_START, /* first transmit when no packets in flight */
@@ -685,6 +691,7 @@ extern void tcp_get_allowed_congestion_control(char *buf, size_t len);
685extern int tcp_set_allowed_congestion_control(char *allowed); 691extern int tcp_set_allowed_congestion_control(char *allowed);
686extern int tcp_set_congestion_control(struct sock *sk, const char *name); 692extern int tcp_set_congestion_control(struct sock *sk, const char *name);
687extern void tcp_slow_start(struct tcp_sock *tp); 693extern void tcp_slow_start(struct tcp_sock *tp);
694extern void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w);
688 695
689extern struct tcp_congestion_ops tcp_init_congestion_ops; 696extern struct tcp_congestion_ops tcp_init_congestion_ops;
690extern u32 tcp_reno_ssthresh(struct sock *sk); 697extern u32 tcp_reno_ssthresh(struct sock *sk);
@@ -821,15 +828,15 @@ static inline void tcp_push_pending_frames(struct sock *sk)
821{ 828{
822 struct tcp_sock *tp = tcp_sk(sk); 829 struct tcp_sock *tp = tcp_sk(sk);
823 830
824 __tcp_push_pending_frames(sk, tcp_current_mss(sk, 1), tp->nonagle); 831 __tcp_push_pending_frames(sk, tcp_current_mss(sk), tp->nonagle);
825} 832}
826 833
827static inline void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq) 834static inline void tcp_init_wl(struct tcp_sock *tp, u32 seq)
828{ 835{
829 tp->snd_wl1 = seq; 836 tp->snd_wl1 = seq;
830} 837}
831 838
832static inline void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq) 839static inline void tcp_update_wl(struct tcp_sock *tp, u32 seq)
833{ 840{
834 tp->snd_wl1 = seq; 841 tp->snd_wl1 = seq;
835} 842}
@@ -900,7 +907,7 @@ static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
900 wake_up_interruptible(sk->sk_sleep); 907 wake_up_interruptible(sk->sk_sleep);
901 if (!inet_csk_ack_scheduled(sk)) 908 if (!inet_csk_ack_scheduled(sk))
902 inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, 909 inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
903 (3 * TCP_RTO_MIN) / 4, 910 (3 * tcp_rto_min(sk)) / 4,
904 TCP_RTO_MAX); 911 TCP_RTO_MAX);
905 } 912 }
906 return 1; 913 return 1;
@@ -925,7 +932,6 @@ extern void tcp_done(struct sock *sk);
925static inline void tcp_sack_reset(struct tcp_options_received *rx_opt) 932static inline void tcp_sack_reset(struct tcp_options_received *rx_opt)
926{ 933{
927 rx_opt->dsack = 0; 934 rx_opt->dsack = 0;
928 rx_opt->eff_sacks = 0;
929 rx_opt->num_sacks = 0; 935 rx_opt->num_sacks = 0;
930} 936}
931 937
@@ -997,11 +1003,21 @@ static inline int tcp_fin_time(const struct sock *sk)
997 return fin_timeout; 1003 return fin_timeout;
998} 1004}
999 1005
1000static inline int tcp_paws_check(const struct tcp_options_received *rx_opt, int rst) 1006static inline int tcp_paws_check(const struct tcp_options_received *rx_opt,
1007 int paws_win)
1001{ 1008{
1002 if ((s32)(rx_opt->rcv_tsval - rx_opt->ts_recent) >= 0) 1009 if ((s32)(rx_opt->ts_recent - rx_opt->rcv_tsval) <= paws_win)
1003 return 0; 1010 return 1;
1004 if (get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_24DAYS) 1011 if (unlikely(get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_24DAYS))
1012 return 1;
1013
1014 return 0;
1015}
1016
1017static inline int tcp_paws_reject(const struct tcp_options_received *rx_opt,
1018 int rst)
1019{
1020 if (tcp_paws_check(rx_opt, 0))
1005 return 0; 1021 return 0;
1006 1022
1007 /* RST segments are not recommended to carry timestamp, 1023 /* RST segments are not recommended to carry timestamp,