rxrpc: Move peer lookup from call-accept to new-incoming-conn
Move the lookup of a peer from a call that's being accepted into the function that creates a new incoming connection. This will allow us to avoid incrementing the peer's usage count in some cases in future. Note that I haven't bother to integrate rxrpc_get_addr_from_skb() with rxrpc_extract_addr_from_skb() as I'm going to delete the former in the very near future. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/udp.h>
|
||||
#include "ar-internal.h"
|
||||
|
||||
@@ -39,3 +40,34 @@ void rxrpc_get_addr_from_skb(struct rxrpc_local *local,
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill out a peer address from a socket buffer containing a packet.
|
||||
*/
|
||||
int rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *srx, struct sk_buff *skb)
|
||||
{
|
||||
memset(srx, 0, sizeof(*srx));
|
||||
|
||||
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.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:
|
||||
pr_warn_ratelimited("AF_RXRPC: Unknown eth protocol %u\n",
|
||||
ntohs(skb->protocol));
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user