• Home
  • Raw
  • Download

Lines Matching refs:rt

73 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt,
79 struct mpls_route *rt = NULL; in mpls_route_input_rcu() local
84 rt = rcu_dereference(platform_label[index]); in mpls_route_input_rcu()
86 return rt; in mpls_route_input_rcu()
95 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh) in __mpls_nh_via() argument
97 return (u8 *)nh + rt->rt_via_offset; in __mpls_nh_via()
100 static const u8 *mpls_nh_via(const struct mpls_route *rt, in mpls_nh_via() argument
103 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
156 static u32 mpls_multipath_hash(struct mpls_route *rt, struct sk_buff *skb) in mpls_multipath_hash() argument
223 static struct mpls_nh *mpls_get_nexthop(struct mpls_route *rt, u8 index) in mpls_get_nexthop() argument
225 return (struct mpls_nh *)((u8 *)rt->rt_nh + index * rt->rt_nh_size); in mpls_get_nexthop()
233 static struct mpls_nh *mpls_select_multipath(struct mpls_route *rt, in mpls_select_multipath() argument
244 if (rt->rt_nhn == 1) in mpls_select_multipath()
245 return rt->rt_nh; in mpls_select_multipath()
247 alive = READ_ONCE(rt->rt_nhn_alive); in mpls_select_multipath()
251 hash = mpls_multipath_hash(rt, skb); in mpls_select_multipath()
253 if (alive == rt->rt_nhn) in mpls_select_multipath()
255 for_nexthops(rt) { in mpls_select_multipath()
263 } endfor_nexthops(rt); in mpls_select_multipath()
266 return mpls_get_nexthop(rt, nh_index); in mpls_select_multipath()
269 static bool mpls_egress(struct net *net, struct mpls_route *rt, in mpls_egress() argument
288 payload_type = rt->rt_payload_type; in mpls_egress()
302 if (rt->rt_ttl_propagate == MPLS_TTL_PROP_ENABLED || in mpls_egress()
303 (rt->rt_ttl_propagate == MPLS_TTL_PROP_DEFAULT && in mpls_egress()
324 if (rt->rt_ttl_propagate == MPLS_TTL_PROP_ENABLED || in mpls_egress()
325 (rt->rt_ttl_propagate == MPLS_TTL_PROP_DEFAULT && in mpls_egress()
346 struct mpls_route *rt; in mpls_forward() local
386 rt = mpls_route_input_rcu(net, dec.label); in mpls_forward()
387 if (!rt) { in mpls_forward()
392 nh = mpls_select_multipath(rt, skb); in mpls_forward()
436 if (!mpls_egress(dev_net(out_dev), rt, skb, dec)) in mpls_forward()
461 mpls_nh_via(rt, nh), skb); in mpls_forward()
513 struct mpls_route *rt; in mpls_rt_alloc() local
516 size = sizeof(*rt) + num_nh * nh_size; in mpls_rt_alloc()
520 rt = kzalloc(size, GFP_KERNEL); in mpls_rt_alloc()
521 if (!rt) in mpls_rt_alloc()
524 rt->rt_nhn = num_nh; in mpls_rt_alloc()
525 rt->rt_nhn_alive = num_nh; in mpls_rt_alloc()
526 rt->rt_nh_size = nh_size; in mpls_rt_alloc()
527 rt->rt_via_offset = MPLS_NH_VIA_OFF(max_labels); in mpls_rt_alloc()
529 return rt; in mpls_rt_alloc()
532 static void mpls_rt_free(struct mpls_route *rt) in mpls_rt_free() argument
534 if (rt) in mpls_rt_free()
535 kfree_rcu(rt, rt_rcu); in mpls_rt_free()
545 struct mpls_route *rt = new ? new : old; in mpls_notify_route() local
548 if (rt && (index >= MPLS_LABEL_FIRST_UNRESERVED)) in mpls_notify_route()
549 rtmsg_lfib(event, index, rt, nlh, net, portid, nlm_flags); in mpls_notify_route()
557 struct mpls_route *rt; in mpls_route_update() local
562 rt = rtnl_dereference(platform_label[index]); in mpls_route_update()
565 mpls_notify_route(net, index, rt, new, info); in mpls_route_update()
568 mpls_rt_free(rt); in mpls_route_update()
592 struct rtable *rt; in inet_fib_lookup_dev() local
596 rt = ip_route_output(net, daddr.s_addr, 0, 0, 0); in inet_fib_lookup_dev()
597 if (IS_ERR(rt)) in inet_fib_lookup_dev()
598 return ERR_CAST(rt); in inet_fib_lookup_dev()
600 dev = rt->dst.dev; in inet_fib_lookup_dev()
603 ip_rt_put(rt); in inet_fib_lookup_dev()
647 struct mpls_route *rt, in find_outdev() argument
655 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
658 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
679 static int mpls_nh_assign_dev(struct net *net, struct mpls_route *rt, in mpls_nh_assign_dev() argument
685 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
768 struct mpls_route *rt) in mpls_nh_build_from_cfg() argument
771 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg()
783 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
786 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
791 rt->rt_nhn_alive--; in mpls_nh_build_from_cfg()
799 static int mpls_nh_build(struct net *net, struct mpls_route *rt, in mpls_nh_build() argument
818 __mpls_nh_via(rt, nh), extack); in mpls_nh_build()
825 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
885 struct mpls_route *rt, u8 max_labels, in mpls_nh_build_multi() argument
894 change_nexthops(rt) { in mpls_nh_build_multi()
918 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
925 rt->rt_nhn_alive--; in mpls_nh_build_multi()
929 } endfor_nexthops(rt); in mpls_nh_build_multi()
931 rt->rt_nhn = nhs; in mpls_nh_build_multi()
967 struct mpls_route *rt, *old; in mpls_route_add() local
1022 rt = mpls_rt_alloc(nhs, max_via_alen, max_labels); in mpls_route_add()
1023 if (IS_ERR(rt)) { in mpls_route_add()
1024 err = PTR_ERR(rt); in mpls_route_add()
1028 rt->rt_protocol = cfg->rc_protocol; in mpls_route_add()
1029 rt->rt_payload_type = cfg->rc_payload_type; in mpls_route_add()
1030 rt->rt_ttl_propagate = cfg->rc_ttl_propagate; in mpls_route_add()
1033 err = mpls_nh_build_multi(cfg, rt, max_labels, extack); in mpls_route_add()
1035 err = mpls_nh_build_from_cfg(cfg, rt); in mpls_route_add()
1039 mpls_route_update(net, index, rt, &cfg->rc_nlinfo); in mpls_route_add()
1044 mpls_rt_free(rt); in mpls_route_add()
1506 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifdown() local
1510 if (!rt) in mpls_ifdown()
1516 for_nexthops(rt) { in mpls_ifdown()
1524 } endfor_nexthops(rt); in mpls_ifdown()
1527 if (deleted == rt->rt_nhn) { in mpls_ifdown()
1533 size_t size = sizeof(*rt) + rt->rt_nhn * in mpls_ifdown()
1534 rt->rt_nh_size; in mpls_ifdown()
1535 struct mpls_route *orig = rt; in mpls_ifdown()
1537 rt = kmalloc(size, GFP_KERNEL); in mpls_ifdown()
1538 if (!rt) in mpls_ifdown()
1540 memcpy(rt, orig, size); in mpls_ifdown()
1544 change_nexthops(rt) { in mpls_ifdown()
1567 } endfor_nexthops(rt); in mpls_ifdown()
1569 WRITE_ONCE(rt->rt_nhn_alive, alive); in mpls_ifdown()
1572 mpls_route_update(net, index, rt, NULL); in mpls_ifdown()
1587 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifup() local
1589 if (!rt) in mpls_ifup()
1593 change_nexthops(rt) { in mpls_ifup()
1607 } endfor_nexthops(rt); in mpls_ifup()
1609 WRITE_ONCE(rt->rt_nhn_alive, alive); in mpls_ifup()
1994 u32 label, struct mpls_route *rt, int flags) in mpls_dump_route() argument
2010 rtm->rtm_protocol = rt->rt_protocol; in mpls_dump_route()
2018 if (rt->rt_ttl_propagate != MPLS_TTL_PROP_DEFAULT) { in mpls_dump_route()
2020 rt->rt_ttl_propagate == MPLS_TTL_PROP_ENABLED; in mpls_dump_route()
2026 if (rt->rt_nhn == 1) { in mpls_dump_route()
2027 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route()
2034 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
2054 for_nexthops(rt) { in mpls_dump_route()
2079 mpls_nh_via(rt, nh), in mpls_dump_route()
2085 } endfor_nexthops(rt); in mpls_dump_route()
2087 if (linkdown == rt->rt_nhn) in mpls_dump_route()
2089 if (dead == rt->rt_nhn) in mpls_dump_route()
2163 static bool mpls_rt_uses_dev(struct mpls_route *rt, in mpls_rt_uses_dev() argument
2168 if (rt->rt_nhn == 1) { in mpls_rt_uses_dev()
2169 struct mpls_nh *nh = rt->rt_nh; in mpls_rt_uses_dev()
2175 for_nexthops(rt) { in mpls_rt_uses_dev()
2179 } endfor_nexthops(rt); in mpls_rt_uses_dev()
2224 struct mpls_route *rt; in mpls_dump_routes() local
2226 rt = rtnl_dereference(platform_label[index]); in mpls_dump_routes()
2227 if (!rt) in mpls_dump_routes()
2230 if ((filter.dev && !mpls_rt_uses_dev(rt, filter.dev)) || in mpls_dump_routes()
2231 (filter.protocol && rt->rt_protocol != filter.protocol)) in mpls_dump_routes()
2236 index, rt, flags) < 0) in mpls_dump_routes()
2244 static inline size_t lfib_nlmsg_size(struct mpls_route *rt) in lfib_nlmsg_size() argument
2251 if (rt->rt_nhn == 1) { in lfib_nlmsg_size()
2252 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size()
2264 for_nexthops(rt) { in lfib_nlmsg_size()
2273 } endfor_nexthops(rt); in lfib_nlmsg_size()
2281 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, in rtmsg_lfib() argument
2289 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in rtmsg_lfib()
2293 err = mpls_dump_route(skb, portid, seq, event, label, rt, nlm_flags); in rtmsg_lfib()
2377 struct mpls_route *rt; in mpls_getroute() local
2406 rt = mpls_route_input_rcu(net, in_label); in mpls_getroute()
2407 if (!rt) { in mpls_getroute()
2413 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in mpls_getroute()
2420 RTM_NEWROUTE, in_label, rt, 0); in mpls_getroute()
2471 nh = mpls_select_multipath(rt, skb); in mpls_getroute()
2496 r->rtm_protocol = rt->rt_protocol; in mpls_getroute()
2508 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_getroute()
2734 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_net_exit() local
2736 mpls_notify_route(net, index, rt, NULL, NULL); in mpls_net_exit()
2737 mpls_rt_free(rt); in mpls_net_exit()