Lines Matching refs:nh

96 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh)  in __mpls_nh_via()  argument
98 return (u8 *)nh + rt->rt_via_offset; in __mpls_nh_via()
102 const struct mpls_nh *nh) in mpls_nh_via() argument
104 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
107 static unsigned int mpls_nh_header_size(const struct mpls_nh *nh) in mpls_nh_header_size() argument
110 return nh->nh_labels * sizeof(struct mpls_shim_hdr); in mpls_nh_header_size()
257 unsigned int nh_flags = READ_ONCE(nh->nh_flags); in mpls_select_multipath()
262 return nh; in mpls_select_multipath()
347 const struct mpls_nh *nh; in mpls_forward() local
393 nh = mpls_select_multipath(rt, skb); in mpls_forward()
394 if (!nh) in mpls_forward()
413 out_dev = nh->nh_dev; in mpls_forward()
418 new_header_size = mpls_nh_header_size(nh); in mpls_forward()
447 for (i = nh->nh_labels - 1; i >= 0; i--) { in mpls_forward()
448 hdr[i] = mpls_entry_encode(nh->nh_label[i], in mpls_forward()
457 if (nh->nh_via_table == MPLS_NEIGH_TABLE_UNSPEC) in mpls_forward()
461 err = neigh_xmit(nh->nh_via_table, out_dev, in mpls_forward()
462 mpls_nh_via(rt, nh), skb); in mpls_forward()
649 struct mpls_nh *nh, int oif) in find_outdev() argument
654 switch (nh->nh_via_table) { in find_outdev()
656 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
659 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
681 struct mpls_nh *nh, int oif) in mpls_nh_assign_dev() argument
686 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
698 if ((nh->nh_via_table == NEIGH_LINK_TABLE) && in mpls_nh_assign_dev()
699 (dev->addr_len != nh->nh_via_alen)) in mpls_nh_assign_dev()
702 nh->nh_dev = dev; in mpls_nh_assign_dev()
705 nh->nh_flags |= RTNH_F_DEAD; in mpls_nh_assign_dev()
711 nh->nh_flags |= RTNH_F_LINKDOWN; in mpls_nh_assign_dev()
772 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg() local
776 if (!nh) in mpls_nh_build_from_cfg()
779 nh->nh_labels = cfg->rc_output_labels; in mpls_nh_build_from_cfg()
780 for (i = 0; i < nh->nh_labels; i++) in mpls_nh_build_from_cfg()
781 nh->nh_label[i] = cfg->rc_output_label[i]; in mpls_nh_build_from_cfg()
783 nh->nh_via_table = cfg->rc_via_table; in mpls_nh_build_from_cfg()
784 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
785 nh->nh_via_alen = cfg->rc_via_alen; in mpls_nh_build_from_cfg()
787 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
791 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_from_cfg()
801 struct mpls_nh *nh, int oif, struct nlattr *via, in mpls_nh_build() argument
807 if (!nh) in mpls_nh_build()
811 err = nla_get_labels(newdst, max_labels, &nh->nh_labels, in mpls_nh_build()
812 nh->nh_label, extack); in mpls_nh_build()
818 err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table, in mpls_nh_build()
819 __mpls_nh_via(rt, nh), extack); in mpls_nh_build()
823 nh->nh_via_table = MPLS_NEIGH_TABLE_UNSPEC; in mpls_nh_build()
826 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
919 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
925 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_multi()
1519 if (!nh->nh_dev || nh->nh_dev == dev) in mpls_ifdown()
1521 if (nh->nh_dev == dev) in mpls_ifdown()
1543 unsigned int nh_flags = nh->nh_flags; in mpls_ifdown()
1545 if (nh->nh_dev != dev) in mpls_ifdown()
1558 nh->nh_dev = NULL; in mpls_ifdown()
1560 if (nh->nh_flags != nh_flags) in mpls_ifdown()
1561 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifdown()
1592 unsigned int nh_flags = nh->nh_flags; in mpls_ifup()
1598 if (nh->nh_dev != dev) in mpls_ifup()
1602 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifup()
2023 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route() local
2025 if (nh->nh_labels && in mpls_dump_route()
2026 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_dump_route()
2027 nh->nh_label)) in mpls_dump_route()
2029 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2030 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
2031 nh->nh_via_alen)) in mpls_dump_route()
2033 dev = nh->nh_dev; in mpls_dump_route()
2036 if (nh->nh_flags & RTNH_F_LINKDOWN) in mpls_dump_route()
2038 if (nh->nh_flags & RTNH_F_DEAD) in mpls_dump_route()
2051 dev = nh->nh_dev; in mpls_dump_route()
2060 if (nh->nh_flags & RTNH_F_LINKDOWN) { in mpls_dump_route()
2064 if (nh->nh_flags & RTNH_F_DEAD) { in mpls_dump_route()
2069 if (nh->nh_labels && nla_put_labels(skb, RTA_NEWDST, in mpls_dump_route()
2070 nh->nh_labels, in mpls_dump_route()
2071 nh->nh_label)) in mpls_dump_route()
2073 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2074 nla_put_via(skb, nh->nh_via_table, in mpls_dump_route()
2075 mpls_nh_via(rt, nh), in mpls_dump_route()
2076 nh->nh_via_alen)) in mpls_dump_route()
2163 struct mpls_nh *nh = rt->rt_nh; in mpls_rt_uses_dev() local
2165 if (nh->nh_dev == dev) in mpls_rt_uses_dev()
2169 if (nh->nh_dev == dev) in mpls_rt_uses_dev()
2244 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size() local
2246 if (nh->nh_dev) in lfib_nlmsg_size()
2248 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) /* RTA_VIA */ in lfib_nlmsg_size()
2249 payload += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2250 if (nh->nh_labels) /* RTA_NEWDST */ in lfib_nlmsg_size()
2251 payload += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2257 if (!nh->nh_dev) in lfib_nlmsg_size()
2261 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) in lfib_nlmsg_size()
2262 nhsize += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2263 if (nh->nh_labels) in lfib_nlmsg_size()
2264 nhsize += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2368 const struct mpls_nh *nh; in mpls_getroute() local
2463 nh = mpls_select_multipath(rt, skb); in mpls_getroute()
2464 if (!nh) { in mpls_getroute()
2494 if (nh->nh_labels && in mpls_getroute()
2495 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_getroute()
2496 nh->nh_label)) in mpls_getroute()
2499 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_getroute()
2500 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_getroute()
2501 nh->nh_via_alen)) in mpls_getroute()
2503 dev = nh->nh_dev; in mpls_getroute()