diff options
Diffstat (limited to 'pbrd/pbr_zebra.c')
| -rw-r--r-- | pbrd/pbr_zebra.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c index a1a2d34ac1..4e5b5f3dde 100644 --- a/pbrd/pbr_zebra.c +++ b/pbrd/pbr_zebra.c @@ -45,17 +45,6 @@ DEFINE_MTYPE_STATIC(PBRD, PBR_INTERFACE, "PBR Interface") /* Zebra structure to hold current status. */ struct zclient *zclient; -static struct interface *zebra_interface_if_lookup(struct stream *s) -{ - char ifname_tmp[INTERFACE_NAMSIZ]; - - /* Read interface name. */ - stream_get(ifname_tmp, s, INTERFACE_NAMSIZ); - - /* And look it up. */ - return if_lookup_by_name(ifname_tmp, VRF_DEFAULT); -} - struct pbr_interface *pbr_if_new(struct interface *ifp) { struct pbr_interface *pbr_ifp; @@ -140,7 +129,7 @@ static int interface_state_up(int command, struct zclient *zclient, zebra_size_t length, vrf_id_t vrf_id) { - zebra_interface_if_lookup(zclient->ibuf); + zebra_interface_state_read(zclient->ibuf, vrf_id); return 0; } @@ -206,13 +195,16 @@ static int rule_notify_owner(int command, struct zclient *zclient, uint32_t seqno, priority, unique; enum zapi_rule_notify_owner note; struct pbr_map_sequence *pbrms; + struct pbr_map_interface *pmi; ifindex_t ifi; + uint64_t installed; if (!zapi_rule_notify_decode(zclient->ibuf, &seqno, &priority, &unique, &ifi, ¬e)) return -1; - pbrms = pbrms_lookup_unique(unique, ifi); + pmi = NULL; + pbrms = pbrms_lookup_unique(unique, ifi, &pmi); if (!pbrms) { DEBUGD(&pbr_dbg_zebra, "%s: Failure to lookup pbrms based upon %u", @@ -220,18 +212,21 @@ static int rule_notify_owner(int command, struct zclient *zclient, return 0; } + installed = 1 << pmi->install_bit; + switch (note) { case ZAPI_RULE_FAIL_INSTALL: DEBUGD(&pbr_dbg_zebra, "%s: Recieved RULE_FAIL_INSTALL", __PRETTY_FUNCTION__); - pbrms->installed = false; + pbrms->installed &= ~installed; break; case ZAPI_RULE_INSTALLED: - pbrms->installed = true; + pbrms->installed |= installed; DEBUGD(&pbr_dbg_zebra, "%s: Recived RULE_INSTALLED", __PRETTY_FUNCTION__); break; case ZAPI_RULE_REMOVED: + pbrms->installed &= ~installed; DEBUGD(&pbr_dbg_zebra, "%s: Received RULE REMOVED", __PRETTY_FUNCTION__); break; @@ -499,9 +494,23 @@ void pbr_send_pbr_map(struct pbr_map_sequence *pbrms, { struct pbr_map *pbrm = pbrms->parent; struct stream *s; + uint64_t is_installed = 1 << pmi->install_bit; - DEBUGD(&pbr_dbg_zebra, "%s: for %s %d", __PRETTY_FUNCTION__, pbrm->name, - install); + is_installed &= pbrms->installed; + + DEBUGD(&pbr_dbg_zebra, "%s: for %s %d(%" PRIu64 ")", + __PRETTY_FUNCTION__, pbrm->name, install, is_installed); + + /* + * If we are installed and asked to do so again + * just return. If we are not installed and asked + * and asked to delete just return; + */ + if (install && is_installed) + return; + + if (!install && !is_installed) + return; s = zclient->obuf; stream_reset(s); |
