forked from mirrors/linux
		
	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:
		
							parent
							
								
									fac87d32a0
								
							
						
					
					
						commit
						e8dfd42c17
					
				
					 30 changed files with 77 additions and 86 deletions
				
			
		|  | @ -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; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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 && | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 { | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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 @@ struct sk_buff *__ip6_make_skb(struct sock *sk, | ||||||
| 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); | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 		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) | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -910,11 +910,8 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb, | ||||||
| 
 | 
 | ||||||
| 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 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 
 | 
 | ||||||
| 		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 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 		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); | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -630,7 +630,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | ||||||
| 	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); | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -415,7 +415,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | ||||||
| 	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, | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet