aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-09-13 03:49:05 -0400
committerDavid Howells <dhowells@redhat.com>2016-09-13 18:09:13 -0400
commit1c2bc7b948a2adee0d3e070f4ce14645efa0a2d2 (patch)
treef0be7662a6eaadbf8a0c7ba232df1557bec8ddf4
parentaaa31cbc66733386406464ec6c5c0889d9968a95 (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.c13
-rw-r--r--net/rxrpc/output.c32
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 */
273void rxrpc_reject_packets(struct rxrpc_local *local) 271void 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);