diff options
Diffstat (limited to 'net/core/dst.c')
| -rw-r--r-- | net/core/dst.c | 59 | 
1 files changed, 42 insertions, 17 deletions
| diff --git a/net/core/dst.c b/net/core/dst.c index 0c01bd8d9d81..fb3bcba87744 100644 --- a/net/core/dst.c +++ b/net/core/dst.c @@ -237,37 +237,62 @@ void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old)  }  EXPORT_SYMBOL(__dst_destroy_metrics_generic); -static struct dst_ops md_dst_ops = { -	.family =		AF_UNSPEC, -}; +struct dst_entry *dst_blackhole_check(struct dst_entry *dst, u32 cookie) +{ +	return NULL; +} -static int dst_md_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb) +u32 *dst_blackhole_cow_metrics(struct dst_entry *dst, unsigned long old)  { -	WARN_ONCE(1, "Attempting to call output on metadata dst\n"); -	kfree_skb(skb); -	return 0; +	return NULL;  } -static int dst_md_discard(struct sk_buff *skb) +struct neighbour *dst_blackhole_neigh_lookup(const struct dst_entry *dst, +					     struct sk_buff *skb, +					     const void *daddr)  { -	WARN_ONCE(1, "Attempting to call input on metadata dst\n"); -	kfree_skb(skb); -	return 0; +	return NULL; +} + +void dst_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk, +			       struct sk_buff *skb, u32 mtu, +			       bool confirm_neigh) +{ +} +EXPORT_SYMBOL_GPL(dst_blackhole_update_pmtu); + +void dst_blackhole_redirect(struct dst_entry *dst, struct sock *sk, +			    struct sk_buff *skb) +{ +} +EXPORT_SYMBOL_GPL(dst_blackhole_redirect); + +unsigned int dst_blackhole_mtu(const struct dst_entry *dst) +{ +	unsigned int mtu = dst_metric_raw(dst, RTAX_MTU); + +	return mtu ? : dst->dev->mtu;  } +EXPORT_SYMBOL_GPL(dst_blackhole_mtu); + +static struct dst_ops dst_blackhole_ops = { +	.family		= AF_UNSPEC, +	.neigh_lookup	= dst_blackhole_neigh_lookup, +	.check		= dst_blackhole_check, +	.cow_metrics	= dst_blackhole_cow_metrics, +	.update_pmtu	= dst_blackhole_update_pmtu, +	.redirect	= dst_blackhole_redirect, +	.mtu		= dst_blackhole_mtu, +};  static void __metadata_dst_init(struct metadata_dst *md_dst,  				enum metadata_type type, u8 optslen) -  {  	struct dst_entry *dst;  	dst = &md_dst->dst; -	dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE, +	dst_init(dst, &dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE,  		 DST_METADATA | DST_NOCOUNT); - -	dst->input = dst_md_discard; -	dst->output = dst_md_discard_out; -  	memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst));  	md_dst->type = type;  } |