Lines Matching refs:rt

95 static int rt6_score_route(struct rt6_info *rt, int oif, int strict);
107 static void rt6_bind_peer(struct rt6_info *rt, int create) in rt6_bind_peer() argument
112 base = inetpeer_base_ptr(rt->_rt6i_peer); in rt6_bind_peer()
116 peer = inet_getpeer_v6(base, &rt->rt6i_dst.addr, create); in rt6_bind_peer()
118 if (!rt6_set_peer(rt, peer)) in rt6_bind_peer()
123 static struct inet_peer *__rt6_get_peer(struct rt6_info *rt, int create) in __rt6_get_peer() argument
125 if (rt6_has_peer(rt)) in __rt6_get_peer()
126 return rt6_peer_ptr(rt); in __rt6_get_peer()
128 rt6_bind_peer(rt, create); in __rt6_get_peer()
129 return (rt6_has_peer(rt) ? rt6_peer_ptr(rt) : NULL); in __rt6_get_peer()
132 static struct inet_peer *rt6_get_peer_create(struct rt6_info *rt) in rt6_get_peer_create() argument
134 return __rt6_get_peer(rt, 1); in rt6_get_peer_create()
139 struct rt6_info *rt = (struct rt6_info *) dst; in ipv6_cow_metrics() local
143 if (!(rt->dst.flags & DST_HOST)) in ipv6_cow_metrics()
146 peer = rt6_get_peer_create(rt); in ipv6_cow_metrics()
168 static inline const void *choose_neigh_daddr(struct rt6_info *rt, in choose_neigh_daddr() argument
172 struct in6_addr *p = &rt->rt6i_gateway; in choose_neigh_daddr()
185 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_neigh_lookup() local
188 daddr = choose_neigh_daddr(rt, skb, daddr); in ip6_neigh_lookup()
307 struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev, in ip6_dst_alloc() local
310 if (rt) { in ip6_dst_alloc()
311 struct dst_entry *dst = &rt->dst; in ip6_dst_alloc()
313 memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst)); in ip6_dst_alloc()
314 rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers); in ip6_dst_alloc()
315 INIT_LIST_HEAD(&rt->rt6i_siblings); in ip6_dst_alloc()
317 return rt; in ip6_dst_alloc()
322 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_destroy() local
323 struct inet6_dev *idev = rt->rt6i_idev; in ip6_dst_destroy()
326 if (!(rt->dst.flags & DST_HOST)) in ip6_dst_destroy()
330 rt->rt6i_idev = NULL; in ip6_dst_destroy()
337 if (rt6_has_peer(rt)) { in ip6_dst_destroy()
338 struct inet_peer *peer = rt6_peer_ptr(rt); in ip6_dst_destroy()
346 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_ifdown() local
347 struct inet6_dev *idev = rt->rt6i_idev; in ip6_dst_ifdown()
356 rt->rt6i_idev = loopback_idev; in ip6_dst_ifdown()
363 static bool rt6_check_expired(const struct rt6_info *rt) in rt6_check_expired() argument
365 if (rt->rt6i_flags & RTF_EXPIRES) { in rt6_check_expired()
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()
438 struct rt6_info *rt, in rt6_device_match()
449 for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) { in rt6_device_match()
481 return rt; in rt6_device_match()
503 static void rt6_probe(struct rt6_info *rt) in rt6_probe() argument
514 if (!rt || !(rt->rt6i_flags & RTF_GATEWAY)) in rt6_probe()
517 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_probe()
525 time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { in rt6_probe()
538 work->target = rt->rt6i_gateway; in rt6_probe()
539 dev_hold(rt->dst.dev); in rt6_probe()
540 work->dev = rt->dst.dev; in rt6_probe()
550 static inline void rt6_probe(struct rt6_info *rt) in rt6_probe() argument
558 static inline int rt6_check_dev(struct rt6_info *rt, int oif) in rt6_check_dev() argument
560 struct net_device *dev = rt->dst.dev; in rt6_check_dev()
564 rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif) in rt6_check_dev()
569 static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt) in rt6_check_neigh() argument
574 if (rt->rt6i_flags & RTF_NONEXTHOP || in rt6_check_neigh()
575 !(rt->rt6i_flags & RTF_GATEWAY)) in rt6_check_neigh()
579 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); in rt6_check_neigh()
600 static int rt6_score_route(struct rt6_info *rt, int oif, in rt6_score_route() argument
605 m = rt6_check_dev(rt, oif); in rt6_score_route()
609 m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; in rt6_score_route()
612 int n = rt6_check_neigh(rt); in rt6_score_route()
619 static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, in find_match() argument
626 if (rt6_check_expired(rt)) in find_match()
629 m = rt6_score_route(rt, oif, strict); in find_match()
638 rt6_probe(rt); in find_match()
644 match = rt; in find_match()
655 struct rt6_info *rt, *match; in find_rr_leaf() local
659 for (rt = rr_head; rt && rt->rt6i_metric == metric; in find_rr_leaf()
660 rt = rt->dst.rt6_next) in find_rr_leaf()
661 match = find_match(rt, oif, strict, &mpri, match, do_rr); in find_rr_leaf()
662 for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; in find_rr_leaf()
663 rt = rt->dst.rt6_next) in find_rr_leaf()
664 match = find_match(rt, oif, strict, &mpri, match, do_rr); in find_rr_leaf()
706 struct rt6_info *rt; in rt6_route_rcv() local
744 rt = rt6_get_dflt_router(gwaddr, dev); in rt6_route_rcv()
746 rt = rt6_get_route_info(net, prefix, rinfo->prefix_len, in rt6_route_rcv()
749 if (rt && !lifetime) { in rt6_route_rcv()
750 ip6_del_rt(rt); in rt6_route_rcv()
751 rt = NULL; in rt6_route_rcv()
754 if (!rt && lifetime) in rt6_route_rcv()
755 rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr, dev->ifindex, in rt6_route_rcv()
757 else if (rt) in rt6_route_rcv()
758 rt->rt6i_flags = RTF_ROUTEINFO | in rt6_route_rcv()
759 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in rt6_route_rcv()
761 if (rt) { in rt6_route_rcv()
763 rt6_clean_expires(rt); in rt6_route_rcv()
765 rt6_set_expires(rt, jiffies + HZ * lifetime); in rt6_route_rcv()
767 ip6_rt_put(rt); in rt6_route_rcv()
795 struct rt6_info *rt; in ip6_pol_route_lookup() local
800 rt = fn->leaf; in ip6_pol_route_lookup()
801 rt = rt6_device_match(net, rt, &fl6->saddr, fl6->flowi6_oif, flags); in ip6_pol_route_lookup()
802 if (rt->rt6i_nsiblings && fl6->flowi6_oif == 0) in ip6_pol_route_lookup()
803 rt = rt6_multipath_select(rt, fl6, fl6->flowi6_oif, flags); in ip6_pol_route_lookup()
804 if (rt == net->ipv6.ip6_null_entry) { in ip6_pol_route_lookup()
809 dst_use(&rt->dst, jiffies); in ip6_pol_route_lookup()
811 return rt; in ip6_pol_route_lookup()
853 static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info, in __ip6_ins_rt() argument
859 table = rt->rt6i_table; in __ip6_ins_rt()
861 err = fib6_add(&table->tb6_root, rt, info, mxc); in __ip6_ins_rt()
867 int ip6_ins_rt(struct rt6_info *rt) in ip6_ins_rt() argument
869 struct nl_info info = { .nl_net = dev_net(rt->dst.dev), }; in ip6_ins_rt()
872 return __ip6_ins_rt(rt, &info, &mxc); in ip6_ins_rt()
879 struct rt6_info *rt; in rt6_alloc_cow() local
885 rt = ip6_rt_copy(ort, daddr); in rt6_alloc_cow()
887 if (rt) { in rt6_alloc_cow()
890 rt->rt6i_flags |= RTF_ANYCAST; in rt6_alloc_cow()
892 rt->rt6i_flags |= RTF_CACHE; in rt6_alloc_cow()
895 if (rt->rt6i_src.plen && saddr) { in rt6_alloc_cow()
896 rt->rt6i_src.addr = *saddr; in rt6_alloc_cow()
897 rt->rt6i_src.plen = 128; in rt6_alloc_cow()
902 return rt; in rt6_alloc_cow()
908 struct rt6_info *rt = ip6_rt_copy(ort, daddr); in rt6_alloc_clone() local
910 if (rt) in rt6_alloc_clone()
911 rt->rt6i_flags |= RTF_CACHE; in rt6_alloc_clone()
912 return rt; in rt6_alloc_clone()
919 struct rt6_info *rt, *nrt; in ip6_pol_route() local
935 rt = rt6_select(fn, oif, strict); in ip6_pol_route()
936 if (rt->rt6i_nsiblings) in ip6_pol_route()
937 rt = rt6_multipath_select(rt, fl6, oif, strict); in ip6_pol_route()
938 if (rt == net->ipv6.ip6_null_entry) { in ip6_pol_route()
948 dst_hold(&rt->dst); in ip6_pol_route()
954 dst_hold(&rt->dst); in ip6_pol_route()
957 if (rt->rt6i_flags & RTF_CACHE) in ip6_pol_route()
960 if (!(rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY))) in ip6_pol_route()
961 nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); in ip6_pol_route()
962 else if (!(rt->dst.flags & DST_HOST)) in ip6_pol_route()
963 nrt = rt6_alloc_clone(rt, &fl6->daddr); in ip6_pol_route()
967 ip6_rt_put(rt); in ip6_pol_route()
968 rt = nrt ? : net->ipv6.ip6_null_entry; in ip6_pol_route()
970 dst_hold(&rt->dst); in ip6_pol_route()
984 ip6_rt_put(rt); in ip6_pol_route()
988 rt->dst.lastuse = jiffies; in ip6_pol_route()
989 rt->dst.__use++; in ip6_pol_route()
991 return rt; in ip6_pol_route()
1052 struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig; in ip6_blackhole_route() local
1055 rt = dst_alloc(&ip6_dst_blackhole_ops, ort->dst.dev, 1, DST_OBSOLETE_NONE, 0); in ip6_blackhole_route()
1056 if (rt) { in ip6_blackhole_route()
1057 new = &rt->dst; in ip6_blackhole_route()
1059 memset(new + 1, 0, sizeof(*rt) - sizeof(*new)); in ip6_blackhole_route()
1060 rt6_init_peer(rt, net->ipv6.peers); in ip6_blackhole_route()
1070 rt->rt6i_idev = ort->rt6i_idev; in ip6_blackhole_route()
1071 if (rt->rt6i_idev) in ip6_blackhole_route()
1072 in6_dev_hold(rt->rt6i_idev); in ip6_blackhole_route()
1074 rt->rt6i_gateway = ort->rt6i_gateway; in ip6_blackhole_route()
1075 rt->rt6i_flags = ort->rt6i_flags; in ip6_blackhole_route()
1076 rt->rt6i_metric = 0; in ip6_blackhole_route()
1078 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); in ip6_blackhole_route()
1080 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key)); in ip6_blackhole_route()
1096 struct rt6_info *rt; in ip6_dst_check() local
1098 rt = (struct rt6_info *) dst; in ip6_dst_check()
1104 if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie)) in ip6_dst_check()
1107 if (rt6_check_expired(rt)) in ip6_dst_check()
1115 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_negative_advice() local
1117 if (rt) { in ip6_negative_advice()
1118 if (rt->rt6i_flags & RTF_CACHE) { in ip6_negative_advice()
1119 if (rt6_check_expired(rt)) { in ip6_negative_advice()
1120 ip6_del_rt(rt); in ip6_negative_advice()
1133 struct rt6_info *rt; in ip6_link_failure() local
1137 rt = (struct rt6_info *) skb_dst(skb); in ip6_link_failure()
1138 if (rt) { in ip6_link_failure()
1139 if (rt->rt6i_flags & RTF_CACHE) { in ip6_link_failure()
1140 dst_hold(&rt->dst); in ip6_link_failure()
1141 if (ip6_del_rt(rt)) in ip6_link_failure()
1142 dst_free(&rt->dst); in ip6_link_failure()
1143 } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) { in ip6_link_failure()
1144 rt->rt6i_node->fn_sernum = -1; in ip6_link_failure()
1207 struct rt6_info *rt; in __ip6_route_redirect() local
1223 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { in __ip6_route_redirect()
1224 if (rt6_check_expired(rt)) in __ip6_route_redirect()
1226 if (rt->dst.error) in __ip6_route_redirect()
1228 if (!(rt->rt6i_flags & RTF_GATEWAY)) in __ip6_route_redirect()
1230 if (fl6->flowi6_oif != rt->dst.dev->ifindex) in __ip6_route_redirect()
1232 if (!ipv6_addr_equal(&rdfl->gateway, &rt->rt6i_gateway)) in __ip6_route_redirect()
1237 if (!rt) in __ip6_route_redirect()
1238 rt = net->ipv6.ip6_null_entry; in __ip6_route_redirect()
1239 else if (rt->dst.error) { in __ip6_route_redirect()
1240 rt = net->ipv6.ip6_null_entry; in __ip6_route_redirect()
1244 if (rt == net->ipv6.ip6_null_entry) { in __ip6_route_redirect()
1251 dst_hold(&rt->dst); in __ip6_route_redirect()
1255 return rt; in __ip6_route_redirect()
1367 struct rt6_info *rt; in icmp6_dst_alloc() local
1374 rt = ip6_dst_alloc(net, dev, 0, NULL); in icmp6_dst_alloc()
1375 if (unlikely(!rt)) { 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()
1384 rt->rt6i_gateway = fl6->daddr; in icmp6_dst_alloc()
1385 rt->rt6i_dst.addr = fl6->daddr; in icmp6_dst_alloc()
1386 rt->rt6i_dst.plen = 128; in icmp6_dst_alloc()
1387 rt->rt6i_idev = idev; 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()
1426 static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg), in icmp6_clean_all() argument
1434 struct rt6_info *rt = (struct rt6_info *) dst; in icmp6_clean_all() local
1435 if (func(rt, arg)) { in icmp6_clean_all()
1520 struct rt6_info *rt = NULL; in ip6_route_info_create() local
1560 rt = ip6_dst_alloc(net, NULL, (cfg->fc_flags & RTF_ADDRCONF) ? 0 : DST_NOCOUNT, table); in ip6_route_info_create()
1562 if (!rt) { in ip6_route_info_create()
1568 rt6_set_expires(rt, jiffies + in ip6_route_info_create()
1571 rt6_clean_expires(rt); in ip6_route_info_create()
1575 rt->rt6i_protocol = cfg->fc_protocol; in ip6_route_info_create()
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()
1588 ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len); in ip6_route_info_create()
1589 rt->rt6i_dst.plen = cfg->fc_dst_len; in ip6_route_info_create()
1590 if (rt->rt6i_dst.plen == 128) { 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()
1596 ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); in ip6_route_info_create()
1597 rt->rt6i_src.plen = cfg->fc_src_len; in ip6_route_info_create()
1600 rt->rt6i_metric = cfg->fc_metric; in ip6_route_info_create()
1623 rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP; 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()
1651 rt->rt6i_gateway = *gw_addr; in ip6_route_info_create()
1705 rt->rt6i_prefsrc.addr = cfg->fc_prefsrc; in ip6_route_info_create()
1706 rt->rt6i_prefsrc.plen = 128; in ip6_route_info_create()
1708 rt->rt6i_prefsrc.plen = 0; in ip6_route_info_create()
1710 rt->rt6i_flags = cfg->fc_flags; in ip6_route_info_create()
1713 rt->dst.dev = dev; in ip6_route_info_create()
1714 rt->rt6i_idev = idev; in ip6_route_info_create()
1715 rt->rt6i_table = table; in ip6_route_info_create()
1719 *rt_ret = rt; in ip6_route_info_create()
1727 if (rt) in ip6_route_info_create()
1728 dst_free(&rt->dst); in ip6_route_info_create()
1738 struct rt6_info *rt = NULL; in ip6_route_add() local
1741 err = ip6_route_info_create(cfg, &rt); in ip6_route_add()
1749 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, &mxc); in ip6_route_add()
1755 if (rt) in ip6_route_add()
1756 dst_free(&rt->dst); in ip6_route_add()
1761 static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) in __ip6_del_rt() argument
1765 struct net *net = dev_net(rt->dst.dev); in __ip6_del_rt()
1767 if (rt == net->ipv6.ip6_null_entry) { in __ip6_del_rt()
1772 table = rt->rt6i_table; in __ip6_del_rt()
1774 err = fib6_del(rt, info); in __ip6_del_rt()
1778 ip6_rt_put(rt); in __ip6_del_rt()
1782 int ip6_del_rt(struct rt6_info *rt) in ip6_del_rt() argument
1785 .nl_net = dev_net(rt->dst.dev), in ip6_del_rt()
1787 return __ip6_del_rt(rt, &info); in ip6_del_rt()
1794 struct rt6_info *rt; in ip6_route_del() local
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()
1814 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway)) in ip6_route_del()
1816 if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric) in ip6_route_del()
1818 dst_hold(&rt->dst); in ip6_route_del()
1821 return __ip6_del_rt(rt, &cfg->fc_nlinfo); in ip6_route_del()
1833 struct rt6_info *rt, *nrt = NULL; in rt6_do_redirect() local
1891 rt = (struct rt6_info *) dst; in rt6_do_redirect()
1892 if (rt == net->ipv6.ip6_null_entry) { in rt6_do_redirect()
1901 dst_confirm(&rt->dst); in rt6_do_redirect()
1918 nrt = ip6_rt_copy(rt, &msg->dest); in rt6_do_redirect()
1931 netevent.old = &rt->dst; in rt6_do_redirect()
1937 if (rt->rt6i_flags & RTF_CACHE) { in rt6_do_redirect()
1938 rt = (struct rt6_info *) dst_clone(&rt->dst); in rt6_do_redirect()
1939 ip6_del_rt(rt); in rt6_do_redirect()
1954 struct rt6_info *rt = ip6_dst_alloc(net, ort->dst.dev, 0, in ip6_rt_copy() local
1957 if (rt) { 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()
1962 rt->rt6i_dst.addr = *dest; in ip6_rt_copy()
1963 rt->rt6i_dst.plen = 128; 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()
1966 rt->rt6i_idev = ort->rt6i_idev; in ip6_rt_copy()
1967 if (rt->rt6i_idev) in ip6_rt_copy()
1968 in6_dev_hold(rt->rt6i_idev); in ip6_rt_copy()
1969 rt->dst.lastuse = jiffies; in ip6_rt_copy()
1972 rt->rt6i_gateway = ort->rt6i_gateway; in ip6_rt_copy()
1974 rt->rt6i_gateway = *dest; in ip6_rt_copy()
1975 rt->rt6i_flags = ort->rt6i_flags; in ip6_rt_copy()
1976 rt6_set_from(rt, ort); in ip6_rt_copy()
1977 rt->rt6i_metric = 0; in ip6_rt_copy()
1980 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key)); in ip6_rt_copy()
1982 memcpy(&rt->rt6i_prefsrc, &ort->rt6i_prefsrc, sizeof(struct rt6key)); in ip6_rt_copy()
1983 rt->rt6i_table = ort->rt6i_table; in ip6_rt_copy()
1985 return rt; in ip6_rt_copy()
1994 struct rt6_info *rt = NULL; in rt6_get_route_info() local
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()
2009 if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY)) in rt6_get_route_info()
2011 if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr)) in rt6_get_route_info()
2013 dst_hold(&rt->dst); in rt6_get_route_info()
2018 return rt; in rt6_get_route_info()
2053 struct rt6_info *rt; in rt6_get_dflt_router() local
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()
2063 ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) && in rt6_get_dflt_router()
2064 ipv6_addr_equal(&rt->rt6i_gateway, addr)) in rt6_get_dflt_router()
2067 if (rt) in rt6_get_dflt_router()
2068 dst_hold(&rt->dst); in rt6_get_dflt_router()
2070 return rt; in rt6_get_dflt_router()
2097 struct rt6_info *rt; in rt6_purge_dflt_routers() local
2107 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { in rt6_purge_dflt_routers()
2108 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) && in rt6_purge_dflt_routers()
2109 (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) { in rt6_purge_dflt_routers()
2110 dst_hold(&rt->dst); in rt6_purge_dflt_routers()
2112 ip6_del_rt(rt); in rt6_purge_dflt_routers()
2235 struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev, in addrconf_dst_alloc() local
2237 if (!rt) in addrconf_dst_alloc()
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()
2245 rt->rt6i_idev = idev; in addrconf_dst_alloc()
2247 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; in addrconf_dst_alloc()
2249 rt->rt6i_flags |= RTF_ANYCAST; in addrconf_dst_alloc()
2251 rt->rt6i_flags |= RTF_LOCAL; in addrconf_dst_alloc()
2253 rt->rt6i_gateway = *addr; in addrconf_dst_alloc()
2254 rt->rt6i_dst.addr = *addr; in addrconf_dst_alloc()
2255 rt->rt6i_dst.plen = 128; in addrconf_dst_alloc()
2256 rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); in addrconf_dst_alloc()
2258 atomic_set(&rt->dst.__refcnt, 1); in addrconf_dst_alloc()
2260 return rt; in addrconf_dst_alloc()
2264 struct rt6_info *rt, in ip6_route_get_saddr() argument
2270 rt ? ip6_dst_idev((struct dst_entry *)rt) : NULL; in ip6_route_get_saddr()
2272 if (rt && rt->rt6i_prefsrc.plen) in ip6_route_get_saddr()
2273 *saddr = rt->rt6i_prefsrc.addr; in ip6_route_get_saddr()
2287 static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg) in fib6_remove_prefsrc() argument
2293 if (((void *)rt->dst.dev == dev || !dev) && in fib6_remove_prefsrc()
2294 rt != net->ipv6.ip6_null_entry && in fib6_remove_prefsrc()
2295 ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) { in fib6_remove_prefsrc()
2297 rt->rt6i_prefsrc.plen = 0; in fib6_remove_prefsrc()
2317 static int fib6_clean_tohost(struct rt6_info *rt, void *arg) in fib6_clean_tohost() argument
2321 if ((((rt->rt6i_flags & RTF_RA_ROUTER) == RTF_RA_ROUTER) || in fib6_clean_tohost()
2322 ((rt->rt6i_flags & RTF_CACHE_GATEWAY) == RTF_CACHE_GATEWAY)) && in fib6_clean_tohost()
2323 ipv6_addr_equal(gateway, &rt->rt6i_gateway)) { in fib6_clean_tohost()
2339 static int fib6_ifdown(struct rt6_info *rt, void *arg) in fib6_ifdown() argument
2344 if ((rt->dst.dev == dev || !dev) && in fib6_ifdown()
2345 rt != adn->net->ipv6.ip6_null_entry) in fib6_ifdown()
2367 static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg) in rt6_mtu_change_route() argument
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()
2539 struct rt6_info *rt, struct fib6_config *r_cfg) in ip6_route_info_append() argument
2549 if (rtnh->dst.dev == rt->dst.dev && in ip6_route_info_append()
2550 rtnh->rt6i_idev == rt->rt6i_idev && in ip6_route_info_append()
2552 &rt->rt6i_gateway)) in ip6_route_info_append()
2559 nh->rt6_info = rt; in ip6_route_info_append()
2575 struct rt6_info *rt; in ip6_route_multipath_add() local
2608 err = ip6_route_info_create(&r_cfg, &rt); in ip6_route_multipath_add()
2612 err = ip6_route_info_append(&rt6_nh_list, rt, &r_cfg); in ip6_route_multipath_add()
2614 dst_free(&rt->dst); in ip6_route_multipath_add()
2753 struct sk_buff *skb, struct rt6_info *rt, in rt6_fill_node() argument
2764 if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { in rt6_fill_node()
2776 rtm->rtm_dst_len = rt->rt6i_dst.plen; in rt6_fill_node()
2777 rtm->rtm_src_len = rt->rt6i_src.plen; in rt6_fill_node()
2779 if (rt->rt6i_table) in rt6_fill_node()
2780 table = rt->rt6i_table->tb6_id; in rt6_fill_node()
2786 if (rt->rt6i_flags & RTF_REJECT) { in rt6_fill_node()
2787 switch (rt->dst.error) { in rt6_fill_node()
2802 else if (rt->rt6i_flags & RTF_LOCAL) in rt6_fill_node()
2804 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK)) in rt6_fill_node()
2810 rtm->rtm_protocol = rt->rt6i_protocol; in rt6_fill_node()
2811 if (rt->rt6i_flags & RTF_DYNAMIC) in rt6_fill_node()
2813 else if (rt->rt6i_flags & RTF_ADDRCONF) { in rt6_fill_node()
2814 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ROUTEINFO)) in rt6_fill_node()
2820 if (rt->rt6i_flags & RTF_CACHE) in rt6_fill_node()
2828 if (nla_put_in6_addr(skb, RTA_DST, &rt->rt6i_dst.addr)) in rt6_fill_node()
2836 nla_put_in6_addr(skb, RTA_SRC, &rt->rt6i_src.addr)) in rt6_fill_node()
2841 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) { in rt6_fill_node()
2859 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 && in rt6_fill_node()
2864 if (rt->rt6i_prefsrc.plen) { in rt6_fill_node()
2866 saddr_buf = rt->rt6i_prefsrc.addr; in rt6_fill_node()
2871 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) in rt6_fill_node()
2874 if (rt->rt6i_flags & RTF_GATEWAY) { in rt6_fill_node()
2875 if (nla_put_in6_addr(skb, RTA_GATEWAY, &rt->rt6i_gateway) < 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()
2882 if (nla_put_u32(skb, RTA_PRIORITY, rt->rt6i_metric)) 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()
2890 if (nla_put_u8(skb, RTA_PREF, IPV6_EXTRACT_PREF(rt->rt6i_flags))) in rt6_fill_node()
2901 int rt6_dump_route(struct rt6_info *rt, void *p_arg) in rt6_dump_route() argument
2913 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, in rt6_dump_route()
2922 struct rt6_info *rt; in inet6_rtm_getroute() local
2973 rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, &fl6, in inet6_rtm_getroute()
2978 rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6); in inet6_rtm_getroute()
2983 ip6_rt_put(rt); in inet6_rtm_getroute()
2994 skb_dst_set(skb, &rt->dst); in inet6_rtm_getroute()
2996 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif, in inet6_rtm_getroute()
3009 void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info) in inet6_rt_notify() argument
3023 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0, in inet6_rt_notify()