[PATCH ethtool-next v3 13/16] sfpdiag: Add JSON output handling to --module-info in SFF8472 modules
From: Danielle Ratson <hidden>
Date: 2025-02-04 13:41:08
Subsystem:
the rest · Maintainer:
Linus Torvalds
Add JSON output handling for 'ethtool -m' / --module-info, following
the guideline below:
1. Fields with description, will have a separate description field.
2. Units will be documented in a separate module-info.json file.
3. ASCII fields will be presented as strings.
4. On/Off is rendered as true/false.
5. Yes/no is rendered as true/false.
6. Per-channel fields will be presented as array, when each element
represents a channel.
7. Fields that hold version, will be split to major and minor sub fields.
Signed-off-by: Danielle Ratson <redacted>
---
Notes:
v3:
* Remove unit fields.
* Reword commit message.
v2:
* In rx_power JSON field, add a type field to let the user know
what type is printed in "value".
sfpdiag.c | 47 +++++++++++++++++++++++++++++++----------------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/sfpdiag.c b/sfpdiag.c
index bbca91e..a32f72c 100644
--- a/sfpdiag.c
+++ b/sfpdiag.c@@ -241,40 +241,55 @@ static void sff8472_parse_eeprom(const __u8 *id, struct sff_diags *sd) void sff8472_show_all(const __u8 *id) { + char *rx_power_type_string = NULL; struct sff_diags sd = {0}; - char *rx_power_string = NULL; int i; sff8472_parse_eeprom(id, &sd); - if (!sd.supports_dom) { - printf("\t%-41s : No\n", "Optical diagnostics support"); + module_print_any_bool("Optical diagnostics support", + "optical_diagnostics_support", + sd.supports_dom, YESNO(sd.supports_dom)); + + if (!sd.supports_dom) return; - } - printf("\t%-41s : Yes\n", "Optical diagnostics support"); - PRINT_BIAS("Laser bias current", sd.bias_cur[MCURR]); - PRINT_xX_PWR("Laser output power", sd.tx_power[MCURR]); + PRINT_BIAS_ALL("Laser bias current", "laser_bias_current", + sd.bias_cur[MCURR]); + PRINT_xX_PWR_ALL("Laser output power", "laser_output_power", + sd.tx_power[MCURR]); if (!sd.rx_power_type) - rx_power_string = "Receiver signal OMA"; + rx_power_type_string = "Receiver signal OMA"; else - rx_power_string = "Receiver signal average optical power"; + rx_power_type_string = "Receiver signal average optical power"; - PRINT_xX_PWR(rx_power_string, sd.rx_power[MCURR]); + open_json_object("rx_power"); + PRINT_xX_PWR_ALL(rx_power_type_string, "value", sd.rx_power[MCURR]); + if (is_json_context()) + module_print_any_string("type", rx_power_type_string); + close_json_object(); module_show_dom_mod_lvl_monitors(&sd); - printf("\t%-41s : %s\n", "Alarm/warning flags implemented", - (sd.supports_alarms ? "Yes" : "No")); + module_print_any_bool("Alarm/warning flags implemented", + "alarm/warning_flags_implemented", + sd.supports_alarms, YESNO(sd.supports_alarms)); + if (sd.supports_alarms) { for (i = 0; sff8472_aw_flags[i].str; ++i) { - printf("\t%-41s : %s\n", sff8472_aw_flags[i].str, - id[SFF_A2_BASE + sff8472_aw_flags[i].offset] - & sff8472_aw_flags[i].value ? "On" : "Off"); + bool value; + + value = id[SFF_A2_BASE + sff8472_aw_flags[i].offset] & + sff8472_aw_flags[i].value; + module_print_any_bool(sff8472_aw_flags[i].str, NULL, + value, ONOFF(value)); } - sff_show_thresholds(sd); + if (is_json_context()) + sff_show_thresholds_json(sd); + else + sff_show_thresholds(sd); } }
--
2.47.0