]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ovpn: fix VPN TX bytes counting
authorRalf Lici <ralf@mandelbit.com>
Fri, 30 Jan 2026 17:32:50 +0000 (18:32 +0100)
committerAntonio Quartulli <antonio@openvpn.net>
Thu, 12 Feb 2026 14:28:59 +0000 (15:28 +0100)
In ovpn_net_xmit, after GSO segmentation and segment processing, the
first segment on the list is used to increment VPN TX statistics, which
fails to account for any subsequent segments in the chain.

Fix this by accumulating the length of every segment that successfully
passes skb_share_check into a tx_bytes variable. This ensures the peer
statistics accurately reflect the total data volume sent, regardless of
whether the original packet was segmented.

Fixes: 04ca14955f9a ("ovpn: store tunnel and transport statistics")
Signed-off-by: Ralf Lici <ralf@mandelbit.com>
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Antonio Quartulli <antonio@openvpn.net>
drivers/net/ovpn/io.c

index f70c58b10599bc9f003115f89813a463c9ecf445..955c9a37e1f8dbc1fdf1cd35fd4569de42e782ef 100644 (file)
@@ -355,6 +355,7 @@ netdev_tx_t ovpn_net_xmit(struct sk_buff *skb, struct net_device *dev)
        struct ovpn_priv *ovpn = netdev_priv(dev);
        struct sk_buff *segments, *curr, *next;
        struct sk_buff_head skb_list;
+       unsigned int tx_bytes = 0;
        struct ovpn_peer *peer;
        __be16 proto;
        int ret;
@@ -414,6 +415,8 @@ netdev_tx_t ovpn_net_xmit(struct sk_buff *skb, struct net_device *dev)
                        continue;
                }
 
+               /* only count what we actually send */
+               tx_bytes += curr->len;
                __skb_queue_tail(&skb_list, curr);
        }
 
@@ -426,7 +429,7 @@ netdev_tx_t ovpn_net_xmit(struct sk_buff *skb, struct net_device *dev)
        }
        skb_list.prev->next = NULL;
 
-       ovpn_peer_stats_increment_tx(&peer->vpn_stats, skb_list.next->len);
+       ovpn_peer_stats_increment_tx(&peer->vpn_stats, tx_bytes);
        ovpn_send(ovpn, skb_list.next, peer);
 
        return NETDEV_TX_OK;