diff options
author | Philippe Guibert <philippe.guibert@6wind.com> | 2018-03-21 17:52:41 +0100 |
---|---|---|
committer | Philippe Guibert <philippe.guibert@6wind.com> | 2018-05-25 15:49:38 +0200 |
commit | c2ef5232ae52eff42790d69514e3515716af349b (patch) | |
tree | da1d950f63770739110e8950ab94c57d5db166b2 /zebra/zebra_pbr.c | |
parent | zebra: ipset and ipset entry deletion remove entry from hash list too (diff) | |
download | frr-c2ef5232ae52eff42790d69514e3515716af349b.tar.xz frr-c2ef5232ae52eff42790d69514e3515716af349b.zip |
zebra: cleanup zebra policy context
Upon the remote daemon leaving, some contexts may have to be flushed.
This commit does the change. IPset and IPSet Entries and iptables are
flushed.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'zebra/zebra_pbr.c')
-rw-r--r-- | zebra/zebra_pbr.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index 050c93dbf..7ab6c9443 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -320,6 +320,36 @@ static void zebra_pbr_cleanup_rules(struct hash_backet *b, void *data) } } +static void zebra_pbr_cleanup_ipset(struct hash_backet *b, void *data) +{ + struct zebra_ns *zns = zebra_ns_lookup(NS_DEFAULT); + struct zebra_pbr_ipset *ipset = b->data; + int *sock = data; + + if (ipset->sock == *sock) + hash_release(zns->ipset_hash, ipset); +} + +static void zebra_pbr_cleanup_ipset_entry(struct hash_backet *b, void *data) +{ + struct zebra_ns *zns = zebra_ns_lookup(NS_DEFAULT); + struct zebra_pbr_ipset_entry *ipset = b->data; + int *sock = data; + + if (ipset->sock == *sock) + hash_release(zns->ipset_entry_hash, ipset); +} + +static void zebra_pbr_cleanup_iptable(struct hash_backet *b, void *data) +{ + struct zebra_ns *zns = zebra_ns_lookup(NS_DEFAULT); + struct zebra_pbr_iptable *iptable = b->data; + int *sock = data; + + if (iptable->sock == *sock) + hash_release(zns->iptable_hash, iptable); +} + static int zebra_pbr_client_close_cleanup(struct zserv *client) { int sock = client->sock; @@ -328,6 +358,12 @@ static int zebra_pbr_client_close_cleanup(struct zserv *client) if (!sock) return 0; hash_iterate(zns->rules_hash, zebra_pbr_cleanup_rules, &sock); + hash_iterate(zns->iptable_hash, + zebra_pbr_cleanup_iptable, &sock); + hash_iterate(zns->ipset_entry_hash, + zebra_pbr_cleanup_ipset_entry, &sock); + hash_iterate(zns->ipset_hash, + zebra_pbr_cleanup_ipset, &sock); return 1; } |