blob: ee382199438b5278b199929a8e4234827e45a1d3 [file] [log] [blame]
Hugo Benichi50a84c62016-09-02 09:00:59 +09001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.connectivity;
18
Hugo Benichi73fd4d12017-03-15 23:05:01 +090019import static android.net.NetworkCapabilities.MAX_TRANSPORT;
20import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
21import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
22import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
Hugo Benichi27a51172017-07-18 11:35:18 +090023import static android.net.NetworkCapabilities.TRANSPORT_LOWPAN;
Hugo Benichi73fd4d12017-03-15 23:05:01 +090024import static android.net.NetworkCapabilities.TRANSPORT_VPN;
25import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
26import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
Hugo Benichi73fd4d12017-03-15 23:05:01 +090027
Hugo Benichi50a84c62016-09-02 09:00:59 +090028import android.net.ConnectivityMetricsEvent;
29import android.net.metrics.ApfProgramEvent;
30import android.net.metrics.ApfStats;
31import android.net.metrics.DefaultNetworkEvent;
32import android.net.metrics.DhcpClientEvent;
33import android.net.metrics.DhcpErrorEvent;
34import android.net.metrics.DnsEvent;
Hugo Benichi5eb90532017-03-23 18:38:22 +090035import android.net.metrics.ConnectStats;
Hugo Benichi50a84c62016-09-02 09:00:59 +090036import android.net.metrics.IpManagerEvent;
37import android.net.metrics.IpReachabilityEvent;
38import android.net.metrics.NetworkEvent;
39import android.net.metrics.RaEvent;
40import android.net.metrics.ValidationProbeEvent;
41import android.os.Parcelable;
Hugo Benichi73fd4d12017-03-15 23:05:01 +090042import android.util.SparseArray;
Hugo Benichi5eb90532017-03-23 18:38:22 +090043import android.util.SparseIntArray;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010044import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass;
Hugo Benichi5eb90532017-03-23 18:38:22 +090045import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;
46import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityLog;
47import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.NetworkId;
48import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.Pair;
Hugo Benichi50a84c62016-09-02 09:00:59 +090049import java.io.IOException;
50import java.util.ArrayList;
51import java.util.List;
52
Hugo Benichi50a84c62016-09-02 09:00:59 +090053
54/** {@hide} */
55final public class IpConnectivityEventBuilder {
56 private IpConnectivityEventBuilder() {
57 }
58
Hugo Benichi0d4a3982016-11-25 11:24:22 +090059 public static byte[] serialize(int dropped, List<IpConnectivityEvent> events)
Hugo Benichi50a84c62016-09-02 09:00:59 +090060 throws IOException {
61 final IpConnectivityLog log = new IpConnectivityLog();
Hugo Benichi0d4a3982016-11-25 11:24:22 +090062 log.events = events.toArray(new IpConnectivityEvent[events.size()]);
Hugo Benichi50a84c62016-09-02 09:00:59 +090063 log.droppedEvents = dropped;
Hugo Benichid680d4c2016-10-13 13:16:16 +090064 if ((log.events.length > 0) || (dropped > 0)) {
65 // Only write version number if log has some information at all.
66 log.version = IpConnectivityMetrics.VERSION;
67 }
Hugo Benichi50a84c62016-09-02 09:00:59 +090068 return IpConnectivityLog.toByteArray(log);
69 }
70
Hugo Benichi0d4a3982016-11-25 11:24:22 +090071 public static List<IpConnectivityEvent> toProto(List<ConnectivityMetricsEvent> eventsIn) {
Hugo Benichi50a84c62016-09-02 09:00:59 +090072 final ArrayList<IpConnectivityEvent> eventsOut = new ArrayList<>(eventsIn.size());
73 for (ConnectivityMetricsEvent in : eventsIn) {
74 final IpConnectivityEvent out = toProto(in);
75 if (out == null) {
76 continue;
77 }
78 eventsOut.add(out);
79 }
Hugo Benichi0d4a3982016-11-25 11:24:22 +090080 return eventsOut;
Hugo Benichi50a84c62016-09-02 09:00:59 +090081 }
82
83 public static IpConnectivityEvent toProto(ConnectivityMetricsEvent ev) {
Hugo Benichi5eb90532017-03-23 18:38:22 +090084 final IpConnectivityEvent out = buildEvent(ev.netId, ev.transports, ev.ifname);
85 out.timeMs = ev.timestamp;
Hugo Benichi50a84c62016-09-02 09:00:59 +090086 if (!setEvent(out, ev.data)) {
87 return null;
88 }
Hugo Benichi50a84c62016-09-02 09:00:59 +090089 return out;
90 }
91
Hugo Benichi5eb90532017-03-23 18:38:22 +090092 public static IpConnectivityEvent toProto(ConnectStats in) {
93 IpConnectivityLogClass.ConnectStatistics stats =
94 new IpConnectivityLogClass.ConnectStatistics();
95 stats.connectCount = in.connectCount;
96 stats.connectBlockingCount = in.connectBlockingCount;
97 stats.ipv6AddrCount = in.ipv6ConnectCount;
98 stats.latenciesMs = in.latencies.toArray();
99 stats.errnosCounters = toPairArray(in.errnos);
100 final IpConnectivityEvent out = buildEvent(in.netId, in.transports, null);
101 out.setConnectStatistics(stats);
102 return out;
103 }
104
105
Hugo Benichi2a5cfb92017-03-22 22:21:44 +0900106 public static IpConnectivityEvent toProto(DnsEvent in) {
Hugo Benichi2a5cfb92017-03-22 22:21:44 +0900107 IpConnectivityLogClass.DNSLookupBatch dnsLookupBatch =
108 new IpConnectivityLogClass.DNSLookupBatch();
109 in.resize(in.eventCount);
110 dnsLookupBatch.eventTypes = bytesToInts(in.eventTypes);
111 dnsLookupBatch.returnCodes = bytesToInts(in.returnCodes);
112 dnsLookupBatch.latenciesMs = in.latenciesMs;
Hugo Benichi5eb90532017-03-23 18:38:22 +0900113 final IpConnectivityEvent out = buildEvent(in.netId, in.transports, null);
Hugo Benichi2a5cfb92017-03-22 22:21:44 +0900114 out.setDnsLookupBatch(dnsLookupBatch);
Hugo Benichi2a5cfb92017-03-22 22:21:44 +0900115 return out;
116 }
117
Hugo Benichi5eb90532017-03-23 18:38:22 +0900118 private static IpConnectivityEvent buildEvent(int netId, long transports, String ifname) {
119 final IpConnectivityEvent ev = new IpConnectivityEvent();
120 ev.networkId = netId;
121 ev.transports = transports;
122 if (ifname != null) {
123 ev.ifName = ifname;
124 }
125 inferLinkLayer(ev);
126 return ev;
127 }
128
Hugo Benichi50a84c62016-09-02 09:00:59 +0900129 private static boolean setEvent(IpConnectivityEvent out, Parcelable in) {
130 if (in instanceof DhcpErrorEvent) {
131 setDhcpErrorEvent(out, (DhcpErrorEvent) in);
132 return true;
133 }
134
135 if (in instanceof DhcpClientEvent) {
136 setDhcpClientEvent(out, (DhcpClientEvent) in);
137 return true;
138 }
139
Hugo Benichi50a84c62016-09-02 09:00:59 +0900140 if (in instanceof IpManagerEvent) {
141 setIpManagerEvent(out, (IpManagerEvent) in);
142 return true;
143 }
144
145 if (in instanceof IpReachabilityEvent) {
146 setIpReachabilityEvent(out, (IpReachabilityEvent) in);
147 return true;
148 }
149
150 if (in instanceof DefaultNetworkEvent) {
151 setDefaultNetworkEvent(out, (DefaultNetworkEvent) in);
152 return true;
153 }
154
155 if (in instanceof NetworkEvent) {
156 setNetworkEvent(out, (NetworkEvent) in);
157 return true;
158 }
159
160 if (in instanceof ValidationProbeEvent) {
161 setValidationProbeEvent(out, (ValidationProbeEvent) in);
162 return true;
163 }
164
165 if (in instanceof ApfProgramEvent) {
166 setApfProgramEvent(out, (ApfProgramEvent) in);
167 return true;
168 }
169
170 if (in instanceof ApfStats) {
171 setApfStats(out, (ApfStats) in);
172 return true;
173 }
174
175 if (in instanceof RaEvent) {
176 setRaEvent(out, (RaEvent) in);
177 return true;
178 }
179
180 return false;
181 }
182
183 private static void setDhcpErrorEvent(IpConnectivityEvent out, DhcpErrorEvent in) {
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100184 IpConnectivityLogClass.DHCPEvent dhcpEvent = new IpConnectivityLogClass.DHCPEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100185 dhcpEvent.setErrorCode(in.errorCode);
186 out.setDhcpEvent(dhcpEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900187 }
188
189 private static void setDhcpClientEvent(IpConnectivityEvent out, DhcpClientEvent in) {
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100190 IpConnectivityLogClass.DHCPEvent dhcpEvent = new IpConnectivityLogClass.DHCPEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100191 dhcpEvent.setStateTransition(in.msg);
192 dhcpEvent.durationMs = in.durationMs;
193 out.setDhcpEvent(dhcpEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900194 }
195
Hugo Benichi50a84c62016-09-02 09:00:59 +0900196 private static void setIpManagerEvent(IpConnectivityEvent out, IpManagerEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900197 IpConnectivityLogClass.IpProvisioningEvent ipProvisioningEvent =
198 new IpConnectivityLogClass.IpProvisioningEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100199 ipProvisioningEvent.eventType = in.eventType;
200 ipProvisioningEvent.latencyMs = (int) in.durationMs;
201 out.setIpProvisioningEvent(ipProvisioningEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900202 }
203
204 private static void setIpReachabilityEvent(IpConnectivityEvent out, IpReachabilityEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900205 IpConnectivityLogClass.IpReachabilityEvent ipReachabilityEvent =
206 new IpConnectivityLogClass.IpReachabilityEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100207 ipReachabilityEvent.eventType = in.eventType;
208 out.setIpReachabilityEvent(ipReachabilityEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900209 }
210
211 private static void setDefaultNetworkEvent(IpConnectivityEvent out, DefaultNetworkEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900212 IpConnectivityLogClass.DefaultNetworkEvent defaultNetworkEvent =
213 new IpConnectivityLogClass.DefaultNetworkEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100214 defaultNetworkEvent.networkId = netIdOf(in.netId);
215 defaultNetworkEvent.previousNetworkId = netIdOf(in.prevNetId);
216 defaultNetworkEvent.transportTypes = in.transportTypes;
217 defaultNetworkEvent.previousNetworkIpSupport = ipSupportOf(in);
218 out.setDefaultNetworkEvent(defaultNetworkEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900219 }
220
221 private static void setNetworkEvent(IpConnectivityEvent out, NetworkEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900222 IpConnectivityLogClass.NetworkEvent networkEvent =
223 new IpConnectivityLogClass.NetworkEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100224 networkEvent.networkId = netIdOf(in.netId);
225 networkEvent.eventType = in.eventType;
226 networkEvent.latencyMs = (int) in.durationMs;
227 out.setNetworkEvent(networkEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900228 }
229
230 private static void setValidationProbeEvent(IpConnectivityEvent out, ValidationProbeEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900231 IpConnectivityLogClass.ValidationProbeEvent validationProbeEvent =
232 new IpConnectivityLogClass.ValidationProbeEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100233 validationProbeEvent.latencyMs = (int) in.durationMs;
234 validationProbeEvent.probeType = in.probeType;
235 validationProbeEvent.probeResult = in.returnCode;
236 out.setValidationProbeEvent(validationProbeEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900237 }
238
239 private static void setApfProgramEvent(IpConnectivityEvent out, ApfProgramEvent in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900240 IpConnectivityLogClass.ApfProgramEvent apfProgramEvent =
241 new IpConnectivityLogClass.ApfProgramEvent();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100242 apfProgramEvent.lifetime = in.lifetime;
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900243 apfProgramEvent.effectiveLifetime = in.actualLifetime;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100244 apfProgramEvent.filteredRas = in.filteredRas;
245 apfProgramEvent.currentRas = in.currentRas;
246 apfProgramEvent.programLength = in.programLength;
Hugo Benichi50a84c62016-09-02 09:00:59 +0900247 if (isBitSet(in.flags, ApfProgramEvent.FLAG_MULTICAST_FILTER_ON)) {
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100248 apfProgramEvent.dropMulticast = true;
Hugo Benichi50a84c62016-09-02 09:00:59 +0900249 }
250 if (isBitSet(in.flags, ApfProgramEvent.FLAG_HAS_IPV4_ADDRESS)) {
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100251 apfProgramEvent.hasIpv4Addr = true;
Hugo Benichi50a84c62016-09-02 09:00:59 +0900252 }
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100253 out.setApfProgramEvent(apfProgramEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900254 }
255
256 private static void setApfStats(IpConnectivityEvent out, ApfStats in) {
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900257 IpConnectivityLogClass.ApfStatistics apfStatistics =
258 new IpConnectivityLogClass.ApfStatistics();
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100259 apfStatistics.durationMs = in.durationMs;
260 apfStatistics.receivedRas = in.receivedRas;
261 apfStatistics.matchingRas = in.matchingRas;
262 apfStatistics.droppedRas = in.droppedRas;
263 apfStatistics.zeroLifetimeRas = in.zeroLifetimeRas;
264 apfStatistics.parseErrors = in.parseErrors;
265 apfStatistics.programUpdates = in.programUpdates;
Hugo Benichi22d9b2d2017-02-22 13:02:27 +0900266 apfStatistics.programUpdatesAll = in.programUpdatesAll;
267 apfStatistics.programUpdatesAllowingMulticast = in.programUpdatesAllowingMulticast;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100268 apfStatistics.maxProgramSize = in.maxProgramSize;
269 out.setApfStatistics(apfStatistics);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900270 }
271
272 private static void setRaEvent(IpConnectivityEvent out, RaEvent in) {
Tamas Berghammer383db5eb2016-06-22 15:21:38 +0100273 IpConnectivityLogClass.RaEvent raEvent = new IpConnectivityLogClass.RaEvent();
274 raEvent.routerLifetime = in.routerLifetime;
275 raEvent.prefixValidLifetime = in.prefixValidLifetime;
276 raEvent.prefixPreferredLifetime = in.prefixPreferredLifetime;
277 raEvent.routeInfoLifetime = in.routeInfoLifetime;
278 raEvent.rdnssLifetime = in.rdnssLifetime;
279 raEvent.dnsslLifetime = in.dnsslLifetime;
280 out.setRaEvent(raEvent);
Hugo Benichi50a84c62016-09-02 09:00:59 +0900281 }
282
283 private static int[] bytesToInts(byte[] in) {
284 final int[] out = new int[in.length];
285 for (int i = 0; i < in.length; i++) {
286 out[i] = in[i] & 0xFF;
287 }
288 return out;
289 }
290
Hugo Benichi5eb90532017-03-23 18:38:22 +0900291 private static Pair[] toPairArray(SparseIntArray counts) {
292 final int s = counts.size();
293 Pair[] pairs = new Pair[s];
294 for (int i = 0; i < s; i++) {
295 Pair p = new Pair();
296 p.key = counts.keyAt(i);
297 p.value = counts.valueAt(i);
298 pairs[i] = p;
299 }
300 return pairs;
301 }
302
Hugo Benichi50a84c62016-09-02 09:00:59 +0900303 private static NetworkId netIdOf(int netid) {
304 final NetworkId ni = new NetworkId();
305 ni.networkId = netid;
306 return ni;
307 }
308
309 private static int ipSupportOf(DefaultNetworkEvent in) {
310 if (in.prevIPv4 && in.prevIPv6) {
311 return IpConnectivityLogClass.DefaultNetworkEvent.DUAL;
312 }
313 if (in.prevIPv6) {
314 return IpConnectivityLogClass.DefaultNetworkEvent.IPV6;
315 }
316 if (in.prevIPv4) {
317 return IpConnectivityLogClass.DefaultNetworkEvent.IPV4;
318 }
319 return IpConnectivityLogClass.DefaultNetworkEvent.NONE;
320 }
321
322 private static boolean isBitSet(int flags, int bit) {
323 return (flags & (1 << bit)) != 0;
324 }
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900325
326 private static void inferLinkLayer(IpConnectivityEvent ev) {
327 int linkLayer = IpConnectivityLogClass.UNKNOWN;
328 if (ev.transports != 0) {
329 linkLayer = transportsToLinkLayer(ev.transports);
330 } else if (ev.ifName != null) {
331 linkLayer = ifnameToLinkLayer(ev.ifName);
332 }
333 if (linkLayer == IpConnectivityLogClass.UNKNOWN) {
334 return;
335 }
336 ev.linkLayer = linkLayer;
337 ev.ifName = "";
338 }
339
340 private static int transportsToLinkLayer(long transports) {
341 switch (Long.bitCount(transports)) {
342 case 0:
343 return IpConnectivityLogClass.UNKNOWN;
344 case 1:
345 int t = Long.numberOfTrailingZeros(transports);
346 return transportToLinkLayer(t);
347 default:
348 return IpConnectivityLogClass.MULTIPLE;
349 }
350 }
351
352 private static int transportToLinkLayer(int transport) {
353 if (0 <= transport && transport < TRANSPORT_LINKLAYER_MAP.length) {
354 return TRANSPORT_LINKLAYER_MAP[transport];
355 }
356 return IpConnectivityLogClass.UNKNOWN;
357 }
358
359 private static final int[] TRANSPORT_LINKLAYER_MAP = new int[MAX_TRANSPORT + 1];
360 static {
361 TRANSPORT_LINKLAYER_MAP[TRANSPORT_CELLULAR] = IpConnectivityLogClass.CELLULAR;
362 TRANSPORT_LINKLAYER_MAP[TRANSPORT_WIFI] = IpConnectivityLogClass.WIFI;
363 TRANSPORT_LINKLAYER_MAP[TRANSPORT_BLUETOOTH] = IpConnectivityLogClass.BLUETOOTH;
364 TRANSPORT_LINKLAYER_MAP[TRANSPORT_ETHERNET] = IpConnectivityLogClass.ETHERNET;
365 TRANSPORT_LINKLAYER_MAP[TRANSPORT_VPN] = IpConnectivityLogClass.UNKNOWN;
Hugo Benichi27a51172017-07-18 11:35:18 +0900366 TRANSPORT_LINKLAYER_MAP[TRANSPORT_WIFI_AWARE] = IpConnectivityLogClass.WIFI_NAN;
367 TRANSPORT_LINKLAYER_MAP[TRANSPORT_LOWPAN] = IpConnectivityLogClass.LOWPAN;
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900368 };
369
370 private static int ifnameToLinkLayer(String ifname) {
371 // Do not try to catch all interface names with regexes, instead only catch patterns that
372 // are cheap to check, and otherwise fallback on postprocessing in aggregation layer.
Hugo Benichi27a51172017-07-18 11:35:18 +0900373 for (int i = 0; i < KNOWN_PREFIX; i++) {
374 String pattern = IFNAME_PREFIXES[i];
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900375 if (ifname.startsWith(pattern)) {
Hugo Benichi27a51172017-07-18 11:35:18 +0900376 return IFNAME_LINKLAYERS[i];
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900377 }
378 }
379 return IpConnectivityLogClass.UNKNOWN;
380 }
381
Hugo Benichi27a51172017-07-18 11:35:18 +0900382 private static final int KNOWN_PREFIX = 7;
383 private static final String[] IFNAME_PREFIXES = new String[KNOWN_PREFIX];
384 private static final int[] IFNAME_LINKLAYERS = new int[KNOWN_PREFIX];
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900385 static {
Hugo Benichi27a51172017-07-18 11:35:18 +0900386 // Ordered from most likely link layer to least likely.
387 IFNAME_PREFIXES[0] = "rmnet";
388 IFNAME_LINKLAYERS[0] = IpConnectivityLogClass.CELLULAR;
389
390 IFNAME_PREFIXES[1] = "wlan";
391 IFNAME_LINKLAYERS[1] = IpConnectivityLogClass.WIFI;
392
393 IFNAME_PREFIXES[2] = "bt-pan";
394 IFNAME_LINKLAYERS[2] = IpConnectivityLogClass.BLUETOOTH;
395
396 IFNAME_PREFIXES[3] = "p2p";
397 IFNAME_LINKLAYERS[3] = IpConnectivityLogClass.WIFI_P2P;
398
399 IFNAME_PREFIXES[4] = "aware";
400 IFNAME_LINKLAYERS[4] = IpConnectivityLogClass.WIFI_NAN;
401
402 IFNAME_PREFIXES[5] = "eth";
403 IFNAME_LINKLAYERS[5] = IpConnectivityLogClass.ETHERNET;
404
405 IFNAME_PREFIXES[6] = "wpan";
406 IFNAME_LINKLAYERS[6] = IpConnectivityLogClass.LOWPAN;
Hugo Benichi73fd4d12017-03-15 23:05:01 +0900407 }
Hugo Benichi50a84c62016-09-02 09:00:59 +0900408}