Lines Matching +full:dsa +full:- +full:v4
1 /* SPDX-License-Identifier: GPL-2.0 */
5 * Copyright (c) 2017-19 Cumulus Networks
6 * Copyright (c) 2017-19 David Ahern <dsa@cumulusnetworks.com>
144 struct list_head fi_list; /* v4 entries using nh */
264 return refcount_inc_not_zero(&nh->refcnt); in nexthop_get()
269 if (refcount_dec_and_test(&nh->refcnt)) in nexthop_put()
270 call_rcu_hurry(&nh->rcu, nexthop_free_rcu); in nexthop_put()
281 if (nh->is_group) { in nexthop_is_fdb()
284 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_is_fdb()
285 return nh_grp->fdb_nh; in nexthop_is_fdb()
289 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_is_fdb()
290 return nhi->fdb_nh; in nexthop_is_fdb()
296 if (nh->is_group) { in nexthop_has_v4()
299 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_has_v4()
300 return nh_grp->has_v4; in nexthop_has_v4()
307 if (nh->is_group) { in nexthop_is_multipath()
310 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_is_multipath()
311 return nh_grp->is_multipath; in nexthop_is_multipath()
322 if (nh->is_group) { in nexthop_num_path()
325 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_num_path()
326 if (nh_grp->is_multipath) in nexthop_num_path()
327 rc = nh_grp->num_nh; in nexthop_num_path()
339 if (nhsel >= nhg->num_nh) in nexthop_mpath_select()
342 return nhg->nh_entries[nhsel].nh; in nexthop_mpath_select()
349 struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp); in nexthop_mpath_fill_node()
352 for (i = 0; i < nhg->num_nh; i++) { in nexthop_mpath_fill_node()
353 struct nexthop *nhe = nhg->nh_entries[i].nh; in nexthop_mpath_fill_node()
354 struct nh_info *nhi = rcu_dereference_rtnl(nhe->nh_info); in nexthop_mpath_fill_node()
355 struct fib_nh_common *nhc = &nhi->fib_nhc; in nexthop_mpath_fill_node()
356 int weight = nhg->nh_entries[i].weight; in nexthop_mpath_fill_node()
359 return -EMSGSIZE; in nexthop_mpath_fill_node()
370 if (nh->is_group) { in nexthop_is_blackhole()
373 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_is_blackhole()
374 if (nh_grp->num_nh > 1) in nexthop_is_blackhole()
377 nh = nh_grp->nh_entries[0].nh; in nexthop_is_blackhole()
380 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_is_blackhole()
381 return nhi->reject_nh; in nexthop_is_blackhole()
389 nh = nexthop_select_path(res->fi->nh, hash); in nexthop_path_fib_result()
390 nhi = rcu_dereference(nh->nh_info); in nexthop_path_fib_result()
391 res->nhc = &nhi->fib_nhc; in nexthop_path_fib_result()
403 if (nh->is_group) { in nexthop_fib_nhc()
406 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_fib_nhc()
407 if (nh_grp->is_multipath) { in nexthop_fib_nhc()
414 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_fib_nhc()
415 return &nhi->fib_nhc; in nexthop_fib_nhc()
427 if (nh->is_group) { in nexthop_get_nhc_lookup()
428 struct nh_group *nhg = rcu_dereference(nh->nh_grp); in nexthop_get_nhc_lookup()
431 for (i = 0; i < nhg->num_nh; i++) { in nexthop_get_nhc_lookup()
432 struct nexthop *nhe = nhg->nh_entries[i].nh; in nexthop_get_nhc_lookup()
434 nhi = rcu_dereference(nhe->nh_info); in nexthop_get_nhc_lookup()
435 if (fib_lookup_good_nhc(&nhi->fib_nhc, fib_flags, flp)) { in nexthop_get_nhc_lookup()
437 return &nhi->fib_nhc; in nexthop_get_nhc_lookup()
441 nhi = rcu_dereference(nh->nh_info); in nexthop_get_nhc_lookup()
442 if (fib_lookup_good_nhc(&nhi->fib_nhc, fib_flags, flp)) { in nexthop_get_nhc_lookup()
444 return &nhi->fib_nhc; in nexthop_get_nhc_lookup()
456 if (nh->is_group) { in nexthop_uses_dev()
457 struct nh_group *nhg = rcu_dereference(nh->nh_grp); in nexthop_uses_dev()
460 for (i = 0; i < nhg->num_nh; i++) { in nexthop_uses_dev()
461 struct nexthop *nhe = nhg->nh_entries[i].nh; in nexthop_uses_dev()
463 nhi = rcu_dereference(nhe->nh_info); in nexthop_uses_dev()
464 if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev)) in nexthop_uses_dev()
468 nhi = rcu_dereference(nh->nh_info); in nexthop_uses_dev()
469 if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev)) in nexthop_uses_dev()
478 if (unlikely(fi->nh)) in fib_info_num_path()
479 return nexthop_num_path(fi->nh); in fib_info_num_path()
481 return fi->fib_nhs; in fib_info_num_path()
489 if (unlikely(fi->nh)) in fib_info_nhc()
490 return nexthop_fib_nhc(fi->nh, nhsel); in fib_info_nhc()
492 return &fi->fib_nh[nhsel].nh_common; in fib_info_nhc()
498 WARN_ON(fi->nh); in fib_info_nh()
500 return &fi->fib_nh[nhsel]; in fib_info_nh()
514 if (nh->is_group) { in nexthop_fib6_nh()
517 nh_grp = rcu_dereference_rtnl(nh->nh_grp); in nexthop_fib6_nh()
523 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_fib6_nh()
524 if (nhi->family == AF_INET6) in nexthop_fib6_nh()
525 return &nhi->fib6_nh; in nexthop_fib6_nh()
534 fib6_nh = f6i->nh ? nexthop_fib6_nh(f6i->nh) : f6i->fib6_nh; in fib6_info_nh_dev()
535 return fib6_nh->fib_nh_dev; in fib6_info_nh_dev()
540 struct nexthop *nh = res->f6i->nh; in nexthop_path_fib6_result()
545 nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_path_fib6_result()
546 if (nhi->reject_nh) { in nexthop_path_fib6_result()
547 res->fib6_type = RTN_BLACKHOLE; in nexthop_path_fib6_result()
548 res->fib6_flags |= RTF_REJECT; in nexthop_path_fib6_result()
549 res->nh = nexthop_fib6_nh(nh); in nexthop_path_fib6_result()
551 res->nh = &nhi->fib6_nh; in nexthop_path_fib6_result()
561 struct nh_info *nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_get_family()
563 return nhi->family; in nexthop_get_family()
569 struct nh_info *nhi = rcu_dereference_rtnl(nh->nh_info); in nexthop_fdb_nhc()
571 return &nhi->fib_nhc; in nexthop_fdb_nhc()
583 nhi = rcu_dereference(nhp->nh_info); in nexthop_path_fdb_result()
584 return &nhi->fib_nhc; in nexthop_path_fdb_result()