Lines Matching refs:dst

3  * net/core/dst.c	Protocol independent destination cache.
27 #include <net/dst.h>
47 void dst_init(struct dst_entry *dst, struct dst_ops *ops,
51 dst->dev = dev;
52 netdev_hold(dev, &dst->dev_tracker, GFP_ATOMIC);
53 dst->ops = ops;
54 dst_init_metrics(dst, dst_default_metrics.metrics, true);
55 dst->expires = 0UL;
57 dst->xfrm = NULL;
59 dst->input = dst_discard;
60 dst->output = dst_discard_out;
61 dst->error = 0;
62 dst->obsolete = initial_obsolete;
63 dst->header_len = 0;
64 dst->trailer_len = 0;
66 dst->tclassid = 0;
68 dst->lwtstate = NULL;
69 rcuref_init(&dst->__rcuref, initial_ref);
70 INIT_LIST_HEAD(&dst->rt_uncached);
71 dst->__use = 0;
72 dst->lastuse = jiffies;
73 dst->flags = flags;
82 struct dst_entry *dst;
89 dst = kmem_cache_alloc(ops->kmem_cachep, GFP_ATOMIC);
90 if (!dst)
93 dst_init(dst, ops, dev, initial_ref, initial_obsolete, flags);
95 return dst;
99 struct dst_entry *dst_destroy(struct dst_entry * dst)
106 if (dst->xfrm) {
107 struct xfrm_dst *xdst = (struct xfrm_dst *) dst;
112 if (!(dst->flags & DST_NOCOUNT))
113 dst_entries_add(dst->ops, -1);
115 if (dst->ops->destroy)
116 dst->ops->destroy(dst);
117 netdev_put(dst->dev, &dst->dev_tracker);
119 lwtstate_put(dst->lwtstate);
121 if (dst->flags & DST_METADATA)
122 metadata_dst_free((struct metadata_dst *)dst);
124 kmem_cache_free(dst->ops->kmem_cachep, dst);
126 dst = child;
127 if (dst)
128 dst_release_immediate(dst);
135 struct dst_entry *dst = container_of(head, struct dst_entry, rcu_head);
137 dst = dst_destroy(dst);
140 /* Operations to mark dst as DEAD and clean up the net device referenced
141 * by dst:
142 * 1. put the dst under blackhole interface and discard all tx/rx packets
149 void dst_dev_put(struct dst_entry *dst)
151 struct net_device *dev = dst->dev;
153 dst->obsolete = DST_OBSOLETE_DEAD;
154 if (dst->ops->ifdown)
155 dst->ops->ifdown(dst, dev);
156 dst->input = dst_discard;
157 dst->output = dst_discard_out;
158 dst->dev = blackhole_netdev;
159 netdev_ref_replace(dev, blackhole_netdev, &dst->dev_tracker,
164 void dst_release(struct dst_entry *dst)
166 if (dst && rcuref_put(&dst->__rcuref))
167 call_rcu_hurry(&dst->rcu_head, dst_destroy_rcu);
171 void dst_release_immediate(struct dst_entry *dst)
173 if (dst && rcuref_put(&dst->__rcuref))
174 dst_destroy(dst);
178 u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old)
190 prev = cmpxchg(&dst->_metrics, old, new);
207 /* Caller asserts that dst_metrics_read_only(dst) is false. */
208 void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old)
213 prev = cmpxchg(&dst->_metrics, old, new);
219 struct dst_entry *dst_blackhole_check(struct dst_entry *dst, u32 cookie)
224 u32 *dst_blackhole_cow_metrics(struct dst_entry *dst, unsigned long old)
229 struct neighbour *dst_blackhole_neigh_lookup(const struct dst_entry *dst,
236 void dst_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk,
243 void dst_blackhole_redirect(struct dst_entry *dst, struct sock *sk,
249 unsigned int dst_blackhole_mtu(const struct dst_entry *dst)
251 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
253 return mtu ? : dst->dev->mtu;
270 struct dst_entry *dst;
272 dst = &md_dst->dst;
273 dst_init(dst, &dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE,
275 memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst));