diff mbox series

[iwinfo] lib: report byte counters as 64 bit values

Message ID 20230515145427.1628898-1-thomas@t-8ch.de
State Accepted
Delegated to: Hauke Mehrtens
Headers show
Series [iwinfo] lib: report byte counters as 64 bit values | expand

Commit Message

Thomas Weißschuh May 15, 2023, 2:54 p.m. UTC
The 32bit counter can only count to 4GiB before wrapping.
Switching to the 64bit variant avoids this issue.

In practice some users are interpreting the counter values as signed
integer bringing down the usable range for 32bit values down to only
2GiB.

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
 include/iwinfo.h |  4 ++--
 iwinfo_nl80211.c | 12 ++++++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)


base-commit: b3888b29535a92584524e14aadf25fcb85e7fed2

Comments

Thomas Weißschuh June 23, 2023, 4:50 p.m. UTC | #1
+Cc a few devs that have worked on iwinfo recently.


Hi,

could somebody take a look my patches [0] to fix an overflow of
per-association packet counters after two GiB [1]?

Thanks,
Thomas

[0] https://lists.openwrt.org/pipermail/openwrt-devel/2023-May/041056.html
    https://lists.openwrt.org/pipermail/openwrt-devel/2023-May/041096.html
    https://lists.openwrt.org/pipermail/openwrt-devel/2023-May/041055.html
[1] https://github.com/openwrt/luci/issues/6210

On 2023-05-15 16:54:27+0200, Thomas Weißschuh wrote:
> The 32bit counter can only count to 4GiB before wrapping.
> Switching to the 64bit variant avoids this issue.
> 
> In practice some users are interpreting the counter values as signed
> integer bringing down the usable range for 32bit values down to only
> 2GiB.
> 
> Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
> ---
>  include/iwinfo.h |  4 ++--
>  iwinfo_nl80211.c | 12 ++++++++++--
>  2 files changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/include/iwinfo.h b/include/iwinfo.h
> index eae99302704a..b50de69f49ca 100644
> --- a/include/iwinfo.h
> +++ b/include/iwinfo.h
> @@ -240,8 +240,8 @@ struct iwinfo_assoclist_entry {
>  	uint64_t rx_drop_misc;
>  	struct iwinfo_rate_entry rx_rate;
>  	struct iwinfo_rate_entry tx_rate;
> -	uint32_t rx_bytes;
> -	uint32_t tx_bytes;
> +	uint64_t rx_bytes;
> +	uint64_t tx_bytes;
>  	uint32_t tx_retries;
>  	uint32_t tx_failed;
>  	uint64_t t_offset;
> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
> index 50bb8f03c2fd..1e0a0c77dc39 100644
> --- a/iwinfo_nl80211.c
> +++ b/iwinfo_nl80211.c
> @@ -1554,6 +1554,8 @@ static int nl80211_fill_signal_cb(struct nl_msg *msg, void *arg)
>  		[NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_RX_BYTES]      = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_TX_BYTES]      = { .type = NLA_U32    },
> +		[NL80211_STA_INFO_RX_BYTES64]    = { .type = NLA_U64    },
> +		[NL80211_STA_INFO_TX_BYTES64]    = { .type = NLA_U64    },
>  		[NL80211_STA_INFO_RX_PACKETS]    = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_TX_PACKETS]    = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_SIGNAL]        = { .type = NLA_U8     },
> @@ -2214,6 +2216,8 @@ static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
>  		[NL80211_STA_INFO_SIGNAL_AVG]    = { .type = NLA_U8     },
>  		[NL80211_STA_INFO_RX_BYTES]      = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_TX_BYTES]      = { .type = NLA_U32    },
> +		[NL80211_STA_INFO_RX_BYTES64]    = { .type = NLA_U64    },
> +		[NL80211_STA_INFO_TX_BYTES64]    = { .type = NLA_U64    },
>  		[NL80211_STA_INFO_TX_RETRIES]    = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_TX_FAILED]     = { .type = NLA_U32    },
>  		[NL80211_STA_INFO_CONNECTED_TIME]= { .type = NLA_U32    },
> @@ -2277,10 +2281,14 @@ static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
>  		                      sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy))
>  			nl80211_parse_rateinfo(rinfo, &e->tx_rate);
>  
> -		if (sinfo[NL80211_STA_INFO_RX_BYTES])
> +		if (sinfo[NL80211_STA_INFO_RX_BYTES64])
> +			e->rx_bytes = nla_get_u64(sinfo[NL80211_STA_INFO_RX_BYTES64]);
> +		else if (sinfo[NL80211_STA_INFO_RX_BYTES])
>  			e->rx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_RX_BYTES]);
>  
> -		if (sinfo[NL80211_STA_INFO_TX_BYTES])
> +		if (sinfo[NL80211_STA_INFO_TX_BYTES64])
> +			e->tx_bytes = nla_get_u64(sinfo[NL80211_STA_INFO_TX_BYTES64]);
> +		else if (sinfo[NL80211_STA_INFO_TX_BYTES])
>  			e->tx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_TX_BYTES]);
>  
>  		if (sinfo[NL80211_STA_INFO_TX_RETRIES])
> 
> base-commit: b3888b29535a92584524e14aadf25fcb85e7fed2
> -- 
> 2.40.1
>
diff mbox series

Patch

diff --git a/include/iwinfo.h b/include/iwinfo.h
index eae99302704a..b50de69f49ca 100644
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -240,8 +240,8 @@  struct iwinfo_assoclist_entry {
 	uint64_t rx_drop_misc;
 	struct iwinfo_rate_entry rx_rate;
 	struct iwinfo_rate_entry tx_rate;
-	uint32_t rx_bytes;
-	uint32_t tx_bytes;
+	uint64_t rx_bytes;
+	uint64_t tx_bytes;
 	uint32_t tx_retries;
 	uint32_t tx_failed;
 	uint64_t t_offset;
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
index 50bb8f03c2fd..1e0a0c77dc39 100644
--- a/iwinfo_nl80211.c
+++ b/iwinfo_nl80211.c
@@ -1554,6 +1554,8 @@  static int nl80211_fill_signal_cb(struct nl_msg *msg, void *arg)
 		[NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32    },
 		[NL80211_STA_INFO_RX_BYTES]      = { .type = NLA_U32    },
 		[NL80211_STA_INFO_TX_BYTES]      = { .type = NLA_U32    },
+		[NL80211_STA_INFO_RX_BYTES64]    = { .type = NLA_U64    },
+		[NL80211_STA_INFO_TX_BYTES64]    = { .type = NLA_U64    },
 		[NL80211_STA_INFO_RX_PACKETS]    = { .type = NLA_U32    },
 		[NL80211_STA_INFO_TX_PACKETS]    = { .type = NLA_U32    },
 		[NL80211_STA_INFO_SIGNAL]        = { .type = NLA_U8     },
@@ -2214,6 +2216,8 @@  static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
 		[NL80211_STA_INFO_SIGNAL_AVG]    = { .type = NLA_U8     },
 		[NL80211_STA_INFO_RX_BYTES]      = { .type = NLA_U32    },
 		[NL80211_STA_INFO_TX_BYTES]      = { .type = NLA_U32    },
+		[NL80211_STA_INFO_RX_BYTES64]    = { .type = NLA_U64    },
+		[NL80211_STA_INFO_TX_BYTES64]    = { .type = NLA_U64    },
 		[NL80211_STA_INFO_TX_RETRIES]    = { .type = NLA_U32    },
 		[NL80211_STA_INFO_TX_FAILED]     = { .type = NLA_U32    },
 		[NL80211_STA_INFO_CONNECTED_TIME]= { .type = NLA_U32    },
@@ -2277,10 +2281,14 @@  static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
 		                      sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy))
 			nl80211_parse_rateinfo(rinfo, &e->tx_rate);
 
-		if (sinfo[NL80211_STA_INFO_RX_BYTES])
+		if (sinfo[NL80211_STA_INFO_RX_BYTES64])
+			e->rx_bytes = nla_get_u64(sinfo[NL80211_STA_INFO_RX_BYTES64]);
+		else if (sinfo[NL80211_STA_INFO_RX_BYTES])
 			e->rx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_RX_BYTES]);
 
-		if (sinfo[NL80211_STA_INFO_TX_BYTES])
+		if (sinfo[NL80211_STA_INFO_TX_BYTES64])
+			e->tx_bytes = nla_get_u64(sinfo[NL80211_STA_INFO_TX_BYTES64]);
+		else if (sinfo[NL80211_STA_INFO_TX_BYTES])
 			e->tx_bytes = nla_get_u32(sinfo[NL80211_STA_INFO_TX_BYTES]);
 
 		if (sinfo[NL80211_STA_INFO_TX_RETRIES])