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;
54 dst->ops = ops;
55 dst_init_metrics(dst, dst_default_metrics.metrics, true);
56 dst->expires = 0UL;
58 dst->xfrm = NULL;
60 dst->input = dst_discard;
61 dst->output = dst_discard_out;
62 dst->error = 0;
63 dst->obsolete = initial_obsolete;
64 dst->header_len = 0;
65 dst->trailer_len = 0;
67 dst->tclassid = 0;
69 dst->lwtstate = NULL;
70 atomic_set(&dst->__refcnt, initial_ref);
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 if (dst->dev)
118 dev_put(dst->dev);
120 lwtstate_put(dst->lwtstate);
122 if (dst->flags & DST_METADATA)
123 metadata_dst_free((struct metadata_dst *)dst);
125 kmem_cache_free(dst->ops->kmem_cachep, dst);
127 dst = child;
128 if (dst)
129 dst_release_immediate(dst);
136 struct dst_entry *dst = container_of(head, struct dst_entry, rcu_head);
138 dst = dst_destroy(dst);
141 /* Operations to mark dst as DEAD and clean up the net device referenced
142 * by dst:
143 * 1. put the dst under blackhole interface and discard all tx/rx packets
150 void dst_dev_put(struct dst_entry *dst)
152 struct net_device *dev = dst->dev;
154 dst->obsolete = DST_OBSOLETE_DEAD;
155 if (dst->ops->ifdown)
156 dst->ops->ifdown(dst, dev, true);
157 dst->input = dst_discard;
158 dst->output = dst_discard_out;
159 dst->dev = blackhole_netdev;
160 dev_hold(dst->dev);
165 void dst_release(struct dst_entry *dst)
167 if (dst) {
170 newrefcnt = atomic_dec_return(&dst->__refcnt);
172 net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
173 __func__, dst, newrefcnt);
175 call_rcu(&dst->rcu_head, dst_destroy_rcu);
180 void dst_release_immediate(struct dst_entry *dst)
182 if (dst) {
185 newrefcnt = atomic_dec_return(&dst->__refcnt);
187 net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
188 __func__, dst, newrefcnt);
190 dst_destroy(dst);
195 u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old)
207 prev = cmpxchg(&dst->_metrics, old, new);
224 /* Caller asserts that dst_metrics_read_only(dst) is false. */
225 void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old)
230 prev = cmpxchg(&dst->_metrics, old, new);
236 struct dst_entry *dst_blackhole_check(struct dst_entry *dst, u32 cookie)
241 u32 *dst_blackhole_cow_metrics(struct dst_entry *dst, unsigned long old)
246 struct neighbour *dst_blackhole_neigh_lookup(const struct dst_entry *dst,
253 void dst_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk,
260 void dst_blackhole_redirect(struct dst_entry *dst, struct sock *sk,
266 unsigned int dst_blackhole_mtu(const struct dst_entry *dst)
268 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
270 return mtu ? : dst->dev->mtu;
287 struct dst_entry *dst;
289 dst = &md_dst->dst;
290 dst_init(dst, &dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE,
292 memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst));