Skip to content

Commit 1c2bc7b

Browse files
committed
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 <[email protected]>
1 parent aaa31cb commit 1c2bc7b

File tree

2 files changed

+11
-34
lines changed

2 files changed

+11
-34
lines changed

net/rxrpc/local_event.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#include <linux/net.h>
1616
#include <linux/skbuff.h>
1717
#include <linux/slab.h>
18-
#include <linux/udp.h>
19-
#include <linux/ip.h>
2018
#include <net/sock.h>
2119
#include <net/af_rxrpc.h>
2220
#include <generated/utsrelease.h>
@@ -33,20 +31,19 @@ static void rxrpc_send_version_request(struct rxrpc_local *local,
3331
{
3432
struct rxrpc_wire_header whdr;
3533
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
36-
struct sockaddr_in sin;
34+
struct sockaddr_rxrpc srx;
3735
struct msghdr msg;
3836
struct kvec iov[2];
3937
size_t len;
4038
int ret;
4139

4240
_enter("");
4341

44-
sin.sin_family = AF_INET;
45-
sin.sin_port = udp_hdr(skb)->source;
46-
sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
42+
if (rxrpc_extract_addr_from_skb(&srx, skb) < 0)
43+
return;
4744

48-
msg.msg_name = &sin;
49-
msg.msg_namelen = sizeof(sin);
45+
msg.msg_name = &srx.transport;
46+
msg.msg_namelen = srx.transport_len;
5047
msg.msg_control = NULL;
5148
msg.msg_controllen = 0;
5249
msg.msg_flags = 0;

net/rxrpc/output.c

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#include <linux/gfp.h>
1616
#include <linux/skbuff.h>
1717
#include <linux/export.h>
18-
#include <linux/udp.h>
19-
#include <linux/ip.h>
2018
#include <net/sock.h>
2119
#include <net/af_rxrpc.h>
2220
#include "ar-internal.h"
@@ -272,10 +270,7 @@ int rxrpc_send_data_packet(struct rxrpc_connection *conn, struct sk_buff *skb)
272270
*/
273271
void rxrpc_reject_packets(struct rxrpc_local *local)
274272
{
275-
union {
276-
struct sockaddr sa;
277-
struct sockaddr_in sin;
278-
} sa;
273+
struct sockaddr_rxrpc srx;
279274
struct rxrpc_skb_priv *sp;
280275
struct rxrpc_wire_header whdr;
281276
struct sk_buff *skb;
@@ -292,32 +287,21 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
292287
iov[1].iov_len = sizeof(code);
293288
size = sizeof(whdr) + sizeof(code);
294289

295-
msg.msg_name = &sa;
290+
msg.msg_name = &srx.transport;
296291
msg.msg_control = NULL;
297292
msg.msg_controllen = 0;
298293
msg.msg_flags = 0;
299294

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-
311295
memset(&whdr, 0, sizeof(whdr));
312296
whdr.type = RXRPC_PACKET_TYPE_ABORT;
313297

314298
while ((skb = skb_dequeue(&local->reject_queue))) {
315299
rxrpc_see_skb(skb);
316300
sp = rxrpc_skb(skb);
317-
switch (sa.sa.sa_family) {
318-
case AF_INET:
319-
sa.sin.sin_port = udp_hdr(skb)->source;
320-
sa.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
301+
302+
if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
303+
msg.msg_namelen = srx.transport_len;
304+
321305
code = htonl(skb->priority);
322306

323307
whdr.epoch = htonl(sp->hdr.epoch);
@@ -329,10 +313,6 @@ void rxrpc_reject_packets(struct rxrpc_local *local)
329313
whdr.flags &= RXRPC_CLIENT_INITIATED;
330314

331315
kernel_sendmsg(local->socket, &msg, iov, 2, size);
332-
break;
333-
334-
default:
335-
break;
336316
}
337317

338318
rxrpc_free_skb(skb);

0 commit comments

Comments
 (0)