Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a1f27c4 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller
Browse files

inet_hashtables: Add inet_lookup_skb helpers



To be able to use the cached socket reference in the skb during input
processing we add a new set of lookup functions that receive the skb on
their argument list.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarKOVACS Krisztian <hidden@sch.bme.hu>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7004482
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -91,6 +91,17 @@ static inline struct sock *__inet6_lookup(struct net *net,
	return inet6_lookup_listener(net, hashinfo, daddr, hnum, dif);
}

static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
					      struct sk_buff *skb,
					      const __be16 sport,
					      const __be16 dport)
{
	return __inet6_lookup(dev_net(skb->dst->dev), hashinfo,
			      &ipv6_hdr(skb)->saddr, sport,
			      &ipv6_hdr(skb)->daddr, ntohs(dport),
			      inet6_iif(skb));
}

extern struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo,
				 const struct in6_addr *saddr, const __be16 sport,
				 const struct in6_addr *daddr, const __be16 dport,
+14 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@


#include <linux/interrupt.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/list.h>
#include <linux/slab.h>
@@ -28,6 +29,7 @@
#include <net/inet_connection_sock.h>
#include <net/inet_sock.h>
#include <net/sock.h>
#include <net/route.h>
#include <net/tcp_states.h>
#include <net/netns/hash.h>

@@ -371,6 +373,18 @@ static inline struct sock *inet_lookup(struct net *net,
	return sk;
}

static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo,
					     struct sk_buff *skb,
					     const __be16 sport,
					     const __be16 dport)
{
	const struct iphdr *iph = ip_hdr(skb);

	return __inet_lookup(dev_net(skb->dst->dev), hashinfo,
			     iph->saddr, sport,
			     iph->daddr, dport, inet_iif(skb));
}

extern int __inet_hash_connect(struct inet_timewait_death_row *death_row,
		struct sock *sk, u32 port_offset,
		int (*check_established)(struct inet_timewait_death_row *,
+2 −3
Original line number Diff line number Diff line
@@ -811,9 +811,8 @@ static int dccp_v4_rcv(struct sk_buff *skb)

	/* Step 2:
	 *	Look up flow ID in table and get corresponding socket */
	sk = __inet_lookup(dev_net(skb->dst->dev), &dccp_hashinfo,
			   iph->saddr, dh->dccph_sport,
			   iph->daddr, dh->dccph_dport, inet_iif(skb));
	sk = __inet_lookup_skb(&dccp_hashinfo, skb,
			       dh->dccph_sport, dh->dccph_dport);
	/*
	 * Step 2:
	 *	If no socket ...
+2 −4
Original line number Diff line number Diff line
@@ -805,10 +805,8 @@ static int dccp_v6_rcv(struct sk_buff *skb)

	/* Step 2:
	 *	Look up flow ID in table and get corresponding socket */
	sk = __inet6_lookup(dev_net(skb->dst->dev), &dccp_hashinfo,
			    &ipv6_hdr(skb)->saddr, dh->dccph_sport,
			    &ipv6_hdr(skb)->daddr, ntohs(dh->dccph_dport),
			    inet6_iif(skb));
	sk = __inet6_lookup_skb(&dccp_hashinfo, skb,
			        dh->dccph_sport, dh->dccph_dport);
	/*
	 * Step 2:
	 *	If no socket ...
+1 −2
Original line number Diff line number Diff line
@@ -1577,8 +1577,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
	TCP_SKB_CB(skb)->flags	 = iph->tos;
	TCP_SKB_CB(skb)->sacked	 = 0;

	sk = __inet_lookup(net, &tcp_hashinfo, iph->saddr,
			th->source, iph->daddr, th->dest, inet_iif(skb));
	sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
	if (!sk)
		goto no_tcp_socket;

Loading