18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/* Utility routines
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2015 Red Hat, Inc. All Rights Reserved.
58c2ecf20Sopenharmony_ci * Written by David Howells (dhowells@redhat.com)
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/ip.h>
98c2ecf20Sopenharmony_ci#include <linux/ipv6.h>
108c2ecf20Sopenharmony_ci#include <linux/udp.h>
118c2ecf20Sopenharmony_ci#include "ar-internal.h"
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/*
148c2ecf20Sopenharmony_ci * Fill out a peer address from a socket buffer containing a packet.
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_ciint rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *srx, struct sk_buff *skb)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	memset(srx, 0, sizeof(*srx));
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	switch (ntohs(skb->protocol)) {
218c2ecf20Sopenharmony_ci	case ETH_P_IP:
228c2ecf20Sopenharmony_ci		srx->transport_type = SOCK_DGRAM;
238c2ecf20Sopenharmony_ci		srx->transport_len = sizeof(srx->transport.sin);
248c2ecf20Sopenharmony_ci		srx->transport.sin.sin_family = AF_INET;
258c2ecf20Sopenharmony_ci		srx->transport.sin.sin_port = udp_hdr(skb)->source;
268c2ecf20Sopenharmony_ci		srx->transport.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
278c2ecf20Sopenharmony_ci		return 0;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#ifdef CONFIG_AF_RXRPC_IPV6
308c2ecf20Sopenharmony_ci	case ETH_P_IPV6:
318c2ecf20Sopenharmony_ci		srx->transport_type = SOCK_DGRAM;
328c2ecf20Sopenharmony_ci		srx->transport_len = sizeof(srx->transport.sin6);
338c2ecf20Sopenharmony_ci		srx->transport.sin6.sin6_family = AF_INET6;
348c2ecf20Sopenharmony_ci		srx->transport.sin6.sin6_port = udp_hdr(skb)->source;
358c2ecf20Sopenharmony_ci		srx->transport.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
368c2ecf20Sopenharmony_ci		return 0;
378c2ecf20Sopenharmony_ci#endif
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	default:
408c2ecf20Sopenharmony_ci		pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
418c2ecf20Sopenharmony_ci				    ntohs(skb->protocol));
428c2ecf20Sopenharmony_ci		return -EAFNOSUPPORT;
438c2ecf20Sopenharmony_ci	}
448c2ecf20Sopenharmony_ci}
45