diff options
| -rw-r--r-- | include/net/xfrm.h | 2 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_policy.c | 8 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 2 | 
3 files changed, 12 insertions, 0 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 62b619e82a9..976a81abe1a 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -292,6 +292,8 @@ struct xfrm_policy_afinfo {  						  struct flowi *fl,  						  int reverse);  	int			(*get_tos)(const struct flowi *fl); +	void			(*init_dst)(struct net *net, +					    struct xfrm_dst *dst);  	int			(*init_path)(struct xfrm_dst *path,  					     struct dst_entry *dst,  					     int nfheader_len); diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index ef39812107b..f8c4c08ffb6 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c @@ -73,6 +73,13 @@ static int xfrm6_get_tos(const struct flowi *fl)  	return 0;  } +static void xfrm6_init_dst(struct net *net, struct xfrm_dst *xdst) +{ +	struct rt6_info *rt = (struct rt6_info *)xdst; + +	rt6_init_peer(rt, net->ipv6.peers); +} +  static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst,  			   int nfheader_len)  { @@ -286,6 +293,7 @@ static struct xfrm_policy_afinfo xfrm6_policy_afinfo = {  	.get_saddr = 		xfrm6_get_saddr,  	.decode_session =	_decode_session6,  	.get_tos =		xfrm6_get_tos, +	.init_dst =		xfrm6_init_dst,  	.init_path =		xfrm6_init_path,  	.fill_dst =		xfrm6_fill_dst,  	.blackhole_route =	ip6_blackhole_route, diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index c5a5165a592..5a2aa17e4d3 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1357,6 +1357,8 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)  		memset(dst + 1, 0, sizeof(*xdst) - sizeof(*dst));  		xdst->flo.ops = &xfrm_bundle_fc_ops; +		if (afinfo->init_dst) +			afinfo->init_dst(net, xdst);  	} else  		xdst = ERR_PTR(-ENOBUFS);  |