diff --git a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java index ebc9d26c4c..6a5089d3c0 100644 --- a/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java +++ b/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java @@ -403,6 +403,18 @@ public class BpfCoordinator { return null; } } + + /** Get error BPF map. */ + @Nullable public IBpfMap getBpfErrorMap() { + if (!isAtLeastS()) return null; + try { + return new BpfMap<>(TETHER_ERROR_MAP_PATH, + BpfMap.BPF_F_RDONLY, S32.class, S32.class); + } catch (ErrnoException e) { + Log.e(TAG, "Cannot create error map: " + e); + return null; + } + } } @VisibleForTesting @@ -1287,13 +1299,15 @@ public class BpfCoordinator { } private void dumpCounters(@NonNull IndentingPrintWriter pw) { - if (!mDeps.isAtLeastS()) { - pw.println("No counter support"); - return; - } - try (IBpfMap map = new BpfMap<>(TETHER_ERROR_MAP_PATH, BpfMap.BPF_F_RDONLY, - S32.class, S32.class)) { - + try (IBpfMap map = mDeps.getBpfErrorMap()) { + if (map == null) { + pw.println("No error counter support"); + return; + } + if (map.isEmpty()) { + pw.println(""); + return; + } map.forEach((k, v) -> { String counterName; try { @@ -1307,7 +1321,7 @@ public class BpfCoordinator { if (v.val > 0) pw.println(String.format("%s: %d", counterName, v.val)); }); } catch (ErrnoException | IOException e) { - pw.println("Error dumping counter map: " + e); + pw.println("Error dumping error counter map: " + e); } } diff --git a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java index 5f4454b3a9..0f3159d968 100644 --- a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java +++ b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java @@ -99,6 +99,7 @@ import com.android.net.module.util.BpfMap; import com.android.net.module.util.InterfaceParams; import com.android.net.module.util.NetworkStackConstants; import com.android.net.module.util.SharedLog; +import com.android.net.module.util.Struct.S32; import com.android.net.module.util.bpf.Tether4Key; import com.android.net.module.util.bpf.Tether4Value; import com.android.net.module.util.bpf.TetherStatsKey; @@ -197,6 +198,7 @@ public class IpServerTest { @Mock private BpfMap mBpfStatsMap; @Mock private BpfMap mBpfLimitMap; @Mock private BpfMap mBpfDevMap; + @Mock private BpfMap mBpfErrorMap; @Captor private ArgumentCaptor mDhcpParamsCaptor; @@ -360,6 +362,11 @@ public class IpServerTest { public BpfMap getBpfDevMap() { return mBpfDevMap; } + + @Nullable + public BpfMap getBpfErrorMap() { + return mBpfErrorMap; + } }; mBpfCoordinator = spy(new BpfCoordinator(mBpfDeps)); diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java index bbca56574b..620ab629bf 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java @@ -99,6 +99,7 @@ import com.android.net.module.util.IBpfMap; import com.android.net.module.util.InterfaceParams; import com.android.net.module.util.NetworkStackConstants; import com.android.net.module.util.SharedLog; +import com.android.net.module.util.Struct.S32; import com.android.net.module.util.bpf.Tether4Key; import com.android.net.module.util.bpf.Tether4Value; import com.android.net.module.util.bpf.TetherStatsKey; @@ -365,6 +366,7 @@ public class BpfCoordinatorTest { @Mock private IBpfMap mBpfDownstream6Map; @Mock private IBpfMap mBpfUpstream6Map; @Mock private IBpfMap mBpfDevMap; + @Mock private IBpfMap mBpfErrorMap; // Late init since methods must be called by the thread that created this object. private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb; @@ -457,6 +459,11 @@ public class BpfCoordinatorTest { public IBpfMap getBpfDevMap() { return mBpfDevMap; } + + @Nullable + public IBpfMap getBpfErrorMap() { + return mBpfErrorMap; + } }); @Before public void setUp() {