Lines Matching full:nh

95 static u8 *__mpls_nh_via(struct mpls_route *rt, struct mpls_nh *nh)  in __mpls_nh_via()  argument
97 return (u8 *)nh + rt->rt_via_offset; in __mpls_nh_via()
101 const struct mpls_nh *nh) in mpls_nh_via() argument
103 return __mpls_nh_via((struct mpls_route *)rt, (struct mpls_nh *)nh); in mpls_nh_via()
106 static unsigned int mpls_nh_header_size(const struct mpls_nh *nh) in mpls_nh_header_size() argument
109 return nh->nh_labels * sizeof(struct mpls_shim_hdr); in mpls_nh_header_size()
229 * a next hop (nh->nh_flags) are modified by netdev event handlers.
256 unsigned int nh_flags = READ_ONCE(nh->nh_flags); in mpls_select_multipath()
261 return nh; in mpls_select_multipath()
346 const struct mpls_nh *nh; in mpls_forward() local
392 nh = mpls_select_multipath(rt, skb); in mpls_forward()
393 if (!nh) in mpls_forward()
412 out_dev = nh->nh_dev; in mpls_forward()
417 new_header_size = mpls_nh_header_size(nh); in mpls_forward()
446 for (i = nh->nh_labels - 1; i >= 0; i--) { in mpls_forward()
447 hdr[i] = mpls_entry_encode(nh->nh_label[i], in mpls_forward()
456 if (nh->nh_via_table == MPLS_NEIGH_TABLE_UNSPEC) in mpls_forward()
460 err = neigh_xmit(nh->nh_via_table, out_dev, in mpls_forward()
461 mpls_nh_via(rt, nh), skb); in mpls_forward()
648 struct mpls_nh *nh, int oif) in find_outdev() argument
653 switch (nh->nh_via_table) { in find_outdev()
655 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
658 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
680 struct mpls_nh *nh, int oif) in mpls_nh_assign_dev() argument
685 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
697 if ((nh->nh_via_table == NEIGH_LINK_TABLE) && in mpls_nh_assign_dev()
698 (dev->addr_len != nh->nh_via_alen)) in mpls_nh_assign_dev()
701 nh->nh_dev = dev; in mpls_nh_assign_dev()
704 nh->nh_flags |= RTNH_F_DEAD; in mpls_nh_assign_dev()
710 nh->nh_flags |= RTNH_F_LINKDOWN; in mpls_nh_assign_dev()
771 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg() local
775 if (!nh) in mpls_nh_build_from_cfg()
778 nh->nh_labels = cfg->rc_output_labels; in mpls_nh_build_from_cfg()
779 for (i = 0; i < nh->nh_labels; i++) in mpls_nh_build_from_cfg()
780 nh->nh_label[i] = cfg->rc_output_label[i]; in mpls_nh_build_from_cfg()
782 nh->nh_via_table = cfg->rc_via_table; in mpls_nh_build_from_cfg()
783 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
784 nh->nh_via_alen = cfg->rc_via_alen; in mpls_nh_build_from_cfg()
786 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
790 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_from_cfg()
800 struct mpls_nh *nh, int oif, struct nlattr *via, in mpls_nh_build() argument
806 if (!nh) in mpls_nh_build()
810 err = nla_get_labels(newdst, max_labels, &nh->nh_labels, in mpls_nh_build()
811 nh->nh_label, extack); in mpls_nh_build()
817 err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table, in mpls_nh_build()
818 __mpls_nh_via(rt, nh), extack); in mpls_nh_build()
822 nh->nh_via_table = MPLS_NEIGH_TABLE_UNSPEC; in mpls_nh_build()
825 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
918 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
924 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_multi()
1513 if (!nh->nh_dev || nh->nh_dev == dev) in mpls_ifdown()
1515 if (nh->nh_dev == dev) in mpls_ifdown()
1537 unsigned int nh_flags = nh->nh_flags; in mpls_ifdown()
1539 if (nh->nh_dev != dev) in mpls_ifdown()
1552 nh->nh_dev = NULL; in mpls_ifdown()
1554 if (nh->nh_flags != nh_flags) in mpls_ifdown()
1555 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifdown()
1586 unsigned int nh_flags = nh->nh_flags; in mpls_ifup()
1592 if (nh->nh_dev != dev) in mpls_ifup()
1596 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifup()
2017 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route() local
2019 if (nh->nh_labels && in mpls_dump_route()
2020 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_dump_route()
2021 nh->nh_label)) in mpls_dump_route()
2023 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2024 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
2025 nh->nh_via_alen)) in mpls_dump_route()
2027 dev = nh->nh_dev; in mpls_dump_route()
2030 if (nh->nh_flags & RTNH_F_LINKDOWN) in mpls_dump_route()
2032 if (nh->nh_flags & RTNH_F_DEAD) in mpls_dump_route()
2045 dev = nh->nh_dev; in mpls_dump_route()
2054 if (nh->nh_flags & RTNH_F_LINKDOWN) { in mpls_dump_route()
2058 if (nh->nh_flags & RTNH_F_DEAD) { in mpls_dump_route()
2063 if (nh->nh_labels && nla_put_labels(skb, RTA_NEWDST, in mpls_dump_route()
2064 nh->nh_labels, in mpls_dump_route()
2065 nh->nh_label)) in mpls_dump_route()
2067 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2068 nla_put_via(skb, nh->nh_via_table, in mpls_dump_route()
2069 mpls_nh_via(rt, nh), in mpls_dump_route()
2070 nh->nh_via_alen)) in mpls_dump_route()
2157 struct mpls_nh *nh = rt->rt_nh; in mpls_rt_uses_dev() local
2159 if (nh->nh_dev == dev) in mpls_rt_uses_dev()
2163 if (nh->nh_dev == dev) in mpls_rt_uses_dev()
2238 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size() local
2240 if (nh->nh_dev) in lfib_nlmsg_size()
2242 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) /* RTA_VIA */ in lfib_nlmsg_size()
2243 payload += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2244 if (nh->nh_labels) /* RTA_NEWDST */ in lfib_nlmsg_size()
2245 payload += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2251 if (!nh->nh_dev) in lfib_nlmsg_size()
2255 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) in lfib_nlmsg_size()
2256 nhsize += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2257 if (nh->nh_labels) in lfib_nlmsg_size()
2258 nhsize += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2362 const struct mpls_nh *nh; in mpls_getroute() local
2457 nh = mpls_select_multipath(rt, skb); in mpls_getroute()
2458 if (!nh) { in mpls_getroute()
2488 if (nh->nh_labels && in mpls_getroute()
2489 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_getroute()
2490 nh->nh_label)) in mpls_getroute()
2493 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_getroute()
2494 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_getroute()
2495 nh->nh_via_alen)) in mpls_getroute()
2497 dev = nh->nh_dev; in mpls_getroute()