All new accounts created on Gitlab now require administrator approval. If you invite any collaborators, please let Flux staff know so they can approve the accounts.

Commit 343d60aa authored by Roopa Prabhu's avatar Roopa Prabhu Committed by David S. Miller

ipv6: change ipv6_stub_impl.ipv6_dst_lookup to take net argument

This patch adds net argument to ipv6_stub_impl.ipv6_dst_lookup
for use cases where sk is not available (like mpls).
sk appears to be needed to get the namespace 'net' and is optional
otherwise. This patch series changes ipv6_stub_impl.ipv6_dst_lookup
to take net argument. sk remains optional.

All callers of ipv6_stub_impl.ipv6_dst_lookup have been modified
to pass net. I have modified them to use already available
'net' in the scope of the call. I can change them to
sock_net(sk) to avoid any unintended change in behaviour if sock
namespace is different. They dont seem to be from code inspection.
Signed-off-by: default avatarRoopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d3aa45ce
...@@ -2034,7 +2034,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, ...@@ -2034,7 +2034,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
fl6.flowi6_mark = skb->mark; fl6.flowi6_mark = skb->mark;
fl6.flowi6_proto = IPPROTO_UDP; fl6.flowi6_proto = IPPROTO_UDP;
if (ipv6_stub->ipv6_dst_lookup(sk, &ndst, &fl6)) { if (ipv6_stub->ipv6_dst_lookup(vxlan->net, sk, &ndst, &fl6)) {
netdev_dbg(dev, "no route to %pI6\n", netdev_dbg(dev, "no route to %pI6\n",
&dst->sin6.sin6_addr); &dst->sin6.sin6_addr);
dev->stats.tx_carrier_errors++; dev->stats.tx_carrier_errors++;
......
...@@ -158,8 +158,8 @@ struct ipv6_stub { ...@@ -158,8 +158,8 @@ struct ipv6_stub {
const struct in6_addr *addr); const struct in6_addr *addr);
int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex, int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex,
const struct in6_addr *addr); const struct in6_addr *addr);
int (*ipv6_dst_lookup)(struct sock *sk, struct dst_entry **dst, int (*ipv6_dst_lookup)(struct net *net, struct sock *sk,
struct flowi6 *fl6); struct dst_entry **dst, struct flowi6 *fl6);
void (*udpv6_encap_enable)(void); void (*udpv6_encap_enable)(void);
void (*ndisc_send_na)(struct net_device *dev, struct neighbour *neigh, void (*ndisc_send_na)(struct net_device *dev, struct neighbour *neigh,
const struct in6_addr *daddr, const struct in6_addr *daddr,
......
...@@ -813,7 +813,8 @@ static inline struct sk_buff *ip6_finish_skb(struct sock *sk) ...@@ -813,7 +813,8 @@ static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
&inet6_sk(sk)->cork); &inet6_sk(sk)->cork);
} }
int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
struct flowi6 *fl6);
struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
const struct in6_addr *final_dst); const struct in6_addr *final_dst);
struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
......
...@@ -107,7 +107,16 @@ int inet6addr_notifier_call_chain(unsigned long val, void *v) ...@@ -107,7 +107,16 @@ int inet6addr_notifier_call_chain(unsigned long val, void *v)
} }
EXPORT_SYMBOL(inet6addr_notifier_call_chain); EXPORT_SYMBOL(inet6addr_notifier_call_chain);
const struct ipv6_stub *ipv6_stub __read_mostly; static int eafnosupport_ipv6_dst_lookup(struct net *net, struct sock *u1,
struct dst_entry **u2,
struct flowi6 *u3)
{
return -EAFNOSUPPORT;
}
const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {
.ipv6_dst_lookup = eafnosupport_ipv6_dst_lookup,
};
EXPORT_SYMBOL_GPL(ipv6_stub); EXPORT_SYMBOL_GPL(ipv6_stub);
/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */
......
...@@ -329,7 +329,7 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net, ...@@ -329,7 +329,7 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net,
struct flowi6 fl2; struct flowi6 fl2;
int err; int err;
err = ip6_dst_lookup(sk, &dst, fl6); err = ip6_dst_lookup(net, sk, &dst, fl6);
if (err) if (err)
return ERR_PTR(err); return ERR_PTR(err);
...@@ -361,7 +361,7 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net, ...@@ -361,7 +361,7 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net,
if (err) if (err)
goto relookup_failed; goto relookup_failed;
err = ip6_dst_lookup(sk, &dst2, &fl2); err = ip6_dst_lookup(net, sk, &dst2, &fl2);
if (err) if (err)
goto relookup_failed; goto relookup_failed;
...@@ -591,7 +591,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) ...@@ -591,7 +591,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
else if (!fl6.flowi6_oif) else if (!fl6.flowi6_oif)
fl6.flowi6_oif = np->ucast_oif; fl6.flowi6_oif = np->ucast_oif;
err = ip6_dst_lookup(sk, &dst, &fl6); err = ip6_dst_lookup(net, sk, &dst, &fl6);
if (err) if (err)
goto out; goto out;
dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0); dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0);
......
...@@ -881,10 +881,9 @@ out: ...@@ -881,10 +881,9 @@ out:
return dst; return dst;
} }
static int ip6_dst_lookup_tail(struct sock *sk, static int ip6_dst_lookup_tail(struct net *net, struct sock *sk,
struct dst_entry **dst, struct flowi6 *fl6) struct dst_entry **dst, struct flowi6 *fl6)
{ {
struct net *net = sock_net(sk);
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
struct neighbour *n; struct neighbour *n;
struct rt6_info *rt; struct rt6_info *rt;
...@@ -994,10 +993,11 @@ out_err_release: ...@@ -994,10 +993,11 @@ out_err_release:
* *
* It returns zero on success, or a standard errno code on error. * It returns zero on success, or a standard errno code on error.
*/ */
int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6) int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
struct flowi6 *fl6)
{ {
*dst = NULL; *dst = NULL;
return ip6_dst_lookup_tail(sk, dst, fl6); return ip6_dst_lookup_tail(net, sk, dst, fl6);
} }
EXPORT_SYMBOL_GPL(ip6_dst_lookup); EXPORT_SYMBOL_GPL(ip6_dst_lookup);
...@@ -1018,7 +1018,7 @@ struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, ...@@ -1018,7 +1018,7 @@ struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
struct dst_entry *dst = NULL; struct dst_entry *dst = NULL;
int err; int err;
err = ip6_dst_lookup_tail(sk, &dst, fl6); err = ip6_dst_lookup_tail(sock_net(sk), sk, &dst, fl6);
if (err) if (err)
return ERR_PTR(err); return ERR_PTR(err);
if (final_dst) if (final_dst)
...@@ -1052,7 +1052,7 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, ...@@ -1052,7 +1052,7 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
dst = ip6_sk_dst_check(sk, dst, fl6); dst = ip6_sk_dst_check(sk, dst, fl6);
err = ip6_dst_lookup_tail(sk, &dst, fl6); err = ip6_dst_lookup_tail(sock_net(sk), sk, &dst, fl6);
if (err) if (err)
return ERR_PTR(err); return ERR_PTR(err);
if (final_dst) if (final_dst)
......
...@@ -194,7 +194,8 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb, ...@@ -194,7 +194,8 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
.saddr = src->ipv6, .saddr = src->ipv6,
.flowi6_proto = IPPROTO_UDP .flowi6_proto = IPPROTO_UDP
}; };
err = ipv6_stub->ipv6_dst_lookup(ub->ubsock->sk, &ndst, &fl6); err = ipv6_stub->ipv6_dst_lookup(net, ub->ubsock->sk, &ndst,
&fl6);
if (err) if (err)
goto tx_error; goto tx_error;
ttl = ip6_dst_hoplimit(ndst); ttl = ip6_dst_hoplimit(ndst);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment