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
384 rt = mpls_route_input_rcu(net, dec.label); in mpls_forward()
385 if (!rt) { in mpls_forward()
390 nh = mpls_select_multipath(rt, skb); in mpls_forward()
434 if (!mpls_egress(dev_net(out_dev), rt, skb, dec)) in mpls_forward()
459 mpls_nh_via(rt, nh), skb); in mpls_forward()
511 struct mpls_route *rt; in mpls_rt_alloc() local
514 size = sizeof(*rt) + num_nh * nh_size; in mpls_rt_alloc()
518 rt = kzalloc(size, GFP_KERNEL); in mpls_rt_alloc()
519 if (!rt) in mpls_rt_alloc()
522 rt->rt_nhn = num_nh; in mpls_rt_alloc()
523 rt->rt_nhn_alive = num_nh; in mpls_rt_alloc()
524 rt->rt_nh_size = nh_size; in mpls_rt_alloc()
525 rt->rt_via_offset = MPLS_NH_VIA_OFF(max_labels); in mpls_rt_alloc()
527 return rt; in mpls_rt_alloc()
530 static void mpls_rt_free(struct mpls_route *rt) in mpls_rt_free() argument
532 if (rt) in mpls_rt_free()
533 kfree_rcu(rt, rt_rcu); in mpls_rt_free()
543 struct mpls_route *rt = new ? new : old; in mpls_notify_route() local
546 if (rt && (index >= MPLS_LABEL_FIRST_UNRESERVED)) in mpls_notify_route()
547 rtmsg_lfib(event, index, rt, nlh, net, portid, nlm_flags); in mpls_notify_route()
555 struct mpls_route *rt; in mpls_route_update() local
560 rt = rtnl_dereference(platform_label[index]); in mpls_route_update()
563 mpls_notify_route(net, index, rt, new, info); in mpls_route_update()
566 mpls_rt_free(rt); in mpls_route_update()
590 struct rtable *rt; in inet_fib_lookup_dev() local
594 rt = ip_route_output(net, daddr.s_addr, 0, 0, 0); in inet_fib_lookup_dev()
595 if (IS_ERR(rt)) in inet_fib_lookup_dev()
596 return ERR_CAST(rt); in inet_fib_lookup_dev()
598 dev = rt->dst.dev; in inet_fib_lookup_dev()
601 ip_rt_put(rt); in inet_fib_lookup_dev()
645 struct mpls_route *rt, in find_outdev() argument
653 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
656 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
677 static int mpls_nh_assign_dev(struct net *net, struct mpls_route *rt, in mpls_nh_assign_dev() argument
683 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
766 struct mpls_route *rt) in mpls_nh_build_from_cfg() argument
769 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg()
781 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
784 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
789 rt->rt_nhn_alive--; in mpls_nh_build_from_cfg()
797 static int mpls_nh_build(struct net *net, struct mpls_route *rt, in mpls_nh_build() argument
816 __mpls_nh_via(rt, nh), extack); in mpls_nh_build()
823 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
883 struct mpls_route *rt, u8 max_labels, in mpls_nh_build_multi() argument
892 change_nexthops(rt) { in mpls_nh_build_multi()
916 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
923 rt->rt_nhn_alive--; in mpls_nh_build_multi()
927 } endfor_nexthops(rt); in mpls_nh_build_multi()
929 rt->rt_nhn = nhs; in mpls_nh_build_multi()
965 struct mpls_route *rt, *old; in mpls_route_add() local
1021 rt = mpls_rt_alloc(nhs, max_via_alen, max_labels); in mpls_route_add()
1022 if (IS_ERR(rt)) { in mpls_route_add()
1023 err = PTR_ERR(rt); in mpls_route_add()
1027 rt->rt_protocol = cfg->rc_protocol; in mpls_route_add()
1028 rt->rt_payload_type = cfg->rc_payload_type; in mpls_route_add()
1029 rt->rt_ttl_propagate = cfg->rc_ttl_propagate; in mpls_route_add()
1032 err = mpls_nh_build_multi(cfg, rt, max_labels, extack); in mpls_route_add()
1034 err = mpls_nh_build_from_cfg(cfg, rt); in mpls_route_add()
1038 mpls_route_update(net, index, rt, &cfg->rc_nlinfo); in mpls_route_add()
1043 mpls_rt_free(rt); in mpls_route_add()
1501 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifdown() local
1505 if (!rt) in mpls_ifdown()
1511 for_nexthops(rt) { in mpls_ifdown()
1519 } endfor_nexthops(rt); in mpls_ifdown()
1522 if (deleted == rt->rt_nhn) { in mpls_ifdown()
1528 size_t size = sizeof(*rt) + rt->rt_nhn * in mpls_ifdown()
1529 rt->rt_nh_size; in mpls_ifdown()
1530 struct mpls_route *orig = rt; in mpls_ifdown()
1532 rt = kmalloc(size, GFP_KERNEL); in mpls_ifdown()
1533 if (!rt) in mpls_ifdown()
1535 memcpy(rt, orig, size); in mpls_ifdown()
1539 change_nexthops(rt) { in mpls_ifdown()
1562 } endfor_nexthops(rt); in mpls_ifdown()
1564 WRITE_ONCE(rt->rt_nhn_alive, alive); in mpls_ifdown()
1567 mpls_route_update(net, index, rt, NULL); in mpls_ifdown()
1582 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifup() local
1584 if (!rt) in mpls_ifup()
1588 change_nexthops(rt) { in mpls_ifup()
1602 } endfor_nexthops(rt); in mpls_ifup()
1604 WRITE_ONCE(rt->rt_nhn_alive, alive); in mpls_ifup()
1989 u32 label, struct mpls_route *rt, int flags) in mpls_dump_route() argument
2005 rtm->rtm_protocol = rt->rt_protocol; in mpls_dump_route()
2013 if (rt->rt_ttl_propagate != MPLS_TTL_PROP_DEFAULT) { in mpls_dump_route()
2015 rt->rt_ttl_propagate == MPLS_TTL_PROP_ENABLED; in mpls_dump_route()
2021 if (rt->rt_nhn == 1) { in mpls_dump_route()
2022 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route()
2029 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
2049 for_nexthops(rt) { in mpls_dump_route()
2074 mpls_nh_via(rt, nh), in mpls_dump_route()
2080 } endfor_nexthops(rt); in mpls_dump_route()
2082 if (linkdown == rt->rt_nhn) in mpls_dump_route()
2084 if (dead == rt->rt_nhn) in mpls_dump_route()
2158 static bool mpls_rt_uses_dev(struct mpls_route *rt, in mpls_rt_uses_dev() argument
2163 if (rt->rt_nhn == 1) { in mpls_rt_uses_dev()
2164 struct mpls_nh *nh = rt->rt_nh; in mpls_rt_uses_dev()
2170 for_nexthops(rt) { in mpls_rt_uses_dev()
2174 } endfor_nexthops(rt); in mpls_rt_uses_dev()
2219 struct mpls_route *rt; in mpls_dump_routes() local
2221 rt = rtnl_dereference(platform_label[index]); in mpls_dump_routes()
2222 if (!rt) in mpls_dump_routes()
2225 if ((filter.dev && !mpls_rt_uses_dev(rt, filter.dev)) || in mpls_dump_routes()
2226 (filter.protocol && rt->rt_protocol != filter.protocol)) in mpls_dump_routes()
2231 index, rt, flags) < 0) in mpls_dump_routes()
2239 static inline size_t lfib_nlmsg_size(struct mpls_route *rt) in lfib_nlmsg_size() argument
2246 if (rt->rt_nhn == 1) { in lfib_nlmsg_size()
2247 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size()
2259 for_nexthops(rt) { in lfib_nlmsg_size()
2268 } endfor_nexthops(rt); in lfib_nlmsg_size()
2276 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, in rtmsg_lfib() argument
2284 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in rtmsg_lfib()
2288 err = mpls_dump_route(skb, portid, seq, event, label, rt, nlm_flags); in rtmsg_lfib()
2372 struct mpls_route *rt; in mpls_getroute() local
2401 rt = mpls_route_input_rcu(net, in_label); in mpls_getroute()
2402 if (!rt) { in mpls_getroute()
2408 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in mpls_getroute()
2415 RTM_NEWROUTE, in_label, rt, 0); in mpls_getroute()
2466 nh = mpls_select_multipath(rt, skb); in mpls_getroute()
2491 r->rtm_protocol = rt->rt_protocol; in mpls_getroute()
2503 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_getroute()
2729 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_net_exit() local
2731 mpls_notify_route(net, index, rt, NULL, NULL); in mpls_net_exit()
2732 mpls_rt_free(rt); in mpls_net_exit()