Commit 669da7a7 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

tcp: add drop reasons to tcp_rcv_state_process()



Add basic support for drop reasons in tcp_rcv_state_process()

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 37fd4e84
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -387,6 +387,9 @@ enum skb_drop_reason {
	SKB_DROP_REASON_TCP_INVALID_SEQUENCE, /* Not acceptable SEQ field */
	SKB_DROP_REASON_TCP_RESET,	/* Invalid RST packet */
	SKB_DROP_REASON_TCP_INVALID_SYN, /* Incoming packet has unexpected SYN flag */
	SKB_DROP_REASON_TCP_CLOSE,	/* TCP socket in CLOSE state */
	SKB_DROP_REASON_TCP_FASTOPEN,	/* dropped by FASTOPEN request socket */
	SKB_DROP_REASON_TCP_OLD_ACK,	/* TCP ACK is old, but in window */
	SKB_DROP_REASON_IP_OUTNOROUTES,	/* route lookup failed */
	SKB_DROP_REASON_BPF_CGROUP_EGRESS,	/* dropped by
						 * BPF_PROG_TYPE_CGROUP_SKB
+3 −0
Original line number Diff line number Diff line
@@ -42,6 +42,9 @@
	   TCP_INVALID_SEQUENCE)				\
	EM(SKB_DROP_REASON_TCP_RESET, TCP_RESET)		\
	EM(SKB_DROP_REASON_TCP_INVALID_SYN, TCP_INVALID_SYN)	\
	EM(SKB_DROP_REASON_TCP_CLOSE, TCP_CLOSE)		\
	EM(SKB_DROP_REASON_TCP_FASTOPEN, TCP_FASTOPEN)		\
	EM(SKB_DROP_REASON_TCP_OLD_ACK, TCP_OLD_ACK)		\
	EM(SKB_DROP_REASON_IP_OUTNOROUTES, IP_OUTNOROUTES)	\
	EM(SKB_DROP_REASON_BPF_CGROUP_EGRESS,			\
	   BPF_CGROUP_EGRESS)					\
+17 −7
Original line number Diff line number Diff line
@@ -6413,21 +6413,26 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
	struct request_sock *req;
	int queued = 0;
	bool acceptable;
	SKB_DR(reason);

	switch (sk->sk_state) {
	case TCP_CLOSE:
		SKB_DR_SET(reason, TCP_CLOSE);
		goto discard;

	case TCP_LISTEN:
		if (th->ack)
			return 1;

		if (th->rst)
		if (th->rst) {
			SKB_DR_SET(reason, TCP_RESET);
			goto discard;

		}
		if (th->syn) {
			if (th->fin)
			if (th->fin) {
				SKB_DR_SET(reason, TCP_FLAGS);
				goto discard;
			}
			/* It is possible that we process SYN packets from backlog,
			 * so we need to make sure to disable BH and RCU right there.
			 */
@@ -6442,6 +6447,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
			consume_skb(skb);
			return 0;
		}
		SKB_DR_SET(reason, TCP_FLAGS);
		goto discard;

	case TCP_SYN_SENT:
@@ -6468,13 +6474,16 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
		WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV &&
		    sk->sk_state != TCP_FIN_WAIT1);

		if (!tcp_check_req(sk, skb, req, true, &req_stolen))
		if (!tcp_check_req(sk, skb, req, true, &req_stolen)) {
			SKB_DR_SET(reason, TCP_FASTOPEN);
			goto discard;
		}
	}

	if (!th->ack && !th->rst && !th->syn)
	if (!th->ack && !th->rst && !th->syn) {
		SKB_DR_SET(reason, TCP_FLAGS);
		goto discard;

	}
	if (!tcp_validate_incoming(sk, skb, th, 0))
		return 0;

@@ -6487,6 +6496,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
		if (sk->sk_state == TCP_SYN_RECV)
			return 1;	/* send one RST */
		tcp_send_challenge_ack(sk);
		SKB_DR_SET(reason, TCP_OLD_ACK);
		goto discard;
	}
	switch (sk->sk_state) {
@@ -6647,7 +6657,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)

	if (!queued) {
discard:
		tcp_drop(sk, skb);
		tcp_drop_reason(sk, skb, reason);
	}
	return 0;