Lines Matching defs:dst
54 #include <net/dst.h>
86 struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie);
87 static unsigned int ip6_default_advmss(const struct dst_entry *dst);
89 unsigned int ip6_mtu(const struct dst_entry *dst);
101 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
104 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
110 struct fib6_info *rt, struct dst_entry *dst,
142 rt->dst.rt_uncached_list = ul;
145 list_add_tail(&rt->dst.rt_uncached, &ul->head);
151 if (!list_empty(&rt->dst.rt_uncached)) {
152 struct uncached_list *ul = rt->dst.rt_uncached_list;
155 list_del_init(&rt->dst.rt_uncached);
172 list_for_each_entry_safe(rt, safe, &ul->head, dst.rt_uncached) {
174 struct net_device *rt_dev = rt->dst.dev;
184 rt->dst.dev = blackhole_netdev;
186 &rt->dst.dev_tracker,
191 list_move(&rt->dst.rt_uncached,
225 static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
229 const struct rt6_info *rt = container_of(dst, struct rt6_info, dst);
232 dst->dev, skb, daddr);
235 static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
237 struct net_device *dev = dst->dev;
238 struct rt6_info *rt = (struct rt6_info *)dst;
295 .dst = {
309 .dst = {
321 .dst = {
336 memset_after(rt, 0, dst);
339 /* allocate dst with ip6_dst_ops */
355 static void ip6_dst_destroy(struct dst_entry *dst)
357 struct rt6_info *rt = (struct rt6_info *)dst;
361 ip_dst_metrics_put(dst);
374 static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
376 struct rt6_info *rt = (struct rt6_info *)dst;
392 return time_after(jiffies, rt->dst.expires);
404 if (time_after(jiffies, rt->dst.expires))
407 return rt->dst.obsolete != DST_OBSOLETE_FORCE_CHK ||
1013 /* for copies of local routes, dst->dev needs to be the
1064 rt->dst.error = ip6_rt_type_to_error(fib6_type);
1068 rt->dst.output = dst_discard_out;
1069 rt->dst.input = dst_discard;
1072 rt->dst.output = ip6_pkt_prohibit_out;
1073 rt->dst.input = ip6_pkt_prohibit;
1078 rt->dst.output = ip6_pkt_discard_out;
1079 rt->dst.input = ip6_pkt_discard;
1093 rt->dst.error = 0;
1094 rt->dst.output = ip6_output;
1097 rt->dst.input = ip6_input;
1099 rt->dst.input = ip6_mc_input;
1101 rt->dst.input = ip6_forward;
1105 rt->dst.lwtstate = lwtstate_get(res->nh->fib_nh_lws);
1106 lwtunnel_set_redirect(&rt->dst);
1109 rt->dst.lastuse = jiffies;
1117 ip_dst_init_metrics(&rt->dst, from->fib6_metrics);
1164 if (dst_hold_safe(&rt->dst))
1168 dst_hold(&rt->dst);
1199 dst_hold(&nrt->dst);
1229 dst_hold(&rt->dst);
1242 dst_use_noref(&rt->dst, jiffies);
1271 struct dst_entry *dst;
1279 dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
1280 if (dst->error == 0)
1281 return (struct rt6_info *) dst;
1283 dst_release(dst);
1292 * Caller must hold dst before calling it.
1387 return rt6->sernum == rt_genid_ipv6(dev_net(rt6->dst.dev));
1403 dst_dev_put(&prev->dst);
1404 dst_release(&prev->dst);
1452 net = dev_net(rt6_ex->rt6i->dst.dev);
1456 * some [sk] cache may keep the dst around for unlimited time
1460 dst_dev_put(&rt6_ex->rt6i->dst);
1463 dst_release(&rt6_ex->rt6i->dst);
1486 static u32 rt6_exception_hash(const struct in6_addr *dst,
1491 struct in6_addr dst;
1494 .dst = *dst,
1655 struct net *net = dev_net(nrt->dst.dev);
1695 if (dst_metric_raw(&nrt->dst, RTAX_MTU) >= fib6_mtu(res)) {
1724 /* Update fn->fn_sernum to invalidate all cached dst */
1972 .dev = rt->dst.dev,
2002 if (dst_mtu(&rt->dst) >= mtu)
2005 if (dst_mtu(&rt->dst) == idev->cnf.mtu6)
2030 if (dst_metric_raw(&entry->dst, RTAX_MTU) &&
2032 dst_metric_set(&entry->dst, RTAX_MTU, mtu);
2087 if (time_after_eq(now, rt->dst.lastuse + gc_args->timeout)) {
2092 } else if (time_after(jiffies, rt->dst.expires)) {
2101 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
2326 keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
2331 keys->addrs.v6addrs.dst = key_iph->daddr;
2354 hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2362 hash_keys.ports.dst = keys.ports.dst;
2396 hash_keys.addrs.v4addrs.dst = keys.addrs.v4addrs.dst;
2402 hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2412 hash_keys.ports.dst = keys.ports.dst;
2443 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2451 hash_keys.ports.dst = fl6->fl6_dport;
2471 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2494 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2496 hash_keys.ports.dst = flkeys->ports.dst;
2502 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2504 hash_keys.ports.dst = fl6->fl6_dport;
2524 hash_keys.addrs.v4addrs.dst = flkeys->addrs.v4addrs.dst;
2528 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2540 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2606 struct dst_entry *dst;
2608 /* This function does not take refcnt on the dst */
2609 dst = l3mdev_link_scope_lookup(net, fl6);
2610 if (dst)
2611 return dst;
2635 struct dst_entry *dst;
2639 dst = ip6_route_output_flags_noref(net, sk, fl6, flags);
2640 rt6 = (struct rt6_info *)dst;
2641 /* For dst cached in uncached_list, refcnt is already taken. */
2642 if (list_empty(&rt6->dst.rt_uncached) && !dst_hold_safe(dst)) {
2643 dst = &net->ipv6.ip6_null_entry->dst;
2644 dst_hold(dst);
2648 return dst;
2664 new = &rt->dst;
2669 dst_copy_metrics(new, &ort->dst);
2715 return &rt->dst;
2723 rt->dst.obsolete == DST_OBSOLETE_FORCE_CHK &&
2725 return &rt->dst;
2730 INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst,
2737 rt = container_of(dst, struct rt6_info, dst);
2740 return rt6_is_valid(rt) ? dst : NULL;
2752 unlikely(!list_empty(&rt->dst.rt_uncached))))
2763 static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
2765 struct rt6_info *rt = (struct rt6_info *) dst;
2772 dst = NULL;
2776 dst_release(dst);
2777 dst = NULL;
2780 return dst;
2817 rt0->dst.expires = from->expires;
2821 dst_set_expires(&rt0->dst, timeout);
2827 struct net *net = dev_net(rt->dst.dev);
2829 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
2840 static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
2845 struct rt6_info *rt6 = (struct rt6_info *)dst;
2847 /* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU)
2864 dst_confirm_neigh(dst, daddr);
2868 if (mtu >= dst_mtu(dst))
2890 .dev = dst->dev,
2898 * using the dst->dev + gw. Should be impossible.
2912 dst_release_immediate(&nrt6->dst);
2919 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
2923 __ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu,
2931 struct dst_entry *dst;
2941 dst = ip6_route_output(net, NULL, &fl6);
2942 if (!dst->error)
2943 __ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu), true);
2944 dst_release(dst);
2951 struct dst_entry *dst;
2959 dst = __sk_dst_get(sk);
2960 if (!dst || !dst->obsolete ||
2961 dst->ops->check(dst, inet6_sk(sk)->dst_cookie))
2971 void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,
2978 ip6_dst_store(sk, dst,
3141 struct dst_entry *dst;
3152 dst = ip6_route_redirect(net, &fl6, skb, &ipv6_hdr(skb)->saddr);
3153 rt6_do_redirect(dst, NULL, skb);
3154 dst_release(dst);
3162 struct dst_entry *dst;
3171 dst = ip6_route_redirect(net, &fl6, skb, &iph->saddr);
3172 rt6_do_redirect(dst, NULL, skb);
3173 dst_release(dst);
3183 static unsigned int ip6_default_advmss(const struct dst_entry *dst)
3185 struct net_device *dev = dst->dev;
3186 unsigned int mtu = dst_mtu(dst);
3205 INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst)
3207 return ip6_dst_mtu_maybe_forward(dst, false);
3237 mtu = dst_metric_raw(&rt->dst, RTAX_MTU);
3255 struct dst_entry *dst;
3266 dst = ERR_PTR(-ENOMEM);
3270 rt->dst.input = ip6_input;
3271 rt->dst.output = ip6_output;
3276 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
3278 /* Add this dst into uncached_list so that rt6_disable_ip() can
3283 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
3286 return dst;
3672 dst_dev_put(&pcpu_rt->dst);
3673 dst_release(&pcpu_rt->dst);
3967 if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex)
4106 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
4168 rt = (struct rt6_info *) dst;
4178 dst_confirm_neigh(&rt->dst, &ipv6_hdr(skb)->saddr);
4202 .dev = dst->dev,
4210 * using the dst->dev. Should be impossible
4233 dst_release_immediate(&nrt->dst);
4237 netevent.old = &rt->dst;
4238 netevent.new = &nrt->dst;
4483 struct dst_entry *dst = skb_dst(skb);
4484 struct net *net = dev_net(dst->dev);
4490 dst->dev == net->loopback_dev)
4493 idev = ip6_dst_idev(dst);
4511 /* Start over by dropping the dst for l3mdev case */
4543 * Allocate a dst for local (unicast / anycast) address.
4620 /* Remove routers and update dst entries when gateway turn into host. */
5595 struct fib6_info *rt, struct dst_entry *dst,
5600 struct rt6_info *rt6 = (struct rt6_info *)dst;
5686 pmetrics = dst ? dst_metrics_ptr(dst) : rt->fib6_metrics->metrics;
5701 if (dst->dev && nla_put_u32(skb, RTA_OIF, dst->dev->ifindex))
5704 if (dst->lwtstate &&
5705 lwtunnel_fill_encap(skb, dst->lwtstate, RTA_ENCAP, RTA_ENCAP_TYPE) < 0)
5750 expires = dst ? dst->expires : rt->expires;
5754 if (!dst) {
5763 if (rtnl_put_cacheinfo(skb, dst, 0, expires, dst ? dst->error : 0) < 0)
5859 &rt6_ex->rt6i->dst, NULL, NULL, 0,
6016 struct dst_entry *dst;
6093 dst = ip6_route_input_lookup(net, dev, &fl6, NULL, flags);
6099 dst = ip6_route_output(net, NULL, &fl6);
6103 rt = container_of(dst, struct rt6_info, dst);
6104 if (rt->dst.error) {
6105 err = rt->dst.error;
6111 err = rt->dst.error;
6123 skb_dst_set(skb, &rt->dst);
6134 err = rt6_fill_node(net, skb, from, dst, &fl6.daddr,
6275 net->ipv6.ip6_null_entry->dst.dev = dev;
6278 net->ipv6.ip6_prohibit_entry->dst.dev = dev;
6280 net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
6484 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6485 dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
6487 INIT_LIST_HEAD(&net->ipv6.ip6_null_entry->dst.rt_uncached);
6496 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6497 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
6499 INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->dst.rt_uncached);
6506 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6507 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
6509 INIT_LIST_HEAD(&net->ipv6.ip6_blk_hole_entry->dst.rt_uncached);
6627 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
6630 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
6632 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;