Lines Matching refs: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()
256 unsigned int nh_flags = READ_ONCE(nh->nh_flags); in mpls_select_multipath()
261 return nh; in mpls_select_multipath()
347 struct mpls_nh *nh; in mpls_forward() local
390 nh = mpls_select_multipath(rt, skb); in mpls_forward()
391 if (!nh) in mpls_forward()
411 out_dev = rcu_dereference(nh->nh_dev); in mpls_forward()
416 new_header_size = mpls_nh_header_size(nh); in mpls_forward()
444 for (i = nh->nh_labels - 1; i >= 0; i--) { in mpls_forward()
445 hdr[i] = mpls_entry_encode(nh->nh_label[i], in mpls_forward()
454 if (nh->nh_via_table == MPLS_NEIGH_TABLE_UNSPEC) in mpls_forward()
458 err = neigh_xmit(nh->nh_via_table, out_dev, in mpls_forward()
459 mpls_nh_via(rt, nh), skb); in mpls_forward()
646 struct mpls_nh *nh, int oif) in find_outdev() argument
651 switch (nh->nh_via_table) { in find_outdev()
653 dev = inet_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
656 dev = inet6_fib_lookup_dev(net, mpls_nh_via(rt, nh)); in find_outdev()
678 struct mpls_nh *nh, int oif) in mpls_nh_assign_dev() argument
683 dev = find_outdev(net, rt, nh, oif); in mpls_nh_assign_dev()
695 if ((nh->nh_via_table == NEIGH_LINK_TABLE) && in mpls_nh_assign_dev()
696 (dev->addr_len != nh->nh_via_alen)) in mpls_nh_assign_dev()
699 RCU_INIT_POINTER(nh->nh_dev, dev); in mpls_nh_assign_dev()
702 nh->nh_flags |= RTNH_F_DEAD; in mpls_nh_assign_dev()
708 nh->nh_flags |= RTNH_F_LINKDOWN; in mpls_nh_assign_dev()
769 struct mpls_nh *nh = rt->rt_nh; in mpls_nh_build_from_cfg() local
773 if (!nh) in mpls_nh_build_from_cfg()
776 nh->nh_labels = cfg->rc_output_labels; in mpls_nh_build_from_cfg()
777 for (i = 0; i < nh->nh_labels; i++) in mpls_nh_build_from_cfg()
778 nh->nh_label[i] = cfg->rc_output_label[i]; in mpls_nh_build_from_cfg()
780 nh->nh_via_table = cfg->rc_via_table; in mpls_nh_build_from_cfg()
781 memcpy(__mpls_nh_via(rt, nh), cfg->rc_via, cfg->rc_via_alen); in mpls_nh_build_from_cfg()
782 nh->nh_via_alen = cfg->rc_via_alen; in mpls_nh_build_from_cfg()
784 err = mpls_nh_assign_dev(net, rt, nh, cfg->rc_ifindex); in mpls_nh_build_from_cfg()
788 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_from_cfg()
798 struct mpls_nh *nh, int oif, struct nlattr *via, in mpls_nh_build() argument
804 if (!nh) in mpls_nh_build()
808 err = nla_get_labels(newdst, max_labels, &nh->nh_labels, in mpls_nh_build()
809 nh->nh_label, extack); in mpls_nh_build()
815 err = nla_get_via(via, &nh->nh_via_alen, &nh->nh_via_table, in mpls_nh_build()
816 __mpls_nh_via(rt, nh), extack); in mpls_nh_build()
820 nh->nh_via_table = MPLS_NEIGH_TABLE_UNSPEC; in mpls_nh_build()
823 err = mpls_nh_assign_dev(net, rt, nh, oif); in mpls_nh_build()
916 err = mpls_nh_build(cfg->rc_nlinfo.nl_net, rt, nh, in mpls_nh_build_multi()
922 if (nh->nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) in mpls_nh_build_multi()
1517 rtnl_dereference(nh->nh_dev); in mpls_ifdown()
1544 unsigned int nh_flags = nh->nh_flags; in mpls_ifdown()
1546 if (rtnl_dereference(nh->nh_dev) != dev) in mpls_ifdown()
1559 RCU_INIT_POINTER(nh->nh_dev, NULL); in mpls_ifdown()
1561 if (nh->nh_flags != nh_flags) in mpls_ifdown()
1562 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifdown()
1593 unsigned int nh_flags = nh->nh_flags; in mpls_ifup()
1595 rtnl_dereference(nh->nh_dev); in mpls_ifup()
1605 WRITE_ONCE(nh->nh_flags, nh_flags); in mpls_ifup()
2026 const struct mpls_nh *nh = rt->rt_nh; in mpls_dump_route() local
2028 if (nh->nh_labels && in mpls_dump_route()
2029 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_dump_route()
2030 nh->nh_label)) in mpls_dump_route()
2032 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2033 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_dump_route()
2034 nh->nh_via_alen)) in mpls_dump_route()
2036 dev = rtnl_dereference(nh->nh_dev); in mpls_dump_route()
2039 if (nh->nh_flags & RTNH_F_LINKDOWN) in mpls_dump_route()
2041 if (nh->nh_flags & RTNH_F_DEAD) in mpls_dump_route()
2054 dev = rtnl_dereference(nh->nh_dev); in mpls_dump_route()
2063 if (nh->nh_flags & RTNH_F_LINKDOWN) { in mpls_dump_route()
2067 if (nh->nh_flags & RTNH_F_DEAD) { in mpls_dump_route()
2072 if (nh->nh_labels && nla_put_labels(skb, RTA_NEWDST, in mpls_dump_route()
2073 nh->nh_labels, in mpls_dump_route()
2074 nh->nh_label)) in mpls_dump_route()
2076 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_dump_route()
2077 nla_put_via(skb, nh->nh_via_table, in mpls_dump_route()
2078 mpls_nh_via(rt, nh), in mpls_dump_route()
2079 nh->nh_via_alen)) in mpls_dump_route()
2168 struct mpls_nh *nh = rt->rt_nh; in mpls_rt_uses_dev() local
2170 nh_dev = rtnl_dereference(nh->nh_dev); in mpls_rt_uses_dev()
2175 nh_dev = rtnl_dereference(nh->nh_dev); in mpls_rt_uses_dev()
2251 struct mpls_nh *nh = rt->rt_nh; in lfib_nlmsg_size() local
2253 if (nh->nh_dev) in lfib_nlmsg_size()
2255 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) /* RTA_VIA */ in lfib_nlmsg_size()
2256 payload += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2257 if (nh->nh_labels) /* RTA_NEWDST */ in lfib_nlmsg_size()
2258 payload += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2264 if (!rtnl_dereference(nh->nh_dev)) in lfib_nlmsg_size()
2268 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC) in lfib_nlmsg_size()
2269 nhsize += nla_total_size(2 + nh->nh_via_alen); in lfib_nlmsg_size()
2270 if (nh->nh_labels) in lfib_nlmsg_size()
2271 nhsize += nla_total_size(nh->nh_labels * 4); in lfib_nlmsg_size()
2380 struct mpls_nh *nh; in mpls_getroute() local
2470 nh = mpls_select_multipath(rt, skb); in mpls_getroute()
2471 if (!nh) { in mpls_getroute()
2501 if (nh->nh_labels && in mpls_getroute()
2502 nla_put_labels(skb, RTA_NEWDST, nh->nh_labels, in mpls_getroute()
2503 nh->nh_label)) in mpls_getroute()
2506 if (nh->nh_via_table != MPLS_NEIGH_TABLE_UNSPEC && in mpls_getroute()
2507 nla_put_via(skb, nh->nh_via_table, mpls_nh_via(rt, nh), in mpls_getroute()
2508 nh->nh_via_alen)) in mpls_getroute()
2510 dev = rtnl_dereference(nh->nh_dev); in mpls_getroute()