diff options
Diffstat (limited to 'include/net/tcp.h')
| -rw-r--r-- | include/net/tcp.h | 74 |
1 files changed, 67 insertions, 7 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index c24339c4e310..0f9848011972 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 28 | #include <linux/cache.h> | 28 | #include <linux/cache.h> |
| 29 | #include <linux/percpu.h> | 29 | #include <linux/percpu.h> |
| 30 | #include <linux/skbuff.h> | ||
| 30 | 31 | ||
| 31 | #include <net/inet_connection_sock.h> | 32 | #include <net/inet_connection_sock.h> |
| 32 | #include <net/inet_timewait_sock.h> | 33 | #include <net/inet_timewait_sock.h> |
| @@ -88,10 +89,10 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo); | |||
| 88 | */ | 89 | */ |
| 89 | 90 | ||
| 90 | #define TCP_SYN_RETRIES 5 /* number of times to retry active opening a | 91 | #define TCP_SYN_RETRIES 5 /* number of times to retry active opening a |
| 91 | * connection: ~180sec is RFC minumum */ | 92 | * connection: ~180sec is RFC minimum */ |
| 92 | 93 | ||
| 93 | #define TCP_SYNACK_RETRIES 5 /* number of times to retry passive opening a | 94 | #define TCP_SYNACK_RETRIES 5 /* number of times to retry passive opening a |
| 94 | * connection: ~180sec is RFC minumum */ | 95 | * connection: ~180sec is RFC minimum */ |
| 95 | 96 | ||
| 96 | 97 | ||
| 97 | #define TCP_ORPHAN_RETRIES 7 /* number of times to retry on an orphaned | 98 | #define TCP_ORPHAN_RETRIES 7 /* number of times to retry on an orphaned |
| @@ -179,7 +180,7 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo); | |||
| 179 | /* Flags in tp->nonagle */ | 180 | /* Flags in tp->nonagle */ |
| 180 | #define TCP_NAGLE_OFF 1 /* Nagle's algo is disabled */ | 181 | #define TCP_NAGLE_OFF 1 /* Nagle's algo is disabled */ |
| 181 | #define TCP_NAGLE_CORK 2 /* Socket is corked */ | 182 | #define TCP_NAGLE_CORK 2 /* Socket is corked */ |
| 182 | #define TCP_NAGLE_PUSH 4 /* Cork is overriden for already queued data */ | 183 | #define TCP_NAGLE_PUSH 4 /* Cork is overridden for already queued data */ |
| 183 | 184 | ||
| 184 | extern struct inet_timewait_death_row tcp_death_row; | 185 | extern struct inet_timewait_death_row tcp_death_row; |
| 185 | 186 | ||
| @@ -217,6 +218,7 @@ extern int sysctl_tcp_low_latency; | |||
| 217 | extern int sysctl_tcp_nometrics_save; | 218 | extern int sysctl_tcp_nometrics_save; |
| 218 | extern int sysctl_tcp_moderate_rcvbuf; | 219 | extern int sysctl_tcp_moderate_rcvbuf; |
| 219 | extern int sysctl_tcp_tso_win_divisor; | 220 | extern int sysctl_tcp_tso_win_divisor; |
| 221 | extern int sysctl_tcp_abc; | ||
| 220 | 222 | ||
| 221 | extern atomic_t tcp_memory_allocated; | 223 | extern atomic_t tcp_memory_allocated; |
| 222 | extern atomic_t tcp_sockets_allocated; | 224 | extern atomic_t tcp_sockets_allocated; |
| @@ -550,13 +552,13 @@ extern u32 __tcp_select_window(struct sock *sk); | |||
| 550 | 552 | ||
| 551 | /* TCP timestamps are only 32-bits, this causes a slight | 553 | /* TCP timestamps are only 32-bits, this causes a slight |
| 552 | * complication on 64-bit systems since we store a snapshot | 554 | * complication on 64-bit systems since we store a snapshot |
| 553 | * of jiffies in the buffer control blocks below. We decidely | 555 | * of jiffies in the buffer control blocks below. We decidedly |
| 554 | * only use of the low 32-bits of jiffies and hide the ugly | 556 | * only use of the low 32-bits of jiffies and hide the ugly |
| 555 | * casts with the following macro. | 557 | * casts with the following macro. |
| 556 | */ | 558 | */ |
| 557 | #define tcp_time_stamp ((__u32)(jiffies)) | 559 | #define tcp_time_stamp ((__u32)(jiffies)) |
| 558 | 560 | ||
| 559 | /* This is what the send packet queueing engine uses to pass | 561 | /* This is what the send packet queuing engine uses to pass |
| 560 | * TCP per-packet control information to the transmission | 562 | * TCP per-packet control information to the transmission |
| 561 | * code. We also store the host-order sequence numbers in | 563 | * code. We also store the host-order sequence numbers in |
| 562 | * here too. This is 36 bytes on 32-bit architectures, | 564 | * here too. This is 36 bytes on 32-bit architectures, |
| @@ -596,7 +598,7 @@ struct tcp_skb_cb { | |||
| 596 | #define TCPCB_EVER_RETRANS 0x80 /* Ever retransmitted frame */ | 598 | #define TCPCB_EVER_RETRANS 0x80 /* Ever retransmitted frame */ |
| 597 | #define TCPCB_RETRANS (TCPCB_SACKED_RETRANS|TCPCB_EVER_RETRANS) | 599 | #define TCPCB_RETRANS (TCPCB_SACKED_RETRANS|TCPCB_EVER_RETRANS) |
| 598 | 600 | ||
| 599 | #define TCPCB_URG 0x20 /* Urgent pointer advenced here */ | 601 | #define TCPCB_URG 0x20 /* Urgent pointer advanced here */ |
| 600 | 602 | ||
| 601 | #define TCPCB_AT_TAIL (TCPCB_URG) | 603 | #define TCPCB_AT_TAIL (TCPCB_URG) |
| 602 | 604 | ||
| @@ -764,6 +766,33 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk) | |||
| 764 | (tp->snd_cwnd >> 2))); | 766 | (tp->snd_cwnd >> 2))); |
| 765 | } | 767 | } |
| 766 | 768 | ||
| 769 | /* | ||
| 770 | * Linear increase during slow start | ||
| 771 | */ | ||
| 772 | static inline void tcp_slow_start(struct tcp_sock *tp) | ||
| 773 | { | ||
| 774 | if (sysctl_tcp_abc) { | ||
| 775 | /* RFC3465: Slow Start | ||
| 776 | * TCP sender SHOULD increase cwnd by the number of | ||
| 777 | * previously unacknowledged bytes ACKed by each incoming | ||
| 778 | * acknowledgment, provided the increase is not more than L | ||
| 779 | */ | ||
| 780 | if (tp->bytes_acked < tp->mss_cache) | ||
| 781 | return; | ||
| 782 | |||
| 783 | /* We MAY increase by 2 if discovered delayed ack */ | ||
| 784 | if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) { | ||
| 785 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||
| 786 | tp->snd_cwnd++; | ||
| 787 | } | ||
| 788 | } | ||
| 789 | tp->bytes_acked = 0; | ||
| 790 | |||
| 791 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||
| 792 | tp->snd_cwnd++; | ||
| 793 | } | ||
| 794 | |||
| 795 | |||
| 767 | static inline void tcp_sync_left_out(struct tcp_sock *tp) | 796 | static inline void tcp_sync_left_out(struct tcp_sock *tp) |
| 768 | { | 797 | { |
| 769 | if (tp->rx_opt.sack_ok && | 798 | if (tp->rx_opt.sack_ok && |
| @@ -793,6 +822,7 @@ static inline void tcp_enter_cwr(struct sock *sk) | |||
| 793 | struct tcp_sock *tp = tcp_sk(sk); | 822 | struct tcp_sock *tp = tcp_sk(sk); |
| 794 | 823 | ||
| 795 | tp->prior_ssthresh = 0; | 824 | tp->prior_ssthresh = 0; |
| 825 | tp->bytes_acked = 0; | ||
| 796 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { | 826 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { |
| 797 | __tcp_enter_cwr(sk); | 827 | __tcp_enter_cwr(sk); |
| 798 | tcp_set_ca_state(sk, TCP_CA_CWR); | 828 | tcp_set_ca_state(sk, TCP_CA_CWR); |
| @@ -809,6 +839,27 @@ static __inline__ __u32 tcp_max_burst(const struct tcp_sock *tp) | |||
| 809 | return 3; | 839 | return 3; |
| 810 | } | 840 | } |
| 811 | 841 | ||
| 842 | /* RFC2861 Check whether we are limited by application or congestion window | ||
| 843 | * This is the inverse of cwnd check in tcp_tso_should_defer | ||
| 844 | */ | ||
| 845 | static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) | ||
| 846 | { | ||
| 847 | const struct tcp_sock *tp = tcp_sk(sk); | ||
| 848 | u32 left; | ||
| 849 | |||
| 850 | if (in_flight >= tp->snd_cwnd) | ||
| 851 | return 1; | ||
| 852 | |||
| 853 | if (!(sk->sk_route_caps & NETIF_F_TSO)) | ||
| 854 | return 0; | ||
| 855 | |||
| 856 | left = tp->snd_cwnd - in_flight; | ||
| 857 | if (sysctl_tcp_tso_win_divisor) | ||
| 858 | return left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd; | ||
| 859 | else | ||
| 860 | return left <= tcp_max_burst(tp); | ||
| 861 | } | ||
| 862 | |||
| 812 | static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, | 863 | static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, |
| 813 | const struct sk_buff *skb) | 864 | const struct sk_buff *skb) |
| 814 | { | 865 | { |
| @@ -852,7 +903,7 @@ static __inline__ u16 tcp_v4_check(struct tcphdr *th, int len, | |||
| 852 | 903 | ||
| 853 | static __inline__ int __tcp_checksum_complete(struct sk_buff *skb) | 904 | static __inline__ int __tcp_checksum_complete(struct sk_buff *skb) |
| 854 | { | 905 | { |
| 855 | return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); | 906 | return __skb_checksum_complete(skb); |
| 856 | } | 907 | } |
| 857 | 908 | ||
| 858 | static __inline__ int tcp_checksum_complete(struct sk_buff *skb) | 909 | static __inline__ int tcp_checksum_complete(struct sk_buff *skb) |
| @@ -1156,6 +1207,15 @@ static inline void tcp_mib_init(void) | |||
| 1156 | TCP_ADD_STATS_USER(TCP_MIB_MAXCONN, -1); | 1207 | TCP_ADD_STATS_USER(TCP_MIB_MAXCONN, -1); |
| 1157 | } | 1208 | } |
| 1158 | 1209 | ||
| 1210 | /*from STCP */ | ||
| 1211 | static inline void clear_all_retrans_hints(struct tcp_sock *tp){ | ||
| 1212 | tp->lost_skb_hint = NULL; | ||
| 1213 | tp->scoreboard_skb_hint = NULL; | ||
| 1214 | tp->retransmit_skb_hint = NULL; | ||
| 1215 | tp->forward_skb_hint = NULL; | ||
| 1216 | tp->fastpath_skb_hint = NULL; | ||
| 1217 | } | ||
| 1218 | |||
| 1159 | /* /proc */ | 1219 | /* /proc */ |
| 1160 | enum tcp_seq_states { | 1220 | enum tcp_seq_states { |
| 1161 | TCP_SEQ_STATE_LISTENING, | 1221 | TCP_SEQ_STATE_LISTENING, |
