Skip to content

Commit e6a3e44

Browse files
Alexander Aringdavem330
authored andcommitted
net: sock: add trace for socket errors
This patch will add tracers to trace inet socket errors only. A user space monitor application can track connection errors indepedent from socket lifetime and do additional handling. For example a cluster manager can fence a node if errors occurs in a specific heuristic. Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e3ae236 commit e6a3e44

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

include/trace/events/sock.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,66 @@ TRACE_EVENT(inet_sock_set_state,
201201
show_tcp_state_name(__entry->newstate))
202202
);
203203

204+
TRACE_EVENT(inet_sk_error_report,
205+
206+
TP_PROTO(const struct sock *sk),
207+
208+
TP_ARGS(sk),
209+
210+
TP_STRUCT__entry(
211+
__field(int, error)
212+
__field(__u16, sport)
213+
__field(__u16, dport)
214+
__field(__u16, family)
215+
__field(__u16, protocol)
216+
__array(__u8, saddr, 4)
217+
__array(__u8, daddr, 4)
218+
__array(__u8, saddr_v6, 16)
219+
__array(__u8, daddr_v6, 16)
220+
),
221+
222+
TP_fast_assign(
223+
struct inet_sock *inet = inet_sk(sk);
224+
struct in6_addr *pin6;
225+
__be32 *p32;
226+
227+
__entry->error = sk->sk_err;
228+
__entry->family = sk->sk_family;
229+
__entry->protocol = sk->sk_protocol;
230+
__entry->sport = ntohs(inet->inet_sport);
231+
__entry->dport = ntohs(inet->inet_dport);
232+
233+
p32 = (__be32 *) __entry->saddr;
234+
*p32 = inet->inet_saddr;
235+
236+
p32 = (__be32 *) __entry->daddr;
237+
*p32 = inet->inet_daddr;
238+
239+
#if IS_ENABLED(CONFIG_IPV6)
240+
if (sk->sk_family == AF_INET6) {
241+
pin6 = (struct in6_addr *)__entry->saddr_v6;
242+
*pin6 = sk->sk_v6_rcv_saddr;
243+
pin6 = (struct in6_addr *)__entry->daddr_v6;
244+
*pin6 = sk->sk_v6_daddr;
245+
} else
246+
#endif
247+
{
248+
pin6 = (struct in6_addr *)__entry->saddr_v6;
249+
ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
250+
pin6 = (struct in6_addr *)__entry->daddr_v6;
251+
ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
252+
}
253+
),
254+
255+
TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c error=%d",
256+
show_family_name(__entry->family),
257+
show_inet_protocol_name(__entry->protocol),
258+
__entry->sport, __entry->dport,
259+
__entry->saddr, __entry->daddr,
260+
__entry->saddr_v6, __entry->daddr_v6,
261+
__entry->error)
262+
);
263+
204264
#endif /* _TRACE_SOCK_H */
205265

206266
/* This part must be outside protection */

net/core/sock.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,16 @@ EXPORT_SYMBOL(__sk_backlog_rcv);
334334
void sk_error_report(struct sock *sk)
335335
{
336336
sk->sk_error_report(sk);
337+
338+
switch (sk->sk_family) {
339+
case AF_INET:
340+
fallthrough;
341+
case AF_INET6:
342+
trace_inet_sk_error_report(sk);
343+
break;
344+
default:
345+
break;
346+
}
337347
}
338348
EXPORT_SYMBOL(sk_error_report);
339349

0 commit comments

Comments
 (0)