3 * Copyright (C) 2015 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
13 #include <linux/ipv6.h>
14 #include <linux/udp.h>
15 #include "ar-internal.h"
18 * Fill out a peer address from a socket buffer containing a packet.
20 int rxrpc_extract_addr_from_skb(struct rxrpc_local
*local
,
21 struct sockaddr_rxrpc
*srx
,
24 memset(srx
, 0, sizeof(*srx
));
26 switch (ntohs(skb
->protocol
)) {
28 if (local
->srx
.transport
.family
== AF_INET6
) {
29 srx
->transport_type
= SOCK_DGRAM
;
30 srx
->transport_len
= sizeof(srx
->transport
.sin6
);
31 srx
->transport
.sin6
.sin6_family
= AF_INET6
;
32 srx
->transport
.sin6
.sin6_port
= udp_hdr(skb
)->source
;
33 srx
->transport
.sin6
.sin6_addr
.s6_addr32
[2] = htonl(0xffff);
34 srx
->transport
.sin6
.sin6_addr
.s6_addr32
[3] = ip_hdr(skb
)->saddr
;
36 srx
->transport_type
= SOCK_DGRAM
;
37 srx
->transport_len
= sizeof(srx
->transport
.sin
);
38 srx
->transport
.sin
.sin_family
= AF_INET
;
39 srx
->transport
.sin
.sin_port
= udp_hdr(skb
)->source
;
40 srx
->transport
.sin
.sin_addr
.s_addr
= ip_hdr(skb
)->saddr
;
44 #ifdef CONFIG_AF_RXRPC_IPV6
46 srx
->transport_type
= SOCK_DGRAM
;
47 srx
->transport_len
= sizeof(srx
->transport
.sin6
);
48 srx
->transport
.sin6
.sin6_family
= AF_INET6
;
49 srx
->transport
.sin6
.sin6_port
= udp_hdr(skb
)->source
;
50 srx
->transport
.sin6
.sin6_addr
= ipv6_hdr(skb
)->saddr
;
55 pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
56 ntohs(skb
->protocol
));