static bool
pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
- const struct pbr_nht_individual *pnhi)
+ struct pbr_nht_individual *pnhi)
{
bool is_valid = pnhc->valid;
break;
}
+ pnhi->nhr_matched = true;
if (!pnhi->nhr->nexthop_num) {
is_valid = false;
goto done;
return pnhc->valid;
}
-static bool pbr_nht_individual_nexthop_interface_update(
- struct pbr_nexthop_cache *pnhc, const struct pbr_nht_individual *pnhi)
+static bool
+pbr_nht_individual_nexthop_interface_update(struct pbr_nexthop_cache *pnhc,
+ struct pbr_nht_individual *pnhi)
{
bool is_valid = pnhc->valid;
!= pnhi->ifp->ifindex) /* Un-related interface */
goto done;
+ pnhi->nhr_matched = true;
is_valid = !!if_is_up(pnhi->ifp);
done:
* If the update is un-related, the subroutines shoud just return their cached
* valid state.
*/
-static void
-pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc,
- const struct pbr_nht_individual *pnhi)
+static void pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc,
+ struct pbr_nht_individual *pnhi)
{
assert(pnhi->nhr || pnhi->ifp); /* Either nexthop or interface update */
pnhi.nhr = (struct zapi_route *)data;
pnhi.valid = 0;
+ pnhi.nhr_matched = false;
hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_update_lookup,
&pnhi);
+ if (!pnhi.nhr_matched)
+ return;
+
/*
* If any of the specified nexthops are valid we are valid
*/