Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'tcp-make-trace-of-reset-logic-complete'

Jason Xing says:

====================
tcp: make trace of reset logic complete

Before this, we miss some cases where the TCP layer could send RST but
we cannot trace it. So I decided to complete it :)

Link: https://lore.kernel.org/all/20240329034243.7929-1-kerneljasonxing@gmail.com/
====================

Link: https://lore.kernel.org/r/20240401073605.37335-1-kerneljasonxing@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+56 -18
+11 -9
include/trace/events/net_probe_common.h
··· 70 70 TP_STORE_V4MAPPED(__entry, saddr, daddr) 71 71 #endif 72 72 73 - #define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh) \ 73 + #define TP_STORE_ADDR_PORTS_SKB_V4(skb, protoh, entry_saddr, entry_daddr) \ 74 74 do { \ 75 - struct sockaddr_in *v4 = (void *)__entry->saddr; \ 75 + struct sockaddr_in *v4 = (void *)entry_saddr; \ 76 76 \ 77 77 v4->sin_family = AF_INET; \ 78 78 v4->sin_port = protoh->source; \ 79 79 v4->sin_addr.s_addr = ip_hdr(skb)->saddr; \ 80 - v4 = (void *)__entry->daddr; \ 80 + v4 = (void *)entry_daddr; \ 81 81 v4->sin_family = AF_INET; \ 82 82 v4->sin_port = protoh->dest; \ 83 83 v4->sin_addr.s_addr = ip_hdr(skb)->daddr; \ ··· 85 85 86 86 #if IS_ENABLED(CONFIG_IPV6) 87 87 88 - #define TP_STORE_ADDR_PORTS_SKB(__entry, skb, protoh) \ 88 + #define TP_STORE_ADDR_PORTS_SKB(skb, protoh, entry_saddr, entry_daddr) \ 89 89 do { \ 90 90 const struct iphdr *iph = ip_hdr(skb); \ 91 91 \ 92 92 if (iph->version == 6) { \ 93 - struct sockaddr_in6 *v6 = (void *)__entry->saddr; \ 93 + struct sockaddr_in6 *v6 = (void *)entry_saddr; \ 94 94 \ 95 95 v6->sin6_family = AF_INET6; \ 96 96 v6->sin6_port = protoh->source; \ 97 97 v6->sin6_addr = ipv6_hdr(skb)->saddr; \ 98 - v6 = (void *)__entry->daddr; \ 98 + v6 = (void *)entry_daddr; \ 99 99 v6->sin6_family = AF_INET6; \ 100 100 v6->sin6_port = protoh->dest; \ 101 101 v6->sin6_addr = ipv6_hdr(skb)->daddr; \ 102 102 } else \ 103 - TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh); \ 103 + TP_STORE_ADDR_PORTS_SKB_V4(skb, protoh, \ 104 + entry_saddr, \ 105 + entry_daddr); \ 104 106 } while (0) 105 107 106 108 #else 107 109 108 - #define TP_STORE_ADDR_PORTS_SKB(__entry, skb, protoh) \ 109 - TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh) 110 + #define TP_STORE_ADDR_PORTS_SKB(skb, protoh, entry_saddr, entry_daddr) \ 111 + TP_STORE_ADDR_PORTS_SKB_V4(skb, protoh, entry_saddr, entry_daddr) 110 112 111 113 #endif 112 114
+39 -3
include/trace/events/tcp.h
··· 78 78 * skb of trace_tcp_send_reset is the skb that caused RST. In case of 79 79 * active reset, skb should be NULL 80 80 */ 81 - DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset, 81 + TRACE_EVENT(tcp_send_reset, 82 82 83 83 TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 84 84 85 - TP_ARGS(sk, skb) 85 + TP_ARGS(sk, skb), 86 + 87 + TP_STRUCT__entry( 88 + __field(const void *, skbaddr) 89 + __field(const void *, skaddr) 90 + __field(int, state) 91 + __array(__u8, saddr, sizeof(struct sockaddr_in6)) 92 + __array(__u8, daddr, sizeof(struct sockaddr_in6)) 93 + ), 94 + 95 + TP_fast_assign( 96 + __entry->skbaddr = skb; 97 + __entry->skaddr = sk; 98 + /* Zero means unknown state. */ 99 + __entry->state = sk ? sk->sk_state : 0; 100 + 101 + memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 102 + memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 103 + 104 + if (sk && sk_fullsock(sk)) { 105 + const struct inet_sock *inet = inet_sk(sk); 106 + 107 + TP_STORE_ADDR_PORTS(__entry, inet, sk); 108 + } else if (skb) { 109 + const struct tcphdr *th = (const struct tcphdr *)skb->data; 110 + /* 111 + * We should reverse the 4-tuple of skb, so later 112 + * it can print the right flow direction of rst. 113 + */ 114 + TP_STORE_ADDR_PORTS_SKB(skb, th, entry->daddr, entry->saddr); 115 + } 116 + ), 117 + 118 + TP_printk("skbaddr=%p skaddr=%p src=%pISpc dest=%pISpc state=%s", 119 + __entry->skbaddr, __entry->skaddr, 120 + __entry->saddr, __entry->daddr, 121 + __entry->state ? show_tcp_state_name(__entry->state) : "UNKNOWN") 86 122 ); 87 123 88 124 /* ··· 331 295 memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 332 296 memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 333 297 334 - TP_STORE_ADDR_PORTS_SKB(__entry, skb, th); 298 + TP_STORE_ADDR_PORTS_SKB(skb, th, __entry->saddr, __entry->daddr); 335 299 ), 336 300 337 301 TP_printk("skbaddr=%p src=%pISpc dest=%pISpc",
+1 -1
include/trace/events/udp.h
··· 38 38 memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 39 39 memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 40 40 41 - TP_STORE_ADDR_PORTS_SKB(__entry, skb, uh); 41 + TP_STORE_ADDR_PORTS_SKB(skb, uh, __entry->saddr, __entry->daddr); 42 42 ), 43 43 44 44 TP_printk("rc=%d family=%s src=%pISpc dest=%pISpc", __entry->rc,
+3 -4
net/ipv4/tcp_ipv4.c
··· 866 866 * routing might fail in this case. No choice here, if we choose to force 867 867 * input interface, we will misroute in case of asymmetric route. 868 868 */ 869 - if (sk) { 869 + if (sk) 870 870 arg.bound_dev_if = sk->sk_bound_dev_if; 871 - if (sk_fullsock(sk)) 872 - trace_tcp_send_reset(sk, skb); 873 - } 871 + 872 + trace_tcp_send_reset(sk, skb); 874 873 875 874 BUILD_BUG_ON(offsetof(struct sock, sk_bound_dev_if) != 876 875 offsetof(struct inet_timewait_sock, tw_bound_dev_if));
+2 -1
net/ipv6/tcp_ipv6.c
··· 1113 1113 if (sk) { 1114 1114 oif = sk->sk_bound_dev_if; 1115 1115 if (sk_fullsock(sk)) { 1116 - trace_tcp_send_reset(sk, skb); 1117 1116 if (inet6_test_bit(REPFLOW, sk)) 1118 1117 label = ip6_flowlabel(ipv6h); 1119 1118 priority = READ_ONCE(sk->sk_priority); ··· 1127 1128 if (net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_TCP_RESET) 1128 1129 label = ip6_flowlabel(ipv6h); 1129 1130 } 1131 + 1132 + trace_tcp_send_reset(sk, skb); 1130 1133 1131 1134 tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, 0, oif, 1, 1132 1135 ipv6_get_dsfield(ipv6h), label, priority, txhash,