From 1eb17c771b50dd78a5cf88622d37bd2b474d4475 Mon Sep 17 00:00:00 2001 From: Kaushik Date: Tue, 25 Aug 2020 07:27:43 -0700 Subject: [PATCH 1/2] lib : Fix when redist is performed with route-map using access-list. 1. Added new API for add/delete acl with route map notify. Co-authored-by: harios Signed-off-by: Kaushik --- lib/filter_nb.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/lib/filter_nb.c b/lib/filter_nb.c index 91691d2f1d..812301f4a6 100644 --- a/lib/filter_nb.c +++ b/lib/filter_nb.c @@ -29,6 +29,7 @@ #include "lib/filter.h" #include "lib/plist.h" #include "lib/plist_int.h" +#include "lib/routemap.h" /* Helper function. */ static in_addr_t @@ -40,6 +41,22 @@ ipv4_network_addr(in_addr_t hostaddr, int masklen) return hostaddr & mask.s_addr; } +static void acl_notify_route_map(struct access_list *acl, int route_map_event) +{ + switch (route_map_event) { + case RMAP_EVENT_FILTER_ADDED: + if (acl->master->add_hook) + (*acl->master->add_hook)(acl); + break; + case RMAP_EVENT_FILTER_DELETED: + if (acl->master->delete_hook) + (*acl->master->delete_hook)(acl); + break; + } + + route_map_notify_dependencies(acl->name, route_map_event); +} + static enum nb_error prefix_list_length_validate(struct nb_cb_modify_args *args) { int type = yang_dnode_get_enum(args->dnode, "../../type"); @@ -255,6 +272,8 @@ lib_access_list_entry_action_modify(struct nb_cb_modify_args *args) else f->type = FILTER_DENY; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -275,6 +294,8 @@ lib_access_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args) fz = &f->u.zfilter; yang_dnode_get_prefix(&fz->prefix, args->dnode, NULL); + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -291,6 +312,8 @@ lib_access_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args) fz = &f->u.zfilter; memset(&fz->prefix, 0, sizeof(fz->prefix)); + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -310,6 +333,8 @@ lib_access_list_entry_ipv4_exact_match_modify(struct nb_cb_modify_args *args) fz = &f->u.zfilter; fz->exact = yang_dnode_get_bool(args->dnode, NULL); + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -326,6 +351,8 @@ lib_access_list_entry_ipv4_exact_match_destroy(struct nb_cb_destroy_args *args) fz = &f->u.zfilter; fz->exact = 0; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -347,6 +374,8 @@ lib_access_list_entry_host_modify(struct nb_cb_modify_args *args) yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL); fc->addr_mask.s_addr = INADDR_ANY; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -364,6 +393,8 @@ lib_access_list_entry_host_destroy(struct nb_cb_destroy_args *args) fc->addr.s_addr = INADDR_ANY; fc->addr_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -387,6 +418,8 @@ lib_access_list_entry_network_modify(struct nb_cb_modify_args *args) fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen); masklen2ip(p.prefixlen, &fc->addr_mask); + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -404,6 +437,8 @@ lib_access_list_entry_network_destroy(struct nb_cb_destroy_args *args) fc->addr.s_addr = INADDR_ANY; fc->addr_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -425,6 +460,8 @@ lib_access_list_entry_source_any_create(struct nb_cb_create_args *args) fc->addr.s_addr = INADDR_ANY; fc->addr_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -442,6 +479,8 @@ lib_access_list_entry_source_any_destroy(struct nb_cb_destroy_args *args) fc->addr.s_addr = INADDR_ANY; fc->addr_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -463,6 +502,8 @@ static int lib_access_list_entry_destination_host_modify( yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL); fc->mask_mask.s_addr = INADDR_ANY; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -481,6 +522,8 @@ static int lib_access_list_entry_destination_host_destroy( fc->mask.s_addr = INADDR_ANY; fc->mask_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -504,6 +547,8 @@ static int lib_access_list_entry_destination_network_modify( fc->mask.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen); masklen2ip(p.prefixlen, &fc->mask_mask); + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -522,6 +567,8 @@ static int lib_access_list_entry_destination_network_destroy( fc->mask.s_addr = INADDR_ANY; fc->mask_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -543,6 +590,8 @@ static int lib_access_list_entry_destination_any_create( fc->mask.s_addr = INADDR_ANY; fc->mask_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -561,6 +610,8 @@ static int lib_access_list_entry_destination_any_destroy( fc->mask.s_addr = INADDR_ANY; fc->mask_mask.s_addr = INADDR_NONE; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } @@ -594,6 +645,8 @@ static int lib_access_list_entry_any_create(struct nb_cb_create_args *args) break; } + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED); + return NB_OK; } @@ -609,6 +662,8 @@ static int lib_access_list_entry_any_destroy(struct nb_cb_destroy_args *args) fz = &f->u.zfilter; fz->prefix.family = 0; + acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED); + return NB_OK; } From e641623d90130ff5bed36cd581e625cc7d6845ea Mon Sep 17 00:00:00 2001 From: Kaushik Date: Mon, 31 Aug 2020 04:32:30 -0700 Subject: [PATCH 2/2] ospfd : Fix in lsa refresh when redist is done with route-map using access-list. 1. Minor change in distribute-list update timer based on lsa flag. Co-authored-by: harios Signed-off-by: Kaushik --- ospfd/ospf_zebra.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index eb125394b8..8cf8430247 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -1353,11 +1353,18 @@ static int ospf_distribute_list_update_timer(struct thread *thread) default_refresh = 1; else if ( (lsa = ospf_external_info_find_lsa( - ospf, &ei->p))) - ospf_external_lsa_refresh( - ospf, lsa, ei, - LSA_REFRESH_IF_CHANGED); - else + ospf, &ei->p))) { + if (!CHECK_FLAG( + lsa->flags, + OSPF_LSA_IN_MAXAGE)) + ospf_external_lsa_refresh( + ospf, lsa, ei, + LSA_REFRESH_IF_CHANGED); + else + ospf_external_lsa_refresh( + ospf, lsa, ei, + LSA_REFRESH_FORCE); + } else ospf_external_lsa_originate( ospf, ei); }