@@ -28,65 +28,65 @@ static void rxrpc_store_error(struct rxrpc_peer *, struct sock_exterr_skb *);
28
28
* Find the peer associated with an ICMP packet.
29
29
*/
30
30
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 )
32
33
{
33
34
struct sock_exterr_skb * serr = SKB_EXT_ERR (skb );
34
- struct sockaddr_rxrpc srx ;
35
35
36
36
_enter ("" );
37
37
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 ;
42
42
43
43
/* Can we see an ICMP4 packet on an ICMP6 listening socket? and vice
44
44
* versa?
45
45
*/
46
- switch (srx . transport .family ) {
46
+ switch (srx -> transport .family ) {
47
47
case AF_INET :
48
- srx . transport .sin .sin_port = serr -> port ;
48
+ srx -> transport .sin .sin_port = serr -> port ;
49
49
switch (serr -> ee .ee_origin ) {
50
50
case SO_EE_ORIGIN_ICMP :
51
51
_net ("Rx ICMP" );
52
- memcpy (& srx . transport .sin .sin_addr ,
52
+ memcpy (& srx -> transport .sin .sin_addr ,
53
53
skb_network_header (skb ) + serr -> addr_offset ,
54
54
sizeof (struct in_addr ));
55
55
break ;
56
56
case SO_EE_ORIGIN_ICMP6 :
57
57
_net ("Rx ICMP6 on v4 sock" );
58
- memcpy (& srx . transport .sin .sin_addr ,
58
+ memcpy (& srx -> transport .sin .sin_addr ,
59
59
skb_network_header (skb ) + serr -> addr_offset + 12 ,
60
60
sizeof (struct in_addr ));
61
61
break ;
62
62
default :
63
- memcpy (& srx . transport .sin .sin_addr , & ip_hdr (skb )-> saddr ,
63
+ memcpy (& srx -> transport .sin .sin_addr , & ip_hdr (skb )-> saddr ,
64
64
sizeof (struct in_addr ));
65
65
break ;
66
66
}
67
67
break ;
68
68
69
69
#ifdef CONFIG_AF_RXRPC_IPV6
70
70
case AF_INET6 :
71
- srx . transport .sin6 .sin6_port = serr -> port ;
71
+ srx -> transport .sin6 .sin6_port = serr -> port ;
72
72
switch (serr -> ee .ee_origin ) {
73
73
case SO_EE_ORIGIN_ICMP6 :
74
74
_net ("Rx ICMP6" );
75
- memcpy (& srx . transport .sin6 .sin6_addr ,
75
+ memcpy (& srx -> transport .sin6 .sin6_addr ,
76
76
skb_network_header (skb ) + serr -> addr_offset ,
77
77
sizeof (struct in6_addr ));
78
78
break ;
79
79
case SO_EE_ORIGIN_ICMP :
80
80
_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 ,
85
85
skb_network_header (skb ) + serr -> addr_offset ,
86
86
sizeof (struct in_addr ));
87
87
break ;
88
88
default :
89
- memcpy (& srx . transport .sin6 .sin6_addr ,
89
+ memcpy (& srx -> transport .sin6 .sin6_addr ,
90
90
& ipv6_hdr (skb )-> saddr ,
91
91
sizeof (struct in6_addr ));
92
92
break ;
@@ -98,7 +98,7 @@ static struct rxrpc_peer *rxrpc_lookup_peer_icmp_rcu(struct rxrpc_local *local,
98
98
BUG ();
99
99
}
100
100
101
- return rxrpc_lookup_peer_rcu (local , & srx );
101
+ return rxrpc_lookup_peer_rcu (local , srx );
102
102
}
103
103
104
104
/*
@@ -146,6 +146,7 @@ static void rxrpc_adjust_mtu(struct rxrpc_peer *peer, struct sock_exterr_skb *se
146
146
void rxrpc_error_report (struct sock * sk )
147
147
{
148
148
struct sock_exterr_skb * serr ;
149
+ struct sockaddr_rxrpc srx ;
149
150
struct rxrpc_local * local = sk -> sk_user_data ;
150
151
struct rxrpc_peer * peer ;
151
152
struct sk_buff * skb ;
@@ -166,7 +167,7 @@ void rxrpc_error_report(struct sock *sk)
166
167
}
167
168
168
169
rcu_read_lock ();
169
- peer = rxrpc_lookup_peer_icmp_rcu (local , skb );
170
+ peer = rxrpc_lookup_peer_icmp_rcu (local , skb , & srx );
170
171
if (peer && !rxrpc_get_peer_maybe (peer ))
171
172
peer = NULL ;
172
173
if (!peer ) {
@@ -176,6 +177,8 @@ void rxrpc_error_report(struct sock *sk)
176
177
return ;
177
178
}
178
179
180
+ trace_rxrpc_rx_icmp (peer , & serr -> ee , & srx );
181
+
179
182
if ((serr -> ee .ee_origin == SO_EE_ORIGIN_ICMP &&
180
183
serr -> ee .ee_type == ICMP_DEST_UNREACH &&
181
184
serr -> ee .ee_code == ICMP_FRAG_NEEDED )) {
@@ -209,9 +212,6 @@ static void rxrpc_store_error(struct rxrpc_peer *peer,
209
212
210
213
ee = & serr -> ee ;
211
214
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
-
215
215
err = ee -> ee_errno ;
216
216
217
217
switch (ee -> ee_origin ) {
0 commit comments