diff options
Diffstat (limited to 'net/ipv4/xfrm4_policy.c')
| -rw-r--r-- | net/ipv4/xfrm4_policy.c | 33 | 
1 files changed, 15 insertions, 18 deletions
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 0d3426cb5c4..c6281847f16 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c @@ -79,30 +79,19 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,  	struct rtable *rt = (struct rtable *)xdst->route;  	const struct flowi4 *fl4 = &fl->u.ip4; -	xdst->u.rt.rt_key_dst = fl4->daddr; -	xdst->u.rt.rt_key_src = fl4->saddr; -	xdst->u.rt.rt_key_tos = fl4->flowi4_tos; -	xdst->u.rt.rt_route_iif = fl4->flowi4_iif;  	xdst->u.rt.rt_iif = fl4->flowi4_iif; -	xdst->u.rt.rt_oif = fl4->flowi4_oif; -	xdst->u.rt.rt_mark = fl4->flowi4_mark;  	xdst->u.dst.dev = dev;  	dev_hold(dev); -	xdst->u.rt.peer = rt->peer; -	if (rt->peer) -		atomic_inc(&rt->peer->refcnt); -  	/* Sheit... I remember I did this right. Apparently,  	 * it was magically lost, so this code needs audit */ +	xdst->u.rt.rt_is_input = rt->rt_is_input;  	xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST |  					      RTCF_LOCAL);  	xdst->u.rt.rt_type = rt->rt_type; -	xdst->u.rt.rt_src = rt->rt_src; -	xdst->u.rt.rt_dst = rt->rt_dst;  	xdst->u.rt.rt_gateway = rt->rt_gateway; -	xdst->u.rt.rt_spec_dst = rt->rt_spec_dst; +	xdst->u.rt.rt_pmtu = rt->rt_pmtu;  	return 0;  } @@ -198,12 +187,22 @@ static inline int xfrm4_garbage_collect(struct dst_ops *ops)  	return (dst_entries_get_slow(ops) > ops->gc_thresh * 2);  } -static void xfrm4_update_pmtu(struct dst_entry *dst, u32 mtu) +static void xfrm4_update_pmtu(struct dst_entry *dst, struct sock *sk, +			      struct sk_buff *skb, u32 mtu) +{ +	struct xfrm_dst *xdst = (struct xfrm_dst *)dst; +	struct dst_entry *path = xdst->route; + +	path->ops->update_pmtu(path, sk, skb, mtu); +} + +static void xfrm4_redirect(struct dst_entry *dst, struct sock *sk, +			   struct sk_buff *skb)  {  	struct xfrm_dst *xdst = (struct xfrm_dst *)dst;  	struct dst_entry *path = xdst->route; -	path->ops->update_pmtu(path, mtu); +	path->ops->redirect(path, sk, skb);  }  static void xfrm4_dst_destroy(struct dst_entry *dst) @@ -212,9 +211,6 @@ static void xfrm4_dst_destroy(struct dst_entry *dst)  	dst_destroy_metrics_generic(dst); -	if (likely(xdst->u.rt.peer)) -		inet_putpeer(xdst->u.rt.peer); -  	xfrm_dst_destroy(xdst);  } @@ -232,6 +228,7 @@ static struct dst_ops xfrm4_dst_ops = {  	.protocol =		cpu_to_be16(ETH_P_IP),  	.gc =			xfrm4_garbage_collect,  	.update_pmtu =		xfrm4_update_pmtu, +	.redirect =		xfrm4_redirect,  	.cow_metrics =		dst_cow_metrics_generic,  	.destroy =		xfrm4_dst_destroy,  	.ifdown =		xfrm4_dst_ifdown,  |