Message ID | 20220216035426.2233808-7-imagedong@tencent.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: add skb drop reasons to TCP packet receive | expand |
On Wed, 16 Feb 2022 11:54:23 +0800 menglong8.dong@gmail.com wrote: > From: Menglong Dong <imagedong@tencent.com> > > Replace kfree_skb() used in tcp_v4_do_rcv() and tcp_v6_do_rcv() with > kfree_skb_reason(). > > Signed-off-by: Menglong Dong <imagedong@tencent.com> Clang says: net/ipv6/tcp_ipv6.c:1556:6: warning: variable 'reason' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (tcp_rcv_state_process(sk, skb)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/ipv6/tcp_ipv6.c:1567:24: note: uninitialized use occurs here kfree_skb_reason(skb, reason); ^~~~~~ net/ipv6/tcp_ipv6.c:1556:2: note: remove the 'if' if its condition is always false if (tcp_rcv_state_process(sk, skb)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/ipv6/tcp_ipv6.c:1547:8: warning: variable 'reason' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (tcp_child_process(sk, nsk, skb)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/ipv6/tcp_ipv6.c:1567:24: note: uninitialized use occurs here kfree_skb_reason(skb, reason); ^~~~~~ net/ipv6/tcp_ipv6.c:1547:4: note: remove the 'if' if its condition is always false if (tcp_child_process(sk, nsk, skb)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/ipv6/tcp_ipv6.c:1543:7: warning: variable 'reason' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (!nsk) ^~~~ net/ipv6/tcp_ipv6.c:1567:24: note: uninitialized use occurs here kfree_skb_reason(skb, reason); ^~~~~~ net/ipv6/tcp_ipv6.c:1543:3: note: remove the 'if' if its condition is always false if (!nsk) ^~~~~~~~~ net/ipv6/tcp_ipv6.c:1479:2: note: variable 'reason' is declared here enum skb_drop_reason reason; ^
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 15ef1bcff84f..036b855c1b14 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1708,6 +1708,7 @@ INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *, */ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) { + enum skb_drop_reason reason; struct sock *rsk; if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ @@ -1730,6 +1731,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) return 0; } + reason = SKB_DROP_REASON_NOT_SPECIFIED; if (tcp_checksum_complete(skb)) goto csum_err; @@ -1757,7 +1759,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) reset: tcp_v4_send_reset(rsk, skb); discard: - kfree_skb(skb); + kfree_skb_reason(skb, reason); /* Be careful here. If this function gets more complicated and * gcc suffers from register pressure on the x86, sk (in %ebx) * might be destroyed here. This current version compiles correctly, @@ -1766,6 +1768,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) return 0; csum_err: + reason = SKB_DROP_REASON_TCP_CSUM; trace_tcp_bad_csum(skb); TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS); TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS); diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 15090fe5af90..4d4af9b15c83 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1476,6 +1476,7 @@ int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) { struct ipv6_pinfo *np = tcp_inet6_sk(sk); struct sk_buff *opt_skb = NULL; + enum skb_drop_reason reason; struct tcp_sock *tp; /* Imagine: socket is IPv6. IPv4 packet arrives, @@ -1563,9 +1564,10 @@ int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) discard: if (opt_skb) __kfree_skb(opt_skb); - kfree_skb(skb); + kfree_skb_reason(skb, reason); return 0; csum_err: + reason = SKB_DROP_REASON_TCP_CSUM; trace_tcp_bad_csum(skb); TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS); TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);