diff options
author | Russ White <russ@riw.us> | 2021-05-07 20:27:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-07 20:27:01 +0200 |
commit | d2b7ab94454b8adba8ceec91fe9ac8b8714b6c9b (patch) | |
tree | e1ab06c34f930e079e81b69911672d41b886aeb3 /ospf6d | |
parent | Merge pull request #8632 from wesleycoakley/le-32-128-fix (diff) | |
parent | ospf6d: Fix when an "export-list" or "filter-list out" is applied. (diff) | |
download | frr-d2b7ab94454b8adba8ceec91fe9ac8b8714b6c9b.tar.xz frr-d2b7ab94454b8adba8ceec91fe9ac8b8714b6c9b.zip |
Merge pull request #8347 from volta-networks/fix_ospv6_filter_debug
ospf6d: Fix when an "export-list" or "filter-list out" is configured
Diffstat (limited to 'ospf6d')
-rw-r--r-- | ospf6d/ospf6_abr.c | 27 | ||||
-rw-r--r-- | ospf6d/ospf6_abr.h | 2 | ||||
-rw-r--r-- | ospf6d/ospf6_area.c | 40 | ||||
-rw-r--r-- | ospf6d/ospf6_area.h | 1 | ||||
-rw-r--r-- | ospf6d/ospf6_flood.c | 6 | ||||
-rw-r--r-- | ospf6d/ospf6_intra.c | 2 | ||||
-rw-r--r-- | ospf6d/ospf6d.c | 4 |
7 files changed, 71 insertions, 11 deletions
diff --git a/ospf6d/ospf6_abr.c b/ospf6d/ospf6_abr.c index 27d4f0755..286e64278 100644 --- a/ospf6d/ospf6_abr.c +++ b/ospf6d/ospf6_abr.c @@ -389,6 +389,8 @@ int ospf6_abr_originate_summary_to_area(struct ospf6_route *route, zlog_debug( "prefix %pFX was denied by export list", &route->prefix); + ospf6_abr_delete_route(route, summary, + summary_table, old); return 0; } } @@ -401,6 +403,9 @@ int ospf6_abr_originate_summary_to_area(struct ospf6_route *route, zlog_debug( "prefix %pFX was denied by filter-list out", &route->prefix); + ospf6_abr_delete_route(route, summary, summary_table, + old); + return 0; } @@ -1075,7 +1080,8 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa) == FILTER_DENY) { if (is_debug) zlog_debug( - "Prefix was denied by import-list"); + "Prefix %pFX was denied by import-list", + &prefix); if (old) ospf6_route_remove(old, table); return; @@ -1087,7 +1093,9 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa) if (prefix_list_apply(PREFIX_LIST_IN(oa), &prefix) != PREFIX_PERMIT) { if (is_debug) - zlog_debug("Prefix was denied by prefix-list"); + zlog_debug( + "Prefix %pFX was denied by prefix-list in", + &prefix); if (old) ospf6_route_remove(old, table); return; @@ -1287,6 +1295,21 @@ void ospf6_abr_reimport(struct ospf6_area *oa) ospf6_abr_examin_summary(lsa, oa); } +/* export filter removed so determine if we should reoriginate summary LSAs */ +void ospf6_abr_reexport(struct ospf6_area *oa) +{ + struct ospf6_route *route; + + /* if not a ABR return success */ + if (!ospf6_is_router_abr(oa->ospf6)) + return; + + /* Redo summaries if required */ + for (route = ospf6_route_head(oa->ospf6->route_table); route; + route = ospf6_route_next(route)) + ospf6_abr_originate_summary_to_area(route, oa); +} + void ospf6_abr_prefix_resummarize(struct ospf6 *o) { struct ospf6_route *route; diff --git a/ospf6d/ospf6_abr.h b/ospf6d/ospf6_abr.h index 25a73f920..6a912ac63 100644 --- a/ospf6d/ospf6_abr.h +++ b/ospf6d/ospf6_abr.h @@ -73,6 +73,7 @@ extern void ospf6_abr_examin_brouter(uint32_t router_id, struct ospf6_route *route, struct ospf6 *ospf6); extern void ospf6_abr_reimport(struct ospf6_area *oa); +extern void ospf6_abr_reexport(struct ospf6_area *oa); extern void ospf6_abr_range_reset_cost(struct ospf6 *ospf6); extern void ospf6_abr_prefix_resummarize(struct ospf6 *ospf6); @@ -86,5 +87,6 @@ extern void ospf6_abr_old_path_update(struct ospf6_route *old_route, struct ospf6_route *route, struct ospf6_route_table *table); extern void ospf6_abr_init(void); +extern void ospf6_abr_reexport(struct ospf6_area *oa); #endif /*OSPF6_ABR_H*/ diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c index c38ce09a2..d65e40279 100644 --- a/ospf6d/ospf6_area.c +++ b/ospf6d/ospf6_area.c @@ -661,7 +661,9 @@ DEFUN (area_filter_list, XFREE(MTYPE_OSPF6_PLISTNAME, PREFIX_NAME_OUT(area)); PREFIX_NAME_OUT(area) = XSTRDUP(MTYPE_OSPF6_PLISTNAME, plistname); - ospf6_abr_enable_area(area); + + /* Redo summaries if required */ + ospf6_abr_reexport(area); } return CMD_SUCCESS; @@ -703,12 +705,32 @@ DEFUN (no_area_filter_list, return CMD_SUCCESS; XFREE(MTYPE_OSPF6_PLISTNAME, PREFIX_NAME_OUT(area)); - ospf6_abr_enable_area(area); + PREFIX_LIST_OUT(area) = NULL; + ospf6_abr_reexport(area); } return CMD_SUCCESS; } +void ospf6_filter_update(struct access_list *access) +{ + struct ospf6_area *oa; + struct listnode *n, *node, *nnode; + struct ospf6 *ospf6; + + for (ALL_LIST_ELEMENTS(om6->ospf6, node, nnode, ospf6)) { + for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, n, oa)) { + if (IMPORT_NAME(oa) + && strcmp(IMPORT_NAME(oa), access->name) == 0) + ospf6_abr_reimport(oa); + + if (EXPORT_NAME(oa) + && strcmp(EXPORT_NAME(oa), access->name) == 0) + ospf6_abr_reexport(oa); + } + } +} + void ospf6_area_plist_update(struct prefix_list *plist, int add) { struct listnode *node, *nnode; @@ -724,11 +746,15 @@ void ospf6_area_plist_update(struct prefix_list *plist, int add) for (ALL_LIST_ELEMENTS(om6->ospf6, node, nnode, ospf6)) { for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, n, oa)) { if (PREFIX_NAME_IN(oa) - && !strcmp(PREFIX_NAME_IN(oa), name)) + && !strcmp(PREFIX_NAME_IN(oa), name)) { PREFIX_LIST_IN(oa) = add ? plist : NULL; + ospf6_abr_reexport(oa); + } if (PREFIX_NAME_OUT(oa) - && !strcmp(PREFIX_NAME_OUT(oa), name)) + && !strcmp(PREFIX_NAME_OUT(oa), name)) { PREFIX_LIST_OUT(oa) = add ? plist : NULL; + ospf6_abr_reexport(oa); + } } } } @@ -818,7 +844,9 @@ DEFUN (area_export_list, free(EXPORT_NAME(area)); EXPORT_NAME(area) = strdup(argv[idx_name]->arg); - ospf6_abr_enable_area(area); + + /* Redo summaries if required */ + ospf6_abr_reexport(area); return CMD_SUCCESS; } @@ -846,7 +874,7 @@ DEFUN (no_area_export_list, free(EXPORT_NAME(area)); EXPORT_NAME(area) = NULL; - ospf6_abr_enable_area(area); + ospf6_abr_reexport(area); return CMD_SUCCESS; } diff --git a/ospf6d/ospf6_area.h b/ospf6d/ospf6_area.h index 8a58b2a50..761fe75f7 100644 --- a/ospf6d/ospf6_area.h +++ b/ospf6d/ospf6_area.h @@ -148,6 +148,7 @@ extern void ospf6_area_show(struct vty *, struct ospf6_area *, json_object *json_areas, bool use_json); extern void ospf6_area_plist_update(struct prefix_list *plist, int add); +extern void ospf6_filter_update(struct access_list *access); extern void ospf6_area_config_write(struct vty *vty, struct ospf6 *ospf6); extern void ospf6_area_init(void); struct ospf6_interface; diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c index 5f4815fec..0fa6f8c77 100644 --- a/ospf6d/ospf6_flood.c +++ b/ospf6d/ospf6_flood.c @@ -381,7 +381,8 @@ void ospf6_flood_interface(struct ospf6_neighbor *from, struct ospf6_lsa *lsa, } else { /* (d) add retrans-list, schedule retransmission */ if (is_debug) - zlog_debug("Add retrans-list of this neighbor"); + zlog_debug("Add retrans-list of neighbor %s ", + on->name); ospf6_increment_retrans_count(lsa); ospf6_lsdb_add(ospf6_lsa_copy(lsa), on->retrans_list); thread_add_timer(master, ospf6_lsupdate_send_neighbor, @@ -395,7 +396,8 @@ void ospf6_flood_interface(struct ospf6_neighbor *from, struct ospf6_lsa *lsa, if (retrans_added == 0) { if (is_debug) zlog_debug( - "No retransmission scheduled, next interface"); + "No retransmission scheduled, next interface %s", + oi->interface->name); return; } diff --git a/ospf6d/ospf6_intra.c b/ospf6d/ospf6_intra.c index adff76ec4..61a438b04 100644 --- a/ospf6d/ospf6_intra.c +++ b/ospf6d/ospf6_intra.c @@ -1672,7 +1672,7 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa, if (IS_OSPF6_DEBUG_EXAMIN(INTRA_PREFIX)) zlog_debug( - "%s: route %pFX %p with final effective paths %u nh%u", + "%s: route %pFX %p with final effective paths %u nh %u", __func__, &route->prefix, (void *)old_route, old_route->paths diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c index a2f27ec3b..da8c695f6 100644 --- a/ospf6d/ospf6d.c +++ b/ospf6d/ospf6d.c @@ -25,6 +25,7 @@ #include "vty.h" #include "command.h" #include "plist.h" +#include "filter.h" #include "ospf6_proto.h" #include "ospf6_top.h" @@ -1398,8 +1399,11 @@ void ospf6_init(struct thread_master *master) ospf6_asbr_init(); ospf6_abr_init(); + /* initialize hooks for modifying filter rules */ prefix_list_add_hook(ospf6_plist_add); prefix_list_delete_hook(ospf6_plist_del); + access_list_add_hook(ospf6_filter_update); + access_list_delete_hook(ospf6_filter_update); ospf6_bfd_init(); install_node(&debug_node); |