[RFC PATCH 07/10] net: ipv6: Convert raw sockets to sk_lookup
From: David Ahern <hidden>
Date: 2017-07-25 15:38:58
Subsystem:
networking [general], the rest · Maintainers:
"David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Convert __raw_v6_lookup to use the new sk_lookup struct Signed-off-by: David Ahern <redacted> --- include/net/rawv6.h | 3 +-- net/ipv4/raw_diag.c | 15 ++++++++++----- net/ipv6/raw.c | 41 +++++++++++++++++++++++------------------ 3 files changed, 34 insertions(+), 25 deletions(-)
diff --git a/include/net/rawv6.h b/include/net/rawv6.h
index cbe4e9de1894..406268324d26 100644
--- a/include/net/rawv6.h
+++ b/include/net/rawv6.h@@ -5,8 +5,7 @@ extern struct raw_hashinfo raw_v6_hashinfo; struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, - unsigned short num, const struct in6_addr *loc_addr, - const struct in6_addr *rmt_addr, int dif); + const struct sk_lookup *params); int raw_abort(struct sock *sk, int err);
diff --git a/net/ipv4/raw_diag.c b/net/ipv4/raw_diag.c
index a708de070cc6..2314993f6294 100644
--- a/net/ipv4/raw_diag.c
+++ b/net/ipv4/raw_diag.c@@ -53,11 +53,16 @@ static struct sock *raw_lookup(struct net *net, struct sock *from, sk = __raw_v4_lookup(net, from, ¶ms); } #if IS_ENABLED(CONFIG_IPV6) - else - sk = __raw_v6_lookup(net, from, r->sdiag_raw_protocol, - (const struct in6_addr *)r->id.idiag_src, - (const struct in6_addr *)r->id.idiag_dst, - r->id.idiag_if); + else { + struct sk_lookup params = { + .saddr.ipv6 = (const struct in6_addr *)r->id.idiag_dst, + .daddr.ipv6 = (const struct in6_addr *)r->id.idiag_src, + .hnum = r->sdiag_raw_protocol, + .dif = r->id.idiag_if, + }; + + sk = __raw_v6_lookup(net, from, ¶ms); + } #endif return sk; }
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 60be012fe708..51e651f18ffb 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c@@ -71,14 +71,14 @@ struct raw_hashinfo raw_v6_hashinfo = { EXPORT_SYMBOL_GPL(raw_v6_hashinfo); struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, - unsigned short num, const struct in6_addr *loc_addr, - const struct in6_addr *rmt_addr, int dif) + const struct sk_lookup *params) { + const struct in6_addr *loc_addr = params->daddr.ipv6; + const struct in6_addr *rmt_addr = params->saddr.ipv6; bool is_multicast = ipv6_addr_is_multicast(loc_addr); sk_for_each_from(sk) - if (inet_sk(sk)->inet_num == num) { - + if (inet_sk(sk)->inet_num == params->hnum) { if (!net_eq(sock_net(sk), net)) continue;
@@ -86,7 +86,8 @@ struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) continue; - if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) + if (sk->sk_bound_dev_if && + sk->sk_bound_dev_if != params->dif) continue; if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
@@ -159,15 +160,17 @@ EXPORT_SYMBOL(rawv6_mh_filter_unregister); */ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) { - const struct in6_addr *saddr; - const struct in6_addr *daddr; + struct sk_lookup params = { + .saddr.ipv6 = &ipv6_hdr(skb)->saddr, + .daddr.ipv6 = &ipv6_hdr(skb)->daddr, + .hnum = nexthdr, + .dif = inet6_iif(skb), + }; struct sock *sk; bool delivered = false; __u8 hash; struct net *net; - saddr = &ipv6_hdr(skb)->saddr; - daddr = saddr + 1; hash = nexthdr & (RAW_HTABLE_SIZE - 1);
@@ -178,7 +181,7 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) goto out; net = dev_net(skb->dev); - sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, inet6_iif(skb)); + sk = __raw_v6_lookup(net, sk, ¶ms); while (sk) { int filtered;
@@ -221,8 +224,7 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) rawv6_rcv(sk, clone); } } - sk = __raw_v6_lookup(net, sk_next(sk), nexthdr, daddr, saddr, - inet6_iif(skb)); + sk = __raw_v6_lookup(net, sk_next(sk), ¶ms); } out: read_unlock(&raw_v6_hashinfo.lock);
@@ -362,23 +364,26 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, u8 type, u8 code, int inner_offset, __be32 info) { struct sock *sk; - int hash; - const struct in6_addr *saddr, *daddr; struct net *net; + int hash; hash = nexthdr & (RAW_HTABLE_SIZE - 1); read_lock(&raw_v6_hashinfo.lock); sk = sk_head(&raw_v6_hashinfo.ht[hash]); if (sk) { + struct sk_lookup params = { + .hnum = nexthdr, + .dif = inet6_iif(skb), + }; /* Note: ipv6_hdr(skb) != skb->data */ const struct ipv6hdr *ip6h = (const struct ipv6hdr *)skb->data; - saddr = &ip6h->saddr; - daddr = &ip6h->daddr; + + params.daddr.ipv6 = &ip6h->saddr; + params.saddr.ipv6 = &ip6h->daddr; net = dev_net(skb->dev); - while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, - inet6_iif(skb)))) { + while ((sk = __raw_v6_lookup(net, sk, ¶ms))) { rawv6_err(sk, skb, NULL, type, code, inner_offset, info); sk = sk_next(sk);
--
2.1.4