Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c656fd24 authored by Maciej Żenczykowski's avatar Maciej Żenczykowski Committed by Automerger Merge Worker
Browse files

Merge "NetworkStatsService - xt_qtaguid non-ebpf - account stacked interface...

Merge "NetworkStatsService - xt_qtaguid non-ebpf - account stacked interface stats" am: 9273b6d9 am: 76bcb1ef am: a9d97ca7 am: dedd296f

Change-Id: Icb5ad0b9deb9aecb395000b01cbc8b72471807b3
parents 63bb8503 dedd296f
Loading
Loading
Loading
Loading
+28 −10
Original line number Diff line number Diff line
@@ -1311,21 +1311,39 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                }

                // Traffic occurring on stacked interfaces is usually clatd.
                // UID stats are always counted on the stacked interface and never
                // on the base interface, because the packets on the base interface
                // do not actually match application sockets until they are translated.
                //
                // Interface stats are more complicated. Packets subject to BPF offload
                // never appear on the base interface and only appear on the stacked
                // interface, so to ensure those packets increment interface stats, interface
                // stats from stacked interfaces must be collected.
                // UID stats are always counted on the stacked interface and never on the base
                // interface, because the packets on the base interface do not actually match
                // application sockets (they're not IPv4) and thus the app uid is not known.
                // For receive this is obvious: packets must be translated from IPv6 to IPv4
                // before the application socket can be found.
                // For transmit: either they go through the clat daemon which by virtue of going
                // through userspace strips the original socket association during the IPv4 to
                // IPv6 translation process, or they are offloaded by eBPF, which doesn't:
                // However, on an ebpf device the accounting is done in cgroup ebpf hooks,
                // which don't trigger again post ebpf translation.
                // (as such stats accounted to the clat uid are ignored)
                //
                // Interface stats are more complicated.
                //
                // eBPF offloaded 464xlat'ed packets never hit base interface ip6tables, and thus
                // *all* statistics are collected by iptables on the stacked v4-* interface.
                //
                // Additionally for ingress all packets bound for the clat IPv6 address are dropped
                // in ip6tables raw prerouting and thus even non-offloaded packets are only
                // accounted for on the stacked interface.
                //
                // For egress, packets subject to eBPF offload never appear on the base interface
                // and only appear on the stacked interface. Thus to ensure packets increment
                // interface stats, we must collate data from stacked interfaces. For xt_qtaguid
                // (or non eBPF offloaded) TX they would appear on both, however egress interface
                // accounting is explicitly bypassed for traffic from the clat uid.
                //
                final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks();
                for (LinkProperties stackedLink : stackedLinks) {
                    final String stackedIface = stackedLink.getInterfaceName();
                    if (stackedIface != null) {
                        if (mUseBpfTrafficStats) {
                        findOrCreateNetworkIdentitySet(mActiveIfaces, stackedIface).add(ident);
                        }
                        findOrCreateNetworkIdentitySet(mActiveUidIfaces, stackedIface).add(ident);
                        if (isMobile) {
                            mobileIfaces.add(stackedIface);