From 9ee5e7a0a081fdf06be2b5430fbd58be4f290f07 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 d03ff4e363126f37af52a996546bb86a3f03cc2a 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",