Merge tag 'iwlwifi-next-for-kalle-2016-07-11' of git://git.kernel.org/pub/scm/linux...
[deliverable/linux.git] / net / rxrpc / utils.c
index f28122a15a24b4db3df91361807b625a2ebfe7bd..b88914d53ca5e10eb63f2172e01609baf1598f4c 100644 (file)
  */
 
 #include <linux/ip.h>
+#include <linux/ipv6.h>
 #include <linux/udp.h>
 #include "ar-internal.h"
 
 /*
- * Set up an RxRPC address from a socket buffer.
+ * Fill out a peer address from a socket buffer containing a packet.
  */
-void rxrpc_get_addr_from_skb(struct rxrpc_local *local,
-                            const struct sk_buff *skb,
-                            struct sockaddr_rxrpc *srx)
+int rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *srx, struct sk_buff *skb)
 {
        memset(srx, 0, sizeof(*srx));
-       srx->transport_type = local->srx.transport_type;
-       srx->transport.family = local->srx.transport.family;
 
-       /* Can we see an ipv4 UDP packet on an ipv6 UDP socket?  and vice
-        * versa?
-        */
-       switch (srx->transport.family) {
-       case AF_INET:
+       switch (ntohs(skb->protocol)) {
+       case ETH_P_IP:
+               srx->transport_type = SOCK_DGRAM;
+               srx->transport_len = sizeof(srx->transport.sin);
+               srx->transport.sin.sin_family = AF_INET;
                srx->transport.sin.sin_port = udp_hdr(skb)->source;
-               srx->transport_len = sizeof(struct sockaddr_in);
-               memcpy(&srx->transport.sin.sin_addr, &ip_hdr(skb)->saddr,
-                      sizeof(struct in_addr));
-               break;
+               srx->transport.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
+               return 0;
+
+       case ETH_P_IPV6:
+               srx->transport_type = SOCK_DGRAM;
+               srx->transport_len = sizeof(srx->transport.sin6);
+               srx->transport.sin6.sin6_family = AF_INET6;
+               srx->transport.sin6.sin6_port = udp_hdr(skb)->source;
+               srx->transport.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
+               return 0;
 
        default:
-               BUG();
+               pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
+                                   ntohs(skb->protocol));
+               return -EAFNOSUPPORT;
        }
 }
This page took 0.028205 seconds and 5 git commands to generate.