Commit 2a968ef6 authored by Menglong Dong's avatar Menglong Dong Committed by David S. Miller
Browse files

net: tcp: use tcp_drop_reason() for tcp_rcv_established()



Replace tcp_drop() used in tcp_rcv_established() with tcp_drop_reason().
Following drop reasons are added:

SKB_DROP_REASON_TCP_FLAGS

Reviewed-by: default avatarMengen Sun <mengensun@tencent.com>
Reviewed-by: default avatarHao Peng <flyingpeng@tencent.com>
Signed-off-by: default avatarMenglong Dong <imagedong@tencent.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8eba65fa
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -362,6 +362,7 @@ enum skb_drop_reason {
					 * backlog (see
					 * backlog (see
					 * LINUX_MIB_TCPBACKLOGDROP)
					 * LINUX_MIB_TCPBACKLOGDROP)
					 */
					 */
	SKB_DROP_REASON_TCP_FLAGS,	/* TCP flags invalid */
	SKB_DROP_REASON_MAX,
	SKB_DROP_REASON_MAX,
};
};


+1 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@
	   TCP_MD5UNEXPECTED)					\
	   TCP_MD5UNEXPECTED)					\
	EM(SKB_DROP_REASON_TCP_MD5FAILURE, TCP_MD5FAILURE)	\
	EM(SKB_DROP_REASON_TCP_MD5FAILURE, TCP_MD5FAILURE)	\
	EM(SKB_DROP_REASON_SOCKET_BACKLOG, SOCKET_BACKLOG)	\
	EM(SKB_DROP_REASON_SOCKET_BACKLOG, SOCKET_BACKLOG)	\
	EM(SKB_DROP_REASON_TCP_FLAGS, TCP_FLAGS)		\
	EMe(SKB_DROP_REASON_MAX, MAX)
	EMe(SKB_DROP_REASON_MAX, MAX)


#undef EM
#undef EM
+7 −2
Original line number Original line Diff line number Diff line
@@ -5787,6 +5787,7 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
 */
 */
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
{
{
	enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
	const struct tcphdr *th = (const struct tcphdr *)skb->data;
	const struct tcphdr *th = (const struct tcphdr *)skb->data;
	struct tcp_sock *tp = tcp_sk(sk);
	struct tcp_sock *tp = tcp_sk(sk);
	unsigned int len = skb->len;
	unsigned int len = skb->len;
@@ -5875,6 +5876,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
				tp->rcv_rtt_last_tsecr = tp->rx_opt.rcv_tsecr;
				tp->rcv_rtt_last_tsecr = tp->rx_opt.rcv_tsecr;
				return;
				return;
			} else { /* Header too small */
			} else { /* Header too small */
				reason = SKB_DROP_REASON_PKT_TOO_SMALL;
				TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
				TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
				goto discard;
				goto discard;
			}
			}
@@ -5930,8 +5932,10 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
	if (len < (th->doff << 2) || tcp_checksum_complete(skb))
	if (len < (th->doff << 2) || tcp_checksum_complete(skb))
		goto csum_error;
		goto csum_error;


	if (!th->ack && !th->rst && !th->syn)
	if (!th->ack && !th->rst && !th->syn) {
		reason = SKB_DROP_REASON_TCP_FLAGS;
		goto discard;
		goto discard;
	}


	/*
	/*
	 *	Standard slow path.
	 *	Standard slow path.
@@ -5957,12 +5961,13 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
	return;
	return;


csum_error:
csum_error:
	reason = SKB_DROP_REASON_TCP_CSUM;
	trace_tcp_bad_csum(skb);
	trace_tcp_bad_csum(skb);
	TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS);
	TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS);
	TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
	TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);


discard:
discard:
	tcp_drop(sk, skb);
	tcp_drop_reason(sk, skb, reason);
}
}
EXPORT_SYMBOL(tcp_rcv_established);
EXPORT_SYMBOL(tcp_rcv_established);