The generic PHY receive packet and byte counters describe successfully received traffic. Some PHYs instead count all received frames and bytes, including frames with errors. A frame error count cannot recover the number of successfully received bytes because damaged frames have different lengths. Add optional receive-total counters to ethtool_phy_stats and the phydev statistics group. Count frame bytes including the Ethernet header, padding and FCS, and excluding the preamble and start frame delimiter. These counters describe reception at the PHY, before MAC or host filtering. Append the new attributes so existing statistic IDs and their meanings remain unchanged. Publish the names through the existing statistics string set, and retain the unset-counter convention so drivers can report either set of counters independently. Signed-off-by: James Hilliard --- Documentation/networking/ethtool-netlink.rst | 16 +++++++++++++++- include/linux/ethtool.h | 6 ++++++ include/uapi/linux/ethtool_netlink.h | 2 ++ net/ethtool/stats.c | 8 +++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst index eba226c79ec3..5528d0f7afdd 100644 --- a/Documentation/networking/ethtool-netlink.rst +++ b/Documentation/networking/ethtool-netlink.rst @@ -1665,7 +1665,7 @@ the ``ETHTOOL_A_STATS_GROUPS`` bitset. Currently defined values are: ETHTOOL_STATS_ETH_PHY eth-phy Basic IEEE 802.3 PHY statistics (30.3.2.1.*) ETHTOOL_STATS_ETH_CTRL eth-ctrl Basic IEEE 802.3 MAC Ctrl statistics (30.3.3.*) ETHTOOL_STATS_RMON rmon RMON (RFC 2819) statistics - ETHTOOL_STATS_PHY phy Additional PHY statistics, not defined by IEEE + ETHTOOL_STATS_PHY phydev Additional PHY statistics, not defined by IEEE ====================== ======== =============================================== Each group should have a corresponding ``ETHTOOL_A_STATS_GRP`` in the reply. @@ -1683,6 +1683,20 @@ by ``ETHTOOL_A_STATS_GRP_SS_ID``. Complex statistics (such as RMON histogram entries) are also listed inside ``ETHTOOL_A_STATS_GRP`` and do not have a string defined in the string set. +The ``phydev`` group provides separate counters for successfully received +traffic and total received traffic. ``ETHTOOL_A_STATS_PHY_RX_PKTS`` +(``RxFrames``) and ``ETHTOOL_A_STATS_PHY_RX_BYTES`` (``RxOctets``) count +successfully received frames and bytes. ``ETHTOOL_A_STATS_PHY_RX_PKTS_TOTAL`` +(``RxFramesTotal``) and ``ETHTOOL_A_STATS_PHY_RX_BYTES_TOTAL`` (``RxOctetsTotal``) +include frames with errors. The total byte count includes the Ethernet header, +padding and FCS, but excludes the preamble and start frame delimiter. These +totals describe reception at the PHY, independently of subsequent filtering +or drops at the MAC or host. + +Each counter is optional. Drivers leave unsupported counters at +``ETHTOOL_STAT_NOT_SET``, and the kernel omits them from the reply. A PHY can +report total received traffic even when it cannot separate successful traffic. + RMON "histogram" counters count number of packets within given size range. Because RFC does not specify the ranges beyond the standard 1518 MTU devices differ in definition of buckets. For this reason the definition of packet ranges diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index c3a41fbd5426..7a7b434ab1fa 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -486,6 +486,10 @@ struct ethtool_eth_phy_stats { * @tx_packets: Total successfully transmitted frames * @tx_bytes: Total successfully transmitted bytes * @tx_errors: Total transmitted frames with errors + * @rx_packets_total: Total received frames, including frames with errors + * @rx_bytes_total: Total received frame bytes, including frames with errors. + * Includes the Ethernet header, padding and FCS, but excludes the preamble + * and start frame delimiter. * * This structure provides a standardized interface for reporting * PHY-level statistics counters. It is designed to expose statistics @@ -499,6 +503,8 @@ struct ethtool_phy_stats { u64 tx_packets; u64 tx_bytes; u64 tx_errors; + u64 rx_packets_total; + u64 rx_bytes_total; }; /* Basic IEEE 802.3 MAC Ctrl statistics (30.3.3.*), not otherwise exposed diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index fa5d645140a4..db26cff28f12 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -202,6 +202,8 @@ enum { ETHTOOL_A_STATS_PHY_TX_PKTS, ETHTOOL_A_STATS_PHY_TX_BYTES, ETHTOOL_A_STATS_PHY_TX_ERRORS, + ETHTOOL_A_STATS_PHY_RX_PKTS_TOTAL, + ETHTOOL_A_STATS_PHY_RX_BYTES_TOTAL, /* add new constants above here */ __ETHTOOL_A_STATS_PHY_CNT, diff --git a/net/ethtool/stats.c b/net/ethtool/stats.c index 9b0d8cb07675..b4c4bdd8fc4b 100644 --- a/net/ethtool/stats.c +++ b/net/ethtool/stats.c @@ -88,6 +88,8 @@ const char stats_phy_names[__ETHTOOL_A_STATS_PHY_CNT][ETH_GSTRING_LEN] = { [ETHTOOL_A_STATS_PHY_TX_PKTS] = "TxFrames", [ETHTOOL_A_STATS_PHY_TX_BYTES] = "TxOctets", [ETHTOOL_A_STATS_PHY_TX_ERRORS] = "TxErrors", + [ETHTOOL_A_STATS_PHY_RX_PKTS_TOTAL] = "RxFramesTotal", + [ETHTOOL_A_STATS_PHY_RX_BYTES_TOTAL] = "RxOctetsTotal", }; const struct nla_policy ethnl_stats_get_policy[ETHTOOL_A_STATS_SRC + 1] = { @@ -295,7 +297,11 @@ static int stats_put_phydev_stats(struct sk_buff *skb, stat_put(skb, ETHTOOL_A_STATS_PHY_TX_BYTES, data->phydev_stats.tx_bytes) || stat_put(skb, ETHTOOL_A_STATS_PHY_TX_ERRORS, - data->phydev_stats.tx_errors)) + data->phydev_stats.tx_errors) || + stat_put(skb, ETHTOOL_A_STATS_PHY_RX_PKTS_TOTAL, + data->phydev_stats.rx_packets_total) || + stat_put(skb, ETHTOOL_A_STATS_PHY_RX_BYTES_TOTAL, + data->phydev_stats.rx_bytes_total)) return -EMSGSIZE; return 0; } -- 2.53.0