From 7351b9575423b665829fdaca76e0ffbbdf4e829e Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Mon, 27 Apr 2020 12:13:04 +0300 Subject: [PATCH 1/2] lib: Convert access_list_empty to bool Signed-off-by: Donatas Abraitis --- lib/filter.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/filter.c b/lib/filter.c index da02a77763..17ca4689f4 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -437,12 +437,12 @@ static struct filter *filter_seq_check(struct access_list *access, } /* If access_list has no filter then return 1. */ -static int access_list_empty(struct access_list *access) +static bool access_list_empty(struct access_list *access) { if (access->head == NULL && access->tail == NULL) - return 1; + return true; else - return 0; + return false; } /* Delete filter from specified access_list. If there is hook From 7d16d76f4c5628aefd104d1a5bc97b1829a375e7 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Mon, 27 Apr 2020 12:13:48 +0300 Subject: [PATCH 2/2] lib: Delete the entire access-list only if there are no more entries When you enter the access-list with the same sequence number but with a different prefix AND access-list has only a single entry, then the entry is deleted and the whole access-list is deleted. That means that "replace entry" never be re-inserted. With fix: ``` ~# vtysh -c 'c' -c 'access-list 1 seq 10 permit 127.0.0.10/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.10/32 ~# vtysh -c 'c' -c 'access-list 1 seq 10 permit 127.0.0.20/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.20/32 ~# vtysh -c 'c' -c 'access-list 1 seq 11 permit 127.0.0.11/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 10 permit 127.0.0.20/32 access-list 1 seq 11 permit 127.0.0.11/32 ~# vtysh -c 'c' -c 'no access-list 1 seq 10 permit 127.0.0.20/32' ~# vtysh -c 'sh run' | grep access-list access-list 1 seq 11 permit 127.0.0.11/32 ~# ``` Signed-off-by: Donatas Abraitis --- lib/filter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/filter.c b/lib/filter.c index 17ca4689f4..4a83b8b043 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -451,6 +451,7 @@ static void access_list_filter_delete(struct access_list *access, struct filter *filter) { struct access_master *master; + struct filter *replace = filter; master = access->master; @@ -472,7 +473,7 @@ static void access_list_filter_delete(struct access_list *access, (*master->delete_hook)(access); /* If access_list becomes empty delete it from access_master. */ - if (access_list_empty(access)) + if (access_list_empty(access) && !replace) access_list_delete(access); }