ipv6: introduce dst_rt6_info() helper

Instead of (struct rt6_info *)dst casts, we can use :

 #define dst_rt6_info(_ptr) \
         container_of_const(_ptr, struct rt6_info, dst)

Some places needed missing const qualifiers :

ip6_confirm_neigh(), ipv6_anycast_destination(),
ipv6_unicast_destination(), has_gateway()

v2: added missing parts (David Ahern)

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet 2024-04-26 15:19:52 +00:00 committed by David S. Miller
parent fac87d32a0
commit e8dfd42c17
30 changed files with 77 additions and 86 deletions

View File

@ -348,15 +348,15 @@ static int dst_fetch_ha(const struct dst_entry *dst,
static bool has_gateway(const struct dst_entry *dst, sa_family_t family) static bool has_gateway(const struct dst_entry *dst, sa_family_t family)
{ {
struct rtable *rt; const struct rtable *rt;
struct rt6_info *rt6; const struct rt6_info *rt6;
if (family == AF_INET) { if (family == AF_INET) {
rt = container_of(dst, struct rtable, dst); rt = container_of(dst, struct rtable, dst);
return rt->rt_uses_gateway; return rt->rt_uses_gateway;
} }
rt6 = container_of(dst, struct rt6_info, dst); rt6 = dst_rt6_info(dst);
return rt6->rt6i_flags & RTF_GATEWAY; return rt6->rt6i_flags & RTF_GATEWAY;
} }

View File

@ -540,7 +540,7 @@ mlxsw_sp_span_gretap6_route(const struct net_device *to_dev,
if (!dst || dst->error) if (!dst || dst->error)
goto out; goto out;
rt6 = container_of(dst, struct rt6_info, dst); rt6 = dst_rt6_info(dst);
dev = dst->dev; dev = dst->dev;
*saddrp = fl6.saddr; *saddrp = fl6.saddr;

View File

@ -653,7 +653,7 @@ static int vrf_finish_output6(struct net *net, struct sock *sk,
skb->dev = dev; skb->dev = dev;
rcu_read_lock(); rcu_read_lock();
nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr); nexthop = rt6_nexthop(dst_rt6_info(dst), &ipv6_hdr(skb)->daddr);
neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop); neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop);
if (unlikely(!neigh)) if (unlikely(!neigh))
neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false); neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false);

View File

@ -2513,7 +2513,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
} }
if (!info) { if (!info) {
u32 rt6i_flags = ((struct rt6_info *)ndst)->rt6i_flags; u32 rt6i_flags = dst_rt6_info(ndst)->rt6i_flags;
err = encap_bypass_if_local(skb, dev, vxlan, AF_INET6, err = encap_bypass_if_local(skb, dev, vxlan, AF_INET6,
dst_port, ifindex, vni, dst_port, ifindex, vni,

View File

@ -956,7 +956,7 @@ static inline struct dst_entry *qeth_dst_check_rcu(struct sk_buff *skb,
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
struct rt6_info *rt; struct rt6_info *rt;
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
if (dst) { if (dst) {
if (proto == htons(ETH_P_IPV6)) if (proto == htons(ETH_P_IPV6))
dst = dst_check(dst, rt6_get_cookie(rt)); dst = dst_check(dst, rt6_get_cookie(rt));
@ -978,7 +978,7 @@ static inline __be32 qeth_next_hop_v4_rcu(struct sk_buff *skb,
static inline struct in6_addr *qeth_next_hop_v6_rcu(struct sk_buff *skb, static inline struct in6_addr *qeth_next_hop_v6_rcu(struct sk_buff *skb,
struct dst_entry *dst) struct dst_entry *dst)
{ {
struct rt6_info *rt = (struct rt6_info *) dst; struct rt6_info *rt = dst_rt6_info(dst);
if (rt && !ipv6_addr_any(&rt->rt6i_gateway)) if (rt && !ipv6_addr_any(&rt->rt6i_gateway))
return &rt->rt6i_gateway; return &rt->rt6i_gateway;

View File

@ -234,9 +234,11 @@ struct fib6_result {
for (rt = (w)->leaf; rt; \ for (rt = (w)->leaf; rt; \
rt = rcu_dereference_protected(rt->fib6_next, 1)) rt = rcu_dereference_protected(rt->fib6_next, 1))
static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) #define dst_rt6_info(_ptr) container_of_const(_ptr, struct rt6_info, dst)
static inline struct inet6_dev *ip6_dst_idev(const struct dst_entry *dst)
{ {
return ((struct rt6_info *)dst)->rt6i_idev; return dst_rt6_info(dst)->rt6i_idev;
} }
static inline bool fib6_requires_src(const struct fib6_info *rt) static inline bool fib6_requires_src(const struct fib6_info *rt)

View File

@ -210,12 +210,11 @@ void rt6_uncached_list_del(struct rt6_info *rt);
static inline const struct rt6_info *skb_rt6_info(const struct sk_buff *skb) static inline const struct rt6_info *skb_rt6_info(const struct sk_buff *skb)
{ {
const struct dst_entry *dst = skb_dst(skb); const struct dst_entry *dst = skb_dst(skb);
const struct rt6_info *rt6 = NULL;
if (dst) if (dst)
rt6 = container_of(dst, struct rt6_info, dst); return dst_rt6_info(dst);
return rt6; return NULL;
} }
/* /*
@ -227,7 +226,7 @@ static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
np->dst_cookie = rt6_get_cookie((struct rt6_info *)dst); np->dst_cookie = rt6_get_cookie(dst_rt6_info(dst));
sk_setup_caps(sk, dst); sk_setup_caps(sk, dst);
np->daddr_cache = daddr; np->daddr_cache = daddr;
#ifdef CONFIG_IPV6_SUBTREES #ifdef CONFIG_IPV6_SUBTREES
@ -240,7 +239,7 @@ void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,
static inline bool ipv6_unicast_destination(const struct sk_buff *skb) static inline bool ipv6_unicast_destination(const struct sk_buff *skb)
{ {
struct rt6_info *rt = (struct rt6_info *) skb_dst(skb); const struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
return rt->rt6i_flags & RTF_LOCAL; return rt->rt6i_flags & RTF_LOCAL;
} }
@ -248,7 +247,7 @@ static inline bool ipv6_unicast_destination(const struct sk_buff *skb)
static inline bool ipv6_anycast_destination(const struct dst_entry *dst, static inline bool ipv6_anycast_destination(const struct dst_entry *dst,
const struct in6_addr *daddr) const struct in6_addr *daddr)
{ {
struct rt6_info *rt = (struct rt6_info *)dst; const struct rt6_info *rt = dst_rt6_info(dst);
return rt->rt6i_flags & RTF_ANYCAST || return rt->rt6i_flags & RTF_ANYCAST ||
(rt->rt6i_dst.plen < 127 && (rt->rt6i_dst.plen < 127 &&

View File

@ -133,7 +133,7 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,
struct in6_addr *daddr, struct in6_addr *daddr,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
int count = atomic_read(&dev->peer_count); int count = atomic_read(&dev->peer_count);
const struct in6_addr *nexthop; const struct in6_addr *nexthop;
struct lowpan_peer *peer; struct lowpan_peer *peer;

View File

@ -112,7 +112,7 @@ void dst_cache_set_ip6(struct dst_cache *dst_cache, struct dst_entry *dst,
idst = this_cpu_ptr(dst_cache->cache); idst = this_cpu_ptr(dst_cache->cache);
dst_cache_per_cpu_dst_set(this_cpu_ptr(dst_cache->cache), dst, dst_cache_per_cpu_dst_set(this_cpu_ptr(dst_cache->cache), dst,
rt6_get_cookie((struct rt6_info *)dst)); rt6_get_cookie(dst_rt6_info(dst)));
idst->in6_saddr = *saddr; idst->in6_saddr = *saddr;
} }
EXPORT_SYMBOL_GPL(dst_cache_set_ip6); EXPORT_SYMBOL_GPL(dst_cache_set_ip6);

View File

@ -2215,7 +2215,7 @@ static int bpf_out_neigh_v6(struct net *net, struct sk_buff *skb,
rcu_read_lock(); rcu_read_lock();
if (!nh) { if (!nh) {
dst = skb_dst(skb); dst = skb_dst(skb);
nexthop = rt6_nexthop(container_of(dst, struct rt6_info, dst), nexthop = rt6_nexthop(dst_rt6_info(dst),
&ipv6_hdr(skb)->daddr); &ipv6_hdr(skb)->daddr);
} else { } else {
nexthop = &nh->ipv6_nh; nexthop = &nh->ipv6_nh;

View File

@ -543,7 +543,7 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,
struct rt6_info *rt6; struct rt6_info *rt6;
__be32 daddr; __be32 daddr;
rt6 = skb_valid_dst(skb) ? (struct rt6_info *)skb_dst(skb) : rt6 = skb_valid_dst(skb) ? dst_rt6_info(skb_dst(skb)) :
NULL; NULL;
daddr = md ? dst : tunnel->parms.iph.daddr; daddr = md ? dst : tunnel->parms.iph.daddr;

View File

@ -212,7 +212,7 @@ static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
} else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) { } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) {
res = true; res = true;
} else { } else {
struct rt6_info *rt = (struct rt6_info *)dst; struct rt6_info *rt = dst_rt6_info(dst);
int tmo = net->ipv6.sysctl.icmpv6_time; int tmo = net->ipv6.sysctl.icmpv6_time;
struct inet_peer *peer; struct inet_peer *peer;
@ -241,7 +241,7 @@ static bool icmpv6_rt_has_prefsrc(struct sock *sk, u8 type,
dst = ip6_route_output(net, sk, fl6); dst = ip6_route_output(net, sk, fl6);
if (!dst->error) { if (!dst->error) {
struct rt6_info *rt = (struct rt6_info *)dst; struct rt6_info *rt = dst_rt6_info(dst);
struct in6_addr prefsrc; struct in6_addr prefsrc;
rt6_get_prefsrc(rt, &prefsrc); rt6_get_prefsrc(rt, &prefsrc);
@ -616,7 +616,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
if (ip6_append_data(sk, icmpv6_getfrag, &msg, if (ip6_append_data(sk, icmpv6_getfrag, &msg,
len + sizeof(struct icmp6hdr), len + sizeof(struct icmp6hdr),
sizeof(struct icmp6hdr), sizeof(struct icmp6hdr),
&ipc6, &fl6, (struct rt6_info *)dst, &ipc6, &fl6, dst_rt6_info(dst),
MSG_DONTWAIT)) { MSG_DONTWAIT)) {
ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS); ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
ip6_flush_pending_frames(sk); ip6_flush_pending_frames(sk);
@ -803,7 +803,7 @@ static enum skb_drop_reason icmpv6_echo_reply(struct sk_buff *skb)
if (ip6_append_data(sk, icmpv6_getfrag, &msg, if (ip6_append_data(sk, icmpv6_getfrag, &msg,
skb->len + sizeof(struct icmp6hdr), skb->len + sizeof(struct icmp6hdr),
sizeof(struct icmp6hdr), &ipc6, &fl6, sizeof(struct icmp6hdr), &ipc6, &fl6,
(struct rt6_info *)dst, MSG_DONTWAIT)) { dst_rt6_info(dst), MSG_DONTWAIT)) {
__ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS); __ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
ip6_flush_pending_frames(sk); ip6_flush_pending_frames(sk);
} else { } else {

View File

@ -38,7 +38,7 @@ static inline struct ila_params *ila_params_lwtunnel(
static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb) static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ {
struct dst_entry *orig_dst = skb_dst(skb); struct dst_entry *orig_dst = skb_dst(skb);
struct rt6_info *rt = (struct rt6_info *)orig_dst; struct rt6_info *rt = dst_rt6_info(orig_dst);
struct ila_lwt *ilwt = ila_lwt_lwtunnel(orig_dst->lwtstate); struct ila_lwt *ilwt = ila_lwt_lwtunnel(orig_dst->lwtstate);
struct dst_entry *dst; struct dst_entry *dst;
int err = -EINVAL; int err = -EINVAL;
@ -70,7 +70,7 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)
memset(&fl6, 0, sizeof(fl6)); memset(&fl6, 0, sizeof(fl6));
fl6.flowi6_oif = orig_dst->dev->ifindex; fl6.flowi6_oif = orig_dst->dev->ifindex;
fl6.flowi6_iif = LOOPBACK_IFINDEX; fl6.flowi6_iif = LOOPBACK_IFINDEX;
fl6.daddr = *rt6_nexthop((struct rt6_info *)orig_dst, fl6.daddr = *rt6_nexthop(dst_rt6_info(orig_dst),
&ip6h->daddr); &ip6h->daddr);
dst = ip6_route_output(net, NULL, &fl6); dst = ip6_route_output(net, NULL, &fl6);

View File

@ -120,7 +120,7 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
rcu_read_lock(); rcu_read_lock();
nexthop = rt6_nexthop((struct rt6_info *)dst, daddr); nexthop = rt6_nexthop(dst_rt6_info(dst), daddr);
neigh = __ipv6_neigh_lookup_noref(dev, nexthop); neigh = __ipv6_neigh_lookup_noref(dev, nexthop);
if (unlikely(IS_ERR_OR_NULL(neigh))) { if (unlikely(IS_ERR_OR_NULL(neigh))) {
@ -599,7 +599,7 @@ int ip6_forward(struct sk_buff *skb)
* send a redirect. * send a redirect.
*/ */
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
if (rt->rt6i_flags & RTF_GATEWAY) if (rt->rt6i_flags & RTF_GATEWAY)
target = &rt->rt6i_gateway; target = &rt->rt6i_gateway;
else else
@ -856,7 +856,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
int (*output)(struct net *, struct sock *, struct sk_buff *)) int (*output)(struct net *, struct sock *, struct sk_buff *))
{ {
struct sk_buff *frag; struct sk_buff *frag;
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ? struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
inet6_sk(skb->sk) : NULL; inet6_sk(skb->sk) : NULL;
bool mono_delivery_time = skb->mono_delivery_time; bool mono_delivery_time = skb->mono_delivery_time;
@ -1063,7 +1063,7 @@ static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
return NULL; return NULL;
} }
rt = (struct rt6_info *)dst; rt = dst_rt6_info(dst);
/* Yes, checking route validity in not connected /* Yes, checking route validity in not connected
* case is not very simple. Take into account, * case is not very simple. Take into account,
* that we do not support routing by source, TOS, * that we do not support routing by source, TOS,
@ -1118,7 +1118,7 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,
struct rt6_info *rt; struct rt6_info *rt;
*dst = ip6_route_output(net, sk, fl6); *dst = ip6_route_output(net, sk, fl6);
rt = (*dst)->error ? NULL : (struct rt6_info *)*dst; rt = (*dst)->error ? NULL : dst_rt6_info(*dst);
rcu_read_lock(); rcu_read_lock();
from = rt ? rcu_dereference(rt->from) : NULL; from = rt ? rcu_dereference(rt->from) : NULL;
@ -1159,7 +1159,7 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,
* dst entry and replace it instead with the * dst entry and replace it instead with the
* dst entry of the nexthop router * dst entry of the nexthop router
*/ */
rt = (struct rt6_info *) *dst; rt = dst_rt6_info(*dst);
rcu_read_lock(); rcu_read_lock();
n = __ipv6_neigh_lookup_noref(rt->dst.dev, n = __ipv6_neigh_lookup_noref(rt->dst.dev,
rt6_nexthop(rt, &fl6->daddr)); rt6_nexthop(rt, &fl6->daddr));
@ -1423,7 +1423,7 @@ static int __ip6_append_data(struct sock *sk,
int offset = 0; int offset = 0;
bool zc = false; bool zc = false;
u32 tskey = 0; u32 tskey = 0;
struct rt6_info *rt = (struct rt6_info *)cork->dst; struct rt6_info *rt = dst_rt6_info(cork->dst);
bool paged, hold_tskey, extra_uref = false; bool paged, hold_tskey, extra_uref = false;
struct ipv6_txoptions *opt = v6_cork->opt; struct ipv6_txoptions *opt = v6_cork->opt;
int csummode = CHECKSUM_NONE; int csummode = CHECKSUM_NONE;
@ -1877,7 +1877,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
struct ipv6hdr *hdr; struct ipv6hdr *hdr;
struct ipv6_txoptions *opt = v6_cork->opt; struct ipv6_txoptions *opt = v6_cork->opt;
struct rt6_info *rt = (struct rt6_info *)cork->base.dst; struct rt6_info *rt = dst_rt6_info(cork->base.dst);
struct flowi6 *fl6 = &cork->fl.u.ip6; struct flowi6 *fl6 = &cork->fl.u.ip6;
unsigned char proto = fl6->flowi6_proto; unsigned char proto = fl6->flowi6_proto;
@ -1949,7 +1949,7 @@ out:
int ip6_send_skb(struct sk_buff *skb) int ip6_send_skb(struct sk_buff *skb)
{ {
struct net *net = sock_net(skb->sk); struct net *net = sock_net(skb->sk);
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
int err; int err;
err = ip6_local_out(net, skb->sk, skb); err = ip6_local_out(net, skb->sk, skb);

View File

@ -2273,7 +2273,7 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
int err; int err;
struct mr_table *mrt; struct mr_table *mrt;
struct mfc6_cache *cache; struct mfc6_cache *cache;
struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
if (!mrt) if (!mrt)

View File

@ -1722,7 +1722,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
if (IS_ERR(dst)) if (IS_ERR(dst))
return; return;
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
if (rt->rt6i_flags & RTF_GATEWAY) { if (rt->rt6i_flags & RTF_GATEWAY) {
ND_PRINTK(2, warn, ND_PRINTK(2, warn,

View File

@ -154,7 +154,7 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
dst = ip6_sk_dst_lookup_flow(sk, &fl6, daddr, false); dst = ip6_sk_dst_lookup_flow(sk, &fl6, daddr, false);
if (IS_ERR(dst)) if (IS_ERR(dst))
return PTR_ERR(dst); return PTR_ERR(dst);
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
fl6.flowi6_oif = READ_ONCE(np->mcast_oif); fl6.flowi6_oif = READ_ONCE(np->mcast_oif);

View File

@ -598,7 +598,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
struct ipv6hdr *iph; struct ipv6hdr *iph;
struct sk_buff *skb; struct sk_buff *skb;
int err; int err;
struct rt6_info *rt = (struct rt6_info *)*dstp; struct rt6_info *rt = dst_rt6_info(*dstp);
int hlen = LL_RESERVED_SPACE(rt->dst.dev); int hlen = LL_RESERVED_SPACE(rt->dst.dev);
int tlen = rt->dst.dev->needed_tailroom; int tlen = rt->dst.dev->needed_tailroom;
@ -917,7 +917,7 @@ back_from_confirm:
ipc6.opt = opt; ipc6.opt = opt;
lock_sock(sk); lock_sock(sk);
err = ip6_append_data(sk, raw6_getfrag, &rfv, err = ip6_append_data(sk, raw6_getfrag, &rfv,
len, 0, &ipc6, &fl6, (struct rt6_info *)dst, len, 0, &ipc6, &fl6, dst_rt6_info(dst),
msg->msg_flags); msg->msg_flags);
if (err) if (err)

View File

@ -226,7 +226,7 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
struct sk_buff *skb, struct sk_buff *skb,
const void *daddr) const void *daddr)
{ {
const struct rt6_info *rt = container_of(dst, struct rt6_info, dst); const struct rt6_info *rt = dst_rt6_info(dst);
return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any), return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any),
dst->dev, skb, daddr); dst->dev, skb, daddr);
@ -234,8 +234,8 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr) static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
{ {
const struct rt6_info *rt = dst_rt6_info(dst);
struct net_device *dev = dst->dev; struct net_device *dev = dst->dev;
struct rt6_info *rt = (struct rt6_info *)dst;
daddr = choose_neigh_daddr(rt6_nexthop(rt, &in6addr_any), NULL, daddr); daddr = choose_neigh_daddr(rt6_nexthop(rt, &in6addr_any), NULL, daddr);
if (!daddr) if (!daddr)
@ -354,7 +354,7 @@ EXPORT_SYMBOL(ip6_dst_alloc);
static void ip6_dst_destroy(struct dst_entry *dst) static void ip6_dst_destroy(struct dst_entry *dst)
{ {
struct rt6_info *rt = (struct rt6_info *)dst; struct rt6_info *rt = dst_rt6_info(dst);
struct fib6_info *from; struct fib6_info *from;
struct inet6_dev *idev; struct inet6_dev *idev;
@ -373,7 +373,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)
static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev) static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
{ {
struct rt6_info *rt = (struct rt6_info *)dst; struct rt6_info *rt = dst_rt6_info(dst);
struct inet6_dev *idev = rt->rt6i_idev; struct inet6_dev *idev = rt->rt6i_idev;
if (idev && idev->dev != blackhole_netdev) { if (idev && idev->dev != blackhole_netdev) {
@ -1288,7 +1288,7 @@ struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup); dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
if (dst->error == 0) if (dst->error == 0)
return (struct rt6_info *) dst; return dst_rt6_info(dst);
dst_release(dst); dst_release(dst);
@ -2647,7 +2647,7 @@ struct dst_entry *ip6_route_output_flags(struct net *net,
rcu_read_lock(); rcu_read_lock();
dst = ip6_route_output_flags_noref(net, sk, fl6, flags); dst = ip6_route_output_flags_noref(net, sk, fl6, flags);
rt6 = (struct rt6_info *)dst; rt6 = dst_rt6_info(dst);
/* For dst cached in uncached_list, refcnt is already taken. */ /* For dst cached in uncached_list, refcnt is already taken. */
if (list_empty(&rt6->dst.rt_uncached) && !dst_hold_safe(dst)) { if (list_empty(&rt6->dst.rt_uncached) && !dst_hold_safe(dst)) {
dst = &net->ipv6.ip6_null_entry->dst; dst = &net->ipv6.ip6_null_entry->dst;
@ -2661,7 +2661,7 @@ EXPORT_SYMBOL_GPL(ip6_route_output_flags);
struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig) struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
{ {
struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig; struct rt6_info *rt, *ort = dst_rt6_info(dst_orig);
struct net_device *loopback_dev = net->loopback_dev; struct net_device *loopback_dev = net->loopback_dev;
struct dst_entry *new = NULL; struct dst_entry *new = NULL;
@ -2744,7 +2744,7 @@ INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst,
struct fib6_info *from; struct fib6_info *from;
struct rt6_info *rt; struct rt6_info *rt;
rt = container_of(dst, struct rt6_info, dst); rt = dst_rt6_info(dst);
if (rt->sernum) if (rt->sernum)
return rt6_is_valid(rt) ? dst : NULL; return rt6_is_valid(rt) ? dst : NULL;
@ -2772,7 +2772,7 @@ EXPORT_INDIRECT_CALLABLE(ip6_dst_check);
static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
{ {
struct rt6_info *rt = (struct rt6_info *) dst; struct rt6_info *rt = dst_rt6_info(dst);
if (rt) { if (rt) {
if (rt->rt6i_flags & RTF_CACHE) { if (rt->rt6i_flags & RTF_CACHE) {
@ -2796,7 +2796,7 @@ static void ip6_link_failure(struct sk_buff *skb)
icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0); icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
rt = (struct rt6_info *) skb_dst(skb); rt = dst_rt6_info(skb_dst(skb));
if (rt) { if (rt) {
rcu_read_lock(); rcu_read_lock();
if (rt->rt6i_flags & RTF_CACHE) { if (rt->rt6i_flags & RTF_CACHE) {
@ -2852,7 +2852,7 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
bool confirm_neigh) bool confirm_neigh)
{ {
const struct in6_addr *daddr, *saddr; const struct in6_addr *daddr, *saddr;
struct rt6_info *rt6 = (struct rt6_info *)dst; struct rt6_info *rt6 = dst_rt6_info(dst);
/* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU) /* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU)
* IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it. * IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it.
@ -4174,7 +4174,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
} }
} }
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
if (rt->rt6i_flags & RTF_REJECT) { if (rt->rt6i_flags & RTF_REJECT) {
net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n"); net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
return; return;
@ -5608,7 +5608,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
int iif, int type, u32 portid, u32 seq, int iif, int type, u32 portid, u32 seq,
unsigned int flags) unsigned int flags)
{ {
struct rt6_info *rt6 = (struct rt6_info *)dst; struct rt6_info *rt6 = dst_rt6_info(dst);
struct rt6key *rt6_dst, *rt6_src; struct rt6key *rt6_dst, *rt6_src;
u32 *pmetrics, table, rt6_flags; u32 *pmetrics, table, rt6_flags;
unsigned char nh_flags = 0; unsigned char nh_flags = 0;
@ -6111,7 +6111,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
} }
rt = container_of(dst, struct rt6_info, dst); rt = dst_rt6_info(dst);
if (rt->dst.error) { if (rt->dst.error) {
err = rt->dst.error; err = rt->dst.error;
ip6_rt_put(rt); ip6_rt_put(rt);

View File

@ -97,11 +97,9 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
struct dst_entry *dst = skb_dst(skb); struct dst_entry *dst = skb_dst(skb);
if (dst && dst_hold_safe(dst)) { if (dst && dst_hold_safe(dst)) {
const struct rt6_info *rt = (const struct rt6_info *)dst;
rcu_assign_pointer(sk->sk_rx_dst, dst); rcu_assign_pointer(sk->sk_rx_dst, dst);
sk->sk_rx_dst_ifindex = skb->skb_iif; sk->sk_rx_dst_ifindex = skb->skb_iif;
sk->sk_rx_dst_cookie = rt6_get_cookie(rt); sk->sk_rx_dst_cookie = rt6_get_cookie(dst_rt6_info(dst));
} }
} }

View File

@ -910,11 +910,8 @@ start_lookup:
static void udp6_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst) static void udp6_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst)
{ {
if (udp_sk_rx_dst_set(sk, dst)) { if (udp_sk_rx_dst_set(sk, dst))
const struct rt6_info *rt = (const struct rt6_info *)dst; sk->sk_rx_dst_cookie = rt6_get_cookie(dst_rt6_info(dst));
sk->sk_rx_dst_cookie = rt6_get_cookie(rt);
}
} }
/* wrapper for udp_queue_rcv_skb tacking care of csum conversion and /* wrapper for udp_queue_rcv_skb tacking care of csum conversion and
@ -1585,7 +1582,7 @@ back_from_confirm:
skb = ip6_make_skb(sk, getfrag, msg, ulen, skb = ip6_make_skb(sk, getfrag, msg, ulen,
sizeof(struct udphdr), &ipc6, sizeof(struct udphdr), &ipc6,
(struct rt6_info *)dst, dst_rt6_info(dst),
msg->msg_flags, &cork); msg->msg_flags, &cork);
err = PTR_ERR(skb); err = PTR_ERR(skb);
if (!IS_ERR_OR_NULL(skb)) if (!IS_ERR_OR_NULL(skb))
@ -1612,7 +1609,7 @@ do_append_data:
ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk); ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk);
up->len += ulen; up->len += ulen;
err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr), err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr),
&ipc6, fl6, (struct rt6_info *)dst, &ipc6, fl6, dst_rt6_info(dst),
corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
if (err) if (err)
udp_v6_flush_pending_frames(sk); udp_v6_flush_pending_frames(sk);

View File

@ -70,7 +70,7 @@ static int xfrm6_get_saddr(struct net *net, int oif,
static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
const struct flowi *fl) const struct flowi *fl)
{ {
struct rt6_info *rt = (struct rt6_info *)xdst->route; struct rt6_info *rt = dst_rt6_info(xdst->route);
xdst->u.dst.dev = dev; xdst->u.dst.dev = dev;
netdev_hold(dev, &xdst->u.dst.dev_tracker, GFP_ATOMIC); netdev_hold(dev, &xdst->u.dst.dev_tracker, GFP_ATOMIC);

View File

@ -630,7 +630,7 @@ back_from_confirm:
ulen = len + (skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0); ulen = len + (skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0);
err = ip6_append_data(sk, ip_generic_getfrag, msg, err = ip6_append_data(sk, ip_generic_getfrag, msg,
ulen, transhdrlen, &ipc6, ulen, transhdrlen, &ipc6,
&fl6, (struct rt6_info *)dst, &fl6, dst_rt6_info(dst),
msg->msg_flags); msg->msg_flags);
if (err) if (err)
ip6_flush_pending_frames(sk); ip6_flush_pending_frames(sk);

View File

@ -90,7 +90,7 @@ static int mpls_xmit(struct sk_buff *skb)
ttl = net->mpls.default_ttl; ttl = net->mpls.default_ttl;
else else
ttl = ipv6_hdr(skb)->hop_limit; ttl = ipv6_hdr(skb)->hop_limit;
rt6 = (struct rt6_info *)dst; rt6 = dst_rt6_info(dst);
} else { } else {
goto drop; goto drop;
} }

View File

@ -180,7 +180,7 @@ static inline bool crosses_local_route_boundary(int skb_af, struct sk_buff *skb,
(!skb->dev || skb->dev->flags & IFF_LOOPBACK) && (!skb->dev || skb->dev->flags & IFF_LOOPBACK) &&
(addr_type & IPV6_ADDR_LOOPBACK); (addr_type & IPV6_ADDR_LOOPBACK);
old_rt_is_local = __ip_vs_is_local_route6( old_rt_is_local = __ip_vs_is_local_route6(
(struct rt6_info *)skb_dst(skb)); dst_rt6_info(skb_dst(skb)));
} else } else
#endif #endif
{ {
@ -481,7 +481,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,
if (dest) { if (dest) {
dest_dst = __ip_vs_dst_check(dest); dest_dst = __ip_vs_dst_check(dest);
if (likely(dest_dst)) if (likely(dest_dst))
rt = (struct rt6_info *) dest_dst->dst_cache; rt = dst_rt6_info(dest_dst->dst_cache);
else { else {
u32 cookie; u32 cookie;
@ -501,7 +501,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,
ip_vs_dest_dst_free(dest_dst); ip_vs_dest_dst_free(dest_dst);
goto err_unreach; goto err_unreach;
} }
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
cookie = rt6_get_cookie(rt); cookie = rt6_get_cookie(rt);
__ip_vs_dst_set(dest, dest_dst, &rt->dst, cookie); __ip_vs_dst_set(dest, dest_dst, &rt->dst, cookie);
spin_unlock_bh(&dest->dst_lock); spin_unlock_bh(&dest->dst_lock);
@ -517,7 +517,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,
rt_mode); rt_mode);
if (!dst) if (!dst)
goto err_unreach; goto err_unreach;
rt = (struct rt6_info *) dst; rt = dst_rt6_info(dst);
} }
local = __ip_vs_is_local_route6(rt); local = __ip_vs_is_local_route6(rt);
@ -862,7 +862,7 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
IP_VS_RT_MODE_RDR); IP_VS_RT_MODE_RDR);
if (local < 0) if (local < 0)
goto tx_error; goto tx_error;
rt = (struct rt6_info *) skb_dst(skb); rt = dst_rt6_info(skb_dst(skb));
/* /*
* Avoid duplicate tuple in reply direction for NAT traffic * Avoid duplicate tuple in reply direction for NAT traffic
* to local address when connection is sync-ed * to local address when connection is sync-ed
@ -1288,7 +1288,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
if (local) if (local)
return ip_vs_send_or_cont(NFPROTO_IPV6, skb, cp, 1); return ip_vs_send_or_cont(NFPROTO_IPV6, skb, cp, 1);
rt = (struct rt6_info *) skb_dst(skb); rt = dst_rt6_info(skb_dst(skb));
tdev = rt->dst.dev; tdev = rt->dst.dev;
/* /*
@ -1590,7 +1590,7 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
&cp->daddr.in6, NULL, ipvsh, 0, rt_mode); &cp->daddr.in6, NULL, ipvsh, 0, rt_mode);
if (local < 0) if (local < 0)
goto tx_error; goto tx_error;
rt = (struct rt6_info *) skb_dst(skb); rt = dst_rt6_info(skb_dst(skb));
/* /*
* Avoid duplicate tuple in reply direction for NAT traffic * Avoid duplicate tuple in reply direction for NAT traffic
* to local address when connection is sync-ed * to local address when connection is sync-ed

View File

@ -77,12 +77,8 @@ EXPORT_SYMBOL_GPL(flow_offload_alloc);
static u32 flow_offload_dst_cookie(struct flow_offload_tuple *flow_tuple) static u32 flow_offload_dst_cookie(struct flow_offload_tuple *flow_tuple)
{ {
const struct rt6_info *rt; if (flow_tuple->l3proto == NFPROTO_IPV6)
return rt6_get_cookie(dst_rt6_info(flow_tuple->dst_cache));
if (flow_tuple->l3proto == NFPROTO_IPV6) {
rt = (const struct rt6_info *)flow_tuple->dst_cache;
return rt6_get_cookie(rt);
}
return 0; return 0;
} }

View File

@ -729,7 +729,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
return NF_ACCEPT; return NF_ACCEPT;
if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) { if (unlikely(tuplehash->tuple.xmit_type == FLOW_OFFLOAD_XMIT_XFRM)) {
rt = (struct rt6_info *)tuplehash->tuple.dst_cache; rt = dst_rt6_info(tuplehash->tuple.dst_cache);
memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
IP6CB(skb)->iif = skb->dev->ifindex; IP6CB(skb)->iif = skb->dev->ifindex;
IP6CB(skb)->flags = IP6SKB_FORWARDED; IP6CB(skb)->flags = IP6SKB_FORWARDED;
@ -741,7 +741,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
switch (tuplehash->tuple.xmit_type) { switch (tuplehash->tuple.xmit_type) {
case FLOW_OFFLOAD_XMIT_NEIGH: case FLOW_OFFLOAD_XMIT_NEIGH:
rt = (struct rt6_info *)tuplehash->tuple.dst_cache; rt = dst_rt6_info(tuplehash->tuple.dst_cache);
outdev = rt->dst.dev; outdev = rt->dst.dev;
skb->dev = outdev; skb->dev = outdev;
nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6); nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6);

View File

@ -80,7 +80,7 @@ void nft_rt_get_eval(const struct nft_expr *expr,
if (nft_pf(pkt) != NFPROTO_IPV6) if (nft_pf(pkt) != NFPROTO_IPV6)
goto err; goto err;
memcpy(dest, rt6_nexthop((struct rt6_info *)dst, memcpy(dest, rt6_nexthop(dst_rt6_info(dst),
&ipv6_hdr(skb)->daddr), &ipv6_hdr(skb)->daddr),
sizeof(struct in6_addr)); sizeof(struct in6_addr));
break; break;

View File

@ -415,7 +415,7 @@ out:
if (!IS_ERR_OR_NULL(dst)) { if (!IS_ERR_OR_NULL(dst)) {
struct rt6_info *rt; struct rt6_info *rt;
rt = (struct rt6_info *)dst; rt = dst_rt6_info(dst);
t->dst_cookie = rt6_get_cookie(rt); t->dst_cookie = rt6_get_cookie(rt);
pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n", pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n",
&rt->rt6i_dst.addr, rt->rt6i_dst.plen, &rt->rt6i_dst.addr, rt->rt6i_dst.plen,

View File

@ -2598,8 +2598,7 @@ static void xfrm_init_path(struct xfrm_dst *path, struct dst_entry *dst,
int nfheader_len) int nfheader_len)
{ {
if (dst->ops->family == AF_INET6) { if (dst->ops->family == AF_INET6) {
struct rt6_info *rt = (struct rt6_info *)dst; path->path_cookie = rt6_get_cookie(dst_rt6_info(dst));
path->path_cookie = rt6_get_cookie(rt);
path->u.rt6.rt6i_nfheader_len = nfheader_len; path->u.rt6.rt6i_nfheader_len = nfheader_len;
} }
} }