diff options
author | David Howells <dhowells@redhat.com> | 2016-09-13 03:49:05 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2016-09-13 18:09:13 -0400 |
commit | 1c2bc7b948a2adee0d3e070f4ce14645efa0a2d2 (patch) | |
tree | f0be7662a6eaadbf8a0c7ba232df1557bec8ddf4 | |
parent | aaa31cbc66733386406464ec6c5c0889d9968a95 (diff) |
rxrpc: Use rxrpc_extract_addr_from_skb() rather than doing this manually
There are two places that want to transmit a packet in response to one just
received and manually pick the address to reply to out of the sk_buff.
Make them use rxrpc_extract_addr_from_skb() instead so that IPv6 is handled
automatically.
Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r-- | net/rxrpc/local_event.c | 13 | ||||
-rw-r--r-- | net/rxrpc/output.c | 32 |
2 files changed, 11 insertions, 34 deletions
diff --git a/net/rxrpc/local_event.c b/net/rxrpc/local_event.c index cdd58e6e9fbd..f073e932500e 100644 --- a/net/rxrpc/local_event.c +++ b/net/rxrpc/local_event.c | |||
@@ -15,8 +15,6 @@ | |||
15 | #include <linux/net.h> | 15 | #include <linux/net.h> |
16 | #include <linux/skbuff.h> | 16 | #include <linux/skbuff.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/udp.h> | ||
19 | #include <linux/ip.h> | ||
20 | #include <net/sock.h> | 18 | #include <net/sock.h> |
21 | #include <net/af_rxrpc.h> | 19 | #include <net/af_rxrpc.h> |
22 | #include <generated/utsrelease.h> | 20 | #include <generated/utsrelease.h> |
@@ -33,7 +31,7 @@ static void rxrpc_send_version_request(struct rxrpc_local *local, | |||
33 | { | 31 | { |
34 | struct rxrpc_wire_header whdr; | 32 | struct rxrpc_wire_header whdr; |
35 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 33 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
36 | struct sockaddr_in sin; | 34 | struct sockaddr_rxrpc srx; |
37 | struct msghdr msg; | 35 | struct msghdr msg; |
38 | struct kvec iov[2]; | 36 | struct kvec iov[2]; |
39 | size_t len; | 37 | size_t len; |
@@ -41,12 +39,11 @@ static void rxrpc_send_version_request(struct rxrpc_local *local, | |||
41 | 39 | ||
42 | _enter(""); | 40 | _enter(""); |
43 | 41 | ||
44 | sin.sin_family = AF_INET; | 42 | if (rxrpc_extract_addr_from_skb(&srx, skb) < 0) |
45 | sin.sin_port = udp_hdr(skb)->source; | 43 | return; |
46 | sin.sin_addr.s_addr = ip_hdr(skb)->saddr; | ||
47 | 44 | ||
48 | msg.msg_name = &sin; | 45 | msg.msg_name = &srx.transport; |
49 | msg.msg_namelen = sizeof(sin); | 46 | msg.msg_namelen = srx.transport_len; |
50 | msg.msg_control = NULL; | 47 | msg.msg_control = NULL; |
51 | msg.msg_controllen = 0; | 48 | msg.msg_controllen = 0; |
52 | msg.msg_flags = 0; | 49 | msg.msg_flags = 0; |
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 90c7722d5779..ec3621f2c5c8 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c | |||
@@ -15,8 +15,6 @@ | |||
15 | #include <linux/gfp.h> | 15 | #include <linux/gfp.h> |
16 | #include <linux/skbuff.h> | 16 | #include <linux/skbuff.h> |
17 | #include <linux/export.h> | 17 | #include <linux/export.h> |
18 | #include <linux/udp.h> | ||
19 | #include <linux/ip.h> | ||
20 | #include <net/sock.h> | 18 | #include <net/sock.h> |
21 | #include <net/af_rxrpc.h> | 19 | #include <net/af_rxrpc.h> |
22 | #include "ar-internal.h" | 20 | #include "ar-internal.h" |
@@ -272,10 +270,7 @@ send_fragmentable: | |||
272 | */ | 270 | */ |
273 | void rxrpc_reject_packets(struct rxrpc_local *local) | 271 | void rxrpc_reject_packets(struct rxrpc_local *local) |
274 | { | 272 | { |
275 | union { | 273 | struct sockaddr_rxrpc srx; |
276 | struct sockaddr sa; | ||
277 | struct sockaddr_in sin; | ||
278 | } sa; | ||
279 | struct rxrpc_skb_priv *sp; | 274 | struct rxrpc_skb_priv *sp; |
280 | struct rxrpc_wire_header whdr; | 275 | struct rxrpc_wire_header whdr; |
281 | struct sk_buff *skb; | 276 | struct sk_buff *skb; |
@@ -292,32 +287,21 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
292 | iov[1].iov_len = sizeof(code); | 287 | iov[1].iov_len = sizeof(code); |
293 | size = sizeof(whdr) + sizeof(code); | 288 | size = sizeof(whdr) + sizeof(code); |
294 | 289 | ||
295 | msg.msg_name = &sa; | 290 | msg.msg_name = &srx.transport; |
296 | msg.msg_control = NULL; | 291 | msg.msg_control = NULL; |
297 | msg.msg_controllen = 0; | 292 | msg.msg_controllen = 0; |
298 | msg.msg_flags = 0; | 293 | msg.msg_flags = 0; |
299 | 294 | ||
300 | memset(&sa, 0, sizeof(sa)); | ||
301 | sa.sa.sa_family = local->srx.transport.family; | ||
302 | switch (sa.sa.sa_family) { | ||
303 | case AF_INET: | ||
304 | msg.msg_namelen = sizeof(sa.sin); | ||
305 | break; | ||
306 | default: | ||
307 | msg.msg_namelen = 0; | ||
308 | break; | ||
309 | } | ||
310 | |||
311 | memset(&whdr, 0, sizeof(whdr)); | 295 | memset(&whdr, 0, sizeof(whdr)); |
312 | whdr.type = RXRPC_PACKET_TYPE_ABORT; | 296 | whdr.type = RXRPC_PACKET_TYPE_ABORT; |
313 | 297 | ||
314 | while ((skb = skb_dequeue(&local->reject_queue))) { | 298 | while ((skb = skb_dequeue(&local->reject_queue))) { |
315 | rxrpc_see_skb(skb); | 299 | rxrpc_see_skb(skb); |
316 | sp = rxrpc_skb(skb); | 300 | sp = rxrpc_skb(skb); |
317 | switch (sa.sa.sa_family) { | 301 | |
318 | case AF_INET: | 302 | if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) { |
319 | sa.sin.sin_port = udp_hdr(skb)->source; | 303 | msg.msg_namelen = srx.transport_len; |
320 | sa.sin.sin_addr.s_addr = ip_hdr(skb)->saddr; | 304 | |
321 | code = htonl(skb->priority); | 305 | code = htonl(skb->priority); |
322 | 306 | ||
323 | whdr.epoch = htonl(sp->hdr.epoch); | 307 | whdr.epoch = htonl(sp->hdr.epoch); |
@@ -329,10 +313,6 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
329 | whdr.flags &= RXRPC_CLIENT_INITIATED; | 313 | whdr.flags &= RXRPC_CLIENT_INITIATED; |
330 | 314 | ||
331 | kernel_sendmsg(local->socket, &msg, iov, 2, size); | 315 | kernel_sendmsg(local->socket, &msg, iov, 2, size); |
332 | break; | ||
333 | |||
334 | default: | ||
335 | break; | ||
336 | } | 316 | } |
337 | 317 | ||
338 | rxrpc_free_skb(skb); | 318 | rxrpc_free_skb(skb); |