diff options
| -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 27d4f0755e..286e642781 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 25a73f9203..6a912ac630 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 c38ce09a27..d65e40279d 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 8a58b2a50e..761fe75f73 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 5f4815fec1..0fa6f8c779 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 adff76ec41..61a438b04a 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 a2f27ec3b2..da8c695f65 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);  | 
