diff options
author | Florian Westphal <fw@strlen.de> | 2014-09-29 07:08:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-29 14:41:22 -0400 |
commit | d82bd1229885d550d03926cfa937703f6caa3cc0 (patch) | |
tree | 9630083c9e9da59a31b26722a00a6e9a9f5162b7 /net/ipv4/tcp_input.c | |
parent | 2b7fc477b0423cbcc7be8ad8652e3552198de418 (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.c | 36 |
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 | */ | ||
5922 | static 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 | |||
5909 | int tcp_conn_request(struct request_sock_ops *rsk_ops, | 5943 | int 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); |