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
This commit is contained in:
Hugo Benichi
2017-03-15 23:05:01 +09:00
parent 2dbe719d4f
commit 45f6ef836d
2 changed files with 139 additions and 2 deletions

View File

@@ -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.

View File

@@ -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(