Lines Matching refs:rt
36 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt,
42 struct mpls_route *rt = NULL; in mpls_route_input_rcu() local
47 rt = rcu_dereference(platform_label[index]); in mpls_route_input_rcu()
49 return rt; in mpls_route_input_rcu()
63 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh) in __mpls_nh_via() argument
65 u8 *nh0_via = PTR_ALIGN((u8 *)&rt->rt_nh[rt->rt_nhn], VIA_ALEN_ALIGN); in __mpls_nh_via()
66 int nh_index = nh - rt->rt_nh; in __mpls_nh_via()
68 return nh0_via + rt->rt_max_alen * nh_index; in __mpls_nh_via()
71 static const u8 *mpls_nh_via(const struct mpls_route *rt, in mpls_nh_via() argument
74 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
102 static struct mpls_nh *mpls_select_multipath(struct mpls_route *rt, in mpls_select_multipath() argument
115 if (rt->rt_nhn == 1) in mpls_select_multipath()
171 nh_index = hash % rt->rt_nhn; in mpls_select_multipath()
173 return &rt->rt_nh[nh_index]; in mpls_select_multipath()
176 static bool mpls_egress(struct mpls_route *rt, struct sk_buff *skb, in mpls_egress() argument
195 payload_type = rt->rt_payload_type; in mpls_egress()
229 struct mpls_route *rt; in mpls_forward() local
264 rt = mpls_route_input_rcu(net, dec.label); in mpls_forward()
265 if (!rt) in mpls_forward()
268 nh = mpls_select_multipath(rt, skb, dec.bos); in mpls_forward()
306 if (!mpls_egress(rt, skb, dec)) in mpls_forward()
329 mpls_nh_via(rt, nh), skb); in mpls_forward()
369 struct mpls_route *rt; in mpls_rt_alloc() local
371 rt = kzalloc(ALIGN(sizeof(*rt) + num_nh * sizeof(*rt->rt_nh), in mpls_rt_alloc()
375 if (rt) { in mpls_rt_alloc()
376 rt->rt_nhn = num_nh; in mpls_rt_alloc()
377 rt->rt_max_alen = max_alen_aligned; in mpls_rt_alloc()
380 return rt; in mpls_rt_alloc()
383 static void mpls_rt_free(struct mpls_route *rt) in mpls_rt_free() argument
385 if (rt) in mpls_rt_free()
386 kfree_rcu(rt, rt_rcu); in mpls_rt_free()
396 struct mpls_route *rt = new ? new : old; in mpls_notify_route() local
399 if (rt && (index >= MPLS_LABEL_FIRST_UNRESERVED)) in mpls_notify_route()
400 rtmsg_lfib(event, index, rt, nlh, net, portid, nlm_flags); in mpls_notify_route()
408 struct mpls_route *rt; in mpls_route_update() local
413 rt = rtnl_dereference(platform_label[index]); in mpls_route_update()
416 mpls_notify_route(net, index, rt, new, info); in mpls_route_update()
419 mpls_rt_free(rt); in mpls_route_update()
443 struct rtable *rt; in inet_fib_lookup_dev() local
447 rt = ip_route_output(net, daddr.s_addr, 0, 0, 0); in inet_fib_lookup_dev()
448 if (IS_ERR(rt)) in inet_fib_lookup_dev()
449 return ERR_CAST(rt); in inet_fib_lookup_dev()
451 dev = rt->dst.dev; in inet_fib_lookup_dev()
454 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()
737 struct mpls_route *rt, *old; in mpls_route_add() local
780 rt = mpls_rt_alloc(nhs, max_via_alen); in mpls_route_add()
781 if (!rt) in mpls_route_add()
784 rt->rt_protocol = cfg->rc_protocol; in mpls_route_add()
785 rt->rt_payload_type = cfg->rc_payload_type; in mpls_route_add()
788 err = mpls_nh_build_multi(cfg, rt); in mpls_route_add()
790 err = mpls_nh_build_from_cfg(cfg, rt); in mpls_route_add()
794 mpls_route_update(net, index, rt, &cfg->rc_nlinfo); in mpls_route_add()
799 mpls_rt_free(rt); in mpls_route_add()
909 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifdown() local
910 if (!rt) in mpls_ifdown()
912 for_nexthops(rt) { in mpls_ifdown()
916 } endfor_nexthops(rt); in mpls_ifdown()
1226 u32 label, struct mpls_route *rt, int flags) in mpls_dump_route() argument
1242 rtm->rtm_protocol = rt->rt_protocol; in mpls_dump_route()
1249 if (rt->rt_nhn == 1) { in mpls_dump_route()
1250 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route()
1257 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
1271 for_nexthops(rt) { in mpls_dump_route()
1285 mpls_nh_via(rt, nh), in mpls_dump_route()
1291 } endfor_nexthops(rt); in mpls_dump_route()
1320 struct mpls_route *rt; in mpls_dump_routes() local
1321 rt = rtnl_dereference(platform_label[index]); in mpls_dump_routes()
1322 if (!rt) in mpls_dump_routes()
1327 index, rt, NLM_F_MULTI) < 0) in mpls_dump_routes()
1335 static inline size_t lfib_nlmsg_size(struct mpls_route *rt) in lfib_nlmsg_size() argument
1341 if (rt->rt_nhn == 1) { in lfib_nlmsg_size()
1342 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size()
1354 for_nexthops(rt) { in lfib_nlmsg_size()
1361 } endfor_nexthops(rt); in lfib_nlmsg_size()
1369 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, in rtmsg_lfib() argument
1377 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in rtmsg_lfib()
1381 err = mpls_dump_route(skb, portid, seq, event, label, rt, nlm_flags); in rtmsg_lfib()
1573 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_net_exit() local
1575 mpls_notify_route(net, index, rt, NULL, NULL); in mpls_net_exit()
1576 mpls_rt_free(rt); in mpls_net_exit()