Lines Matching refs:nhi
59 static void nexthop_devhash_add(struct net *net, struct nh_info *nhi) in nexthop_devhash_add() argument
61 struct net_device *dev = nhi->fib_nhc.nhc_dev; in nexthop_devhash_add()
69 hlist_add_head(&nhi->dev_hash, head); in nexthop_devhash_add()
93 struct nh_info *nhi; in nexthop_free_single() local
95 nhi = rcu_dereference_raw(nh->nh_info); in nexthop_free_single()
96 switch (nhi->family) { in nexthop_free_single()
98 fib_nh_release(nh->net, &nhi->fib_nh); in nexthop_free_single()
101 ipv6_stub->fib6_nh_release(&nhi->fib6_nh); in nexthop_free_single()
104 kfree(nhi); in nexthop_free_single()
230 struct nh_info *nhi; in nh_fill_node() local
257 nhi = rtnl_dereference(nh->nh_info); in nh_fill_node()
258 nhm->nh_family = nhi->family; in nh_fill_node()
259 if (nhi->reject_nh) { in nh_fill_node()
263 } else if (nhi->fdb_nh) { in nh_fill_node()
269 dev = nhi->fib_nhc.nhc_dev; in nh_fill_node()
274 nhm->nh_scope = nhi->fib_nhc.nhc_scope; in nh_fill_node()
275 switch (nhi->family) { in nh_fill_node()
277 fib_nh = &nhi->fib_nh; in nh_fill_node()
284 fib6_nh = &nhi->fib6_nh; in nh_fill_node()
291 if (nhi->fib_nhc.nhc_lwtstate && in nh_fill_node()
292 lwtunnel_fill_encap(skb, nhi->fib_nhc.nhc_lwtstate, in nh_fill_node()
316 struct nh_info *nhi = rtnl_dereference(nh->nh_info); in nh_nlmsg_size_single() local
324 switch (nhi->family) { in nh_nlmsg_size_single()
326 if (nhi->fib_nh.fib_nh_gw_family) in nh_nlmsg_size_single()
332 if (nhi->fib6_nh.fib_nh_gw_family) in nh_nlmsg_size_single()
337 if (nhi->fib_nhc.nhc_lwtstate) { in nh_nlmsg_size_single()
338 sz += lwtunnel_get_encap_size(nhi->fib_nhc.nhc_lwtstate); in nh_nlmsg_size_single()
402 struct nh_info *nhi = rtnl_dereference(nh->nh_info); in valid_group_nh() local
404 if (nhi->reject_nh && npaths > 1) { in valid_group_nh()
409 *is_fdb = nhi->fdb_nh; in valid_group_nh()
418 struct nh_info *nhi; in nh_check_attr_fdb_group() local
420 nhi = rtnl_dereference(nh->nh_info); in nh_check_attr_fdb_group()
422 if (!nhi->fdb_nh) { in nh_check_attr_fdb_group()
428 *nh_family = nhi->family; in nh_check_attr_fdb_group()
429 } else if (*nh_family != nhi->family) { in nh_check_attr_fdb_group()
554 struct nh_info *nhi; in nexthop_select_path() local
559 nhi = rcu_dereference(nhge->nh->nh_info); in nexthop_select_path()
560 if (nhi->fdb_nh) in nexthop_select_path()
566 switch (nhi->family) { in nexthop_select_path()
568 if (ipv4_good_nh(&nhi->fib_nh)) in nexthop_select_path()
572 if (ipv6_good_nh(&nhi->fib6_nh)) in nexthop_select_path()
589 struct nh_info *nhi; in nexthop_for_each_fib6_nh() local
600 nhi = rcu_dereference_rtnl(nhge->nh->nh_info); in nexthop_for_each_fib6_nh()
601 err = cb(&nhi->fib6_nh, arg); in nexthop_for_each_fib6_nh()
606 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_for_each_fib6_nh()
607 err = cb(&nhi->fib6_nh, arg); in nexthop_for_each_fib6_nh()
629 struct nh_info *nhi; in fib6_check_nexthop() local
649 nhi = rtnl_dereference(nh->nh_info); in fib6_check_nexthop()
650 if (nhi->family == AF_INET) in fib6_check_nexthop()
652 is_fdb_nh = nhi->fdb_nh; in fib6_check_nexthop()
686 static int nexthop_check_scope(struct nh_info *nhi, u8 scope, in nexthop_check_scope() argument
689 if (scope == RT_SCOPE_HOST && nhi->fib_nhc.nhc_gw_family) { in nexthop_check_scope()
695 if (nhi->fib_nhc.nhc_flags & RTNH_F_ONLINK && scope >= RT_SCOPE_LINK) { in nexthop_check_scope()
710 struct nh_info *nhi; in fib_check_nexthop() local
730 nhi = rtnl_dereference(nhg->nh_entries[0].nh->nh_info); in fib_check_nexthop()
731 err = nexthop_check_scope(nhi, scope, extack); in fib_check_nexthop()
733 nhi = rtnl_dereference(nh->nh_info); in fib_check_nexthop()
734 if (nhi->fdb_nh) { in fib_check_nexthop()
739 err = nexthop_check_scope(nhi, scope, extack); in fib_check_nexthop()
809 struct nh_info *nhi; in remove_nh_grp_entry() local
817 nhi = rtnl_dereference(nhges[i].nh->nh_info); in remove_nh_grp_entry()
818 if (nhi->family == AF_INET) in remove_nh_grp_entry()
897 struct nh_info *nhi; in __remove_nexthop() local
899 nhi = rtnl_dereference(nh->nh_info); in __remove_nexthop()
900 if (nhi->fib_nhc.nhc_dev) in __remove_nexthop()
901 hlist_del(&nhi->dev_hash); in __remove_nexthop()
975 struct nh_info *nhi; in nh_group_v4_update() local
977 nhi = rtnl_dereference(nhges[i].nh->nh_info); in nh_group_v4_update()
978 if (nhi->family == AF_INET) in nh_group_v4_update()
1084 struct nh_info *nhi = rtnl_dereference(new->nh_info); in replace_nexthop() local
1086 new_is_reject = nhi->reject_nh; in replace_nexthop()
1192 struct nh_info *nhi; in nexthop_flush_dev() local
1194 hlist_for_each_entry_safe(nhi, n, head, dev_hash) { in nexthop_flush_dev()
1195 if (nhi->fib_nhc.nhc_dev != dev) in nexthop_flush_dev()
1198 if (nhi->reject_nh && in nexthop_flush_dev()
1202 remove_nexthop(net, nhi->nh_parent, NULL); in nexthop_flush_dev()
1256 struct nh_info *nhi; in nexthop_create_group() local
1262 nhi = rtnl_dereference(nhe->nh_info); in nexthop_create_group()
1263 if (nhi->family == AF_INET) in nexthop_create_group()
1298 struct nh_info *nhi, struct nh_config *cfg, in nh_create_ipv4() argument
1301 struct fib_nh *fib_nh = &nhi->fib_nh; in nh_create_ipv4()
1320 if (nhi->fdb_nh) in nh_create_ipv4()
1337 struct nh_info *nhi, struct nh_config *cfg, in nh_create_ipv6() argument
1340 struct fib6_nh *fib6_nh = &nhi->fib6_nh; in nh_create_ipv6()
1374 struct nh_info *nhi; in nexthop_create() local
1382 nhi = kzalloc(sizeof(*nhi), GFP_KERNEL); in nexthop_create()
1383 if (!nhi) { in nexthop_create()
1391 nhi->nh_parent = nh; in nexthop_create()
1392 nhi->family = cfg->nh_family; in nexthop_create()
1393 nhi->fib_nhc.nhc_scope = RT_SCOPE_LINK; in nexthop_create()
1396 nhi->fdb_nh = 1; in nexthop_create()
1399 nhi->reject_nh = 1; in nexthop_create()
1405 err = nh_create_ipv4(net, nh, nhi, cfg, extack); in nexthop_create()
1408 err = nh_create_ipv6(net, nh, nhi, cfg, extack); in nexthop_create()
1413 kfree(nhi); in nexthop_create()
1419 if (!nhi->fdb_nh) in nexthop_create()
1420 nexthop_devhash_add(net, nhi); in nexthop_create()
1422 rcu_assign_pointer(nh->nh_info, nhi); in nexthop_create()
1785 const struct nh_info *nhi; in nh_dump_filtered() local
1796 nhi = rtnl_dereference(nh->nh_info); in nh_dump_filtered()
1797 if (family && nhi->family != family) in nh_dump_filtered()
1800 dev = nhi->fib_nhc.nhc_dev; in nh_dump_filtered()
1933 struct nh_info *nhi; in nexthop_sync_mtu() local
1935 hlist_for_each_entry_safe(nhi, n, head, dev_hash) { in nexthop_sync_mtu()
1936 if (nhi->fib_nhc.nhc_dev == dev) { in nexthop_sync_mtu()
1937 if (nhi->family == AF_INET) in nexthop_sync_mtu()
1938 fib_nhc_update_mtu(&nhi->fib_nhc, dev->mtu, in nexthop_sync_mtu()