Lines Matching refs:nh

62 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh)  in __mpls_nh_via()  argument
65 int nh_index = nh - rt->rt_nh; in __mpls_nh_via()
71 const struct mpls_nh *nh) in mpls_nh_via() argument
73 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
76 static unsigned int mpls_nh_header_size(const struct mpls_nh *nh) in mpls_nh_header_size() argument
79 return nh->nh_labels * sizeof(struct mpls_shim_hdr); in mpls_nh_header_size()
229 struct mpls_nh *nh; in mpls_forward() local
267 nh = mpls_select_multipath(rt, skb, dec.bos); in mpls_forward()
268 if (!nh) in mpls_forward()
272 out_dev = rcu_dereference(nh->nh_dev); in mpls_forward()
287 new_header_size = mpls_nh_header_size(nh); in mpls_forward()
315 for (i = nh->nh_labels - 1; i >= 0; i--) { in mpls_forward()
316 hdr[i] = mpls_entry_encode(nh->nh_label[i], in mpls_forward()
323 if (nh->nh_via_table == MPLS_NEIGH_TABLE_UNSPEC) in mpls_forward()
327 err = neigh_xmit(nh->nh_via_table, out_dev, in mpls_forward()
328 mpls_nh_via(rt, nh), skb); in mpls_forward()
499 struct mpls_nh *nh, int oif) in find_outdev() argument
504 switch (nh->nh_via_table) { in find_outdev()
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()
531 struct mpls_nh *nh, int oif) in mpls_nh_assign_dev() argument
536 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
548 if ((nh->nh_via_table == NEIGH_LINK_TABLE) && in mpls_nh_assign_dev()
549 (dev->addr_len != nh->nh_via_alen)) in mpls_nh_assign_dev()
552 RCU_INIT_POINTER(nh->nh_dev, dev); in mpls_nh_assign_dev()
564 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg() local
568 if (!nh) in mpls_nh_build_from_cfg()
576 nh->nh_labels = cfg->rc_output_labels; in mpls_nh_build_from_cfg()
577 for (i = 0; i < nh->nh_labels; i++) in mpls_nh_build_from_cfg()
578 nh->nh_label[i] = cfg->rc_output_label[i]; in mpls_nh_build_from_cfg()
580 nh->nh_via_table = cfg->rc_via_table; 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()
582 nh->nh_via_alen = 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()
595 struct mpls_nh *nh, int oif, in mpls_nh_build() argument
600 if (!nh) in mpls_nh_build()
605 &nh->nh_labels, nh->nh_label); in mpls_nh_build()
611 err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table, in mpls_nh_build()
612 __mpls_nh_via(rt, nh)); in mpls_nh_build()
616 nh->nh_via_table = MPLS_NEIGH_TABLE_UNSPEC; in mpls_nh_build()
619 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
699 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
907 if (rtnl_dereference(nh->nh_dev) != dev) in mpls_ifdown()
909 nh->nh_dev = NULL; in mpls_ifdown()
1245 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route() local
1247 if (nh->nh_labels && in mpls_dump_route()
1248 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_dump_route()
1249 nh->nh_label)) in mpls_dump_route()
1251 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
1252 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
1253 nh->nh_via_alen)) in mpls_dump_route()
1255 dev = rtnl_dereference(nh->nh_dev); in mpls_dump_route()
1271 dev = rtnl_dereference(nh->nh_dev); in mpls_dump_route()
1274 if (nh->nh_labels && nla_put_labels(skb, RTA_NEWDST, in mpls_dump_route()
1275 nh->nh_labels, in mpls_dump_route()
1276 nh->nh_label)) in mpls_dump_route()
1278 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
1279 nla_put_via(skb, nh->nh_via_table, in mpls_dump_route()
1280 mpls_nh_via(rt, nh), in mpls_dump_route()
1281 nh->nh_via_alen)) in mpls_dump_route()
1337 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size() local
1339 if (nh->nh_dev) in lfib_nlmsg_size()
1341 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) /* RTA_VIA */ in lfib_nlmsg_size()
1342 payload += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
1343 if (nh->nh_labels) /* RTA_NEWDST */ in lfib_nlmsg_size()
1344 payload += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
1352 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) in lfib_nlmsg_size()
1353 nhsize += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
1354 if (nh->nh_labels) in lfib_nlmsg_size()
1355 nhsize += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()