Lines Matching refs:rt

40 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt,
46 struct mpls_route *rt = NULL; in mpls_route_input_rcu() local
51 rt = rcu_dereference(platform_label[index]); in mpls_route_input_rcu()
53 return rt; in mpls_route_input_rcu()
66 static unsigned int mpls_rt_header_size(const struct mpls_route *rt) in mpls_rt_header_size() argument
69 return rt->rt_labels * sizeof(struct mpls_shim_hdr); in mpls_rt_header_size()
89 static bool mpls_egress(struct mpls_route *rt, struct sk_buff *skb, in mpls_egress() argument
141 struct mpls_route *rt; in mpls_forward() local
175 rt = mpls_route_input_rcu(net, dec.label); in mpls_forward()
176 if (!rt) in mpls_forward()
180 out_dev = rcu_dereference(rt->rt_dev); in mpls_forward()
195 new_header_size = mpls_rt_header_size(rt); in mpls_forward()
213 if (!mpls_egress(rt, skb, dec)) in mpls_forward()
223 for (i = rt->rt_labels - 1; i >= 0; i--) { in mpls_forward()
224 hdr[i] = mpls_entry_encode(rt->rt_label[i], dec.ttl, 0, bos); in mpls_forward()
229 err = neigh_xmit(rt->rt_via_table, out_dev, rt->rt_via, skb); in mpls_forward()
265 struct mpls_route *rt; in mpls_rt_alloc() local
267 rt = kzalloc(sizeof(*rt) + alen, GFP_KERNEL); in mpls_rt_alloc()
268 if (rt) in mpls_rt_alloc()
269 rt->rt_via_alen = alen; in mpls_rt_alloc()
270 return rt; in mpls_rt_alloc()
273 static void mpls_rt_free(struct mpls_route *rt) in mpls_rt_free() argument
275 if (rt) in mpls_rt_free()
276 kfree_rcu(rt, rt_rcu); in mpls_rt_free()
286 struct mpls_route *rt = new ? new : old; in mpls_notify_route() local
289 if (rt && (index >= 16)) in mpls_notify_route()
290 rtmsg_lfib(event, index, rt, nlh, net, portid, nlm_flags); in mpls_notify_route()
298 struct mpls_route *rt, *old = NULL; in mpls_route_update() local
303 rt = rtnl_dereference(platform_label[index]); in mpls_route_update()
304 if (!dev || (rt && (rtnl_dereference(rt->rt_dev) == dev))) { in mpls_route_update()
306 old = rt; in mpls_route_update()
335 struct mpls_route *rt, *old; in mpls_route_add() local
395 rt = mpls_rt_alloc(cfg->rc_via_alen); in mpls_route_add()
396 if (!rt) in mpls_route_add()
399 rt->rt_labels = cfg->rc_output_labels; in mpls_route_add()
400 for (i = 0; i < rt->rt_labels; i++) in mpls_route_add()
401 rt->rt_label[i] = cfg->rc_output_label[i]; in mpls_route_add()
402 rt->rt_protocol = cfg->rc_protocol; in mpls_route_add()
403 RCU_INIT_POINTER(rt->rt_dev, dev); in mpls_route_add()
404 rt->rt_via_table = cfg->rc_via_table; in mpls_route_add()
405 memcpy(rt->rt_via, cfg->rc_via, cfg->rc_via_alen); in mpls_route_add()
407 mpls_route_update(net, index, NULL, rt, &cfg->rc_nlinfo); in mpls_route_add()
528 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_ifdown() local
529 if (!rt) in mpls_ifdown()
531 if (rtnl_dereference(rt->rt_dev) != dev) in mpls_ifdown()
533 rt->rt_dev = NULL; in mpls_ifdown()
819 u32 label, struct mpls_route *rt, int flags) in mpls_dump_route() argument
835 rtm->rtm_protocol = rt->rt_protocol; in mpls_dump_route()
840 if (rt->rt_labels && in mpls_dump_route()
841 nla_put_labels(skb, RTA_NEWDST, rt->rt_labels, rt->rt_label)) in mpls_dump_route()
843 if (nla_put_via(skb, rt->rt_via_table, rt->rt_via, rt->rt_via_alen)) in mpls_dump_route()
845 dev = rtnl_dereference(rt->rt_dev); in mpls_dump_route()
875 struct mpls_route *rt; in mpls_dump_routes() local
876 rt = rtnl_dereference(platform_label[index]); in mpls_dump_routes()
877 if (!rt) in mpls_dump_routes()
882 index, rt, NLM_F_MULTI) < 0) in mpls_dump_routes()
890 static inline size_t lfib_nlmsg_size(struct mpls_route *rt) in lfib_nlmsg_size() argument
894 + nla_total_size(2 + rt->rt_via_alen) /* RTA_VIA */ in lfib_nlmsg_size()
896 if (rt->rt_labels) /* RTA_NEWDST */ in lfib_nlmsg_size()
897 payload += nla_total_size(rt->rt_labels * 4); in lfib_nlmsg_size()
898 if (rt->rt_dev) /* RTA_OIF */ in lfib_nlmsg_size()
903 static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, in rtmsg_lfib() argument
911 skb = nlmsg_new(lfib_nlmsg_size(rt), GFP_KERNEL); in rtmsg_lfib()
915 err = mpls_dump_route(skb, portid, seq, event, label, rt, nlm_flags); in rtmsg_lfib()
1099 struct mpls_route *rt = rtnl_dereference(platform_label[index]); in mpls_net_exit() local
1101 mpls_rt_free(rt); in mpls_net_exit()