Lines Matching refs:dst

77 static struct dst_entry	*ip6_dst_check(struct dst_entry *dst, u32 cookie);
78 static unsigned int ip6_default_advmss(const struct dst_entry *dst);
79 static unsigned int ip6_mtu(const struct dst_entry *dst);
91 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
93 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
137 static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old) in ipv6_cow_metrics() argument
139 struct rt6_info *rt = (struct rt6_info *) dst; in ipv6_cow_metrics()
143 if (!(rt->dst.flags & DST_HOST)) in ipv6_cow_metrics()
144 return dst_cow_metrics_generic(dst, old); in ipv6_cow_metrics()
157 prev = cmpxchg(&dst->_metrics, old, new); in ipv6_cow_metrics()
181 static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, in ip6_neigh_lookup() argument
185 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_neigh_lookup()
189 n = __ipv6_neigh_lookup(dst->dev, daddr); in ip6_neigh_lookup()
192 return neigh_create(&nd_tbl, daddr, dst->dev); in ip6_neigh_lookup()
213 static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst) in ip6_blackhole_mtu() argument
215 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU); in ip6_blackhole_mtu()
217 return mtu ? : dst->dev->mtu; in ip6_blackhole_mtu()
220 static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk, in ip6_rt_blackhole_update_pmtu() argument
225 static void ip6_rt_blackhole_redirect(struct dst_entry *dst, struct sock *sk, in ip6_rt_blackhole_redirect() argument
230 static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst, in ip6_rt_blackhole_cow_metrics() argument
253 .dst = {
270 .dst = {
285 .dst = {
311 struct dst_entry *dst = &rt->dst; in ip6_dst_alloc() local
313 memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst)); in ip6_dst_alloc()
320 static void ip6_dst_destroy(struct dst_entry *dst) in ip6_dst_destroy() argument
322 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_destroy()
324 struct dst_entry *from = dst->from; in ip6_dst_destroy()
326 if (!(rt->dst.flags & DST_HOST)) in ip6_dst_destroy()
327 dst_destroy_metrics_generic(dst); in ip6_dst_destroy()
334 dst->from = NULL; in ip6_dst_destroy()
343 static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, in ip6_dst_ifdown() argument
346 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_ifdown()
366 if (time_after(jiffies, rt->dst.expires)) in rt6_check_expired()
368 } else if (rt->dst.from) { in rt6_check_expired()
369 return rt6_check_expired((struct rt6_info *) rt->dst.from); in rt6_check_expired()
449 for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) { in rt6_device_match()
450 struct net_device *dev = sprt->dst.dev; in rt6_device_match()
517 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_probe()
539 dev_hold(rt->dst.dev); in rt6_probe()
540 work->dev = rt->dst.dev; in rt6_probe()
560 struct net_device *dev = rt->dst.dev; in rt6_check_dev()
579 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_check_neigh()
660 rt = rt->dst.rt6_next) in find_rr_leaf()
663 rt = rt->dst.rt6_next) in find_rr_leaf()
683 struct rt6_info *next = rt0->dst.rt6_next; in rt6_select()
693 net = dev_net(rt0->dst.dev); in rt6_select()
809 dst_use(&rt->dst, jiffies); in ip6_pol_route_lookup()
829 struct dst_entry *dst; in rt6_lookup() local
837 dst = fib6_rule_lookup(net, &fl6, flags, ip6_pol_route_lookup); in rt6_lookup()
838 if (dst->error == 0) in rt6_lookup()
839 return (struct rt6_info *) dst; in rt6_lookup()
841 dst_release(dst); in rt6_lookup()
869 struct nl_info info = { .nl_net = dev_net(rt->dst.dev), }; in ip6_ins_rt()
948 dst_hold(&rt->dst); in ip6_pol_route()
954 dst_hold(&rt->dst); in ip6_pol_route()
962 else if (!(rt->dst.flags & DST_HOST)) in ip6_pol_route()
970 dst_hold(&rt->dst); in ip6_pol_route()
988 rt->dst.lastuse = jiffies; in ip6_pol_route()
989 rt->dst.__use++; in ip6_pol_route()
1055 rt = dst_alloc(&ip6_dst_blackhole_ops, ort->dst.dev, 1, DST_OBSOLETE_NONE, 0); in ip6_blackhole_route()
1057 new = &rt->dst; in ip6_blackhole_route()
1066 if (dst_metrics_read_only(&ort->dst)) in ip6_blackhole_route()
1067 new->_metrics = ort->dst._metrics; in ip6_blackhole_route()
1069 dst_copy_metrics(new, &ort->dst); in ip6_blackhole_route()
1094 static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie) in ip6_dst_check() argument
1098 rt = (struct rt6_info *) dst; in ip6_dst_check()
1110 return dst; in ip6_dst_check()
1113 static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) in ip6_negative_advice() argument
1115 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_negative_advice()
1121 dst = NULL; in ip6_negative_advice()
1124 dst_release(dst); in ip6_negative_advice()
1125 dst = NULL; in ip6_negative_advice()
1128 return dst; in ip6_negative_advice()
1140 dst_hold(&rt->dst); in ip6_link_failure()
1142 dst_free(&rt->dst); in ip6_link_failure()
1149 static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, in ip6_rt_update_pmtu() argument
1152 struct rt6_info *rt6 = (struct rt6_info *)dst; in ip6_rt_update_pmtu()
1154 dst_confirm(dst); in ip6_rt_update_pmtu()
1155 if (mtu < dst_mtu(dst) && rt6->rt6i_dst.plen == 128) { in ip6_rt_update_pmtu()
1156 struct net *net = dev_net(dst->dev); in ip6_rt_update_pmtu()
1162 dst_metric_set(dst, RTAX_MTU, mtu); in ip6_rt_update_pmtu()
1171 struct dst_entry *dst; in ip6_update_pmtu() local
1181 dst = ip6_route_output(net, NULL, &fl6); in ip6_update_pmtu()
1182 if (!dst->error) in ip6_update_pmtu()
1183 ip6_rt_update_pmtu(dst, NULL, skb, ntohl(mtu)); in ip6_update_pmtu()
1184 dst_release(dst); in ip6_update_pmtu()
1223 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in __ip6_route_redirect()
1226 if (rt->dst.error) in __ip6_route_redirect()
1230 if (fl6->flowi6_oif != rt->dst.dev->ifindex) in __ip6_route_redirect()
1239 else if (rt->dst.error) { in __ip6_route_redirect()
1251 dst_hold(&rt->dst); in __ip6_route_redirect()
1275 struct dst_entry *dst; in ip6_redirect() local
1286 dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr); in ip6_redirect()
1287 rt6_do_redirect(dst, NULL, skb); in ip6_redirect()
1288 dst_release(dst); in ip6_redirect()
1297 struct dst_entry *dst; in ip6_redirect_no_header() local
1307 dst = ip6_route_redirect(net, &fl6, &iph->saddr); in ip6_redirect_no_header()
1308 rt6_do_redirect(dst, NULL, skb); in ip6_redirect_no_header()
1309 dst_release(dst); in ip6_redirect_no_header()
1318 static unsigned int ip6_default_advmss(const struct dst_entry *dst) in ip6_default_advmss() argument
1320 struct net_device *dev = dst->dev; in ip6_default_advmss()
1321 unsigned int mtu = dst_mtu(dst); in ip6_default_advmss()
1340 static unsigned int ip6_mtu(const struct dst_entry *dst) in ip6_mtu() argument
1343 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU); in ip6_mtu()
1351 idev = __in6_dev_get(dst->dev); in ip6_mtu()
1366 struct dst_entry *dst; in icmp6_dst_alloc() local
1377 dst = ERR_PTR(-ENOMEM); in icmp6_dst_alloc()
1381 rt->dst.flags |= DST_HOST; in icmp6_dst_alloc()
1382 rt->dst.output = ip6_output; in icmp6_dst_alloc()
1383 atomic_set(&rt->dst.__refcnt, 1); in icmp6_dst_alloc()
1388 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0); in icmp6_dst_alloc()
1391 rt->dst.next = icmp6_dst_gc_list; in icmp6_dst_alloc()
1392 icmp6_dst_gc_list = &rt->dst; in icmp6_dst_alloc()
1397 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0); in icmp6_dst_alloc()
1400 return dst; in icmp6_dst_alloc()
1405 struct dst_entry *dst, **pprev; in icmp6_dst_gc() local
1411 while ((dst = *pprev) != NULL) { in icmp6_dst_gc()
1412 if (!atomic_read(&dst->__refcnt)) { in icmp6_dst_gc()
1413 *pprev = dst->next; in icmp6_dst_gc()
1414 dst_free(dst); in icmp6_dst_gc()
1416 pprev = &dst->next; in icmp6_dst_gc()
1429 struct dst_entry *dst, **pprev; in icmp6_clean_all() local
1433 while ((dst = *pprev) != NULL) { in icmp6_clean_all()
1434 struct rt6_info *rt = (struct rt6_info *) dst; in icmp6_clean_all()
1436 *pprev = dst->next; in icmp6_clean_all()
1437 dst_free(dst); in icmp6_clean_all()
1439 pprev = &dst->next; in icmp6_clean_all()
1580 rt->dst.input = ip6_mc_input; in ip6_route_info_create()
1582 rt->dst.input = ip6_input; in ip6_route_info_create()
1584 rt->dst.input = ip6_forward; in ip6_route_info_create()
1586 rt->dst.output = ip6_output; in ip6_route_info_create()
1591 rt->dst.flags |= DST_HOST; in ip6_route_info_create()
1592 dst_metrics_set_force_overwrite(&rt->dst); in ip6_route_info_create()
1626 rt->dst.error = -EINVAL; in ip6_route_info_create()
1627 rt->dst.output = dst_discard_sk; in ip6_route_info_create()
1628 rt->dst.input = dst_discard; in ip6_route_info_create()
1631 rt->dst.error = -EACCES; in ip6_route_info_create()
1632 rt->dst.output = ip6_pkt_prohibit_out; in ip6_route_info_create()
1633 rt->dst.input = ip6_pkt_prohibit; in ip6_route_info_create()
1637 rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN in ip6_route_info_create()
1639 rt->dst.output = ip6_pkt_discard_out; in ip6_route_info_create()
1640 rt->dst.input = ip6_pkt_discard; in ip6_route_info_create()
1674 if (dev != grt->dst.dev) { in ip6_route_info_create()
1679 dev = grt->dst.dev; in ip6_route_info_create()
1713 rt->dst.dev = dev; in ip6_route_info_create()
1728 dst_free(&rt->dst); in ip6_route_info_create()
1756 dst_free(&rt->dst); in ip6_route_add()
1765 struct net *net = dev_net(rt->dst.dev); in __ip6_del_rt()
1785 .nl_net = dev_net(rt->dst.dev), in ip6_del_rt()
1808 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in ip6_route_del()
1810 (!rt->dst.dev || in ip6_route_del()
1811 rt->dst.dev->ifindex != cfg->fc_ifindex)) in ip6_route_del()
1818 dst_hold(&rt->dst); in ip6_route_del()
1829 static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb) in rt6_do_redirect() argument
1891 rt = (struct rt6_info *) dst; in rt6_do_redirect()
1901 dst_confirm(&rt->dst); in rt6_do_redirect()
1931 netevent.old = &rt->dst; in rt6_do_redirect()
1932 netevent.new = &nrt->dst; in rt6_do_redirect()
1938 rt = (struct rt6_info *) dst_clone(&rt->dst); in rt6_do_redirect()
1953 struct net *net = dev_net(ort->dst.dev); in ip6_rt_copy()
1954 struct rt6_info *rt = ip6_dst_alloc(net, ort->dst.dev, 0, in ip6_rt_copy()
1958 rt->dst.input = ort->dst.input; in ip6_rt_copy()
1959 rt->dst.output = ort->dst.output; in ip6_rt_copy()
1960 rt->dst.flags |= DST_HOST; in ip6_rt_copy()
1964 dst_copy_metrics(&rt->dst, &ort->dst); in ip6_rt_copy()
1965 rt->dst.error = ort->dst.error; in ip6_rt_copy()
1969 rt->dst.lastuse = jiffies; in ip6_rt_copy()
2006 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in rt6_get_route_info()
2007 if (rt->dst.dev->ifindex != ifindex) in rt6_get_route_info()
2013 dst_hold(&rt->dst); in rt6_get_route_info()
2061 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { in rt6_get_dflt_router()
2062 if (dev == rt->dst.dev && in rt6_get_dflt_router()
2068 dst_hold(&rt->dst); in rt6_get_dflt_router()
2107 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { in rt6_purge_dflt_routers()
2110 dst_hold(&rt->dst); in rt6_purge_dflt_routers()
2184 struct dst_entry *dst = skb_dst(skb); in ip6_pkt_drop() local
2189 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), in ip6_pkt_drop()
2195 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst), in ip6_pkt_drop()
2242 rt->dst.flags |= DST_HOST; in addrconf_dst_alloc()
2243 rt->dst.input = ip6_input; in addrconf_dst_alloc()
2244 rt->dst.output = ip6_output; in addrconf_dst_alloc()
2258 atomic_set(&rt->dst.__refcnt, 1); in addrconf_dst_alloc()
2293 if (((void *)rt->dst.dev == dev || !dev) && in fib6_remove_prefsrc()
2344 if ((rt->dst.dev == dev || !dev) && in fib6_ifdown()
2396 if (rt->dst.dev == arg->dev && in rt6_mtu_change_route()
2397 !dst_metric_locked(&rt->dst, RTAX_MTU) && in rt6_mtu_change_route()
2398 (dst_mtu(&rt->dst) >= arg->mtu || in rt6_mtu_change_route()
2399 (dst_mtu(&rt->dst) < arg->mtu && in rt6_mtu_change_route()
2400 dst_mtu(&rt->dst) == idev->cnf.mtu6))) { in rt6_mtu_change_route()
2401 dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu); in rt6_mtu_change_route()
2549 if (rtnh->dst.dev == rt->dst.dev && in ip6_route_info_append()
2614 dst_free(&rt->dst); in ip6_route_multipath_add()
2658 dst_free(&nh->rt6_info->dst); in ip6_route_multipath_add()
2754 struct in6_addr *dst, struct in6_addr *src, in rt6_fill_node() argument
2787 switch (rt->dst.error) { in rt6_fill_node()
2804 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK)) in rt6_fill_node()
2823 if (dst) { in rt6_fill_node()
2824 if (nla_put_in6_addr(skb, RTA_DST, dst)) in rt6_fill_node()
2857 } else if (dst) { in rt6_fill_node()
2859 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 && in rt6_fill_node()
2871 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) in rt6_fill_node()
2879 if (rt->dst.dev && in rt6_fill_node()
2880 nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex)) in rt6_fill_node()
2885 expires = (rt->rt6i_flags & RTF_EXPIRES) ? rt->dst.expires - jiffies : 0; in rt6_fill_node()
2887 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0) in rt6_fill_node()
2994 skb_dst_set(skb, &rt->dst); in inet6_rtm_getroute()
3046 net->ipv6.ip6_null_entry->dst.dev = dev; in ip6_route_dev_notify()
3049 net->ipv6.ip6_prohibit_entry->dst.dev = dev; in ip6_route_dev_notify()
3051 net->ipv6.ip6_blk_hole_entry->dst.dev = dev; in ip6_route_dev_notify()
3239 net->ipv6.ip6_null_entry->dst.path = in ip6_route_net_init()
3241 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3242 dst_init_metrics(&net->ipv6.ip6_null_entry->dst, in ip6_route_net_init()
3251 net->ipv6.ip6_prohibit_entry->dst.path = in ip6_route_net_init()
3253 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3254 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst, in ip6_route_net_init()
3262 net->ipv6.ip6_blk_hole_entry->dst.path = in ip6_route_net_init()
3264 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; in ip6_route_net_init()
3265 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst, in ip6_route_net_init()
3391 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()
3394 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()
3396 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; in ip6_route_init()