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 <donatas.abraitis@gmail.com>
This commit is contained in:
Donatas Abraitis 2020-04-27 12:13:48 +03:00
parent 7351b95754
commit 7d16d76f4c

View File

@ -451,6 +451,7 @@ static void access_list_filter_delete(struct access_list *access,
struct filter *filter) struct filter *filter)
{ {
struct access_master *master; struct access_master *master;
struct filter *replace = filter;
master = access->master; master = access->master;
@ -472,7 +473,7 @@ static void access_list_filter_delete(struct access_list *access,
(*master->delete_hook)(access); (*master->delete_hook)(access);
/* If access_list becomes empty delete it from access_master. */ /* 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); access_list_delete(access);
} }