Skip to content

Commit

Permalink
rstreason: make it work in trace world
Browse files Browse the repository at this point in the history
At last, we should let it work by introducing this reset reason in
trace world.

One of the possible expected outputs is:
... tcp_send_reset: skbaddr=xxx skaddr=xxx src=xxx dest=xxx
state=TCP_ESTABLISHED reason=NOT_SPECIFIED

Signed-off-by: Jason Xing <[email protected]>
Reviewed-by: Steven Rostedt (Google) <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
JasonXing authored and Patchew Applier committed Apr 11, 2024
1 parent 3b46e63 commit ce18572
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 7 deletions.
37 changes: 33 additions & 4 deletions include/trace/events/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <net/ipv6.h>
#include <net/tcp.h>
#include <linux/sock_diag.h>
#include <net/rstreason.h>

/*
* tcp event with arguments sk and skb
Expand Down Expand Up @@ -74,20 +75,38 @@ DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
TP_ARGS(sk, skb)
);

#undef FN1
#define FN1(reason) TRACE_DEFINE_ENUM(SK_RST_REASON_##reason);
#undef FN2
#define FN2(reason) TRACE_DEFINE_ENUM(SKB_DROP_REASON_##reason);
DEFINE_RST_REASON(FN1, FN1)

#undef FN1
#undef FNe1
#define FN1(reason) { SK_RST_REASON_##reason, #reason },
#define FNe1(reason) { SK_RST_REASON_##reason, #reason }

#undef FN2
#undef FNe2
#define FN2(reason) { SKB_DROP_REASON_##reason, #reason },
#define FNe2(reason) { SKB_DROP_REASON_##reason, #reason }
/*
* skb of trace_tcp_send_reset is the skb that caused RST. In case of
* active reset, skb should be NULL
*/
TRACE_EVENT(tcp_send_reset,

TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
TP_PROTO(const struct sock *sk,
const struct sk_buff *skb,
const enum sk_rst_reason reason),

TP_ARGS(sk, skb),
TP_ARGS(sk, skb, reason),

TP_STRUCT__entry(
__field(const void *, skbaddr)
__field(const void *, skaddr)
__field(int, state)
__field(enum sk_rst_reason, reason)
__array(__u8, saddr, sizeof(struct sockaddr_in6))
__array(__u8, daddr, sizeof(struct sockaddr_in6))
),
Expand All @@ -113,14 +132,24 @@ TRACE_EVENT(tcp_send_reset,
*/
TP_STORE_ADDR_PORTS_SKB(skb, th, entry->daddr, entry->saddr);
}
__entry->reason = reason;
),

TP_printk("skbaddr=%p skaddr=%p src=%pISpc dest=%pISpc state=%s",
TP_printk("skbaddr=%p skaddr=%p src=%pISpc dest=%pISpc state=%s reason=%s",
__entry->skbaddr, __entry->skaddr,
__entry->saddr, __entry->daddr,
__entry->state ? show_tcp_state_name(__entry->state) : "UNKNOWN")
__entry->state ? show_tcp_state_name(__entry->state) : "UNKNOWN",
__entry->reason < RST_REASON_START ?
__print_symbolic(__entry->reason, DEFINE_DROP_REASON(FN2, FNe2)) :
__print_symbolic(__entry->reason, DEFINE_RST_REASON(FN1, FNe1)))
);

#undef FN1
#undef FNe1

#undef FN2
#undef FNe2

/*
* tcp event with arguments sk
*
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/tcp_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -871,7 +871,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb,
if (sk)
arg.bound_dev_if = sk->sk_bound_dev_if;

trace_tcp_send_reset(sk, skb);
trace_tcp_send_reset(sk, skb, reason);

BUILD_BUG_ON(offsetof(struct sock, sk_bound_dev_if) !=
offsetof(struct inet_timewait_sock, tw_bound_dev_if));
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/tcp_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -3611,7 +3611,7 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority,
/* skb of trace_tcp_send_reset() keeps the skb that caused RST,
* skb here is different to the troublesome skb, so use NULL
*/
trace_tcp_send_reset(sk, NULL);
trace_tcp_send_reset(sk, NULL, SK_RST_REASON_NOT_SPECIFIED);
}

/* Send a crossed SYN-ACK during socket establishment.
Expand Down
2 changes: 1 addition & 1 deletion net/ipv6/tcp_ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,7 @@ static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb,
label = ip6_flowlabel(ipv6h);
}

trace_tcp_send_reset(sk, skb);
trace_tcp_send_reset(sk, skb, reason);

tcp_v6_send_response(sk, skb, seq, ack_seq, 0, 0, 0, oif, 1,
ipv6_get_dsfield(ipv6h), label, priority, txhash,
Expand Down

0 comments on commit ce18572

Please sign in to comment.