Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d82bd122 authored by Florian Westphal's avatar Florian Westphal Committed by David S. Miller
Browse files

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: default avatarStephen Hemminger <stephen@networkplumber.org>
Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2b7fc477
Loading
Loading
Loading
Loading
+0 −34
Original line number Diff line number Diff line
@@ -861,40 +861,6 @@ static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
		icsk->icsk_ca_ops->cwnd_event(sk, event);
}

/* RFC3168 : 6.1.1 SYN packets must not have ECT/ECN bits set
 *
 * If we receive a SYN packet with these bits set, it means a
 * network is playing bad games with TOS bits. In order to
 * avoid possible false congestion notifications, we disable
 * TCP ECN negociation.
 *
 * Exception: tcp_ca wants ECN. This is required for DCTCP
 * congestion control; it requires setting ECT on all packets,
 * including SYN. We inverse the test in this case: If our
 * local socket wants ECN, but peer only set ece/cwr (but not
 * ECT in IP header) its probably a non-DCTCP aware sender.
 */
static inline void
TCP_ECN_create_request(struct request_sock *req, const struct sk_buff *skb,
		       const struct sock *listen_sk)
{
	const struct tcphdr *th = tcp_hdr(skb);
	const struct net *net = sock_net(listen_sk);
	bool th_ecn = th->ece && th->cwr;
	bool ect, need_ecn;

	if (!th_ecn)
		return;

	ect = !INET_ECN_is_not_ect(TCP_SKB_CB(skb)->ip_dsfield);
	need_ecn = tcp_ca_needs_ecn(listen_sk);

	if (!ect && !need_ecn && net->ipv4.sysctl_tcp_ecn)
		inet_rsk(req)->ecn_ok = 1;
	else if (ect && need_ecn)
		inet_rsk(req)->ecn_ok = 1;
}

/* These functions determine how the current flow behaves in respect of SACK
 * handling. SACK is negotiated with the peer, and therefore it can vary
 * between different flows.
+35 −1
Original line number Diff line number Diff line
@@ -5906,6 +5906,40 @@ static inline void pr_drop_req(struct request_sock *req, __u16 port, int family)
#endif
}

/* RFC3168 : 6.1.1 SYN packets must not have ECT/ECN bits set
 *
 * If we receive a SYN packet with these bits set, it means a
 * network is playing bad games with TOS bits. In order to
 * avoid possible false congestion notifications, we disable
 * TCP ECN negociation.
 *
 * Exception: tcp_ca wants ECN. This is required for DCTCP
 * congestion control; it requires setting ECT on all packets,
 * including SYN. We inverse the test in this case: If our
 * local socket wants ECN, but peer only set ece/cwr (but not
 * ECT in IP header) its probably a non-DCTCP aware sender.
 */
static void tcp_ecn_create_request(struct request_sock *req,
				   const struct sk_buff *skb,
				   const struct sock *listen_sk)
{
	const struct tcphdr *th = tcp_hdr(skb);
	const struct net *net = sock_net(listen_sk);
	bool th_ecn = th->ece && th->cwr;
	bool ect, need_ecn;

	if (!th_ecn)
		return;

	ect = !INET_ECN_is_not_ect(TCP_SKB_CB(skb)->ip_dsfield);
	need_ecn = tcp_ca_needs_ecn(listen_sk);

	if (!ect && !need_ecn && net->ipv4.sysctl_tcp_ecn)
		inet_rsk(req)->ecn_ok = 1;
	else if (ect && need_ecn)
		inet_rsk(req)->ecn_ok = 1;
}

int tcp_conn_request(struct request_sock_ops *rsk_ops,
		     const struct tcp_request_sock_ops *af_ops,
		     struct sock *sk, struct sk_buff *skb)
@@ -5966,7 +6000,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
		goto drop_and_free;

	if (!want_cookie || tmp_opt.tstamp_ok)
		TCP_ECN_create_request(req, skb, sk);
		tcp_ecn_create_request(req, skb, sk);

	if (want_cookie) {
		isn = cookie_init_sequence(af_ops, sk, skb, &req->mss);