struct bgp_pbr_action *bpa_found;
};
+struct bgp_pbr_rule_unique {
+ uint32_t unique;
+ struct bgp_pbr_rule *bpr_found;
+};
+
+static int bgp_pbr_rule_walkcb(struct hash_backet *backet, void *arg)
+{
+ struct bgp_pbr_rule *bpr = (struct bgp_pbr_rule *)backet->data;
+ struct bgp_pbr_rule_unique *bpru = (struct bgp_pbr_rule_unique *)
+ arg;
+ uint32_t unique = bpru->unique;
+
+ if (bpr->unique == unique) {
+ bpru->bpr_found = bpr;
+ return HASHWALK_ABORT;
+ }
+ return HASHWALK_CONTINUE;
+}
+
static int bgp_pbr_action_walkcb(struct hash_backet *backet, void *arg)
{
struct bgp_pbr_action *bpa = (struct bgp_pbr_action *)backet->data;
return true;
}
+struct bgp_pbr_rule *bgp_pbr_rule_lookup(vrf_id_t vrf_id,
+ uint32_t unique)
+{
+ struct bgp *bgp = bgp_lookup_by_vrf_id(vrf_id);
+ struct bgp_pbr_rule_unique bpru;
+
+ if (!bgp || unique == 0)
+ return NULL;
+ bpru.unique = unique;
+ bpru.bpr_found = NULL;
+ hash_walk(bgp->pbr_rule_hash, bgp_pbr_rule_walkcb, &bpru);
+ return bpru.bpr_found;
+}
+
struct bgp_pbr_action *bgp_pbr_action_rule_lookup(vrf_id_t vrf_id,
uint32_t unique)
{
uint32_t seqno, priority, unique;
enum zapi_rule_notify_owner note;
struct bgp_pbr_action *bgp_pbra;
+ struct bgp_pbr_rule *bgp_pbr = NULL;
ifindex_t ifi;
if (!zapi_rule_notify_decode(zclient->ibuf, &seqno, &priority, &unique,
bgp_pbra = bgp_pbr_action_rule_lookup(vrf_id, unique);
if (!bgp_pbra) {
- if (BGP_DEBUG(zebra, ZEBRA))
- zlog_debug("%s: Fail to look BGP rule (%u)",
- __PRETTY_FUNCTION__, unique);
- return 0;
+ /* look in bgp pbr rule */
+ bgp_pbr = bgp_pbr_rule_lookup(vrf_id, unique);
+ if (!bgp_pbr && note != ZAPI_RULE_REMOVED) {
+ if (BGP_DEBUG(zebra, ZEBRA))
+ zlog_debug("%s: Fail to look BGP rule (%u)",
+ __PRETTY_FUNCTION__, unique);
+ return 0;
+ }
}
switch (note) {
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("%s: Received RULE_FAIL_INSTALL",
__PRETTY_FUNCTION__);
- bgp_pbra->installed = false;
- bgp_pbra->install_in_progress = false;
+ if (bgp_pbra) {
+ bgp_pbra->installed = false;
+ bgp_pbra->install_in_progress = false;
+ } else {
+ bgp_pbr->installed = false;
+ bgp_pbr->install_in_progress = false;
+ }
break;
case ZAPI_RULE_INSTALLED:
- bgp_pbra->installed = true;
- bgp_pbra->install_in_progress = false;
+ if (bgp_pbra) {
+ bgp_pbra->installed = true;
+ bgp_pbra->install_in_progress = false;
+ } else {
+ bgp_pbr->installed = true;
+ bgp_pbr->install_in_progress = false;
+ bgp_pbr->action->refcnt++;
+ }
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("%s: Received RULE_INSTALLED",
__PRETTY_FUNCTION__);