diff options
| author | Louis Scalbert <louis.scalbert@6wind.com> | 2022-09-06 17:08:57 +0200 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2023-04-18 11:33:15 +0200 | 
| commit | 0833c251803bc01f25e027a7d18e90daf84f4361 (patch) | |
| tree | 02fea47c3038eb9f5e87fd5dee4afd340fdbf41a /isisd/isis_spf.c | |
| parent | 1610e215d98f887afc508f01cac8280b0e96176a (diff) | |
isisd: add an algorithm argument to show isis route
Add an optional algorithm argument to "show isis route" command.
Signed-off-by: Eric Kinzie <ekinzie@labn.net>
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'isisd/isis_spf.c')
| -rw-r--r-- | isisd/isis_spf.c | 115 | 
1 files changed, 93 insertions, 22 deletions
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 01efaf8efb..9646f9259d 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -2624,9 +2624,15 @@ void isis_print_routes(struct vty *vty, struct isis_spftree *spftree,  static void show_isis_route_common(struct vty *vty, int levels,  				   struct isis *isis, bool prefix_sid, -				   bool backup, json_object **json) +				   bool backup, uint8_t algo, +				   json_object **json)  {  	json_object *json_level = NULL, *jstr = NULL, *json_val; +#ifndef FABRICD +	struct isis_flex_algo_data *fa_data; +	struct flex_algo *fa; +#endif /* ifndef FABRICD */ +	struct isis_spftree *spftree;  	struct listnode *node;  	struct isis_area *area;  	char key[8]; @@ -2638,13 +2644,36 @@ static void show_isis_route_common(struct vty *vty, int levels,  		*json = json_object_new_object();  	for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { +#ifndef FABRICD +		/* +		 * The shapes of the flex algo spftree 2-dimensional array +		 * and the area spftree 2-dimensional array are not guaranteed +		 * to be identical. +		 */ +		fa = NULL; +		if (flex_algo_id_valid(algo)) { +			fa = flex_algo_lookup(area->flex_algos, algo); +			if (!fa) +				continue; +			fa_data = (struct isis_flex_algo_data *)fa->data; +		} else { +			fa_data = NULL; +		} +#endif /* ifndef FABRICD */ +  		if (json) {  			jstr = json_object_new_string(  				area->area_tag ? area->area_tag : "null");  			json_object_object_add(*json, "area", jstr);  		} else { -			vty_out(vty, "Area %s:\n", +			vty_out(vty, "Area %s:",  				area->area_tag ? area->area_tag : "null"); +#ifndef FABRICD +			if (algo != SR_ALGORITHM_SPF) +				vty_out(vty, " Algorithm %hhu\n", algo); +			else +#endif /* ifndef FABRICD */ +				vty_out(vty, "\n");  		}  		for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { @@ -2662,11 +2691,20 @@ static void show_isis_route_common(struct vty *vty, int levels,  			if (area->ip_circuits > 0) {  				json_val = NULL; -				isis_print_routes( -					vty, -					area->spftree[SPFTREE_IPV4][level - 1], -					json ? &json_val : NULL, prefix_sid, -					backup); +#ifndef FABRICD +				if (fa_data) +					spftree = fa_data->spftree[SPFTREE_IPV4] +								  [level - 1]; +				else +#endif /* ifndef FABRICD */ +					spftree = area->spftree[SPFTREE_IPV4] +							       [level - 1]; + +				isis_print_spftree(vty, spftree); + +				isis_print_routes(vty, spftree, +						  json ? &json_val : NULL, +						  prefix_sid, backup);  				if (json && json_val) {  					json_object_object_add(  						json_level, "ipv4", json_val); @@ -2674,11 +2712,20 @@ static void show_isis_route_common(struct vty *vty, int levels,  			}  			if (area->ipv6_circuits > 0) {  				json_val = NULL; -				isis_print_routes( -					vty, -					area->spftree[SPFTREE_IPV6][level - 1], -					json ? &json_val : NULL, prefix_sid, -					backup); +#ifndef FABRICD +				if (fa_data) +					spftree = fa_data->spftree[SPFTREE_IPV6] +								  [level - 1]; +				else +#endif /* ifndef FABRICD */ +					spftree = area->spftree[SPFTREE_IPV6] +							       [level - 1]; + +				isis_print_spftree(vty, spftree); + +				isis_print_routes(vty, spftree, +						  json ? &json_val : NULL, +						  prefix_sid, backup);  				if (json && json_val) {  					json_object_object_add(  						json_level, "ipv6", json_val); @@ -2686,9 +2733,18 @@ static void show_isis_route_common(struct vty *vty, int levels,  			}  			if (isis_area_ipv6_dstsrc_enabled(area)) {  				json_val = NULL; -				isis_print_routes(vty, -						  area->spftree[SPFTREE_DSTSRC] -							       [level - 1], +#ifndef FABRICD +				if (fa_data) +					spftree = +						fa_data->spftree[SPFTREE_DSTSRC] +								[level - 1]; +				else +#endif /* ifndef FABRICD */ +					spftree = area->spftree[SPFTREE_DSTSRC] +							       [level - 1]; + +				isis_print_spftree(vty, spftree); +				isis_print_routes(vty, spftree,  						  json ? &json_val : NULL,  						  prefix_sid, backup);  				if (json && json_val) { @@ -2710,17 +2766,25 @@ DEFUN(show_isis_route, show_isis_route_cmd,        " [vrf <NAME|all>] route"  #ifndef FABRICD        " [<level-1|level-2>]" -#endif +#endif /* ifndef FABRICD */        " [<prefix-sid|backup>]" +#ifndef FABRICD +      " [algorithm (128-255)]" +#endif /* ifndef FABRICD */        " [json$uj]",        SHOW_STR PROTO_HELP VRF_FULL_CMD_HELP_STR        "IS-IS routing table\n"  #ifndef FABRICD        "level-1 routes\n"        "level-2 routes\n" -#endif +#endif /* ifndef FABRICD */        "Show Prefix-SID information\n" -      "Show backup routes\n" JSON_STR) +      "Show backup routes\n" +#ifndef FABRICD +      "Show Flex-algo routes\n" +      "Algorithm number\n" +#endif /* ifndef FABRICD */ +      JSON_STR)  {  	int levels;  	struct isis *isis; @@ -2732,6 +2796,7 @@ DEFUN(show_isis_route, show_isis_route_cmd,  	bool uj = use_json(argc, argv);  	int idx = 0;  	json_object *json = NULL, *json_vrf = NULL; +	uint8_t algorithm = SR_ALGORITHM_SPF;  	if (argv_find(argv, argc, "level-1", &idx))  		levels = ISIS_LEVEL1; @@ -2751,15 +2816,20 @@ DEFUN(show_isis_route, show_isis_route_cmd,  	if (argv_find(argv, argc, "backup", &idx))  		backup = true; +#ifndef FABRICD +	if (argv_find(argv, argc, "algorithm", &idx)) +		algorithm = (uint8_t)strtoul(argv[idx + 1]->arg, NULL, 10); +#endif /* ifndef FABRICD */ +  	if (uj)  		json = json_object_new_array();  	if (vrf_name) {  		if (all_vrf) {  			for (ALL_LIST_ELEMENTS_RO(im->isis, node, isis)) { -				show_isis_route_common(vty, levels, isis, -						       prefix_sid, backup, -						       uj ? &json_vrf : NULL); +				show_isis_route_common( +					vty, levels, isis, prefix_sid, backup, +					algorithm, uj ? &json_vrf : NULL);  				if (uj) {  					json_object_object_add(  						json_vrf, "vrf_id", @@ -2773,7 +2843,8 @@ DEFUN(show_isis_route, show_isis_route_cmd,  		isis = isis_lookup_by_vrfname(vrf_name);  		if (isis != NULL) {  			show_isis_route_common(vty, levels, isis, prefix_sid, -					       backup, uj ? &json_vrf : NULL); +					       backup, algorithm, +					       uj ? &json_vrf : NULL);  			if (uj) {  				json_object_object_add(  					json_vrf, "vrf_id",  | 
