• Peilin Ye's avatar
    veth: Use tstats per-CPU traffic counters · 6f2684bf
    Peilin Ye authored
    Currently veth devices use the lstats per-CPU traffic counters, which only
    cover TX traffic. veth_get_stats64() actually populates RX stats of a veth
    device from its peer's TX counters, based on the assumption that a veth
    device can _only_ receive packets from its peer, which is no longer true:
    
    For example, recent CNIs (like Cilium) can use the bpf_redirect_peer() BPF
    helper to redirect traffic from NIC's tc ingress to veth's tc ingress (in
    a different netns), skipping veth's peer device. Unfortunately, this kind
    of traffic isn't currently accounted for in veth's RX stats.
    
    In preparation for the fix, use tstats (instead of lstats) to maintain
    both RX and TX counters for each veth device. We'll use RX counters for
    bpf_redirect_peer() traffic, and keep using TX counters for the usual
    "peer-to-peer" traffic. In veth_get_stats64(), calculate RX stats by
    _adding_ RX count to peer's TX count, in order to cover both kinds of
    traffic.
    
    veth_stats_rx() might need a name change (perhaps to "veth_stats_xdp()")
    for less confusion, but let's leave it to another patch to keep the fix
    minimal.
    Signed-off-by: default avatarPeilin Ye <peilin.ye@bytedance.com>
    Co-developed-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
    Link: https://lore.kernel.org/r/20231114004220.6495-5-daniel@iogearbox.netSigned-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
    6f2684bf
veth.c 47.5 KB