Lines Matching refs:nhc

163 static void free_nh_exceptions(struct fib_nh_common *nhc)  in free_nh_exceptions()  argument
168 hash = rcu_dereference_protected(nhc->nhc_exceptions, 1); in free_nh_exceptions()
210 void fib_nh_common_release(struct fib_nh_common *nhc) in fib_nh_common_release() argument
212 if (nhc->nhc_dev) in fib_nh_common_release()
213 dev_put(nhc->nhc_dev); in fib_nh_common_release()
215 lwtstate_put(nhc->nhc_lwtstate); in fib_nh_common_release()
216 rt_fibinfo_free_cpus(nhc->nhc_pcpu_rth_output); in fib_nh_common_release()
217 rt_fibinfo_free(&nhc->nhc_rth_input); in fib_nh_common_release()
218 free_nh_exceptions(nhc); in fib_nh_common_release()
492 struct fib_nh_common *nhc = fib_info_nhc(fi, i); in fib_nlmsg_size() local
494 if (nhc->nhc_lwtstate) { in fib_nlmsg_size()
497 nhc->nhc_lwtstate); in fib_nlmsg_size()
551 const struct fib_nh_common *nhc = fib_info_nhc(fi, 0); in fib_detect_death() local
555 if (likely(nhc->nhc_gw_family == AF_INET)) in fib_detect_death()
556 n = neigh_lookup(&arp_tbl, &nhc->nhc_gw.ipv4, nhc->nhc_dev); in fib_detect_death()
557 else if (nhc->nhc_gw_family == AF_INET6) in fib_detect_death()
558 n = neigh_lookup(ipv6_stub->nd_tbl, &nhc->nhc_gw.ipv6, in fib_detect_death()
559 nhc->nhc_dev); in fib_detect_death()
581 int fib_nh_common_init(struct net *net, struct fib_nh_common *nhc, in fib_nh_common_init() argument
588 nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *, in fib_nh_common_init()
590 if (!nhc->nhc_pcpu_rth_output) in fib_nh_common_init()
602 nhc->nhc_family, cfg, &lwtstate, in fib_nh_common_init()
607 nhc->nhc_lwtstate = lwtstate_get(lwtstate); in fib_nh_common_init()
613 rt_fibinfo_free_cpus(nhc->nhc_pcpu_rth_output); in fib_nh_common_init()
614 nhc->nhc_pcpu_rth_output = NULL; in fib_nh_common_init()
1341 __be32 fib_info_update_nhc_saddr(struct net *net, struct fib_nh_common *nhc, in fib_info_update_nhc_saddr() argument
1346 if (nhc->nhc_family != AF_INET) in fib_info_update_nhc_saddr()
1347 return inet_select_addr(nhc->nhc_dev, 0, scope); in fib_info_update_nhc_saddr()
1349 nh = container_of(nhc, struct fib_nh, nh_common); in fib_info_update_nhc_saddr()
1358 struct fib_nh_common *nhc = res->nhc; in fib_result_prefsrc() local
1363 if (nhc->nhc_family == AF_INET) { in fib_result_prefsrc()
1366 nh = container_of(nhc, struct fib_nh, nh_common); in fib_result_prefsrc()
1371 return fib_info_update_nhc_saddr(net, nhc, res->fi->fib_scope); in fib_result_prefsrc()
1645 int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nhc, in fib_nexthop_info() argument
1648 if (nhc->nhc_flags & RTNH_F_DEAD) in fib_nexthop_info()
1651 if (nhc->nhc_flags & RTNH_F_LINKDOWN) { in fib_nexthop_info()
1655 switch (nhc->nhc_family) { in fib_nexthop_info()
1657 if (ip_ignore_linkdown(nhc->nhc_dev)) in fib_nexthop_info()
1661 if (ip6_ignore_linkdown(nhc->nhc_dev)) in fib_nexthop_info()
1668 switch (nhc->nhc_gw_family) { in fib_nexthop_info()
1670 if (nla_put_in_addr(skb, RTA_GATEWAY, nhc->nhc_gw.ipv4)) in fib_nexthop_info()
1677 if (rt_family != nhc->nhc_gw_family) { in fib_nexthop_info()
1688 memcpy(via->rtvia_addr, &nhc->nhc_gw.ipv6, alen); in fib_nexthop_info()
1690 &nhc->nhc_gw.ipv6) < 0) { in fib_nexthop_info()
1696 *flags |= (nhc->nhc_flags & RTNH_F_ONLINK); in fib_nexthop_info()
1697 if (nhc->nhc_flags & RTNH_F_OFFLOAD) in fib_nexthop_info()
1700 if (!skip_oif && nhc->nhc_dev && in fib_nexthop_info()
1701 nla_put_u32(skb, RTA_OIF, nhc->nhc_dev->ifindex)) in fib_nexthop_info()
1704 if (nhc->nhc_lwtstate && in fib_nexthop_info()
1705 lwtunnel_fill_encap(skb, nhc->nhc_lwtstate, in fib_nexthop_info()
1717 int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc, in fib_add_nexthop() argument
1720 const struct net_device *dev = nhc->nhc_dev; in fib_add_nexthop()
1731 if (fib_nexthop_info(skb, nhc, rt_family, &flags, true) < 0) in fib_add_nexthop()
1842 const struct fib_nh_common *nhc = fib_info_nhc(fi, 0); in fib_dump_info() local
1845 if (fib_nexthop_info(skb, nhc, AF_INET, &flags, false) < 0) in fib_dump_info()
1850 if (nhc->nhc_family == AF_INET) { in fib_dump_info()
1853 nh = container_of(nhc, struct fib_nh, nh_common); in fib_dump_info()
1946 void fib_nhc_update_mtu(struct fib_nh_common *nhc, u32 new, u32 orig) in fib_nhc_update_mtu() argument
1951 bucket = rcu_dereference_protected(nhc->nhc_exceptions, 1); in fib_nhc_update_mtu()
2072 struct fib_nh_common *nhc; in fib_select_default() local
2095 nhc = fib_info_nhc(next_fi, 0); in fib_select_default()
2096 if (!nhc->nhc_gw_family || nhc->nhc_scope != RT_SCOPE_LINK) in fib_select_default()
2243 res->nhc = &nexthop_nh->nh_common; in fib_select_multipath()
2252 res->nhc = &nexthop_nh->nh_common; in fib_select_multipath()