diff options
Diffstat (limited to 'include/net/ip6_fib.h')
| -rw-r--r-- | include/net/ip6_fib.h | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index b26bb810198..0ae759a6c76 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -123,6 +123,54 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)  	return ((struct rt6_info *)dst)->rt6i_idev;  } +static inline void rt6_clean_expires(struct rt6_info *rt) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = NULL; +} + +static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) +		dst_release(rt->dst.from); + +	rt->rt6i_flags |= RTF_EXPIRES; +	rt->dst.expires = expires; +} + +static inline void rt6_update_expires(struct rt6_info *rt, int timeout) +{ +	if (!(rt->rt6i_flags & RTF_EXPIRES)) { +		if (rt->dst.from) +			dst_release(rt->dst.from); +		/* dst_set_expires relies on expires == 0  +		 * if it has not been set previously. +		 */ +		rt->dst.expires = 0; +	} + +	dst_set_expires(&rt->dst, timeout); +	rt->rt6i_flags |= RTF_EXPIRES; +} + +static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) +{ +	struct dst_entry *new = (struct dst_entry *) from; + +	if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) { +		if (new == rt->dst.from) +			return; +		dst_release(rt->dst.from); +	} + +	rt->rt6i_flags &= ~RTF_EXPIRES; +	rt->dst.from = new; +	dst_hold(new); +} +  struct fib6_walker_t {  	struct list_head lh;  	struct fib6_node *root, *node;  |