Lines Matching refs:dst

80 static struct dst_entry	*ip6_dst_check(struct dst_entry *dst, u32 cookie);
81 static unsigned int ip6_default_advmss(const struct dst_entry *dst);
82 static unsigned int ip6_mtu(const struct dst_entry *dst);
94 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
96 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
122 rt->dst.flags |= DST_NOCACHE; in rt6_uncached_list_add()
156 struct net_device *rt_dev = rt->dst.dev; in rt6_uncached_list_flush_dev()
164 rt->dst.dev = loopback_dev; in rt6_uncached_list_flush_dev()
165 dev_hold(rt->dst.dev); in rt6_uncached_list_flush_dev()
175 return dst_metrics_write_ptr(rt->dst.from); in rt6_pcpu_cow_metrics()
178 static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old) in ipv6_cow_metrics() argument
180 struct rt6_info *rt = (struct rt6_info *)dst; in ipv6_cow_metrics()
187 return dst_cow_metrics_generic(dst, old); in ipv6_cow_metrics()
203 static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, in ip6_neigh_lookup() argument
207 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_neigh_lookup()
211 n = __ipv6_neigh_lookup(dst->dev, daddr); in ip6_neigh_lookup()
214 return neigh_create(&nd_tbl, daddr, dst->dev); in ip6_neigh_lookup()
235 static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst) in ip6_blackhole_mtu() argument
237 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU); in ip6_blackhole_mtu()
239 return mtu ? : dst->dev->mtu; in ip6_blackhole_mtu()
242 static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk, in ip6_rt_blackhole_update_pmtu() argument
247 static void ip6_rt_blackhole_redirect(struct dst_entry *dst, struct sock *sk, in ip6_rt_blackhole_redirect() argument
269 .dst = {
286 .dst = {
301 .dst = {
319 struct dst_entry *dst = &rt->dst; in rt6_info_init() local
321 memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst)); in rt6_info_init()
367 static void ip6_dst_destroy(struct dst_entry *dst) in ip6_dst_destroy() argument
369 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_destroy()
370 struct dst_entry *from = dst->from; in ip6_dst_destroy()
373 dst_destroy_metrics_generic(dst); in ip6_dst_destroy()
383 dst->from = NULL; in ip6_dst_destroy()
387 static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, in ip6_dst_ifdown() argument
390 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_ifdown()
410 return time_after(jiffies, rt->dst.expires); in __rt6_check_expired()
418 if (time_after(jiffies, rt->dst.expires)) in rt6_check_expired()
420 } else if (rt->dst.from) { in rt6_check_expired()
421 return rt6_check_expired((struct rt6_info *) rt->dst.from); in rt6_check_expired()
477 for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) { in rt6_device_match()
478 struct net_device *dev = sprt->dst.dev; in rt6_device_match()
546 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_probe()
569 dev_hold(rt->dst.dev); in rt6_probe()
570 work->dev = rt->dst.dev; in rt6_probe()
588 struct net_device *dev = rt->dst.dev; in rt6_check_dev()
607 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_check_neigh()
654 struct net_device *dev = rt->dst.dev; in find_match()
694 for (rt = rr_head; rt; rt = rt->dst.rt6_next) { in find_rr_leaf()
703 for (rt = fn->leaf; rt && rt != rr_head; rt = rt->dst.rt6_next) { in find_rr_leaf()
715 for (rt = cont; rt; rt = rt->dst.rt6_next) in find_rr_leaf()
735 struct rt6_info *next = rt0->dst.rt6_next; in rt6_select()
745 net = dev_net(rt0->dst.dev); in rt6_select()
866 dst_use(&rt->dst, jiffies); in ip6_pol_route_lookup()
886 struct dst_entry *dst; in rt6_lookup() local
894 dst = fib6_rule_lookup(net, &fl6, flags, ip6_pol_route_lookup); in rt6_lookup()
895 if (dst->error == 0) in rt6_lookup()
896 return (struct rt6_info *) dst; in rt6_lookup()
898 dst_release(dst); in rt6_lookup()
926 struct nl_info info = { .nl_net = dev_net(rt->dst.dev), }; in ip6_ins_rt()
943 ort = (struct rt6_info *)ort->dst.from; in ip6_rt_cache_alloc()
945 rt = __ip6_dst_alloc(dev_net(ort->dst.dev), ort->dst.dev, 0); in ip6_rt_cache_alloc()
953 rt->dst.flags |= DST_HOST; in ip6_rt_cache_alloc()
976 pcpu_rt = __ip6_dst_alloc(dev_net(rt->dst.dev), in ip6_rt_pcpu_alloc()
977 rt->dst.dev, rt->dst.flags); in ip6_rt_pcpu_alloc()
996 dst_hold(&pcpu_rt->dst); in rt6_get_pcpu_route()
1009 struct net *net = dev_net(rt->dst.dev); in rt6_make_pcpu_route()
1011 dst_hold(&net->ipv6.ip6_null_entry->dst); in rt6_make_pcpu_route()
1021 dst_destroy(&pcpu_rt->dst); in rt6_make_pcpu_route()
1031 dst_destroy(&pcpu_rt->dst); in rt6_make_pcpu_route()
1034 dst_hold(&pcpu_rt->dst); in rt6_make_pcpu_route()
1077 dst_use(&rt->dst, jiffies); in ip6_pol_route()
1092 dst_use(&rt->dst, jiffies); in ip6_pol_route()
1096 dst_release(&rt->dst); in ip6_pol_route()
1103 dst_hold(&uncached_rt->dst); in ip6_pol_route()
1111 rt->dst.lastuse = jiffies; in ip6_pol_route()
1112 rt->dst.__use++; in ip6_pol_route()
1122 dst_hold(&rt->dst); in ip6_pol_route()
1125 dst_release(&rt->dst); in ip6_pol_route()
1180 struct dst_entry *dst; in ip6_route_output_flags() local
1183 dst = l3mdev_rt6_dst_by_oif(net, fl6); in ip6_route_output_flags()
1184 if (dst) in ip6_route_output_flags()
1185 return dst; in ip6_route_output_flags()
1208 rt = dst_alloc(&ip6_dst_blackhole_ops, ort->dst.dev, 1, DST_OBSOLETE_NONE, 0); in ip6_blackhole_route()
1212 new = &rt->dst; in ip6_blackhole_route()
1217 dst_copy_metrics(new, &ort->dst); in ip6_blackhole_route()
1244 if (rt->dst.from && in rt6_dst_from_metrics_check()
1245 dst_metrics_ptr(&rt->dst) != dst_metrics_ptr(rt->dst.from)) in rt6_dst_from_metrics_check()
1246 dst_init_metrics(&rt->dst, dst_metrics_ptr(rt->dst.from), true); in rt6_dst_from_metrics_check()
1257 return &rt->dst; in rt6_check()
1263 rt->dst.obsolete == DST_OBSOLETE_FORCE_CHK && in rt6_dst_from_check()
1264 rt6_check((struct rt6_info *)(rt->dst.from), cookie)) in rt6_dst_from_check()
1265 return &rt->dst; in rt6_dst_from_check()
1270 static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie) in ip6_dst_check() argument
1274 rt = (struct rt6_info *) dst; in ip6_dst_check()
1284 (unlikely(dst->flags & DST_NOCACHE) && rt->dst.from)) in ip6_dst_check()
1290 static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) in ip6_negative_advice() argument
1292 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_negative_advice()
1298 dst = NULL; in ip6_negative_advice()
1301 dst_release(dst); in ip6_negative_advice()
1302 dst = NULL; in ip6_negative_advice()
1305 return dst; in ip6_negative_advice()
1317 dst_hold(&rt->dst); in ip6_link_failure()
1327 struct net *net = dev_net(rt->dst.dev); in rt6_do_update_pmtu()
1340 static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk, in __ip6_rt_update_pmtu() argument
1343 struct rt6_info *rt6 = (struct rt6_info *)dst; in __ip6_rt_update_pmtu()
1348 dst_confirm(dst); in __ip6_rt_update_pmtu()
1350 if (mtu >= dst_mtu(dst)) in __ip6_rt_update_pmtu()
1382 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, in ip6_rt_update_pmtu() argument
1385 __ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu); in ip6_rt_update_pmtu()
1392 struct dst_entry *dst; in ip6_update_pmtu() local
1402 dst = ip6_route_output(net, NULL, &fl6); in ip6_update_pmtu()
1403 if (!dst->error) in ip6_update_pmtu()
1404 __ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu)); in ip6_update_pmtu()
1405 dst_release(dst); in ip6_update_pmtu()
1444 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in __ip6_route_redirect()
1447 if (rt->dst.error) in __ip6_route_redirect()
1451 if (fl6->flowi6_oif != rt->dst.dev->ifindex) in __ip6_route_redirect()
1460 else if (rt->dst.error) { in __ip6_route_redirect()
1472 dst_hold(&rt->dst); in __ip6_route_redirect()
1496 struct dst_entry *dst; in ip6_redirect() local
1507 dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr); in ip6_redirect()
1508 rt6_do_redirect(dst, NULL, skb); in ip6_redirect()
1509 dst_release(dst); in ip6_redirect()
1518 struct dst_entry *dst; in ip6_redirect_no_header() local
1528 dst = ip6_route_redirect(net, &fl6, &iph->saddr); in ip6_redirect_no_header()
1529 rt6_do_redirect(dst, NULL, skb); in ip6_redirect_no_header()
1530 dst_release(dst); in ip6_redirect_no_header()
1539 static unsigned int ip6_default_advmss(const struct dst_entry *dst) in ip6_default_advmss() argument
1541 struct net_device *dev = dst->dev; in ip6_default_advmss()
1542 unsigned int mtu = dst_mtu(dst); in ip6_default_advmss()
1561 static unsigned int ip6_mtu(const struct dst_entry *dst) in ip6_mtu() argument
1563 const struct rt6_info *rt = (const struct rt6_info *)dst; in ip6_mtu()
1570 mtu = dst_metric_raw(dst, RTAX_MTU); in ip6_mtu()
1577 idev = __in6_dev_get(dst->dev); in ip6_mtu()
1592 struct dst_entry *dst; in icmp6_dst_alloc() local
1603 dst = ERR_PTR(-ENOMEM); in icmp6_dst_alloc()
1607 rt->dst.flags |= DST_HOST; in icmp6_dst_alloc()
1608 rt->dst.output = ip6_output; in icmp6_dst_alloc()
1609 atomic_set(&rt->dst.__refcnt, 1); in icmp6_dst_alloc()
1614 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0); in icmp6_dst_alloc()
1617 rt->dst.next = icmp6_dst_gc_list; in icmp6_dst_alloc()
1618 icmp6_dst_gc_list = &rt->dst; in icmp6_dst_alloc()
1623 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0); in icmp6_dst_alloc()
1626 return dst; in icmp6_dst_alloc()
1631 struct dst_entry *dst, **pprev; in icmp6_dst_gc() local
1637 while ((dst = *pprev) != NULL) { in icmp6_dst_gc()
1638 if (!atomic_read(&dst->__refcnt)) { in icmp6_dst_gc()
1639 *pprev = dst->next; in icmp6_dst_gc()
1640 dst_free(dst); in icmp6_dst_gc()
1642 pprev = &dst->next; in icmp6_dst_gc()
1655 struct dst_entry *dst, **pprev; in icmp6_clean_all() local
1659 while ((dst = *pprev) != NULL) { in icmp6_clean_all()
1660 struct rt6_info *rt = (struct rt6_info *) dst; in icmp6_clean_all()
1662 *pprev = dst->next; in icmp6_clean_all()
1663 dst_free(dst); in icmp6_clean_all()
1665 pprev = &dst->next; in icmp6_clean_all()
1816 rt->dst.input = ip6_mc_input; in ip6_route_info_create()
1818 rt->dst.input = ip6_input; in ip6_route_info_create()
1820 rt->dst.input = ip6_forward; in ip6_route_info_create()
1822 rt->dst.output = ip6_output; in ip6_route_info_create()
1832 rt->dst.lwtstate = lwtstate_get(lwtstate); in ip6_route_info_create()
1833 if (lwtunnel_output_redirect(rt->dst.lwtstate)) { in ip6_route_info_create()
1834 rt->dst.lwtstate->orig_output = rt->dst.output; in ip6_route_info_create()
1835 rt->dst.output = lwtunnel_output; in ip6_route_info_create()
1837 if (lwtunnel_input_redirect(rt->dst.lwtstate)) { in ip6_route_info_create()
1838 rt->dst.lwtstate->orig_input = rt->dst.input; in ip6_route_info_create()
1839 rt->dst.input = lwtunnel_input; in ip6_route_info_create()
1846 rt->dst.flags |= DST_HOST; in ip6_route_info_create()
1879 rt->dst.error = -EINVAL; in ip6_route_info_create()
1880 rt->dst.output = dst_discard_out; in ip6_route_info_create()
1881 rt->dst.input = dst_discard; in ip6_route_info_create()
1884 rt->dst.error = -EACCES; in ip6_route_info_create()
1885 rt->dst.output = ip6_pkt_prohibit_out; in ip6_route_info_create()
1886 rt->dst.input = ip6_pkt_prohibit; in ip6_route_info_create()
1891 rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN in ip6_route_info_create()
1894 rt->dst.output = ip6_pkt_discard_out; in ip6_route_info_create()
1895 rt->dst.input = ip6_pkt_discard; in ip6_route_info_create()
1940 if (dev != grt->dst.dev) { in ip6_route_info_create()
1945 dev = grt->dst.dev; in ip6_route_info_create()
1979 rt->dst.dev = dev; in ip6_route_info_create()
1992 dst_free(&rt->dst); in ip6_route_info_create()
2021 dst_free(&rt->dst); in ip6_route_add()
2030 struct net *net = dev_net(rt->dst.dev); in __ip6_del_rt()
2033 rt->dst.flags & DST_NOCACHE) { in __ip6_del_rt()
2051 .nl_net = dev_net(rt->dst.dev), in ip6_del_rt()
2074 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in ip6_route_del()
2079 (!rt->dst.dev || in ip6_route_del()
2080 rt->dst.dev->ifindex != cfg->fc_ifindex)) in ip6_route_del()
2087 dst_hold(&rt->dst); in ip6_route_del()
2098 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb) in rt6_do_redirect() argument
2159 rt = (struct rt6_info *) dst; in rt6_do_redirect()
2169 dst_confirm(&rt->dst); in rt6_do_redirect()
2199 netevent.old = &rt->dst; in rt6_do_redirect()
2200 netevent.new = &nrt->dst; in rt6_do_redirect()
2206 rt = (struct rt6_info *) dst_clone(&rt->dst); in rt6_do_redirect()
2220 BUG_ON(from->dst.from); in rt6_set_from()
2223 dst_hold(&from->dst); in rt6_set_from()
2224 rt->dst.from = &from->dst; in rt6_set_from()
2225 dst_init_metrics(&rt->dst, dst_metrics_ptr(&from->dst), true); in rt6_set_from()
2230 rt->dst.input = ort->dst.input; in ip6_rt_copy_init()
2231 rt->dst.output = ort->dst.output; in ip6_rt_copy_init()
2233 rt->dst.error = ort->dst.error; in ip6_rt_copy_init()
2237 rt->dst.lastuse = jiffies; in ip6_rt_copy_init()
2247 rt->dst.lwtstate = lwtstate_get(ort->dst.lwtstate); in ip6_rt_copy_init()
2268 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in rt6_get_route_info()
2269 if (rt->dst.dev->ifindex != ifindex) in rt6_get_route_info()
2275 dst_hold(&rt->dst); in rt6_get_route_info()
2323 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { in rt6_get_dflt_router()
2324 if (dev == rt->dst.dev && in rt6_get_dflt_router()
2330 dst_hold(&rt->dst); in rt6_get_dflt_router()
2369 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { in rt6_purge_dflt_routers()
2372 dst_hold(&rt->dst); in rt6_purge_dflt_routers()
2447 struct dst_entry *dst = skb_dst(skb); in ip6_pkt_drop() local
2452 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), in ip6_pkt_drop()
2458 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), in ip6_pkt_drop()
2506 rt->dst.flags |= DST_HOST; in addrconf_dst_alloc()
2507 rt->dst.input = ip6_input; in addrconf_dst_alloc()
2508 rt->dst.output = ip6_output; in addrconf_dst_alloc()
2522 rt->dst.flags |= DST_NOCACHE; in addrconf_dst_alloc()
2524 atomic_set(&rt->dst.__refcnt, 1); in addrconf_dst_alloc()
2559 if (((void *)rt->dst.dev == dev || !dev) && in fib6_remove_prefsrc()
2610 if ((rt->dst.dev == dev || !dev) && in fib6_ifdown()
2664 if (rt->dst.dev == arg->dev && in rt6_mtu_change_route()
2665 !dst_metric_locked(&rt->dst, RTAX_MTU)) { in rt6_mtu_change_route()
2674 } else if (dst_mtu(&rt->dst) >= arg->mtu || in rt6_mtu_change_route()
2675 (dst_mtu(&rt->dst) < arg->mtu && in rt6_mtu_change_route()
2676 dst_mtu(&rt->dst) == idev->cnf.mtu6)) { in rt6_mtu_change_route()
2677 dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu); in rt6_mtu_change_route()
2837 if (rtnh->dst.dev == rt->dst.dev && in ip6_route_info_append()
2909 dst_free(&rt->dst); in ip6_route_multipath_add()
2953 dst_free(&nh->rt6_info->dst); in ip6_route_multipath_add()
3044 + lwtunnel_get_encap_size(rt->dst.lwtstate); in rt6_nlmsg_size()
3049 struct in6_addr *dst, struct in6_addr *src, in rt6_fill_node() argument
3083 switch (rt->dst.error) { in rt6_fill_node()
3100 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK)) in rt6_fill_node()
3105 if (!netif_carrier_ok(rt->dst.dev)) { in rt6_fill_node()
3124 if (dst) { in rt6_fill_node()
3125 if (nla_put_in6_addr(skb, RTA_DST, dst)) in rt6_fill_node()
3158 } else if (dst) { in rt6_fill_node()
3160 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 && in rt6_fill_node()
3172 memcpy(metrics, dst_metrics_ptr(&rt->dst), sizeof(metrics)); in rt6_fill_node()
3183 if (rt->dst.dev && in rt6_fill_node()
3184 nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex)) in rt6_fill_node()
3189 expires = (rt->rt6i_flags & RTF_EXPIRES) ? rt->dst.expires - jiffies : 0; in rt6_fill_node()
3191 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0) in rt6_fill_node()
3197 lwtunnel_fill_encap(skb, rt->dst.lwtstate); in rt6_fill_node()
3305 skb_dst_set(skb, &rt->dst); in inet6_rtm_getroute()
3358 net->ipv6.ip6_null_entry->dst.dev = dev; in ip6_route_dev_notify()
3361 net->ipv6.ip6_prohibit_entry->dst.dev = dev; in ip6_route_dev_notify()
3363 net->ipv6.ip6_blk_hole_entry->dst.dev = dev; in ip6_route_dev_notify()
3551 net->ipv6.ip6_null_entry->dst.path = in ip6_route_net_init()
3553 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3554 dst_init_metrics(&net->ipv6.ip6_null_entry->dst, in ip6_route_net_init()
3563 net->ipv6.ip6_prohibit_entry->dst.path = in ip6_route_net_init()
3565 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3566 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst, in ip6_route_net_init()
3574 net->ipv6.ip6_blk_hole_entry->dst.path = in ip6_route_net_init()
3576 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3577 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst, in ip6_route_net_init()
3704 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()
3707 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()
3709 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()