Commit a11a791c authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

tcp: add four drop reasons to tcp_check_req()



Use two existing drop reasons in tcp_check_req():

- TCP_RFC7323_PAWS

- TCP_OVERWINDOW

Add two new ones:

- TCP_RFC7323_TSECR (corresponds to LINUX_MIB_TSECRREJECTED)

- TCP_LISTEN_OVERFLOW (when a listener accept queue is full)

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarJason Xing <kerneljasonxing@gmail.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250301201424.2046477-3-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e34100c2
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@
	FN(TCP_OFOMERGE)		\
	FN(TCP_RFC7323_PAWS)		\
	FN(TCP_RFC7323_PAWS_ACK)	\
	FN(TCP_RFC7323_TSECR)		\
	FN(TCP_LISTEN_OVERFLOW)		\
	FN(TCP_OLD_SEQUENCE)		\
	FN(TCP_INVALID_SEQUENCE)	\
	FN(TCP_INVALID_ACK_SEQUENCE)	\
@@ -281,6 +283,13 @@ enum skb_drop_reason {
	 * Corresponds to LINUX_MIB_PAWS_OLD_ACK.
	 */
	SKB_DROP_REASON_TCP_RFC7323_PAWS_ACK,
	/**
	 * @SKB_DROP_REASON_TCP_RFC7323_TSECR: PAWS check, invalid TSEcr.
	 * Corresponds to LINUX_MIB_TSECRREJECTED.
	 */
	SKB_DROP_REASON_TCP_RFC7323_TSECR,
	/** @SKB_DROP_REASON_TCP_LISTEN_OVERFLOW: listener queue full. */
	SKB_DROP_REASON_TCP_LISTEN_OVERFLOW,
	/** @SKB_DROP_REASON_TCP_OLD_SEQUENCE: Old SEQ field (duplicate packet) */
	SKB_DROP_REASON_TCP_OLD_SEQUENCE,
	/** @SKB_DROP_REASON_TCP_INVALID_SEQUENCE: Not acceptable SEQ field */
+8 −2
Original line number Diff line number Diff line
@@ -809,10 +809,15 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
					  LINUX_MIB_TCPACKSKIPPEDSYNRECV,
					  &tcp_rsk(req)->last_oow_ack_time))
			req->rsk_ops->send_ack(sk, skb, req);
		if (paws_reject)
		if (paws_reject) {
			SKB_DR_SET(*drop_reason, TCP_RFC7323_PAWS);
			NET_INC_STATS(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
		else if (tsecr_reject)
		} else if (tsecr_reject) {
			SKB_DR_SET(*drop_reason, TCP_RFC7323_TSECR);
			NET_INC_STATS(sock_net(sk), LINUX_MIB_TSECRREJECTED);
		} else {
			SKB_DR_SET(*drop_reason, TCP_OVERWINDOW);
		}
		return NULL;
	}

@@ -882,6 +887,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
	return inet_csk_complete_hashdance(sk, child, req, own_req);

listen_overflow:
	SKB_DR_SET(*drop_reason, TCP_LISTEN_OVERFLOW);
	if (sk != req->rsk_listener)
		__NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMIGRATEREQFAILURE);