Lines Matching refs:rt
193 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_destroy() local
194 struct inet6_dev *idev = rt->rt6i_idev; in ip6_dst_destroy()
197 rt->rt6i_idev = NULL; in ip6_dst_destroy()
205 struct rt6_info *rt = (struct rt6_info *)dst; in ip6_dst_ifdown() local
206 struct inet6_dev *idev = rt->rt6i_idev; in ip6_dst_ifdown()
214 rt->rt6i_idev = loopback_idev; in ip6_dst_ifdown()
220 static __inline__ int rt6_check_expired(const struct rt6_info *rt) in rt6_check_expired() argument
222 return (rt->rt6i_flags & RTF_EXPIRES && in rt6_check_expired()
223 time_after(jiffies, rt->rt6i_expires)); in rt6_check_expired()
237 struct rt6_info *rt, in rt6_device_match()
248 for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) { in rt6_device_match()
280 return rt; in rt6_device_match()
284 static void rt6_probe(struct rt6_info *rt) in rt6_probe() argument
286 struct neighbour *neigh = rt ? rt->rt6i_nexthop : NULL; in rt6_probe()
299 time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { in rt6_probe()
308 ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL); in rt6_probe()
313 static inline void rt6_probe(struct rt6_info *rt) in rt6_probe() argument
322 static inline int rt6_check_dev(struct rt6_info *rt, int oif) in rt6_check_dev() argument
324 struct net_device *dev = rt->rt6i_dev; in rt6_check_dev()
328 rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif) in rt6_check_dev()
333 static inline int rt6_check_neigh(struct rt6_info *rt) in rt6_check_neigh() argument
335 struct neighbour *neigh = rt->rt6i_nexthop; in rt6_check_neigh()
337 if (rt->rt6i_flags & RTF_NONEXTHOP || in rt6_check_neigh()
338 !(rt->rt6i_flags & RTF_GATEWAY)) in rt6_check_neigh()
356 static int rt6_score_route(struct rt6_info *rt, int oif, in rt6_score_route() argument
361 m = rt6_check_dev(rt, oif); in rt6_score_route()
365 m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; in rt6_score_route()
367 n = rt6_check_neigh(rt); in rt6_score_route()
373 static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, in find_match() argument
378 if (rt6_check_expired(rt)) in find_match()
381 m = rt6_score_route(rt, oif, strict); in find_match()
389 match = rt; in find_match()
391 rt6_probe(rt); in find_match()
402 struct rt6_info *rt, *match; in find_rr_leaf() local
406 for (rt = rr_head; rt && rt->rt6i_metric == metric; in find_rr_leaf()
407 rt = rt->u.dst.rt6_next) in find_rr_leaf()
408 match = find_match(rt, oif, strict, &mpri, match); in find_rr_leaf()
409 for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; in find_rr_leaf()
410 rt = rt->u.dst.rt6_next) in find_rr_leaf()
411 match = find_match(rt, oif, strict, &mpri, match); in find_rr_leaf()
458 struct rt6_info *rt; in rt6_route_rcv() local
495 rt = rt6_get_route_info(net, prefix, rinfo->prefix_len, gwaddr, in rt6_route_rcv()
498 if (rt && !lifetime) { in rt6_route_rcv()
499 ip6_del_rt(rt); in rt6_route_rcv()
500 rt = NULL; in rt6_route_rcv()
503 if (!rt && lifetime) in rt6_route_rcv()
504 rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr, dev->ifindex, in rt6_route_rcv()
506 else if (rt) in rt6_route_rcv()
507 rt->rt6i_flags = RTF_ROUTEINFO | in rt6_route_rcv()
508 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in rt6_route_rcv()
510 if (rt) { in rt6_route_rcv()
512 rt->rt6i_flags &= ~RTF_EXPIRES; in rt6_route_rcv()
514 rt->rt6i_expires = jiffies + HZ * lifetime; in rt6_route_rcv()
515 rt->rt6i_flags |= RTF_EXPIRES; in rt6_route_rcv()
517 dst_release(&rt->u.dst); in rt6_route_rcv()
525 if (rt == __net->ipv6.ip6_null_entry) { \
546 struct rt6_info *rt; in ip6_pol_route_lookup() local
551 rt = fn->leaf; in ip6_pol_route_lookup()
552 rt = rt6_device_match(net, rt, &fl->fl6_src, fl->oif, flags); in ip6_pol_route_lookup()
555 dst_use(&rt->u.dst, jiffies); in ip6_pol_route_lookup()
557 return rt; in ip6_pol_route_lookup()
597 static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info) in __ip6_ins_rt() argument
602 table = rt->rt6i_table; in __ip6_ins_rt()
604 err = fib6_add(&table->tb6_root, rt, info); in __ip6_ins_rt()
610 int ip6_ins_rt(struct rt6_info *rt) in ip6_ins_rt() argument
613 .nl_net = dev_net(rt->rt6i_dev), in ip6_ins_rt()
615 return __ip6_ins_rt(rt, &info); in ip6_ins_rt()
621 struct rt6_info *rt; in rt6_alloc_cow() local
627 rt = ip6_rt_copy(ort); in rt6_alloc_cow()
629 if (rt) { in rt6_alloc_cow()
633 if (!(rt->rt6i_flags&RTF_GATEWAY)) { in rt6_alloc_cow()
634 if (rt->rt6i_dst.plen != 128 && in rt6_alloc_cow()
635 ipv6_addr_equal(&rt->rt6i_dst.addr, daddr)) in rt6_alloc_cow()
636 rt->rt6i_flags |= RTF_ANYCAST; in rt6_alloc_cow()
637 ipv6_addr_copy(&rt->rt6i_gateway, daddr); in rt6_alloc_cow()
640 ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); in rt6_alloc_cow()
641 rt->rt6i_dst.plen = 128; in rt6_alloc_cow()
642 rt->rt6i_flags |= RTF_CACHE; in rt6_alloc_cow()
643 rt->u.dst.flags |= DST_HOST; in rt6_alloc_cow()
646 if (rt->rt6i_src.plen && saddr) { in rt6_alloc_cow()
647 ipv6_addr_copy(&rt->rt6i_src.addr, saddr); in rt6_alloc_cow()
648 rt->rt6i_src.plen = 128; in rt6_alloc_cow()
653 neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); in rt6_alloc_cow()
655 struct net *net = dev_net(rt->rt6i_dev); in rt6_alloc_cow()
677 dst_free(&rt->u.dst); in rt6_alloc_cow()
680 rt->rt6i_nexthop = neigh; in rt6_alloc_cow()
684 return rt; in rt6_alloc_cow()
689 struct rt6_info *rt = ip6_rt_copy(ort); in rt6_alloc_clone() local
690 if (rt) { in rt6_alloc_clone()
691 ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); in rt6_alloc_clone()
692 rt->rt6i_dst.plen = 128; in rt6_alloc_clone()
693 rt->rt6i_flags |= RTF_CACHE; in rt6_alloc_clone()
694 rt->u.dst.flags |= DST_HOST; in rt6_alloc_clone()
695 rt->rt6i_nexthop = neigh_clone(ort->rt6i_nexthop); in rt6_alloc_clone()
697 return rt; in rt6_alloc_clone()
704 struct rt6_info *rt, *nrt; in ip6_pol_route() local
719 rt = rt6_select(fn, oif, strict | reachable); in ip6_pol_route()
722 if (rt == net->ipv6.ip6_null_entry || in ip6_pol_route()
723 rt->rt6i_flags & RTF_CACHE) in ip6_pol_route()
726 dst_hold(&rt->u.dst); in ip6_pol_route()
729 if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) in ip6_pol_route()
730 nrt = rt6_alloc_cow(rt, &fl->fl6_dst, &fl->fl6_src); in ip6_pol_route()
733 nrt = rt6_alloc_clone(rt, &fl->fl6_dst); in ip6_pol_route()
739 dst_release(&rt->u.dst); in ip6_pol_route()
740 rt = nrt ? : net->ipv6.ip6_null_entry; in ip6_pol_route()
742 dst_hold(&rt->u.dst); in ip6_pol_route()
756 dst_release(&rt->u.dst); in ip6_pol_route()
764 dst_hold(&rt->u.dst); in ip6_pol_route()
767 rt->u.dst.lastuse = jiffies; in ip6_pol_route()
768 rt->u.dst.__use++; in ip6_pol_route()
770 return rt; in ip6_pol_route()
837 struct rt6_info *rt = (struct rt6_info *) in ip6_dst_blackhole() local
841 if (rt) { in ip6_dst_blackhole()
842 new = &rt->u.dst; in ip6_dst_blackhole()
853 rt->rt6i_idev = ort->rt6i_idev; in ip6_dst_blackhole()
854 if (rt->rt6i_idev) in ip6_dst_blackhole()
855 in6_dev_hold(rt->rt6i_idev); in ip6_dst_blackhole()
856 rt->rt6i_expires = 0; in ip6_dst_blackhole()
858 ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway); in ip6_dst_blackhole()
859 rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; in ip6_dst_blackhole()
860 rt->rt6i_metric = 0; in ip6_dst_blackhole()
862 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); in ip6_dst_blackhole()
864 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key)); in ip6_dst_blackhole()
882 struct rt6_info *rt; in ip6_dst_check() local
884 rt = (struct rt6_info *) dst; in ip6_dst_check()
886 if (rt && rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) in ip6_dst_check()
894 struct rt6_info *rt = (struct rt6_info *) dst; in ip6_negative_advice() local
896 if (rt) { in ip6_negative_advice()
897 if (rt->rt6i_flags & RTF_CACHE) in ip6_negative_advice()
898 ip6_del_rt(rt); in ip6_negative_advice()
907 struct rt6_info *rt; in ip6_link_failure() local
911 rt = (struct rt6_info *) skb->dst; in ip6_link_failure()
912 if (rt) { in ip6_link_failure()
913 if (rt->rt6i_flags&RTF_CACHE) { in ip6_link_failure()
914 dst_set_expires(&rt->u.dst, 0); in ip6_link_failure()
915 rt->rt6i_flags |= RTF_EXPIRES; in ip6_link_failure()
916 } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) in ip6_link_failure()
917 rt->rt6i_node->fn_sernum = -1; in ip6_link_failure()
963 struct rt6_info *rt; in icmp6_dst_alloc() local
970 rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops); in icmp6_dst_alloc()
971 if (unlikely(rt == NULL)) { in icmp6_dst_alloc()
985 rt->rt6i_dev = dev; in icmp6_dst_alloc()
986 rt->rt6i_idev = idev; in icmp6_dst_alloc()
987 rt->rt6i_nexthop = neigh; in icmp6_dst_alloc()
988 atomic_set(&rt->u.dst.__refcnt, 1); in icmp6_dst_alloc()
989 rt->u.dst.metrics[RTAX_HOPLIMIT-1] = 255; in icmp6_dst_alloc()
990 rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); in icmp6_dst_alloc()
991 rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); in icmp6_dst_alloc()
992 rt->u.dst.output = ip6_output; in icmp6_dst_alloc()
995 rt->u.dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST in icmp6_dst_alloc()
998 ipv6_addr_copy(&rt->rt6i_dst.addr, addr); in icmp6_dst_alloc()
999 rt->rt6i_dst.plen = 128; in icmp6_dst_alloc()
1003 rt->u.dst.next = icmp6_dst_gc_list; in icmp6_dst_alloc()
1004 icmp6_dst_gc_list = &rt->u.dst; in icmp6_dst_alloc()
1010 return &rt->u.dst; in icmp6_dst_alloc()
1038 static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg), in icmp6_clean_all() argument
1046 struct rt6_info *rt = (struct rt6_info *) dst; in icmp6_clean_all() local
1047 if (func(rt, arg)) { in icmp6_clean_all()
1123 struct rt6_info *rt = NULL; in ip6_route_add() local
1154 rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops); in ip6_route_add()
1156 if (rt == NULL) { in ip6_route_add()
1161 rt->u.dst.obsolete = -1; in ip6_route_add()
1162 rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ? in ip6_route_add()
1168 rt->rt6i_protocol = cfg->fc_protocol; in ip6_route_add()
1173 rt->u.dst.input = ip6_mc_input; in ip6_route_add()
1175 rt->u.dst.input = ip6_forward; in ip6_route_add()
1177 rt->u.dst.output = ip6_output; in ip6_route_add()
1179 ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len); in ip6_route_add()
1180 rt->rt6i_dst.plen = cfg->fc_dst_len; in ip6_route_add()
1181 if (rt->rt6i_dst.plen == 128) in ip6_route_add()
1182 rt->u.dst.flags = DST_HOST; in ip6_route_add()
1185 ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); in ip6_route_add()
1186 rt->rt6i_src.plen = cfg->fc_src_len; in ip6_route_add()
1189 rt->rt6i_metric = cfg->fc_metric; in ip6_route_add()
1210 rt->u.dst.output = ip6_pkt_discard_out; in ip6_route_add()
1211 rt->u.dst.input = ip6_pkt_discard; in ip6_route_add()
1212 rt->u.dst.error = -ENETUNREACH; in ip6_route_add()
1213 rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP; in ip6_route_add()
1222 ipv6_addr_copy(&rt->rt6i_gateway, gw_addr); in ip6_route_add()
1272 rt->rt6i_nexthop = __neigh_lookup_errno(&nd_tbl, &rt->rt6i_gateway, dev); in ip6_route_add()
1273 if (IS_ERR(rt->rt6i_nexthop)) { in ip6_route_add()
1274 err = PTR_ERR(rt->rt6i_nexthop); in ip6_route_add()
1275 rt->rt6i_nexthop = NULL; in ip6_route_add()
1280 rt->rt6i_flags = cfg->fc_flags; in ip6_route_add()
1296 rt->u.dst.metrics[type - 1] = nla_get_u32(nla); in ip6_route_add()
1301 if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0) in ip6_route_add()
1302 rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1; in ip6_route_add()
1303 if (!dst_mtu(&rt->u.dst)) in ip6_route_add()
1304 rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(dev); in ip6_route_add()
1305 if (!dst_metric(&rt->u.dst, RTAX_ADVMSS)) in ip6_route_add()
1306 rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); in ip6_route_add()
1307 rt->u.dst.dev = dev; in ip6_route_add()
1308 rt->rt6i_idev = idev; in ip6_route_add()
1309 rt->rt6i_table = table; in ip6_route_add()
1313 return __ip6_ins_rt(rt, &cfg->fc_nlinfo); in ip6_route_add()
1320 if (rt) in ip6_route_add()
1321 dst_free(&rt->u.dst); in ip6_route_add()
1325 static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) in __ip6_del_rt() argument
1329 struct net *net = dev_net(rt->rt6i_dev); in __ip6_del_rt()
1331 if (rt == net->ipv6.ip6_null_entry) in __ip6_del_rt()
1334 table = rt->rt6i_table; in __ip6_del_rt()
1337 err = fib6_del(rt, info); in __ip6_del_rt()
1338 dst_release(&rt->u.dst); in __ip6_del_rt()
1345 int ip6_del_rt(struct rt6_info *rt) in ip6_del_rt() argument
1348 .nl_net = dev_net(rt->rt6i_dev), in ip6_del_rt()
1350 return __ip6_del_rt(rt, &info); in ip6_del_rt()
1357 struct rt6_info *rt; in ip6_route_del() local
1371 for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { in ip6_route_del()
1373 (rt->rt6i_dev == NULL || in ip6_route_del()
1374 rt->rt6i_dev->ifindex != cfg->fc_ifindex)) in ip6_route_del()
1377 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway)) in ip6_route_del()
1379 if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric) in ip6_route_del()
1381 dst_hold(&rt->u.dst); in ip6_route_del()
1384 return __ip6_del_rt(rt, &cfg->fc_nlinfo); in ip6_route_del()
1406 struct rt6_info *rt; in __ip6_route_redirect() local
1423 for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { in __ip6_route_redirect()
1432 if (rt6_check_expired(rt)) in __ip6_route_redirect()
1434 if (!(rt->rt6i_flags & RTF_GATEWAY)) in __ip6_route_redirect()
1436 if (fl->oif != rt->rt6i_dev->ifindex) in __ip6_route_redirect()
1438 if (!ipv6_addr_equal(&rdfl->gateway, &rt->rt6i_gateway)) in __ip6_route_redirect()
1443 if (!rt) in __ip6_route_redirect()
1444 rt = net->ipv6.ip6_null_entry; in __ip6_route_redirect()
1447 dst_hold(&rt->u.dst); in __ip6_route_redirect()
1451 return rt; in __ip6_route_redirect()
1485 struct rt6_info *rt, *nrt = NULL; in rt6_redirect() local
1489 rt = ip6_route_redirect(dest, src, saddr, neigh->dev); in rt6_redirect()
1491 if (rt == net->ipv6.ip6_null_entry) { in rt6_redirect()
1514 dst_confirm(&rt->u.dst); in rt6_redirect()
1517 if (neigh == rt->u.dst.neighbour) in rt6_redirect()
1520 nrt = ip6_rt_copy(rt); in rt6_redirect()
1542 netevent.old = &rt->u.dst; in rt6_redirect()
1546 if (rt->rt6i_flags&RTF_CACHE) { in rt6_redirect()
1547 ip6_del_rt(rt); in rt6_redirect()
1552 dst_release(&rt->u.dst); in rt6_redirect()
1564 struct rt6_info *rt, *nrt; in rt6_pmtu_discovery() local
1568 rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0); in rt6_pmtu_discovery()
1569 if (rt == NULL) in rt6_pmtu_discovery()
1572 if (pmtu >= dst_mtu(&rt->u.dst)) in rt6_pmtu_discovery()
1590 dst_confirm(&rt->u.dst); in rt6_pmtu_discovery()
1597 if (rt->rt6i_flags & RTF_CACHE) { in rt6_pmtu_discovery()
1598 rt->u.dst.metrics[RTAX_MTU-1] = pmtu; in rt6_pmtu_discovery()
1600 rt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; in rt6_pmtu_discovery()
1601 dst_set_expires(&rt->u.dst, net->ipv6.sysctl.ip6_rt_mtu_expires); in rt6_pmtu_discovery()
1602 rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES; in rt6_pmtu_discovery()
1611 if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) in rt6_pmtu_discovery()
1612 nrt = rt6_alloc_cow(rt, daddr, saddr); in rt6_pmtu_discovery()
1614 nrt = rt6_alloc_clone(rt, daddr); in rt6_pmtu_discovery()
1633 dst_release(&rt->u.dst); in rt6_pmtu_discovery()
1643 struct rt6_info *rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops); in ip6_rt_copy() local
1645 if (rt) { in ip6_rt_copy()
1646 rt->u.dst.input = ort->u.dst.input; in ip6_rt_copy()
1647 rt->u.dst.output = ort->u.dst.output; in ip6_rt_copy()
1649 memcpy(rt->u.dst.metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); in ip6_rt_copy()
1650 rt->u.dst.error = ort->u.dst.error; in ip6_rt_copy()
1651 rt->u.dst.dev = ort->u.dst.dev; in ip6_rt_copy()
1652 if (rt->u.dst.dev) in ip6_rt_copy()
1653 dev_hold(rt->u.dst.dev); in ip6_rt_copy()
1654 rt->rt6i_idev = ort->rt6i_idev; in ip6_rt_copy()
1655 if (rt->rt6i_idev) in ip6_rt_copy()
1656 in6_dev_hold(rt->rt6i_idev); in ip6_rt_copy()
1657 rt->u.dst.lastuse = jiffies; in ip6_rt_copy()
1658 rt->rt6i_expires = 0; in ip6_rt_copy()
1660 ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway); in ip6_rt_copy()
1661 rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; in ip6_rt_copy()
1662 rt->rt6i_metric = 0; in ip6_rt_copy()
1664 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); in ip6_rt_copy()
1666 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key)); in ip6_rt_copy()
1668 rt->rt6i_table = ort->rt6i_table; in ip6_rt_copy()
1670 return rt; in ip6_rt_copy()
1679 struct rt6_info *rt = NULL; in rt6_get_route_info() local
1691 for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { in rt6_get_route_info()
1692 if (rt->rt6i_dev->ifindex != ifindex) in rt6_get_route_info()
1694 if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY)) in rt6_get_route_info()
1696 if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr)) in rt6_get_route_info()
1698 dst_hold(&rt->u.dst); in rt6_get_route_info()
1703 return rt; in rt6_get_route_info()
1738 struct rt6_info *rt; in rt6_get_dflt_router() local
1746 for (rt = table->tb6_root.leaf; rt; rt=rt->u.dst.rt6_next) { in rt6_get_dflt_router()
1747 if (dev == rt->rt6i_dev && in rt6_get_dflt_router()
1748 ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) && in rt6_get_dflt_router()
1749 ipv6_addr_equal(&rt->rt6i_gateway, addr)) in rt6_get_dflt_router()
1752 if (rt) in rt6_get_dflt_router()
1753 dst_hold(&rt->u.dst); in rt6_get_dflt_router()
1755 return rt; in rt6_get_dflt_router()
1782 struct rt6_info *rt; in rt6_purge_dflt_routers() local
1792 for (rt = table->tb6_root.leaf; rt; rt = rt->u.dst.rt6_next) { in rt6_purge_dflt_routers()
1793 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) { in rt6_purge_dflt_routers()
1794 dst_hold(&rt->u.dst); in rt6_purge_dflt_routers()
1796 ip6_del_rt(rt); in rt6_purge_dflt_routers()
1923 struct rt6_info *rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops); in addrconf_dst_alloc() local
1926 if (rt == NULL) in addrconf_dst_alloc()
1932 rt->u.dst.flags = DST_HOST; in addrconf_dst_alloc()
1933 rt->u.dst.input = ip6_input; in addrconf_dst_alloc()
1934 rt->u.dst.output = ip6_output; in addrconf_dst_alloc()
1935 rt->rt6i_dev = net->loopback_dev; in addrconf_dst_alloc()
1936 rt->rt6i_idev = idev; in addrconf_dst_alloc()
1937 rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); in addrconf_dst_alloc()
1938 rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); in addrconf_dst_alloc()
1939 rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1; in addrconf_dst_alloc()
1940 rt->u.dst.obsolete = -1; in addrconf_dst_alloc()
1942 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; in addrconf_dst_alloc()
1944 rt->rt6i_flags |= RTF_ANYCAST; in addrconf_dst_alloc()
1946 rt->rt6i_flags |= RTF_LOCAL; in addrconf_dst_alloc()
1947 neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); in addrconf_dst_alloc()
1949 dst_free(&rt->u.dst); in addrconf_dst_alloc()
1958 rt->rt6i_nexthop = neigh; in addrconf_dst_alloc()
1960 ipv6_addr_copy(&rt->rt6i_dst.addr, addr); in addrconf_dst_alloc()
1961 rt->rt6i_dst.plen = 128; in addrconf_dst_alloc()
1962 rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); in addrconf_dst_alloc()
1964 atomic_set(&rt->u.dst.__refcnt, 1); in addrconf_dst_alloc()
1966 return rt; in addrconf_dst_alloc()
1974 static int fib6_ifdown(struct rt6_info *rt, void *arg) in fib6_ifdown() argument
1979 if (((void *)rt->rt6i_dev == dev || dev == NULL) && in fib6_ifdown()
1980 rt != net->ipv6.ip6_null_entry) { in fib6_ifdown()
1981 RT6_TRACE("deleted by ifdown %p\n", rt); in fib6_ifdown()
2004 static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg) in rt6_mtu_change_route() argument
2034 if (rt->rt6i_dev == arg->dev && in rt6_mtu_change_route()
2035 !dst_metric_locked(&rt->u.dst, RTAX_MTU) && in rt6_mtu_change_route()
2036 (dst_mtu(&rt->u.dst) >= arg->mtu || in rt6_mtu_change_route()
2037 (dst_mtu(&rt->u.dst) < arg->mtu && in rt6_mtu_change_route()
2038 dst_mtu(&rt->u.dst) == idev->cnf.mtu6))) { in rt6_mtu_change_route()
2039 rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu; in rt6_mtu_change_route()
2040 rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, arg->mtu); in rt6_mtu_change_route()
2173 struct sk_buff *skb, struct rt6_info *rt, in rt6_fill_node() argument
2184 if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { in rt6_fill_node()
2196 rtm->rtm_dst_len = rt->rt6i_dst.plen; in rt6_fill_node()
2197 rtm->rtm_src_len = rt->rt6i_src.plen; in rt6_fill_node()
2199 if (rt->rt6i_table) in rt6_fill_node()
2200 table = rt->rt6i_table->tb6_id; in rt6_fill_node()
2205 if (rt->rt6i_flags&RTF_REJECT) in rt6_fill_node()
2207 else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK)) in rt6_fill_node()
2213 rtm->rtm_protocol = rt->rt6i_protocol; in rt6_fill_node()
2214 if (rt->rt6i_flags&RTF_DYNAMIC) in rt6_fill_node()
2216 else if (rt->rt6i_flags & RTF_ADDRCONF) in rt6_fill_node()
2218 else if (rt->rt6i_flags&RTF_DEFAULT) in rt6_fill_node()
2221 if (rt->rt6i_flags&RTF_CACHE) in rt6_fill_node()
2228 NLA_PUT(skb, RTA_DST, 16, &rt->rt6i_dst.addr); in rt6_fill_node()
2234 NLA_PUT(skb, RTA_SRC, 16, &rt->rt6i_src.addr); in rt6_fill_node()
2238 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) { in rt6_fill_node()
2254 struct inet6_dev *idev = ip6_dst_idev(&rt->u.dst); in rt6_fill_node()
2261 if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) in rt6_fill_node()
2264 if (rt->u.dst.neighbour) in rt6_fill_node()
2265 NLA_PUT(skb, RTA_GATEWAY, 16, &rt->u.dst.neighbour->primary_key); in rt6_fill_node()
2267 if (rt->u.dst.dev) in rt6_fill_node()
2268 NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); in rt6_fill_node()
2270 NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); in rt6_fill_node()
2272 if (!(rt->rt6i_flags & RTF_EXPIRES)) in rt6_fill_node()
2274 else if (rt->rt6i_expires - jiffies < INT_MAX) in rt6_fill_node()
2275 expires = rt->rt6i_expires - jiffies; in rt6_fill_node()
2279 if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, in rt6_fill_node()
2280 expires, rt->u.dst.error) < 0) in rt6_fill_node()
2290 int rt6_dump_route(struct rt6_info *rt, void *p_arg) in rt6_dump_route() argument
2302 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, in rt6_dump_route()
2311 struct rt6_info *rt; in inet6_rtm_getroute() local
2365 rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); in inet6_rtm_getroute()
2366 skb->dst = &rt->u.dst; in inet6_rtm_getroute()
2368 err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, in inet6_rtm_getroute()
2381 void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info) in inet6_rt_notify() argument
2395 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0, in inet6_rt_notify()
2447 static int rt6_info_route(struct rt6_info *rt, void *p_arg) in rt6_info_route() argument
2451 seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); in rt6_info_route()
2454 seq_printf(m, "%pi6 %02x ", &rt->rt6i_src.addr, rt->rt6i_src.plen); in rt6_info_route()
2459 if (rt->rt6i_nexthop) { in rt6_info_route()
2460 seq_printf(m, "%pi6", rt->rt6i_nexthop->primary_key); in rt6_info_route()
2465 rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt), in rt6_info_route()
2466 rt->u.dst.__use, rt->rt6i_flags, in rt6_info_route()
2467 rt->rt6i_dev ? rt->rt6i_dev->name : ""); in rt6_info_route()