From 1d43b7b725c70b62a098c04089af4c1607fe8b8e Mon Sep 17 00:00:00 2001 From: Jan Hoffmann Date: Sat, 28 Jan 2023 19:13:30 +0100 Subject: [PATCH 1/4] luci-mod-status: improve handling of DSL metrics that are not available Currently, non-existing values (null or undefined) are formatted like zero values. Add explicit handling to allow the user to distinguish between those and actual zero values. Signed-off-by: Jan Hoffmann --- .../resources/view/status/include/50_dsl.js | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index 0ee0b9033a..cab481394e 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -9,6 +9,21 @@ var callDSLMetrics = rpc.declare({ expect: { '': {} } }); +function format_latency(val) { + return '%.2f ms'.format(val / 1000); +} + +function format_values(format, val1, val2) { + var val1Str = (val1 != null) ? format.format(val1) : '-'; + var val2Str = (val2 != null) ? format.format(val2) : '-'; + return val1Str + ' / ' + val2Str; +} +function format_values_func(func, val1, val2) { + var val1Str = (val1 != null) ? func(val1) : '-'; + var val2Str = (val2 != null) ? func(val2) : '-'; + return val1Str + ' / ' + val2Str; +} + function renderbox(dsl) { return E('div', { class: 'ifacebox' }, [ E('div', { class: 'ifacebox-head center ' + (dsl.up ? 'active' : '') }, @@ -19,21 +34,21 @@ function renderbox(dsl) { _('Line Mode'), dsl.mode || '-', _('Line Uptime'), '%t'.format(dsl.uptime), _('Annex'), dsl.annex || '-', - _('Data Rate'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.downstream.data_rate, dsl.upstream.data_rate), - _('Max. Attainable Data Rate (ATTNDR)'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.downstream.attndr, dsl.upstream.attndr), - _('Latency'), '%.2f ms / %.2f ms'.format(dsl.downstream.interleave_delay / 1000, dsl.upstream.interleave_delay / 1000), - _('Line Attenuation (LATN)'), '%.1f dB / %.1f dB'.format(dsl.downstream.latn, dsl.upstream.latn), - _('Signal Attenuation (SATN)'), '%.1f dB / %.1f dB'.format(dsl.downstream.satn, dsl.upstream.satn), - _('Noise Margin (SNR)'), '%.1f dB / %.1f dB'.format(dsl.downstream.snr, dsl.upstream.snr), - _('Aggregate Transmit Power (ACTATP)'), '%.1f dB / %.1f dB'.format(dsl.downstream.actatp, dsl.upstream.actatp), - _('Forward Error Correction Seconds (FECS)'), '%d / %d'.format(dsl.errors.near.fecs, dsl.errors.far.fecs), - _('Errored seconds (ES)'), '%d / %d'.format(dsl.errors.near.es, dsl.errors.far.es), - _('Severely Errored Seconds (SES)'), '%d / %d'.format(dsl.errors.near.ses, dsl.errors.far.ses), - _('Loss of Signal Seconds (LOSS)'), '%d / %d'.format(dsl.errors.near.loss, dsl.errors.far.loss), - _('Unavailable Seconds (UAS)'), '%d / %d'.format(dsl.errors.near.uas, dsl.errors.far.uas), - _('Header Error Code Errors (HEC)'), '%d / %d'.format(dsl.errors.near.hec, dsl.errors.far.hec), - _('Non Pre-emptive CRC errors (CRC_P)'), '%d / %d'.format(dsl.errors.near.crc_p, dsl.errors.far.crc_p), - _('Pre-emptive CRC errors (CRCP_P)'), '%d / %d'.format(dsl.errors.near.crcp_p, dsl.errors.far.crcp_p), + _('Data Rate'), format_values('%1000.3mb/s', dsl.downstream.data_rate, dsl.upstream.data_rate), + _('Max. Attainable Data Rate (ATTNDR)'), format_values('%1000.3mb/s', dsl.downstream.attndr, dsl.upstream.attndr), + _('Latency'), format_values_func(format_latency, dsl.downstream.interleave_delay, dsl.upstream.interleave_delay), + _('Line Attenuation (LATN)'), format_values('%.1f dB', dsl.downstream.latn, dsl.upstream.latn), + _('Signal Attenuation (SATN)'), format_values('%.1f dB', dsl.downstream.satn, dsl.upstream.satn), + _('Noise Margin (SNR)'), format_values('%.1f dB', dsl.downstream.snr, dsl.upstream.snr), + _('Aggregate Transmit Power (ACTATP)'), format_values('%.1f dB', dsl.downstream.actatp, dsl.upstream.actatp), + _('Forward Error Correction Seconds (FECS)'), format_values('%d', dsl.errors.near.fecs, dsl.errors.far.fecs), + _('Errored seconds (ES)'), format_values('%d', dsl.errors.near.es, dsl.errors.far.es), + _('Severely Errored Seconds (SES)'), format_values('%d', dsl.errors.near.ses, dsl.errors.far.ses), + _('Loss of Signal Seconds (LOSS)'), format_values('%d', dsl.errors.near.loss, dsl.errors.far.loss), + _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas), + _('Header Error Code Errors (HEC)'), format_values('%d', dsl.errors.near.hec, dsl.errors.far.hec), + _('Non Pre-emptive CRC errors (CRC_P)'), format_values('%d', dsl.errors.near.crc_p, dsl.errors.far.crc_p), + _('Pre-emptive CRC errors (CRCP_P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p), _('ATU-C System Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id, _('Power Management Mode'), dsl.power_state ]) From 06724c5a9c108d4b562281b8752003218abf35de Mon Sep 17 00:00:00 2001 From: Jan Hoffmann Date: Sat, 28 Jan 2023 19:13:44 +0100 Subject: [PATCH 2/4] luci-mod-status: group DSL metrics into sections for more readability Signed-off-by: Jan Hoffmann --- .../resources/view/status/include/50_dsl.js | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index cab481394e..77b4a46cae 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -33,23 +33,35 @@ function renderbox(dsl) { _('Line State'), dsl.state || '-', _('Line Mode'), dsl.mode || '-', _('Line Uptime'), '%t'.format(dsl.uptime), - _('Annex'), dsl.annex || '-', + _('Annex'), dsl.annex || '-' + ]), + L.itemlist(E('span'), [ _('Data Rate'), format_values('%1000.3mb/s', dsl.downstream.data_rate, dsl.upstream.data_rate), _('Max. Attainable Data Rate (ATTNDR)'), format_values('%1000.3mb/s', dsl.downstream.attndr, dsl.upstream.attndr), - _('Latency'), format_values_func(format_latency, dsl.downstream.interleave_delay, dsl.upstream.interleave_delay), + _('Latency'), format_values_func(format_latency, dsl.downstream.interleave_delay, dsl.upstream.interleave_delay) + ]), + L.itemlist(E('span'), [ _('Line Attenuation (LATN)'), format_values('%.1f dB', dsl.downstream.latn, dsl.upstream.latn), _('Signal Attenuation (SATN)'), format_values('%.1f dB', dsl.downstream.satn, dsl.upstream.satn), _('Noise Margin (SNR)'), format_values('%.1f dB', dsl.downstream.snr, dsl.upstream.snr), - _('Aggregate Transmit Power (ACTATP)'), format_values('%.1f dB', dsl.downstream.actatp, dsl.upstream.actatp), + _('Aggregate Transmit Power (ACTATP)'), format_values('%.1f dB', dsl.downstream.actatp, dsl.upstream.actatp) + ]), + L.itemlist(E('span'), [ _('Forward Error Correction Seconds (FECS)'), format_values('%d', dsl.errors.near.fecs, dsl.errors.far.fecs), _('Errored seconds (ES)'), format_values('%d', dsl.errors.near.es, dsl.errors.far.es), _('Severely Errored Seconds (SES)'), format_values('%d', dsl.errors.near.ses, dsl.errors.far.ses), _('Loss of Signal Seconds (LOSS)'), format_values('%d', dsl.errors.near.loss, dsl.errors.far.loss), - _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas), + _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas) + ]), + L.itemlist(E('span'), [ _('Header Error Code Errors (HEC)'), format_values('%d', dsl.errors.near.hec, dsl.errors.far.hec), _('Non Pre-emptive CRC errors (CRC_P)'), format_values('%d', dsl.errors.near.crc_p, dsl.errors.far.crc_p), - _('Pre-emptive CRC errors (CRCP_P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p), - _('ATU-C System Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id, + _('Pre-emptive CRC errors (CRCP_P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p) + ]), + L.itemlist(E('span'), [ + _('ATU-C System Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id + ]), + L.itemlist(E('span'), [ _('Power Management Mode'), dsl.power_state ]) ]) From 08f2312abf6ff49e6edc26e6b1516372e23fd606 Mon Sep 17 00:00:00 2001 From: Jan Hoffmann Date: Sat, 28 Jan 2023 19:13:50 +0100 Subject: [PATCH 3/4] luci-mod-status: rename some DSL status items Fix some small inaccuracies and inconsistencies between items. Signed-off-by: Jan Hoffmann --- .../resources/view/status/include/50_dsl.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index 77b4a46cae..7de3fa2515 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -43,23 +43,23 @@ function renderbox(dsl) { L.itemlist(E('span'), [ _('Line Attenuation (LATN)'), format_values('%.1f dB', dsl.downstream.latn, dsl.upstream.latn), _('Signal Attenuation (SATN)'), format_values('%.1f dB', dsl.downstream.satn, dsl.upstream.satn), - _('Noise Margin (SNR)'), format_values('%.1f dB', dsl.downstream.snr, dsl.upstream.snr), + _('Noise Margin (SNRM)'), format_values('%.1f dB', dsl.downstream.snr, dsl.upstream.snr), _('Aggregate Transmit Power (ACTATP)'), format_values('%.1f dB', dsl.downstream.actatp, dsl.upstream.actatp) ]), L.itemlist(E('span'), [ _('Forward Error Correction Seconds (FECS)'), format_values('%d', dsl.errors.near.fecs, dsl.errors.far.fecs), - _('Errored seconds (ES)'), format_values('%d', dsl.errors.near.es, dsl.errors.far.es), + _('Errored Seconds (ES)'), format_values('%d', dsl.errors.near.es, dsl.errors.far.es), _('Severely Errored Seconds (SES)'), format_values('%d', dsl.errors.near.ses, dsl.errors.far.ses), _('Loss of Signal Seconds (LOSS)'), format_values('%d', dsl.errors.near.loss, dsl.errors.far.loss), _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas) ]), L.itemlist(E('span'), [ - _('Header Error Code Errors (HEC)'), format_values('%d', dsl.errors.near.hec, dsl.errors.far.hec), - _('Non Pre-emptive CRC errors (CRC_P)'), format_values('%d', dsl.errors.near.crc_p, dsl.errors.far.crc_p), - _('Pre-emptive CRC errors (CRCP_P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p) + _('ATM Header Error Code Errors (HEC)'), format_values('%d', dsl.errors.near.hec, dsl.errors.far.hec), + _('PTM Non Pre-emptive CRC Errors (CRC-P)'), format_values('%d', dsl.errors.near.crc_p, dsl.errors.far.crc_p), + _('PTM Pre-emptive CRC Errors (CRCP-P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p) ]), L.itemlist(E('span'), [ - _('ATU-C System Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id + _('xTU-C Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id ]), L.itemlist(E('span'), [ _('Power Management Mode'), dsl.power_state From 2f1c6fa7a1a4b68adaadd9f7b0f68b0153e76f51 Mon Sep 17 00:00:00 2001 From: Jan Hoffmann Date: Sat, 28 Jan 2023 19:13:55 +0100 Subject: [PATCH 4/4] luci-mod-status: extend DSL metrics Add the following metrics: - Bitswap and rate adaptation status - Impulse noise protection (INP) - Retransmission status (G.INP) - Channel error counters (CV-C, FEC-C) - G.INP counters (MINEFTR, LEFTRS, rtx-tx, rtx-c, rtx-uc) - Modem chipset and firmware version Signed-off-by: Jan Hoffmann --- .../resources/view/status/include/50_dsl.js | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index 7de3fa2515..785fb773ec 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -9,6 +9,10 @@ var callDSLMetrics = rpc.declare({ expect: { '': {} } }); +function format_on_off(val) { + return val ? _('on') : _('off'); +} + function format_latency(val) { return '%.2f ms'.format(val / 1000); } @@ -38,7 +42,16 @@ function renderbox(dsl) { L.itemlist(E('span'), [ _('Data Rate'), format_values('%1000.3mb/s', dsl.downstream.data_rate, dsl.upstream.data_rate), _('Max. Attainable Data Rate (ATTNDR)'), format_values('%1000.3mb/s', dsl.downstream.attndr, dsl.upstream.attndr), - _('Latency'), format_values_func(format_latency, dsl.downstream.interleave_delay, dsl.upstream.interleave_delay) + _('Min. Error-Free Throughput (MINEFTR)'), format_values('%1000.3mb/s', dsl.downstream.mineftr, dsl.upstream.mineftr) + ]), + L.itemlist(E('span'), [ + _('Bitswap'), format_values_func(format_on_off, dsl.downstream.bitswap, dsl.upstream.bitswap), + _('Rate Adaptation Mode'), format_values('%s', dsl.downstream.ra_mode, dsl.upstream.ra_mode) + ]), + L.itemlist(E('span'), [ + _('Latency'), format_values_func(format_latency, dsl.downstream.interleave_delay, dsl.upstream.interleave_delay), + _('Impulse Noise Protection (INP)'), format_values('%.1f symbols', dsl.downstream.inp, dsl.upstream.inp), + _('Retransmission (G.INP)'), format_values_func(format_on_off, dsl.downstream.retx, dsl.upstream.retx) ]), L.itemlist(E('span'), [ _('Line Attenuation (LATN)'), format_values('%.1f dB', dsl.downstream.latn, dsl.upstream.latn), @@ -51,7 +64,12 @@ function renderbox(dsl) { _('Errored Seconds (ES)'), format_values('%d', dsl.errors.near.es, dsl.errors.far.es), _('Severely Errored Seconds (SES)'), format_values('%d', dsl.errors.near.ses, dsl.errors.far.ses), _('Loss of Signal Seconds (LOSS)'), format_values('%d', dsl.errors.near.loss, dsl.errors.far.loss), - _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas) + _('Unavailable Seconds (UAS)'), format_values('%d', dsl.errors.near.uas, dsl.errors.far.uas), + _('Seconds with Low Error-Free Throughput (LEFTRS)'), format_values('%d', dsl.errors.near.leftrs, dsl.errors.far.leftrs) + ]), + L.itemlist(E('span'), [ + _('Channel CRC Errors (CV-C)'), format_values('%d', dsl.errors.near.cv_c, dsl.errors.far.cv_c), + _('Channel Errors Corrected by FEC (FEC-C)'), format_values('%d', dsl.errors.near.fec_c, dsl.errors.far.fec_c) ]), L.itemlist(E('span'), [ _('ATM Header Error Code Errors (HEC)'), format_values('%d', dsl.errors.near.hec, dsl.errors.far.hec), @@ -59,6 +77,13 @@ function renderbox(dsl) { _('PTM Pre-emptive CRC Errors (CRCP-P)'), format_values('%d', dsl.errors.near.crcp_p, dsl.errors.far.crcp_p) ]), L.itemlist(E('span'), [ + _('Retransmitted DTUs (rtx-tx)'), format_values('%d', dsl.errors.far.tx_retransmitted, dsl.errors.near.tx_retransmitted), + _('Corrected DTUs (rtx-c)'), format_values('%d', dsl.errors.near.rx_corrected, dsl.errors.far.rx_corrected), + _('Uncorrected DTUs (rtx-uc)'), format_values('%d', dsl.errors.near.rx_uncorrected_protected, dsl.errors.far.rx_uncorrected_protected) + ]), + L.itemlist(E('span'), [ + _('Modem Chipset'), dsl.chipset || '-', + _('Modem Firmware'), dsl.firmware_version || '-', _('xTU-C Vendor ID'), dsl.atu_c.vendor || dsl.atu_c.vendor_id ]), L.itemlist(E('span'), [