Lines Matching refs:rt
35 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt,
41 struct mpls_route *rt = NULL; in mpls_route_input_rcu() local
46 rt = rcu_dereference(platform_label[index]); in mpls_route_input_rcu()
48 return rt; in mpls_route_input_rcu()
62 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh) in __mpls_nh_via() argument
64 u8 *nh0_via = PTR_ALIGN((u8 *)&rt->rt_nh[rt->rt_nhn], VIA_ALEN_ALIGN); in __mpls_nh_via()
65 int nh_index = nh - rt->rt_nh; in __mpls_nh_via()
67 return nh0_via + rt->rt_max_alen * nh_index; in __mpls_nh_via()
70 static const u8 *mpls_nh_via(const struct mpls_route *rt, in mpls_nh_via() argument
73 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
101 static struct mpls_nh *mpls_select_multipath(struct mpls_route *rt, in mpls_select_multipath() argument
114 if (rt->rt_nhn == 1) in mpls_select_multipath()
170 nh_index = hash % rt->rt_nhn; in mpls_select_multipath()
172 return &rt->rt_nh[nh_index]; in mpls_select_multipath()
175 static bool mpls_egress(struct mpls_route *rt, struct sk_buff *skb, in mpls_egress() argument
194 payload_type = rt->rt_payload_type; in mpls_egress()
228 struct mpls_route *rt; in mpls_forward() local
263 rt = mpls_route_input_rcu(net, dec.label); in mpls_forward()
264 if (!rt) in mpls_forward()
267 nh = mpls_select_multipath(rt, skb, dec.bos); in mpls_forward()
305 if (!mpls_egress(rt, skb, dec)) in mpls_forward()
328 mpls_nh_via(rt, nh), skb); in mpls_forward()
368 struct mpls_route *rt; in mpls_rt_alloc() local
370 rt = kzalloc(ALIGN(sizeof(*rt) + num_nh * sizeof(*rt->rt_nh), in mpls_rt_alloc()
374 if (rt) { in mpls_rt_alloc()
375 rt->rt_nhn = num_nh; in mpls_rt_alloc()
376 rt->rt_max_alen = max_alen_aligned; in mpls_rt_alloc()
379 return rt; in mpls_rt_alloc()
382 static void mpls_rt_free(struct mpls_route *rt) in mpls_rt_free() argument
384 if (rt) in mpls_rt_free()
385 kfree_rcu(rt, rt_rcu); in mpls_rt_free()
395 struct mpls_route *rt = new ? new : old; in mpls_notify_route() local
398 if (rt && (index >= MPLS_LABEL_FIRST_UNRESERVED)) in mpls_notify_route()
399 rtmsg_lfib(event, index, rt, nlh, net, portid, nlm_flags); in mpls_notify_route()
407 struct mpls_route *rt; in mpls_route_update() local
412 rt = rtnl_dereference(platform_label[index]); in mpls_route_update()
415 mpls_notify_route(net, index, rt, new, info); in mpls_route_update()
418 mpls_rt_free(rt); in mpls_route_update()
442 struct rtable *rt; in inet_fib_lookup_dev() local
446 rt = ip_route_output(net, daddr.s_addr, 0, 0, 0); in inet_fib_lookup_dev()
447 if (IS_ERR(rt)) in inet_fib_lookup_dev()
448 return ERR_CAST(rt); in inet_fib_lookup_dev()
450 dev = rt->dst.dev; in inet_fib_lookup_dev()
453 ip_rt_put(rt); in inet_fib_lookup_dev()
498 struct mpls_route *rt, in find_outdev() argument
506 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
509 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
530 static int mpls_nh_assign_dev(struct net *net, struct mpls_route *rt, in mpls_nh_assign_dev() argument
536 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
561 struct mpls_route *rt) in mpls_nh_build_from_cfg() argument
564 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg()
581 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
584 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
594 static int mpls_nh_build(struct net *net, struct mpls_route *rt, in mpls_nh_build() argument
612 __mpls_nh_via(rt, nh)); in mpls_nh_build()
619 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
667 struct mpls_route *rt) in mpls_nh_build_multi() argument
675 change_nexthops(rt) { in mpls_nh_build_multi()
699 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
707 } endfor_nexthops(rt); in mpls_nh_build_multi()
709 rt->rt_nhn = nhs; in mpls_nh_build_multi()
721 struct mpls_route *rt, *old; in mpls_route_add() local
769 rt = mpls_rt_alloc(nhs, max_via_alen); in mpls_route_add()
770 if (!rt) in mpls_route_add()
773 rt->rt_protocol = cfg->rc_protocol; in mpls_route_add()
774 rt->rt_payload_type = cfg->rc_payload_type; in mpls_route_add()
777 err = mpls_nh_build_multi(cfg, rt); in mpls_route_add()
779 err = mpls_nh_build_from_cfg(cfg, rt); in mpls_route_add()
783 mpls_route_update(net, index, rt, &cfg->rc_nlinfo); in mpls_route_add()
788 mpls_rt_free(rt); in mpls_route_add()
903 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifdown() local
904 if (!rt) in mpls_ifdown()
906 for_nexthops(rt) { in mpls_ifdown()
910 } endfor_nexthops(rt); in mpls_ifdown()
1221 u32 label, struct mpls_route *rt, int flags) in mpls_dump_route() argument
1237 rtm->rtm_protocol = rt->rt_protocol; in mpls_dump_route()
1244 if (rt->rt_nhn == 1) { in mpls_dump_route()
1245 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route()
1252 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
1266 for_nexthops(rt) { in mpls_dump_route()
1280 mpls_nh_via(rt, nh), in mpls_dump_route()
1286 } endfor_nexthops(rt); in mpls_dump_route()
1315 struct mpls_route *rt; in mpls_dump_routes() local
1316 rt = rtnl_dereference(platform_label[index]); in mpls_dump_routes()
1317 if (!rt) in mpls_dump_routes()
1322 index, rt, NLM_F_MULTI) < 0) in mpls_dump_routes()
1330 static inline size_t lfib_nlmsg_size(struct mpls_route *rt) in lfib_nlmsg_size() argument
1336 if (rt->rt_nhn == 1) { in lfib_nlmsg_size()
1337 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size()
1349 for_nexthops(rt) { in lfib_nlmsg_size()
1356 } endfor_nexthops(rt); in lfib_nlmsg_size()
1364 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, in rtmsg_lfib() argument
1372 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in rtmsg_lfib()
1376 err = mpls_dump_route(skb, portid, seq, event, label, rt, nlm_flags); in rtmsg_lfib()
1568 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_net_exit() local
1570 mpls_rt_free(rt); in mpls_net_exit()