Linux Audio

Check our new training course

Loading...
v6.2
 1// SPDX-License-Identifier: GPL-2.0-or-later
 2/* Utility routines
 3 *
 4 * Copyright (C) 2015 Red Hat, Inc. All Rights Reserved.
 5 * Written by David Howells (dhowells@redhat.com)
 
 
 
 
 
 6 */
 7
 8#include <linux/ip.h>
 9#include <linux/ipv6.h>
10#include <linux/udp.h>
11#include "ar-internal.h"
12
13/*
14 * Fill out a peer address from a socket buffer containing a packet.
15 */
16int rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *srx, struct sk_buff *skb)
 
 
17{
18	memset(srx, 0, sizeof(*srx));
19
20	switch (ntohs(skb->protocol)) {
21	case ETH_P_IP:
22		srx->transport_type = SOCK_DGRAM;
23		srx->transport_len = sizeof(srx->transport.sin);
24		srx->transport.sin.sin_family = AF_INET;
25		srx->transport.sin.sin_port = udp_hdr(skb)->source;
26		srx->transport.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
 
 
 
 
 
 
 
 
 
27		return 0;
28
29#ifdef CONFIG_AF_RXRPC_IPV6
30	case ETH_P_IPV6:
31		srx->transport_type = SOCK_DGRAM;
32		srx->transport_len = sizeof(srx->transport.sin6);
33		srx->transport.sin6.sin6_family = AF_INET6;
34		srx->transport.sin6.sin6_port = udp_hdr(skb)->source;
35		srx->transport.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
36		return 0;
37#endif
38
39	default:
40		pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
41				    ntohs(skb->protocol));
42		return -EAFNOSUPPORT;
43	}
44}
v4.17
 
 1/* Utility routines
 2 *
 3 * Copyright (C) 2015 Red Hat, Inc. All Rights Reserved.
 4 * Written by David Howells (dhowells@redhat.com)
 5 *
 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.
10 */
11
12#include <linux/ip.h>
13#include <linux/ipv6.h>
14#include <linux/udp.h>
15#include "ar-internal.h"
16
17/*
18 * Fill out a peer address from a socket buffer containing a packet.
19 */
20int rxrpc_extract_addr_from_skb(struct rxrpc_local *local,
21				struct sockaddr_rxrpc *srx,
22				struct sk_buff *skb)
23{
24	memset(srx, 0, sizeof(*srx));
25
26	switch (ntohs(skb->protocol)) {
27	case ETH_P_IP:
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;
35		} else {
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;
41		}
42		return 0;
43
44#ifdef CONFIG_AF_RXRPC_IPV6
45	case ETH_P_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;
51		return 0;
52#endif
53
54	default:
55		pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
56				    ntohs(skb->protocol));
57		return -EAFNOSUPPORT;
58	}
59}