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