Skip to content

Commit 494337c

Browse files
committed
rxrpc: Add a tracepoint to log ICMP/ICMP6 and error messages
Add a tracepoint to log received ICMP/ICMP6 events and other error messages. Signed-off-by: David Howells <[email protected]>
1 parent 93864fc commit 494337c

File tree

2 files changed

+53
-23
lines changed

2 files changed

+53
-23
lines changed

include/trace/events/rxrpc.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define _TRACE_RXRPC_H
1616

1717
#include <linux/tracepoint.h>
18+
#include <linux/errqueue.h>
1819

1920
/*
2021
* Define enums for tracing information.
@@ -1374,6 +1375,35 @@ TRACE_EVENT(rxrpc_resend,
13741375
__entry->anno)
13751376
);
13761377

1378+
TRACE_EVENT(rxrpc_rx_icmp,
1379+
TP_PROTO(struct rxrpc_peer *peer, struct sock_extended_err *ee,
1380+
struct sockaddr_rxrpc *srx),
1381+
1382+
TP_ARGS(peer, ee, srx),
1383+
1384+
TP_STRUCT__entry(
1385+
__field(unsigned int, peer )
1386+
__field_struct(struct sock_extended_err, ee )
1387+
__field_struct(struct sockaddr_rxrpc, srx )
1388+
),
1389+
1390+
TP_fast_assign(
1391+
__entry->peer = peer->debug_id;
1392+
memcpy(&__entry->ee, ee, sizeof(__entry->ee));
1393+
memcpy(&__entry->srx, srx, sizeof(__entry->srx));
1394+
),
1395+
1396+
TP_printk("P=%08x o=%u t=%u c=%u i=%u d=%u e=%d %pISp",
1397+
__entry->peer,
1398+
__entry->ee.ee_origin,
1399+
__entry->ee.ee_type,
1400+
__entry->ee.ee_code,
1401+
__entry->ee.ee_info,
1402+
__entry->ee.ee_data,
1403+
__entry->ee.ee_errno,
1404+
&__entry->srx.transport)
1405+
);
1406+
13771407
#endif /* _TRACE_RXRPC_H */
13781408

13791409
/* This part must be outside protection */

net/rxrpc/peer_event.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,65 +28,65 @@ static void rxrpc_store_error(struct rxrpc_peer *, struct sock_exterr_skb *);
2828
* Find the peer associated with an ICMP packet.
2929
*/
3030
static struct rxrpc_peer *rxrpc_lookup_peer_icmp_rcu(struct rxrpc_local *local,
31-
const struct sk_buff *skb)
31+
const struct sk_buff *skb,
32+
struct sockaddr_rxrpc *srx)
3233
{
3334
struct sock_exterr_skb *serr = SKB_EXT_ERR(skb);
34-
struct sockaddr_rxrpc srx;
3535

3636
_enter("");
3737

38-
memset(&srx, 0, sizeof(srx));
39-
srx.transport_type = local->srx.transport_type;
40-
srx.transport_len = local->srx.transport_len;
41-
srx.transport.family = local->srx.transport.family;
38+
memset(srx, 0, sizeof(*srx));
39+
srx->transport_type = local->srx.transport_type;
40+
srx->transport_len = local->srx.transport_len;
41+
srx->transport.family = local->srx.transport.family;
4242

4343
/* Can we see an ICMP4 packet on an ICMP6 listening socket? and vice
4444
* versa?
4545
*/
46-
switch (srx.transport.family) {
46+
switch (srx->transport.family) {
4747
case AF_INET:
48-
srx.transport.sin.sin_port = serr->port;
48+
srx->transport.sin.sin_port = serr->port;
4949
switch (serr->ee.ee_origin) {
5050
case SO_EE_ORIGIN_ICMP:
5151
_net("Rx ICMP");
52-
memcpy(&srx.transport.sin.sin_addr,
52+
memcpy(&srx->transport.sin.sin_addr,
5353
skb_network_header(skb) + serr->addr_offset,
5454
sizeof(struct in_addr));
5555
break;
5656
case SO_EE_ORIGIN_ICMP6:
5757
_net("Rx ICMP6 on v4 sock");
58-
memcpy(&srx.transport.sin.sin_addr,
58+
memcpy(&srx->transport.sin.sin_addr,
5959
skb_network_header(skb) + serr->addr_offset + 12,
6060
sizeof(struct in_addr));
6161
break;
6262
default:
63-
memcpy(&srx.transport.sin.sin_addr, &ip_hdr(skb)->saddr,
63+
memcpy(&srx->transport.sin.sin_addr, &ip_hdr(skb)->saddr,
6464
sizeof(struct in_addr));
6565
break;
6666
}
6767
break;
6868

6969
#ifdef CONFIG_AF_RXRPC_IPV6
7070
case AF_INET6:
71-
srx.transport.sin6.sin6_port = serr->port;
71+
srx->transport.sin6.sin6_port = serr->port;
7272
switch (serr->ee.ee_origin) {
7373
case SO_EE_ORIGIN_ICMP6:
7474
_net("Rx ICMP6");
75-
memcpy(&srx.transport.sin6.sin6_addr,
75+
memcpy(&srx->transport.sin6.sin6_addr,
7676
skb_network_header(skb) + serr->addr_offset,
7777
sizeof(struct in6_addr));
7878
break;
7979
case SO_EE_ORIGIN_ICMP:
8080
_net("Rx ICMP on v6 sock");
81-
srx.transport.sin6.sin6_addr.s6_addr32[0] = 0;
82-
srx.transport.sin6.sin6_addr.s6_addr32[1] = 0;
83-
srx.transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
84-
memcpy(srx.transport.sin6.sin6_addr.s6_addr + 12,
81+
srx->transport.sin6.sin6_addr.s6_addr32[0] = 0;
82+
srx->transport.sin6.sin6_addr.s6_addr32[1] = 0;
83+
srx->transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
84+
memcpy(srx->transport.sin6.sin6_addr.s6_addr + 12,
8585
skb_network_header(skb) + serr->addr_offset,
8686
sizeof(struct in_addr));
8787
break;
8888
default:
89-
memcpy(&srx.transport.sin6.sin6_addr,
89+
memcpy(&srx->transport.sin6.sin6_addr,
9090
&ipv6_hdr(skb)->saddr,
9191
sizeof(struct in6_addr));
9292
break;
@@ -98,7 +98,7 @@ static struct rxrpc_peer *rxrpc_lookup_peer_icmp_rcu(struct rxrpc_local *local,
9898
BUG();
9999
}
100100

101-
return rxrpc_lookup_peer_rcu(local, &srx);
101+
return rxrpc_lookup_peer_rcu(local, srx);
102102
}
103103

104104
/*
@@ -146,6 +146,7 @@ static void rxrpc_adjust_mtu(struct rxrpc_peer *peer, struct sock_exterr_skb *se
146146
void rxrpc_error_report(struct sock *sk)
147147
{
148148
struct sock_exterr_skb *serr;
149+
struct sockaddr_rxrpc srx;
149150
struct rxrpc_local *local = sk->sk_user_data;
150151
struct rxrpc_peer *peer;
151152
struct sk_buff *skb;
@@ -166,7 +167,7 @@ void rxrpc_error_report(struct sock *sk)
166167
}
167168

168169
rcu_read_lock();
169-
peer = rxrpc_lookup_peer_icmp_rcu(local, skb);
170+
peer = rxrpc_lookup_peer_icmp_rcu(local, skb, &srx);
170171
if (peer && !rxrpc_get_peer_maybe(peer))
171172
peer = NULL;
172173
if (!peer) {
@@ -176,6 +177,8 @@ void rxrpc_error_report(struct sock *sk)
176177
return;
177178
}
178179

180+
trace_rxrpc_rx_icmp(peer, &serr->ee, &srx);
181+
179182
if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP &&
180183
serr->ee.ee_type == ICMP_DEST_UNREACH &&
181184
serr->ee.ee_code == ICMP_FRAG_NEEDED)) {
@@ -209,9 +212,6 @@ static void rxrpc_store_error(struct rxrpc_peer *peer,
209212

210213
ee = &serr->ee;
211214

212-
_net("Rx Error o=%d t=%d c=%d e=%d",
213-
ee->ee_origin, ee->ee_type, ee->ee_code, ee->ee_errno);
214-
215215
err = ee->ee_errno;
216216

217217
switch (ee->ee_origin) {

0 commit comments

Comments
 (0)