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 */
266 return refcount_inc_not_zero(&nh->refcnt);
271 if (refcount_dec_and_test(&nh->refcnt))
272 call_rcu_hurry(&nh->rcu, nexthop_free_rcu);
283 if (nh->is_group) {
286 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
287 return nh_grp->fdb_nh;
291 nhi = rcu_dereference_rtnl(nh->nh_info);
292 return nhi->fdb_nh;
298 if (nh->is_group) {
301 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
302 return nh_grp->has_v4;
309 if (nh->is_group) {
312 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
313 return nh_grp->is_multipath;
324 if (nh->is_group) {
327 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
328 if (nh_grp->is_multipath)
329 rc = nh_grp->num_nh;
341 if (nhsel >= nhg->num_nh)
344 return nhg->nh_entries[nhsel].nh;
351 struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp);
354 for (i = 0; i < nhg->num_nh; i++) {
355 struct nexthop *nhe = nhg->nh_entries[i].nh;
356 struct nh_info *nhi = rcu_dereference_rtnl(nhe->nh_info);
357 struct fib_nh_common *nhc = &nhi->fib_nhc;
358 int weight = nhg->nh_entries[i].weight;
361 return -EMSGSIZE;
372 if (nh->is_group) {
375 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
376 if (nh_grp->num_nh > 1)
379 nh = nh_grp->nh_entries[0].nh;
382 nhi = rcu_dereference_rtnl(nh->nh_info);
383 return nhi->reject_nh;
391 nh = nexthop_select_path(res->fi->nh, hash);
392 nhi = rcu_dereference(nh->nh_info);
393 res->nhc = &nhi->fib_nhc;
405 if (nh->is_group) {
408 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
409 if (nh_grp->is_multipath) {
416 nhi = rcu_dereference_rtnl(nh->nh_info);
417 return &nhi->fib_nhc;
429 if (nh->is_group) {
430 struct nh_group *nhg = rcu_dereference(nh->nh_grp);
433 for (i = 0; i < nhg->num_nh; i++) {
434 struct nexthop *nhe = nhg->nh_entries[i].nh;
436 nhi = rcu_dereference(nhe->nh_info);
437 if (fib_lookup_good_nhc(&nhi->fib_nhc, fib_flags, flp)) {
439 return &nhi->fib_nhc;
443 nhi = rcu_dereference(nh->nh_info);
444 if (fib_lookup_good_nhc(&nhi->fib_nhc, fib_flags, flp)) {
446 return &nhi->fib_nhc;
458 if (nh->is_group) {
459 struct nh_group *nhg = rcu_dereference(nh->nh_grp);
462 for (i = 0; i < nhg->num_nh; i++) {
463 struct nexthop *nhe = nhg->nh_entries[i].nh;
465 nhi = rcu_dereference(nhe->nh_info);
466 if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev))
470 nhi = rcu_dereference(nh->nh_info);
471 if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev))
480 if (unlikely(fi->nh))
481 return nexthop_num_path(fi->nh);
483 return fi->fib_nhs;
491 if (unlikely(fi->nh))
492 return nexthop_fib_nhc(fi->nh, nhsel);
494 return &fi->fib_nh[nhsel].nh_common;
500 WARN_ON(fi->nh);
502 return &fi->fib_nh[nhsel];
516 if (nh->is_group) {
519 nh_grp = rcu_dereference_rtnl(nh->nh_grp);
525 nhi = rcu_dereference_rtnl(nh->nh_info);
526 if (nhi->family == AF_INET6)
527 return &nhi->fib6_nh;
536 fib6_nh = f6i->nh ? nexthop_fib6_nh(f6i->nh) : f6i->fib6_nh;
537 return fib6_nh->fib_nh_dev;
542 struct nexthop *nh = res->f6i->nh;
547 nhi = rcu_dereference_rtnl(nh->nh_info);
548 if (nhi->reject_nh) {
549 res->fib6_type = RTN_BLACKHOLE;
550 res->fib6_flags |= RTF_REJECT;
551 res->nh = nexthop_fib6_nh(nh);
553 res->nh = &nhi->fib6_nh;
563 struct nh_info *nhi = rcu_dereference_rtnl(nh->nh_info);
565 return nhi->family;
571 struct nh_info *nhi = rcu_dereference_rtnl(nh->nh_info);
573 return &nhi->fib_nhc;
585 nhi = rcu_dereference(nhp->nh_info);
586 return &nhi->fib_nhc;