aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2014-09-29 07:08:29 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-29 14:41:22 -0400
commitd82bd1229885d550d03926cfa937703f6caa3cc0 (patch)
tree9630083c9e9da59a31b26722a00a6e9a9f5162b7 /net/ipv4/tcp_input.c
parent2b7fc477b0423cbcc7be8ad8652e3552198de418 (diff)
tcp: move TCP_ECN_create_request out of header
After Octavian Purdilas tcp ipv4/ipv6 unification work this helper only has a single callsite. While at it, convert name to lowercase, suggested by Stephen. Suggested-by: Stephen Hemminger <stephen@networkplumber.org> Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index fc133178c787..174181e28ef3 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5906,6 +5906,40 @@ static inline void pr_drop_req(struct request_sock *req, __u16 port, int family)
5906#endif 5906#endif
5907} 5907}
5908 5908
5909/* RFC3168 : 6.1.1 SYN packets must not have ECT/ECN bits set
5910 *
5911 * If we receive a SYN packet with these bits set, it means a
5912 * network is playing bad games with TOS bits. In order to
5913 * avoid possible false congestion notifications, we disable
5914 * TCP ECN negociation.
5915 *
5916 * Exception: tcp_ca wants ECN. This is required for DCTCP
5917 * congestion control; it requires setting ECT on all packets,
5918 * including SYN. We inverse the test in this case: If our
5919 * local socket wants ECN, but peer only set ece/cwr (but not
5920 * ECT in IP header) its probably a non-DCTCP aware sender.
5921 */
5922static void tcp_ecn_create_request(struct request_sock *req,
5923 const struct sk_buff *skb,
5924 const struct sock *listen_sk)
5925{
5926 const struct tcphdr *th = tcp_hdr(skb);
5927 const struct net *net = sock_net(listen_sk);
5928 bool th_ecn = th->ece && th->cwr;
5929 bool ect, need_ecn;
5930
5931 if (!th_ecn)
5932 return;
5933
5934 ect = !INET_ECN_is_not_ect(TCP_SKB_CB(skb)->ip_dsfield);
5935 need_ecn = tcp_ca_needs_ecn(listen_sk);
5936
5937 if (!ect && !need_ecn && net->ipv4.sysctl_tcp_ecn)
5938 inet_rsk(req)->ecn_ok = 1;
5939 else if (ect && need_ecn)
5940 inet_rsk(req)->ecn_ok = 1;
5941}
5942
5909int tcp_conn_request(struct request_sock_ops *rsk_ops, 5943int tcp_conn_request(struct request_sock_ops *rsk_ops,
5910 const struct tcp_request_sock_ops *af_ops, 5944 const struct tcp_request_sock_ops *af_ops,
5911 struct sock *sk, struct sk_buff *skb) 5945 struct sock *sk, struct sk_buff *skb)
@@ -5966,7 +6000,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
5966 goto drop_and_free; 6000 goto drop_and_free;
5967 6001
5968 if (!want_cookie || tmp_opt.tstamp_ok) 6002 if (!want_cookie || tmp_opt.tstamp_ok)
5969 TCP_ECN_create_request(req, skb, sk); 6003 tcp_ecn_create_request(req, skb, sk);
5970 6004
5971 if (want_cookie) { 6005 if (want_cookie) {
5972 isn = cookie_init_sequence(af_ops, sk, skb, &req->mss); 6006 isn = cookie_init_sequence(af_ops, sk, skb, &req->mss);