From 45f6ef836deb7c9e6d2f49dff9fe2b0c722e4f4f Mon Sep 17 00:00:00 2001 From: Hugo Benichi Date: Wed, 15 Mar 2017 23:05:01 +0900 Subject: [PATCH 1/2] Connectivity metrics: serialize networkId, transports, ifname This patch adds translation from ConnectivityMetricsEvent to IpConnectivityEvent of recently added fields: - top-level network id - top-level ifname - transports Also adds inference of link layer from transports or ifname. At the moment these new fields are not populated in ConnectivityMetricsEvent. Follow-up patches will fill this gap for the events of the android.net.metrics package. Test: new unit tests, $ runtest frameworks-net passes Bug: 34901696 Change-Id: I563a6a3183470bdfaabb7c781a1beaf6b1058bf0 --- .../java/android/net/NetworkCapabilities.java | 6 +- .../IpConnectivityEventBuilderTest.java | 135 ++++++++++++++++++ 2 files changed, 139 insertions(+), 2 deletions(-) diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 4dd8ce9c8b..0765c86776 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -423,8 +423,10 @@ public final class NetworkCapabilities implements Parcelable { */ public static final int TRANSPORT_WIFI_AWARE = 5; - private static final int MIN_TRANSPORT = TRANSPORT_CELLULAR; - private static final int MAX_TRANSPORT = TRANSPORT_WIFI_AWARE; + /** @hide */ + public static final int MIN_TRANSPORT = TRANSPORT_CELLULAR; + /** @hide */ + public static final int MAX_TRANSPORT = TRANSPORT_WIFI_AWARE; /** * Adds the given transport type to this {@code NetworkCapability} instance. diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java index 48861bde77..7f53495da2 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java @@ -26,6 +26,11 @@ import static com.android.server.connectivity.MetricsTestUtil.anIntArray; import static com.android.server.connectivity.MetricsTestUtil.b; import static com.android.server.connectivity.MetricsTestUtil.describeIpEvent; import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityLog; +import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.BLUETOOTH; +import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.CELLULAR; +import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.ETHERNET; +import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.MULTIPLE; +import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.WIFI; import android.net.ConnectivityMetricsEvent; import android.net.metrics.ApfProgramEvent; @@ -46,6 +51,136 @@ import junit.framework.TestCase; // TODO: instead of comparing textpb to textpb, parse textpb and compare proto to proto. public class IpConnectivityEventBuilderTest extends TestCase { + @SmallTest + public void testLinkLayerInferrence() { + ConnectivityMetricsEvent ev = describeIpEvent( + aType(IpReachabilityEvent.class), + aString("wlan0"), + anInt(IpReachabilityEvent.NUD_FAILED)); + + String want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + " link_layer: 0", + " network_id: 0", + " time_ms: 1", + " transports: 0", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.netId = 123; + ev.transports = 3; // transports have priority for inferrence of link layer + ev.ifname = "wlan0"; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + String.format(" link_layer: %d", MULTIPLE), + " network_id: 123", + " time_ms: 1", + " transports: 3", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.transports = 1; + ev.ifname = null; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + String.format(" link_layer: %d", CELLULAR), + " network_id: 123", + " time_ms: 1", + " transports: 1", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.transports = 0; + ev.ifname = "not_inferred"; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"not_inferred\"", + " link_layer: 0", + " network_id: 123", + " time_ms: 1", + " transports: 0", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.ifname = "bt-pan"; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + String.format(" link_layer: %d", BLUETOOTH), + " network_id: 123", + " time_ms: 1", + " transports: 0", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.ifname = "rmnet_ipa0"; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + String.format(" link_layer: %d", CELLULAR), + " network_id: 123", + " time_ms: 1", + " transports: 0", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + + ev.ifname = "wlan0"; + want = joinLines( + "dropped_events: 0", + "events <", + " if_name: \"\"", + String.format(" link_layer: %d", WIFI), + " network_id: 123", + " time_ms: 1", + " transports: 0", + " ip_reachability_event <", + " event_type: 512", + " if_name: \"wlan0\"", + " >", + ">", + "version: 2"); + verifySerialization(want, ev); + } + @SmallTest public void testDefaultNetworkEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( From 075cd83383938a101c359850bc78a4dbc88d1a6e Mon Sep 17 00:00:00 2001 From: Hugo Benichi Date: Thu, 16 Mar 2017 16:33:47 +0900 Subject: [PATCH 2/2] Connectivity metrics: change how interface names are logged This patch deprecates the ifname field for specific metrics events of types DhcpClientEvent, DhcpErrorEvent, IpReachabilityEvent and IpManagerEvent. Instead ifnames are logged in ConnectivityMetricsEvent, allowing for link layer inference. Test: updated unit tests, $ runtest frameworks-net passes Bug: 34901696 Change-Id: I8bfabcb115bbd5289471d653c153a40bb48f28cd --- .../IpConnectivityEventBuilderTest.java | 27 ++++++--------- .../IpConnectivityMetricsTest.java | 34 +++++++++++-------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java index 7f53495da2..dbc78612c3 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java @@ -55,7 +55,6 @@ public class IpConnectivityEventBuilderTest extends TestCase { public void testLinkLayerInferrence() { ConnectivityMetricsEvent ev = describeIpEvent( aType(IpReachabilityEvent.class), - aString("wlan0"), anInt(IpReachabilityEvent.NUD_FAILED)); String want = joinLines( @@ -68,7 +67,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -87,7 +86,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 3", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -105,7 +104,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 1", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -123,7 +122,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -140,7 +139,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -157,7 +156,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -174,7 +173,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); @@ -221,7 +220,6 @@ public class IpConnectivityEventBuilderTest extends TestCase { public void testDhcpClientEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DhcpClientEvent.class), - aString("wlan0"), aString("SomeState"), anInt(192)); @@ -235,7 +233,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " dhcp_event <", " duration_ms: 192", - " if_name: \"wlan0\"", + " if_name: \"\"", " state_transition: \"SomeState\"", " >", ">", @@ -248,7 +246,6 @@ public class IpConnectivityEventBuilderTest extends TestCase { public void testDhcpErrorEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DhcpErrorEvent.class), - aString("wlan0"), anInt(DhcpErrorEvent.L4_NOT_UDP)); String want = joinLines( @@ -261,7 +258,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " dhcp_event <", " duration_ms: 0", - " if_name: \"wlan0\"", + " if_name: \"\"", " error_code: 50397184", " >", ">", @@ -326,7 +323,6 @@ public class IpConnectivityEventBuilderTest extends TestCase { public void testIpManagerEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(IpManagerEvent.class), - aString("wlan0"), anInt(IpManagerEvent.PROVISIONING_OK), aLong(5678)); @@ -340,7 +336,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_provisioning_event <", " event_type: 1", - " if_name: \"wlan0\"", + " if_name: \"\"", " latency_ms: 5678", " >", ">", @@ -353,7 +349,6 @@ public class IpConnectivityEventBuilderTest extends TestCase { public void testIpReachabilityEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(IpReachabilityEvent.class), - aString("wlan0"), anInt(IpReachabilityEvent.NUD_FAILED)); String want = joinLines( @@ -366,7 +361,7 @@ public class IpConnectivityEventBuilderTest extends TestCase { " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "version: 2"); diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java index 785e1ce20a..50c92b3804 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -48,7 +48,7 @@ import org.mockito.MockitoAnnotations; public class IpConnectivityMetricsTest extends TestCase { static final IpReachabilityEvent FAKE_EV = - new IpReachabilityEvent("wlan0", IpReachabilityEvent.NUD_FAILED); + new IpReachabilityEvent(IpReachabilityEvent.NUD_FAILED); @Mock Context mCtx; @Mock IIpConnectivityMetrics mMockService; @@ -154,47 +154,51 @@ public class IpConnectivityMetricsTest extends TestCase { apfStats.programUpdatesAllowingMulticast = 3; apfStats.maxProgramSize = 2048; Parcelable[] events = { - new IpReachabilityEvent("wlan0", IpReachabilityEvent.NUD_FAILED), - new DhcpClientEvent("wlan0", "SomeState", 192), + new IpReachabilityEvent(IpReachabilityEvent.NUD_FAILED), + new DhcpClientEvent("SomeState", 192), new DefaultNetworkEvent(102, new int[]{1,2,3}, 101, true, false), - new IpManagerEvent("wlan0", IpManagerEvent.PROVISIONING_OK, 5678), + new IpManagerEvent(IpManagerEvent.PROVISIONING_OK, 5678), new ValidationProbeEvent(120, 40730, ValidationProbeEvent.PROBE_HTTP, 204), apfStats, new RaEvent(2000, 400, 300, -1, 1000, -1) }; for (int i = 0; i < events.length; i++) { - logger.log(100 * (i + 1), events[i]); + ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent(); + ev.timestamp = 100 * (i + 1); + ev.ifname = "wlan0"; + ev.data = events[i]; + logger.log(ev); } String want = joinLines( "dropped_events: 0", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 100", " transports: 0", " ip_reachability_event <", " event_type: 512", - " if_name: \"wlan0\"", + " if_name: \"\"", " >", ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 200", " transports: 0", " dhcp_event <", " duration_ms: 192", - " if_name: \"wlan0\"", + " if_name: \"\"", " state_transition: \"SomeState\"", " >", ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 300", " transports: 0", @@ -213,19 +217,19 @@ public class IpConnectivityMetricsTest extends TestCase { ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 400", " transports: 0", " ip_provisioning_event <", " event_type: 1", - " if_name: \"wlan0\"", + " if_name: \"\"", " latency_ms: 5678", " >", ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 500", " transports: 0", @@ -240,7 +244,7 @@ public class IpConnectivityMetricsTest extends TestCase { ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 600", " transports: 0", @@ -259,7 +263,7 @@ public class IpConnectivityMetricsTest extends TestCase { ">", "events <", " if_name: \"\"", - " link_layer: 0", + " link_layer: 4", " network_id: 0", " time_ms: 700", " transports: 0",