diff options
| author | Igor Ryzhov <idryzhov@gmail.com> | 2024-08-10 01:32:55 +0300 | 
|---|---|---|
| committer | Mergify <37929162+mergify[bot]@users.noreply.github.com> | 2024-08-12 19:04:13 +0000 | 
| commit | 51c43a86706c30a7991690bbc3c6b8e7de4eedb2 (patch) | |
| tree | 3b97621d4f60633098395b321927d87d750bb0c0 | |
| parent | 6621d8350b8d92c2770847c68206cc6c1b291482 (diff) | |
lib: fix distribute-list deletion
When a whole distribute-list is deleted (can be done only using API),
all its children must be cleaned up manually.
Fixes #16538
Signed-off-by: Igor Ryzhov <idryzhov@gmail.com>
(cherry picked from commit 8fad4f317ebd3de7677d7600e7a024f713b20d70)
| -rw-r--r-- | lib/distribute.c | 33 | 
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/distribute.c b/lib/distribute.c index 90a73c3635..c0693b0849 100644 --- a/lib/distribute.c +++ b/lib/distribute.c @@ -456,10 +456,43 @@ int group_distribute_list_create_helper(   * XPath: /frr-ripd:ripd/instance/distribute-lists/distribute-list/{in,out}/{access,prefix}-list   */ +static int distribute_list_leaf_update(const struct lyd_node *dnode, +				       int ip_version, bool no); +  int group_distribute_list_destroy(struct nb_cb_destroy_args *args)  { +	struct lyd_node *dnode; +  	if (args->event != NB_EV_APPLY)  		return NB_OK; + +	/* +	 * We don't keep the IP version of distribute-list anywhere, so we're +	 * trying to remove both. If one doesn't exist, it's simply skipped by +	 * the remove function. +	 */ + +	dnode = yang_dnode_get(args->dnode, "in/access-list"); +	if (dnode) { +		distribute_list_leaf_update(dnode, 4, true); +		distribute_list_leaf_update(dnode, 6, true); +	} +	dnode = yang_dnode_get(args->dnode, "in/prefix-list"); +	if (dnode) { +		distribute_list_leaf_update(dnode, 4, true); +		distribute_list_leaf_update(dnode, 6, true); +	} +	dnode = yang_dnode_get(args->dnode, "out/access-list"); +	if (dnode) { +		distribute_list_leaf_update(dnode, 4, true); +		distribute_list_leaf_update(dnode, 6, true); +	} +	dnode = yang_dnode_get(args->dnode, "out/prefix-list"); +	if (dnode) { +		distribute_list_leaf_update(dnode, 4, true); +		distribute_list_leaf_update(dnode, 6, true); +	} +  	nb_running_unset_entry(args->dnode);  	return NB_OK;  }  | 
