inet: refactor inet[6]_lookup functions to take skb
This is a preliminary step to allow fast socket lookup of SO_REUSEPORT groups. Doing so with a BPF filter will require access to the skb in question. This change plumbs the skb (and offset to payload data) through the call stack to the listening socket lookup implementations where it will be used in a following patch. Signed-off-by: Craig Gallek <kraig@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d9b3fca273
commit
a583636a83
12 changed files with 85 additions and 42 deletions
|
@ -357,18 +357,18 @@ struct sock *inet_diag_find_one_icsk(struct net *net,
|
|||
struct sock *sk;
|
||||
|
||||
if (req->sdiag_family == AF_INET)
|
||||
sk = inet_lookup(net, hashinfo, req->id.idiag_dst[0],
|
||||
sk = inet_lookup(net, hashinfo, NULL, 0, req->id.idiag_dst[0],
|
||||
req->id.idiag_dport, req->id.idiag_src[0],
|
||||
req->id.idiag_sport, req->id.idiag_if);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
else if (req->sdiag_family == AF_INET6) {
|
||||
if (ipv6_addr_v4mapped((struct in6_addr *)req->id.idiag_dst) &&
|
||||
ipv6_addr_v4mapped((struct in6_addr *)req->id.idiag_src))
|
||||
sk = inet_lookup(net, hashinfo, req->id.idiag_dst[3],
|
||||
sk = inet_lookup(net, hashinfo, NULL, 0, req->id.idiag_dst[3],
|
||||
req->id.idiag_dport, req->id.idiag_src[3],
|
||||
req->id.idiag_sport, req->id.idiag_if);
|
||||
else
|
||||
sk = inet6_lookup(net, hashinfo,
|
||||
sk = inet6_lookup(net, hashinfo, NULL, 0,
|
||||
(struct in6_addr *)req->id.idiag_dst,
|
||||
req->id.idiag_dport,
|
||||
(struct in6_addr *)req->id.idiag_src,
|
||||
|
|
|
@ -205,6 +205,7 @@ static inline int compute_score(struct sock *sk, struct net *net,
|
|||
|
||||
struct sock *__inet_lookup_listener(struct net *net,
|
||||
struct inet_hashinfo *hashinfo,
|
||||
struct sk_buff *skb, int doff,
|
||||
const __be32 saddr, __be16 sport,
|
||||
const __be32 daddr, const unsigned short hnum,
|
||||
const int dif)
|
||||
|
|
|
@ -637,8 +637,8 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
|||
* Incoming packet is checked with md5 hash with finding key,
|
||||
* no RST generated if md5 hash doesn't match.
|
||||
*/
|
||||
sk1 = __inet_lookup_listener(net,
|
||||
&tcp_hashinfo, ip_hdr(skb)->saddr,
|
||||
sk1 = __inet_lookup_listener(net, &tcp_hashinfo, NULL, 0,
|
||||
ip_hdr(skb)->saddr,
|
||||
th->source, ip_hdr(skb)->daddr,
|
||||
ntohs(th->source), inet_iif(skb));
|
||||
/* don't send rst if it can't find key */
|
||||
|
@ -1581,7 +1581,8 @@ int tcp_v4_rcv(struct sk_buff *skb)
|
|||
TCP_SKB_CB(skb)->sacked = 0;
|
||||
|
||||
lookup:
|
||||
sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
|
||||
sk = __inet_lookup_skb(&tcp_hashinfo, skb, __tcp_hdrlen(th), th->source,
|
||||
th->dest);
|
||||
if (!sk)
|
||||
goto no_tcp_socket;
|
||||
|
||||
|
@ -1695,7 +1696,8 @@ do_time_wait:
|
|||
switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
|
||||
case TCP_TW_SYN: {
|
||||
struct sock *sk2 = inet_lookup_listener(dev_net(skb->dev),
|
||||
&tcp_hashinfo,
|
||||
&tcp_hashinfo, skb,
|
||||
__tcp_hdrlen(th),
|
||||
iph->saddr, th->source,
|
||||
iph->daddr, th->dest,
|
||||
inet_iif(skb));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue