diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2019-08-07 19:44:11 -0300 | 
|---|---|---|
| committer | Renato Westphal <renato@opensourcerouting.org> | 2019-09-17 00:35:46 -0300 | 
| commit | 6cf38339223e17cf9e5073c8916e2fce0a469c5c (patch) | |
| tree | 4d939cb4b3af4339644b7a8f5729eabd9ef0d309 /isisd/isis_route.c | |
| parent | 0a5f3f4fb9d2c9573ff70bdfdc0c28c006d491d6 (diff) | |
isisd: introduce new route update hook
This hook will be called whenever a route is added, updated or
deleted.  It will be used, for instance, by the SR code to keep
Prefix-SIDs in sync with their associated routes.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'isisd/isis_route.c')
| -rw-r--r-- | isisd/isis_route.c | 23 | 
1 files changed, 16 insertions, 7 deletions
diff --git a/isisd/isis_route.c b/isisd/isis_route.c index a2b15b1c4d..05394e0fe4 100644 --- a/isisd/isis_route.c +++ b/isisd/isis_route.c @@ -49,9 +49,15 @@  #include "isis_route.h"  #include "isis_zebra.h" +DEFINE_HOOK(isis_route_update_hook, +	    (struct isis_area * area, struct prefix *prefix, +	     struct isis_route_info *route_info), +	    (area, prefix, route_info)) +  static struct isis_nexthop *nexthoplookup(struct list *nexthops, int family,  					  union g_addr *ip, ifindex_t ifindex); -static void isis_route_update(struct prefix *prefix, struct prefix_ipv6 *src_p, +static void isis_route_update(struct isis_area *area, struct prefix *prefix, +			      struct prefix_ipv6 *src_p,  			      struct isis_route_info *route_info);  static struct isis_nexthop *isis_nexthop_create(int family, union g_addr *ip, @@ -318,7 +324,7 @@ struct isis_route_info *isis_route_create(struct prefix *prefix,  	return route_info;  } -static void isis_route_delete(struct route_node *rode, +static void isis_route_delete(struct isis_area *area, struct route_node *rode,  			      struct route_table *table)  {  	struct isis_route_info *rinfo; @@ -345,14 +351,15 @@ static void isis_route_delete(struct route_node *rode,  		UNSET_FLAG(rinfo->flag, ISIS_ROUTE_FLAG_ACTIVE);  		if (isis->debugs & DEBUG_RTE_EVENTS)  			zlog_debug("ISIS-Rte: route delete  %s", buff); -		isis_route_update(prefix, src_p, rinfo); +		isis_route_update(area, prefix, src_p, rinfo);  	}  	isis_route_info_delete(rinfo);  	rode->info = NULL;  	route_unlock_node(rode);  } -static void isis_route_update(struct prefix *prefix, struct prefix_ipv6 *src_p, +static void isis_route_update(struct isis_area *area, struct prefix *prefix, +			      struct prefix_ipv6 *src_p,  			      struct isis_route_info *route_info)  {  	if (CHECK_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ACTIVE)) { @@ -360,6 +367,7 @@ static void isis_route_update(struct prefix *prefix, struct prefix_ipv6 *src_p,  			return;  		isis_zebra_route_add_route(prefix, src_p, route_info); +		hook_call(isis_route_update_hook, area, prefix, route_info);  		SET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED);  		UNSET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_RESYNC); @@ -368,6 +376,7 @@ static void isis_route_update(struct prefix *prefix, struct prefix_ipv6 *src_p,  			return;  		isis_zebra_route_del_route(prefix, src_p, route_info); +		hook_call(isis_route_update_hook, area, prefix, route_info);  		UNSET_FLAG(route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED);  	} @@ -413,7 +422,7 @@ static void _isis_route_verify_table(struct isis_area *area,  				buff);  		} -		isis_route_update(dst_p, src_p, rinfo); +		isis_route_update(area, dst_p, src_p, rinfo);  		if (CHECK_FLAG(rinfo->flag, ISIS_ROUTE_FLAG_ACTIVE))  			continue; @@ -422,7 +431,7 @@ static void _isis_route_verify_table(struct isis_area *area,  		 * directly for  		 * validating => no problems with deleting routes. */  		if (!tables) { -			isis_route_delete(rnode, table); +			isis_route_delete(area, rnode, table);  			continue;  		} @@ -445,7 +454,7 @@ static void _isis_route_verify_table(struct isis_area *area,  			route_unlock_node(drnode);  		} -		isis_route_delete(rnode, table); +		isis_route_delete(area, rnode, table);  	}  }  | 
