diff options
| author | Javier Garcia <javier.martin.garcia@ibm.com> | 2022-02-23 16:51:07 +0100 | 
|---|---|---|
| committer | Javier Garcia <javier.martin.garcia@ibm.com> | 2022-02-25 12:36:17 +0100 | 
| commit | 9fee4d4c6038ef6b14e9f509d6b04d189660c4cd (patch) | |
| tree | 7ee70b1f92accd1cc34f6c400f01cc3076723c3d /isisd/isis_circuit.c | |
| parent | 471bb5da52ec7eeb127b08fe71ab41d468d8abe4 (diff) | |
isisd: Add json to show isis interface command.
Signed-off-by: Javier Garcia <javier.martin.garcia@ibm.com>
Diffstat (limited to 'isisd/isis_circuit.c')
| -rw-r--r-- | isisd/isis_circuit.c | 145 | 
1 files changed, 145 insertions, 0 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 1b0447226d..da75f196ba 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -933,6 +933,151 @@ void circuit_update_nlpids(struct isis_circuit *circuit)  	return;  } +void isis_circuit_print_json(struct isis_circuit *circuit, +			     struct json_object *json, char detail) +{ +	int level; +	json_object *iface_json, *ipv4_addr_json, *ipv6_link_json, +		*ipv6_non_link_json, *hold_json, *lan_prio_json, *levels_json, +		*level_json; +	char buf_prx[INET6_BUFSIZ]; +	char buf[255]; + +	snprintfrr(buf, sizeof(buf), "0x%x", circuit->circuit_id); +	if (detail == ISIS_UI_LEVEL_BRIEF) { +		iface_json = json_object_new_object(); +		json_object_object_add(json, "interface", iface_json); +		json_object_string_add(iface_json, "name", +				       circuit->interface->name); +		json_object_string_add(iface_json, "circuit-id", buf); +		json_object_string_add(iface_json, "state", +				       circuit_state2string(circuit->state)); +		json_object_string_add(iface_json, "type", +				       circuit_type2string(circuit->circ_type)); +		json_object_string_add(iface_json, "level", +				       circuit_t2string(circuit->is_type)); +	} + +	if (detail == ISIS_UI_LEVEL_DETAIL) { +		struct listnode *node; +		struct prefix *ip_addr; + +		iface_json = json_object_new_object(); +		json_object_object_add(json, "interface", iface_json); +		json_object_string_add(iface_json, "name", +				       circuit->interface->name); +		json_object_string_add(iface_json, "state", +				       circuit_state2string(circuit->state)); +		if (circuit->is_passive) +			json_object_string_add(iface_json, "is-passive", +					       "passive"); +		else +			json_object_string_add(iface_json, "is-passive", +					       "active"); +		json_object_string_add(iface_json, "circuit-id", buf); +		json_object_string_add(iface_json, "type", +				       circuit_type2string(circuit->circ_type)); +		json_object_string_add(iface_json, "level", +				       circuit_t2string(circuit->is_type)); +		if (circuit->circ_type == CIRCUIT_T_BROADCAST) +			json_object_string_add(iface_json, "snpa", +					       snpa_print(circuit->u.bc.snpa)); + + +		levels_json = json_object_new_array(); +		json_object_object_add(iface_json, "levels", levels_json); +		for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { +			if ((circuit->is_type & level) == 0) +				continue; +			level_json = json_object_new_object(); +			json_object_string_add(level_json, "level", +					       circuit_t2string(level)); +			if (circuit->area->newmetric) +				json_object_int_add(level_json, "metric", +						    circuit->te_metric[0]); +			else +				json_object_int_add(level_json, "metric", +						    circuit->metric[0]); +			if (!circuit->is_passive) { +				json_object_int_add(level_json, +						    "active-neighbors", +						    circuit->upadjcount[0]); +				json_object_int_add(level_json, +						    "hello-interval", +						    circuit->hello_interval[0]); +				hold_json = json_object_new_object(); +				json_object_object_add(level_json, "holddown", +						       hold_json); +				json_object_int_add( +					hold_json, "count", +					circuit->hello_multiplier[0]); +				json_object_string_add( +					hold_json, "pad", +					(circuit->pad_hellos ? "yes" : "no")); +				json_object_int_add(level_json, "cnsp-interval", +						    circuit->csnp_interval[0]); +				json_object_int_add(level_json, "psnp-interval", +						    circuit->psnp_interval[0]); +				if (circuit->circ_type == CIRCUIT_T_BROADCAST) { +					lan_prio_json = +						json_object_new_object(); +					json_object_object_add(level_json, +							       "lan", +							       lan_prio_json); +					json_object_int_add( +						lan_prio_json, "priority", +						circuit->priority[0]); +					json_object_string_add( +						lan_prio_json, "is-dis", +						(circuit->u.bc.is_dr[0] +							 ? "yes" +							 : "no")); +				} +			} +			json_object_array_add(levels_json, level_json); +		} + +		if (circuit->ip_addrs && listcount(circuit->ip_addrs) > 0) { +			ipv4_addr_json = json_object_new_object(); +			json_object_object_add(iface_json, "ip-prefix", +					       ipv4_addr_json); +			for (ALL_LIST_ELEMENTS_RO(circuit->ip_addrs, node, +						  ip_addr)) { +				snprintfrr(buf_prx, INET6_BUFSIZ, "%pFX", +					   ip_addr); +				json_object_string_add(ipv4_addr_json, "ip", +						       buf_prx); +			} +		} +		if (circuit->ipv6_link && listcount(circuit->ipv6_link) > 0) { +			ipv6_link_json = json_object_new_object(); +			json_object_object_add(iface_json, "ipv6-link-locals", +					       ipv6_link_json); +			for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_link, node, +						  ip_addr)) { +				snprintfrr(buf_prx, INET6_BUFSIZ, "%pFX", +					   ip_addr); +				json_object_string_add(ipv6_link_json, "ipv6", +						       buf_prx); +			} +		} +		if (circuit->ipv6_non_link && +		    listcount(circuit->ipv6_non_link) > 0) { +			ipv6_non_link_json = json_object_new_object(); +			json_object_object_add(iface_json, "ipv6-prefixes", +					       ipv6_non_link_json); +			for (ALL_LIST_ELEMENTS_RO(circuit->ipv6_non_link, node, +						  ip_addr)) { +				snprintfrr(buf_prx, INET6_BUFSIZ, "%pFX", +					   ip_addr); +				json_object_string_add(ipv6_non_link_json, +						       "ipv6", buf_prx); +			} +		} +	} +	return; +} +  void isis_circuit_print_vty(struct isis_circuit *circuit, struct vty *vty,  			    char detail)  {  | 
