• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 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 
17 package com.android.internal.telephony.data;
18 
19 import static android.telephony.TelephonyManager.HAL_SERVICE_DATA;
20 
21 import android.annotation.CallbackExecutor;
22 import android.annotation.IntDef;
23 import android.annotation.NonNull;
24 import android.annotation.Nullable;
25 import android.content.Intent;
26 import android.net.ConnectivityManager;
27 import android.net.LinkAddress;
28 import android.net.LinkProperties;
29 import android.net.NetworkAgent;
30 import android.net.NetworkAgentConfig;
31 import android.net.NetworkCapabilities;
32 import android.net.NetworkFactory;
33 import android.net.NetworkProvider;
34 import android.net.NetworkScore;
35 import android.net.ProxyInfo;
36 import android.net.RouteInfo;
37 import android.net.TelephonyNetworkSpecifier;
38 import android.net.Uri;
39 import android.net.vcn.VcnManager;
40 import android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener;
41 import android.net.vcn.VcnNetworkPolicyResult;
42 import android.os.AsyncResult;
43 import android.os.Looper;
44 import android.os.Message;
45 import android.os.Process;
46 import android.os.SystemClock;
47 import android.provider.Telephony;
48 import android.telephony.AccessNetworkConstants;
49 import android.telephony.AccessNetworkConstants.AccessNetworkType;
50 import android.telephony.AccessNetworkConstants.TransportType;
51 import android.telephony.Annotation.DataFailureCause;
52 import android.telephony.Annotation.DataState;
53 import android.telephony.Annotation.NetCapability;
54 import android.telephony.Annotation.NetworkType;
55 import android.telephony.Annotation.ValidationStatus;
56 import android.telephony.AnomalyReporter;
57 import android.telephony.CarrierConfigManager;
58 import android.telephony.DataFailCause;
59 import android.telephony.DataSpecificRegistrationInfo;
60 import android.telephony.LinkCapacityEstimate;
61 import android.telephony.NetworkRegistrationInfo;
62 import android.telephony.PcoData;
63 import android.telephony.PreciseDataConnectionState;
64 import android.telephony.ServiceState;
65 import android.telephony.SubscriptionManager;
66 import android.telephony.SubscriptionPlan;
67 import android.telephony.TelephonyDisplayInfo;
68 import android.telephony.TelephonyManager;
69 import android.telephony.data.ApnSetting;
70 import android.telephony.data.DataCallResponse;
71 import android.telephony.data.DataCallResponse.HandoverFailureMode;
72 import android.telephony.data.DataCallResponse.LinkStatus;
73 import android.telephony.data.DataProfile;
74 import android.telephony.data.DataService;
75 import android.telephony.data.DataServiceCallback;
76 import android.telephony.data.NetworkSliceInfo;
77 import android.telephony.data.QosBearerSession;
78 import android.telephony.data.TrafficDescriptor;
79 import android.telephony.data.TrafficDescriptor.OsAppId;
80 import android.text.TextUtils;
81 import android.util.ArrayMap;
82 import android.util.IndentingPrintWriter;
83 import android.util.LocalLog;
84 import android.util.SparseArray;
85 import android.util.SparseIntArray;
86 
87 import com.android.internal.telephony.CarrierSignalAgent;
88 import com.android.internal.telephony.CommandsInterface;
89 import com.android.internal.telephony.Phone;
90 import com.android.internal.telephony.PhoneConstants;
91 import com.android.internal.telephony.PhoneFactory;
92 import com.android.internal.telephony.RIL;
93 import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
94 import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason;
95 import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
96 import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEntry;
97 import com.android.internal.telephony.data.DataRetryManager.DataRetryEntry;
98 import com.android.internal.telephony.data.LinkBandwidthEstimator.LinkBandwidthEstimatorCallback;
99 import com.android.internal.telephony.data.TelephonyNetworkAgent.TelephonyNetworkAgentCallback;
100 import com.android.internal.telephony.metrics.DataCallSessionStats;
101 import com.android.internal.telephony.metrics.TelephonyMetrics;
102 import com.android.internal.util.ArrayUtils;
103 import com.android.internal.util.IState;
104 import com.android.internal.util.State;
105 import com.android.internal.util.StateMachine;
106 import com.android.net.module.util.LinkPropertiesUtils;
107 import com.android.net.module.util.NetUtils;
108 import com.android.net.module.util.NetworkCapabilitiesUtils;
109 import com.android.telephony.Rlog;
110 
111 import java.io.FileDescriptor;
112 import java.io.PrintWriter;
113 import java.math.BigInteger;
114 import java.net.InetAddress;
115 import java.util.ArrayList;
116 import java.util.Arrays;
117 import java.util.Collections;
118 import java.util.Comparator;
119 import java.util.List;
120 import java.util.Map;
121 import java.util.Objects;
122 import java.util.Set;
123 import java.util.UUID;
124 import java.util.concurrent.Executor;
125 import java.util.concurrent.TimeUnit;
126 import java.util.function.Consumer;
127 import java.util.stream.Collectors;
128 
129 /**
130  * DataNetwork class represents a single PDN (Packet Data Network).
131  *
132  * The life cycle of a data network starts from {@link ConnectingState}. If setup data request
133  * succeeds, then it enters {@link ConnectedState}, otherwise it enters
134  * {@link DisconnectedState}.
135  *
136  * When data network is in {@link ConnectingState}, it can enter {@link HandoverState} if handover
137  * between IWLAN and cellular occurs. After handover completes or fails, it return back to
138  * {@link ConnectedState}. When the data network is about to be disconnected, it first enters
139  * {@link DisconnectingState} when performing graceful tear down or when sending the data
140  * deactivation request. At the end, it enters {@link DisconnectedState} when {@link DataService}
141  * notifies data disconnected. Note that an unsolicited disconnected event from {@link DataService}
142  * or any vendor HAL failure response can immediately move data network from {@link ConnectedState}
143  * to {@link DisconnectedState}. {@link DisconnectedState} is the final state of a data network.
144  *
145  * State machine diagram:
146  *
147  *
148  *                                  ┌─────────┐
149  *                                  │Handover │
150  *                                  └─▲────┬──┘
151  *                                    │    │
152  *             ┌───────────┐        ┌─┴────▼──┐        ┌──────────────┐
153  *             │Connecting ├────────►Connected├────────►Disconnecting │
154  *             └─────┬─────┘        └────┬────┘        └───────┬──────┘
155  *                   │                   │                     │
156  *                   │             ┌─────▼──────┐              │
157  *                   └─────────────►Disconnected◄──────────────┘
158  *                                 └────────────┘
159  *
160  */
161 public class DataNetwork extends StateMachine {
162     private static final boolean VDBG = false;
163     /** Event for data config updated. */
164     private static final int EVENT_DATA_CONFIG_UPDATED = 1;
165 
166     /** Event for attaching a network request. */
167     private static final int EVENT_ATTACH_NETWORK_REQUEST = 2;
168 
169     /** Event for detaching a network request. */
170     private static final int EVENT_DETACH_NETWORK_REQUEST = 3;
171 
172     /** Event when detect radio not available. */
173     private static final int  EVENT_RADIO_NOT_AVAILABLE = 4;
174 
175     /** Event for allocating PDU session id response. */
176     private static final int EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE = 5;
177 
178     /** Event for setup data network response. */
179     private static final int EVENT_SETUP_DATA_NETWORK_RESPONSE = 6;
180 
181     /** Event for tearing down data network. */
182     private static final int EVENT_TEAR_DOWN_NETWORK = 7;
183 
184     /** Event triggered by {@link DataServiceCallback#onDataCallListChanged(List)}. */
185     private static final int EVENT_DATA_STATE_CHANGED = 8;
186 
187     /** Data network service state changed event. */
188     private static final int EVENT_SERVICE_STATE_CHANGED = 9;
189 
190     /** Event for detaching all network requests. */
191     private static final int EVENT_DETACH_ALL_NETWORK_REQUESTS = 10;
192 
193     /** Event for bandwidth estimation from the modem changed. */
194     private static final int EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED = 11;
195 
196     /** Event for display info changed. This is for getting 5G NSA or mmwave information. */
197     private static final int EVENT_DISPLAY_INFO_CHANGED = 13;
198 
199     /** Event for setup data call (for handover) response from the data service. */
200     private static final int EVENT_HANDOVER_RESPONSE = 15;
201 
202     /** Event for subscription plan changed or unmetered/congested override set. */
203     private static final int EVENT_SUBSCRIPTION_PLAN_OVERRIDE = 16;
204 
205     /** Event for PCO data received from network. */
206     private static final int EVENT_PCO_DATA_RECEIVED = 17;
207 
208     /** Event for carrier privileged UIDs changed. */
209     private static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = 18;
210 
211     /** Event for deactivate data network response. */
212     private static final int EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE = 19;
213 
214     /**
215      * Event for data network stuck in transient (i.e. connecting/disconnecting/handover) state for
216      * too long time. Timeout value specified in
217      * {@link DataConfigManager#getAnomalyNetworkConnectingTimeoutMs()},
218      * {@link DataConfigManager#getAnomalyNetworkDisconnectingTimeoutMs()},
219      * {@link DataConfigManager#getNetworkHandoverTimeoutMs()}.
220      */
221     private static final int EVENT_STUCK_IN_TRANSIENT_STATE = 20;
222 
223     /**
224      * Event for waiting for tearing down condition met. This will cause data network entering
225      * disconnecting state.
226      */
227     private static final int EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET = 21;
228 
229     /** Event for call started. */
230     private static final int EVENT_VOICE_CALL_STARTED = 22;
231 
232     /** Event for call ended. */
233     private static final int EVENT_VOICE_CALL_ENDED = 23;
234 
235     /** Event for CSS indicator changed. */
236     private static final int EVENT_CSS_INDICATOR_CHANGED = 24;
237 
238     /**
239      * Event for notifying source transport that handover is about to be initiated on target
240      * transport.
241      */
242     private static final int EVENT_NOTIFY_HANDOVER_STARTED = 25;
243 
244     /**
245      * Event for the response of notifying source transport that handover is about to be initiated
246      * on target transport.
247      */
248     private static final int EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE = 26;
249 
250     /**
251      * Event for the response of notifying source transport that handover is cancelled/failed on the
252      * target transport.
253      */
254     private static final int EVENT_NOTIFY_HANDOVER_CANCELLED_RESPONSE = 27;
255 
256     /** Invalid context id. */
257     private static final int INVALID_CID = -1;
258 
259     /**
260      * The data network providing default internet will have a higher score of 50. Other network
261      * will have a slightly lower score of 45. The intention is other connections will not cause
262      * connectivity service to tear down default internet connection. For example, to validate
263      * internet connection on non-default data SIM, we'll set up a temporary internet network on
264      * that data SIM. In this case, score of 45 is assigned so connectivity service will not replace
265      * the default internet network with it.
266      */
267     private static final int DEFAULT_INTERNET_NETWORK_SCORE = 50;
268     private static final int OTHER_NETWORK_SCORE = 45;
269 
270     @IntDef(prefix = {"TEAR_DOWN_REASON_"},
271             value = {
272                     TEAR_DOWN_REASON_NONE,
273                     TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED,
274                     TEAR_DOWN_REASON_SIM_REMOVAL,
275                     TEAR_DOWN_REASON_AIRPLANE_MODE_ON,
276                     TEAR_DOWN_REASON_DATA_DISABLED,
277                     TEAR_DOWN_REASON_NO_LIVE_REQUEST,
278                     TEAR_DOWN_REASON_RAT_NOT_ALLOWED,
279                     TEAR_DOWN_REASON_ROAMING_DISABLED,
280                     TEAR_DOWN_REASON_CONCURRENT_VOICE_DATA_NOT_ALLOWED,
281                     TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY,
282                     TEAR_DOWN_REASON_POWER_OFF_BY_CARRIER,
283                     TEAR_DOWN_REASON_DATA_STALL,
284                     TEAR_DOWN_REASON_HANDOVER_FAILED,
285                     TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED,
286                     TEAR_DOWN_REASON_VCN_REQUESTED,
287                     TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED,
288                     TEAR_DOWN_REASON_DEFAULT_DATA_UNSELECTED,
289                     TEAR_DOWN_REASON_NOT_IN_SERVICE,
290                     TEAR_DOWN_REASON_DATA_CONFIG_NOT_READY,
291                     TEAR_DOWN_REASON_PENDING_TEAR_DOWN_ALL,
292                     TEAR_DOWN_REASON_NO_SUITABLE_DATA_PROFILE,
293                     TEAR_DOWN_REASON_CDMA_EMERGENCY_CALLBACK_MODE,
294                     TEAR_DOWN_REASON_RETRY_SCHEDULED,
295                     TEAR_DOWN_REASON_DATA_THROTTLED,
296                     TEAR_DOWN_REASON_DATA_PROFILE_INVALID,
297                     TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED,
298                     TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY,
299                     TEAR_DOWN_REASON_ILLEGAL_STATE,
300                     TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK,
301                     TEAR_DOWN_REASON_PREFERRED_DATA_SWITCHED,
302             })
303     public @interface TearDownReason {}
304 
305     /** Data network was not torn down. */
306     public static final int TEAR_DOWN_REASON_NONE = 0;
307 
308     /** Data network tear down requested by connectivity service. */
309     public static final int TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED = 1;
310 
311     /** Data network tear down due to SIM removal. */
312     public static final int TEAR_DOWN_REASON_SIM_REMOVAL = 2;
313 
314     /** Data network tear down due to airplane mode turned on. */
315     public static final int TEAR_DOWN_REASON_AIRPLANE_MODE_ON = 3;
316 
317     /** Data network tear down due to data disabled (by user, policy, carrier, etc...). */
318     public static final int TEAR_DOWN_REASON_DATA_DISABLED = 4;
319 
320     /** Data network tear down due to no live network request. */
321     public static final int TEAR_DOWN_REASON_NO_LIVE_REQUEST = 5;
322 
323     /** Data network tear down due to current RAT is not allowed by the data profile. */
324     public static final int TEAR_DOWN_REASON_RAT_NOT_ALLOWED = 6;
325 
326     /** Data network tear down due to data roaming not enabled. */
327     public static final int TEAR_DOWN_REASON_ROAMING_DISABLED = 7;
328 
329     /** Data network tear down due to concurrent voice/data not allowed. */
330     public static final int TEAR_DOWN_REASON_CONCURRENT_VOICE_DATA_NOT_ALLOWED = 8;
331 
332 
333 
334     /** Data network tear down due to data service unbound. */
335     public static final int TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY = 10;
336 
337     /** Data network tear down due to radio turned off by the carrier. */
338     public static final int TEAR_DOWN_REASON_POWER_OFF_BY_CARRIER = 11;
339 
340     /** Data network tear down due to data stall. */
341     public static final int TEAR_DOWN_REASON_DATA_STALL = 12;
342 
343     /** Data network tear down due to handover failed. */
344     public static final int TEAR_DOWN_REASON_HANDOVER_FAILED = 13;
345 
346     /** Data network tear down due to handover not allowed. */
347     public static final int TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED = 14;
348 
349     /** Data network tear down due to VCN service requested. */
350     public static final int TEAR_DOWN_REASON_VCN_REQUESTED = 15;
351 
352     /** Data network tear down due to VOPS no longer supported. */
353     public static final int TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED = 16;
354 
355     /** Data network tear down due to default data unselected. */
356     public static final int TEAR_DOWN_REASON_DEFAULT_DATA_UNSELECTED = 17;
357 
358     /** Data network tear down due to device not in service. */
359     public static final int TEAR_DOWN_REASON_NOT_IN_SERVICE = 18;
360 
361     /** Data network tear down due to data config not ready. */
362     public static final int TEAR_DOWN_REASON_DATA_CONFIG_NOT_READY = 19;
363 
364     /** Data network tear down due to tear down all pending. */
365     public static final int TEAR_DOWN_REASON_PENDING_TEAR_DOWN_ALL = 20;
366 
367     /** Data network tear down due to no suitable data profile. */
368     public static final int TEAR_DOWN_REASON_NO_SUITABLE_DATA_PROFILE = 21;
369 
370     /** Data network tear down due to CDMA ECBM. */
371     public static final int TEAR_DOWN_REASON_CDMA_EMERGENCY_CALLBACK_MODE = 22;
372 
373     /** Data network tear down due to retry scheduled. */
374     public static final int TEAR_DOWN_REASON_RETRY_SCHEDULED = 23;
375 
376     /** Data network tear down due to data throttled. */
377     public static final int TEAR_DOWN_REASON_DATA_THROTTLED = 24;
378 
379     /** Data network tear down due to data profile invalid. */
380     public static final int TEAR_DOWN_REASON_DATA_PROFILE_INVALID = 25;
381 
382     /** Data network tear down due to data profile not preferred. */
383     public static final int TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED = 26;
384 
385     /** Data network tear down due to handover not allowed by policy. */
386     public static final int TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY = 27;
387 
388     /** Data network tear down due to illegal state. */
389     public static final int TEAR_DOWN_REASON_ILLEGAL_STATE = 28;
390 
391     /** Data network tear down due to only allowed single network. */
392     public static final int TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK = 29;
393 
394     /** Data network tear down due to preferred data switched to another phone. */
395     public static final int TEAR_DOWN_REASON_PREFERRED_DATA_SWITCHED = 30;
396 
397     @IntDef(prefix = {"BANDWIDTH_SOURCE_"},
398             value = {
399                     BANDWIDTH_SOURCE_UNKNOWN,
400                     BANDWIDTH_SOURCE_MODEM,
401                     BANDWIDTH_SOURCE_CARRIER_CONFIG,
402                     BANDWIDTH_SOURCE_BANDWIDTH_ESTIMATOR,
403             })
404     public @interface BandwidthEstimationSource {}
405 
406     /** Indicates the bandwidth estimation source is unknown. This must be a configuration error. */
407     public static final int BANDWIDTH_SOURCE_UNKNOWN = 0;
408 
409     /** Indicates the bandwidth estimation source is from the modem. */
410     public static final int BANDWIDTH_SOURCE_MODEM = 1;
411 
412     /** Indicates the bandwidth estimation source is from the static carrier config. */
413     public static final int BANDWIDTH_SOURCE_CARRIER_CONFIG = 2;
414 
415     /** Indicates the bandwidth estimation source is from {@link LinkBandwidthEstimator}. */
416     public static final int BANDWIDTH_SOURCE_BANDWIDTH_ESTIMATOR = 3;
417 
418     /**
419      * The capabilities that are allowed to changed dynamically during the life cycle of network.
420      * This is copied from {@code NetworkCapabilities#MUTABLE_CAPABILITIES}. There is no plan to
421      * make this a connectivity manager API since in the future, immutable network capabilities
422      * would be allowed to changed dynamically. (i.e. not immutable anymore.)
423      */
424     private static final List<Integer> MUTABLE_CAPABILITIES = List.of(
425             NetworkCapabilities.NET_CAPABILITY_TRUSTED,
426             NetworkCapabilities.NET_CAPABILITY_VALIDATED,
427             NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL,
428             NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING,
429             NetworkCapabilities.NET_CAPABILITY_FOREGROUND,
430             NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED,
431             NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED,
432             NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY,
433             NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED,
434             NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED,
435             NetworkCapabilities.NET_CAPABILITY_HEAD_UNIT,
436             // Connectivity service will support NOT_METERED as a mutable and requestable
437             // capability.
438             NetworkCapabilities.NET_CAPABILITY_NOT_METERED,
439             // Even though MMTEL is an immutable capability, we still make it an mutable capability
440             // here before we have a better solution to deal with network transition from VoPS
441             // to non-VoPS network.
442             NetworkCapabilities.NET_CAPABILITY_MMTEL
443     );
444 
445     /** The parent state. Any messages not handled by the child state fallback to this. */
446     private final DefaultState mDefaultState = new DefaultState();
447 
448     /**
449      * The connecting state. This is the initial state of a data network.
450      *
451      * @see DataNetwork for the state machine diagram.
452      */
453     private final ConnectingState mConnectingState = new ConnectingState();
454 
455     /**
456      * The connected state. This is the state when data network becomes usable.
457      *
458      * @see DataNetwork for the state machine diagram.
459      */
460     private final ConnectedState mConnectedState = new ConnectedState();
461 
462     /**
463      * The handover state. This is the state when data network handover between IWLAN and cellular.
464      *
465      * @see DataNetwork for the state machine diagram.
466      */
467     private final HandoverState mHandoverState = new HandoverState();
468 
469     /**
470      * The disconnecting state. This is the state when data network is about to be disconnected.
471      * The network is still usable in this state, but the clients should be prepared to lose the
472      * network in any moment. This state is particular useful for IMS graceful tear down, where
473      * the network enters disconnecting state while waiting for IMS de-registration signal.
474      *
475      * @see DataNetwork for the state machine diagram.
476      */
477     private final DisconnectingState mDisconnectingState = new DisconnectingState();
478 
479     /**
480      * The disconnected state. This is the final state of a data network.
481      *
482      * @see DataNetwork for the state machine diagram.
483      */
484     private final DisconnectedState mDisconnectedState = new DisconnectedState();
485 
486     /** The phone instance. */
487     private final @NonNull Phone mPhone;
488 
489     /**
490      * The subscription id. This is assigned when the network is created, and not supposed to
491      * change afterwards.
492      */
493     private final int mSubId;
494 
495     /** The network score of this network. */
496     private int mNetworkScore;
497 
498     /**
499      * Indicates that
500      * {@link DataService.DataServiceProvider#deactivateDataCall(int, int, DataServiceCallback)}
501      * has been called. This flag can be only changed from {@code false} to {@code true}.
502      */
503     private boolean mInvokedDataDeactivation = false;
504 
505     /**
506      * Indicates that if the data network has ever entered {@link ConnectedState}.
507      */
508     private boolean mEverConnected = false;
509 
510     /** RIL interface. */
511     private final @NonNull CommandsInterface mRil;
512 
513     /** Local log. */
514     private final LocalLog mLocalLog = new LocalLog(128);
515 
516     /** The callback to receives data network state update. */
517     private final @NonNull DataNetworkCallback mDataNetworkCallback;
518 
519     /** The log tag. */
520     private String mLogTag;
521 
522     /** Metrics of per data network connection. */
523     private final DataCallSessionStats mDataCallSessionStats;
524 
525     /**
526      * The unique context id assigned by the data service in {@link DataCallResponse#getId()}. One
527      * for {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} and one for
528      * {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN}. The reason for storing both is that
529      * during handover, both cid will be used.
530      */
531     private final SparseIntArray mCid = new SparseIntArray(2);
532 
533     /**
534      * The initial network agent id. The network agent can be re-created due to immutable capability
535      * changed. This is to preserve the initial network agent id so the id in the logging tag won't
536      * change for the entire life cycle of data network.
537      */
538     private int mInitialNetworkAgentId;
539 
540     /** PDU session id. */
541     private int mPduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET;
542 
543     /**
544      * Data service managers for accessing {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} and
545      * {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN} data services.
546      */
547     private final @NonNull SparseArray<DataServiceManager> mDataServiceManagers;
548 
549     /** Access networks manager. */
550     private final @NonNull AccessNetworksManager mAccessNetworksManager;
551 
552     /** Data network controller. */
553     private final @NonNull DataNetworkController mDataNetworkController;
554 
555     /** Data network controller callback. */
556     private final @NonNull DataNetworkController.DataNetworkControllerCallback
557             mDataNetworkControllerCallback;
558 
559     /** Data config manager. */
560     private final @NonNull DataConfigManager mDataConfigManager;
561 
562     /** VCN manager. */
563     private final @Nullable VcnManager mVcnManager;
564 
565     /** VCN policy changed listener. */
566     private @Nullable VcnNetworkPolicyChangeListener mVcnPolicyChangeListener;
567 
568     /** The network agent associated with this data network. */
569     private @NonNull TelephonyNetworkAgent mNetworkAgent;
570 
571     /** QOS callback tracker. This is only created after network connected on WWAN. */
572     private @Nullable QosCallbackTracker mQosCallbackTracker;
573 
574     /** NAT keepalive tracker. */
575     private @Nullable KeepaliveTracker mKeepaliveTracker;
576 
577     /** The data profile used to establish this data network. */
578     private @NonNull DataProfile mDataProfile;
579 
580     /**
581      * The data profile used for data handover. Some carriers might use different data profile
582      * between IWLAN and cellular. Only set before handover started.
583      */
584     private @Nullable DataProfile mHandoverDataProfile;
585 
586     /** The network capabilities of this data network. */
587     private @NonNull NetworkCapabilities mNetworkCapabilities;
588 
589     /** The matched traffic descriptor returned from setup data call request. */
590     private final @NonNull List<TrafficDescriptor> mTrafficDescriptors = new ArrayList<>();
591 
592     /** The link properties of this data network. */
593     private @NonNull LinkProperties mLinkProperties;
594 
595     /** The network slice info. */
596     private @Nullable NetworkSliceInfo mNetworkSliceInfo;
597 
598     /** The link status (i.e. RRC state). */
599     private @LinkStatus int mLinkStatus = DataCallResponse.LINK_STATUS_UNKNOWN;
600 
601     /** The network bandwidth. */
602     private @NonNull NetworkBandwidth mNetworkBandwidth = new NetworkBandwidth(14, 14);
603 
604     /** The TCP buffer sizes config. */
605     private @NonNull String mTcpBufferSizes;
606 
607     /** The telephony display info. */
608     private @NonNull TelephonyDisplayInfo mTelephonyDisplayInfo;
609 
610     /** Whether {@link NetworkCapabilities#NET_CAPABILITY_TEMPORARILY_NOT_METERED} is supported. */
611     private boolean mTempNotMeteredSupported = false;
612 
613     /** Whether the current data network is temporarily not metered. */
614     private boolean mTempNotMetered = false;
615 
616     /** Whether the current data network is congested. */
617     private boolean mCongested = false;
618 
619     /** The network requests associated with this data network */
620     private final @NonNull NetworkRequestList mAttachedNetworkRequestList =
621             new NetworkRequestList();
622 
623     /**
624      * The latest data call response received from either
625      * {@link DataServiceCallback#onSetupDataCallComplete(int, DataCallResponse)} or
626      * {@link DataServiceCallback#onDataCallListChanged(List)}. The very first update must be
627      * from {@link DataServiceCallback#onSetupDataCallComplete(int, DataCallResponse)}.
628      */
629     private @Nullable DataCallResponse mDataCallResponse = null;
630 
631     /**
632      * The fail cause from either setup data failure or unsolicited disconnect reported by data
633      * service.
634      */
635     private @DataFailureCause int mFailCause = DataFailCause.NONE;
636 
637     /**
638      * The tear down reason if the data call is voluntarily deactivated, not due to failure.
639      */
640     private @TearDownReason int mTearDownReason = TEAR_DOWN_REASON_NONE;
641 
642     /**
643      * The retry delay in milliseconds from setup data failure.
644      */
645     private long mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
646 
647     /**
648      * Indicates if data network is suspended. Note this is slightly different from the
649      * {@link TelephonyManager#DATA_SUSPENDED}, which is only possible when data network is in
650      * connected state. This flag reflects to the
651      * {@link NetworkCapabilities#NET_CAPABILITY_NOT_SUSPENDED} which can happen when data network
652      * is in connected or disconnecting state.
653      */
654     private boolean mSuspended = false;
655 
656     /**
657      * The current transport of the data network. For handover, the current transport will be set
658      * after handover completes.
659      */
660     private @TransportType int mTransport;
661 
662     /**
663      * The last known data network type.
664      */
665     private @NetworkType int mLastKnownDataNetworkType;
666 
667     /**
668      * The last known roaming state of this data network.
669      */
670     private boolean mLastKnownRoamingState;
671 
672     /** The reason that why setting up this data network is allowed. */
673     private @NonNull DataAllowedReason mDataAllowedReason;
674 
675     /**
676      * PCO (Protocol Configuration Options) data received from the network. The first key is the
677      * cid of the PCO data, the second key is the PCO id, the value is the PCO data.
678      */
679     private final @NonNull Map<Integer, Map<Integer, PcoData>> mPcoData = new ArrayMap<>();
680 
681     /** The QOS bearer sessions. */
682     private final @NonNull List<QosBearerSession> mQosBearerSessions = new ArrayList<>();
683 
684     /**
685      * The UIDs of packages that have carrier privilege.
686      */
687     private @NonNull int[] mAdministratorUids = new int[0];
688 
689     /** Carrier privileges callback to monitor administrator UID change. */
690     private @Nullable TelephonyManager.CarrierPrivilegesCallback mCarrierPrivilegesCallback;
691 
692     /**
693      * Carrier service package uid. This UID will not change through the life cycle of data network.
694      */
695     private int mCarrierServicePackageUid = Process.INVALID_UID;
696 
697     /**
698      * Link bandwidth estimator callback for receiving latest link bandwidth information.
699      */
700     private @Nullable LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback;
701 
702     /**
703      * Data config callback for carrier config update.
704      */
705     private @Nullable DataConfigManagerCallback mDataConfigManagerCallback;
706 
707     /**
708      * The network bandwidth.
709      */
710     public static class NetworkBandwidth {
711         /** The downlink bandwidth in Kbps. */
712         public final int downlinkBandwidthKbps;
713 
714         /** The uplink Bandwidth in Kbps. */
715         public final int uplinkBandwidthKbps;
716 
717         /**
718          * Constructor.
719          *
720          * @param downlinkBandwidthKbps The downlink bandwidth in Kbps.
721          * @param uplinkBandwidthKbps The uplink Bandwidth in Kbps.
722          */
NetworkBandwidth(int downlinkBandwidthKbps, int uplinkBandwidthKbps)723         public NetworkBandwidth(int downlinkBandwidthKbps, int uplinkBandwidthKbps) {
724             this.downlinkBandwidthKbps = downlinkBandwidthKbps;
725             this.uplinkBandwidthKbps = uplinkBandwidthKbps;
726         }
727 
728         @Override
toString()729         public String toString() {
730             return String.format("NetworkBandwidth=[downlink=%d, uplink=%d]",
731                     downlinkBandwidthKbps, uplinkBandwidthKbps);
732         }
733     }
734 
735     /**
736      * Data network callback. Should only be used by {@link DataNetworkController}.
737      */
738     public abstract static class DataNetworkCallback extends DataCallback {
739         /**
740          * Constructor
741          *
742          * @param executor The executor of the callback.
743          */
DataNetworkCallback(@onNull @allbackExecutor Executor executor)744         public DataNetworkCallback(@NonNull @CallbackExecutor Executor executor) {
745             super(executor);
746         }
747 
748         /**
749          * Called when data setup failed.
750          *
751          * @param dataNetwork The data network.
752          * @param requestList The network requests attached to this data network.
753          * @param cause The fail cause of setup data network.
754          * @param retryDurationMillis The network suggested data retry duration in milliseconds as
755          * specified in 3GPP TS 24.302 section 8.2.9.1. The {@link DataProfile} associated to this
756          * data network will be throttled for the specified duration unless
757          * {@link DataServiceCallback#onApnUnthrottled} is called. {@link Long#MAX_VALUE} indicates
758          * data retry should not occur. {@link DataCallResponse#RETRY_DURATION_UNDEFINED} indicates
759          * network did not suggest any retry duration.
760          */
onSetupDataFailed(@onNull DataNetwork dataNetwork, @NonNull NetworkRequestList requestList, @DataFailureCause int cause, long retryDurationMillis)761         public abstract void onSetupDataFailed(@NonNull DataNetwork dataNetwork,
762                 @NonNull NetworkRequestList requestList, @DataFailureCause int cause,
763                 long retryDurationMillis);
764 
765         /**
766          * Called when data network enters {@link ConnectedState}.
767          *
768          * @param dataNetwork The data network.
769          */
onConnected(@onNull DataNetwork dataNetwork)770         public abstract void onConnected(@NonNull DataNetwork dataNetwork);
771 
772         /**
773          * Called when data network validation status changed.
774          *
775          * @param dataNetwork The data network.
776          * @param status one of {@link NetworkAgent#VALIDATION_STATUS_VALID} or
777          * {@link NetworkAgent#VALIDATION_STATUS_NOT_VALID}.
778          * @param redirectUri If internet connectivity is being redirected (e.g., on a captive
779          * portal), this is the destination the probes are being redirected to, otherwise
780          * {@code null}.
781          */
onValidationStatusChanged(@onNull DataNetwork dataNetwork, @ValidationStatus int status, @Nullable Uri redirectUri)782         public abstract void onValidationStatusChanged(@NonNull DataNetwork dataNetwork,
783                 @ValidationStatus int status, @Nullable Uri redirectUri);
784 
785         /**
786          * Called when data network suspended state changed.
787          *
788          * @param dataNetwork The data network.
789          * @param suspended {@code true} if data is suspended.
790          */
onSuspendedStateChanged(@onNull DataNetwork dataNetwork, boolean suspended)791         public abstract void onSuspendedStateChanged(@NonNull DataNetwork dataNetwork,
792                 boolean suspended);
793 
794         /**
795          * Called when network requests were failed to attach to the data network.
796          *
797          * @param dataNetwork The data network.
798          * @param requestList The requests failed to attach.
799          */
onAttachFailed(@onNull DataNetwork dataNetwork, @NonNull NetworkRequestList requestList)800         public abstract void onAttachFailed(@NonNull DataNetwork dataNetwork,
801                 @NonNull NetworkRequestList requestList);
802 
803         /**
804          * Called when data network enters {@link DisconnectedState}. Note this is only called
805          * when the data network was previously connected. For setup data network failed,
806          * {@link #onSetupDataFailed(DataNetwork, NetworkRequestList, int, long)} is called.
807          *
808          * @param dataNetwork The data network.
809          * @param cause The disconnect cause.
810          * @param tearDownReason The reason the network was torn down
811          */
onDisconnected(@onNull DataNetwork dataNetwork, @DataFailureCause int cause, @TearDownReason int tearDownReason)812         public abstract void onDisconnected(@NonNull DataNetwork dataNetwork,
813                 @DataFailureCause int cause, @TearDownReason int tearDownReason);
814 
815         /**
816          * Called when handover between IWLAN and cellular network succeeded.
817          *
818          * @param dataNetwork The data network.
819          */
onHandoverSucceeded(@onNull DataNetwork dataNetwork)820         public abstract void onHandoverSucceeded(@NonNull DataNetwork dataNetwork);
821 
822         /**
823          * Called when data network handover between IWLAN and cellular network failed.
824          *
825          * @param dataNetwork The data network.
826          * @param cause The fail cause.
827          * @param retryDurationMillis Network suggested retry time in milliseconds.
828          * {@link Long#MAX_VALUE} indicates data retry should not occur.
829          * {@link DataCallResponse#RETRY_DURATION_UNDEFINED} indicates network did not suggest any
830          * retry duration.
831          * @param handoverFailureMode The handover failure mode that determine the behavior of
832          * how frameworks should handle the handover failure.
833          */
onHandoverFailed(@onNull DataNetwork dataNetwork, @DataFailureCause int cause, long retryDurationMillis, @HandoverFailureMode int handoverFailureMode)834         public abstract void onHandoverFailed(@NonNull DataNetwork dataNetwork,
835                 @DataFailureCause int cause, long retryDurationMillis,
836                 @HandoverFailureMode int handoverFailureMode);
837 
838         /**
839          * Called when data network link status (i.e. RRC state) changed.
840          *
841          * @param dataNetwork The data network.
842          * @param linkStatus The link status (i.e. RRC state).
843          */
onLinkStatusChanged(@onNull DataNetwork dataNetwork, @LinkStatus int linkStatus)844         public abstract void onLinkStatusChanged(@NonNull DataNetwork dataNetwork,
845                 @LinkStatus int linkStatus);
846 
847         /**
848          * Called when PCO data changed.
849          *
850          * @param dataNetwork The data network.
851          */
onPcoDataChanged(@onNull DataNetwork dataNetwork)852         public abstract void onPcoDataChanged(@NonNull DataNetwork dataNetwork);
853 
854         /**
855          * Called when network capabilities changed.
856          *
857          * @param dataNetwork The data network.
858          */
onNetworkCapabilitiesChanged(@onNull DataNetwork dataNetwork)859         public abstract void onNetworkCapabilitiesChanged(@NonNull DataNetwork dataNetwork);
860 
861         /**
862          * Called when attempt to tear down a data network
863          *
864          * @param dataNetwork The data network.
865          */
onTrackNetworkUnwanted(@onNull DataNetwork dataNetwork)866         public abstract void onTrackNetworkUnwanted(@NonNull DataNetwork dataNetwork);
867 
868         /**
869          * Called when a network request is detached after no longer satisfied.
870          *
871          * @param networkRequest The detached network request.
872          */
onRetryUnsatisfiedNetworkRequest( @onNull TelephonyNetworkRequest networkRequest)873         public abstract void onRetryUnsatisfiedNetworkRequest(
874                 @NonNull TelephonyNetworkRequest networkRequest);
875     }
876 
877     /**
878      * Constructor
879      *
880      * @param phone The phone instance.
881      * @param looper The looper to be used by the state machine. Currently the handler thread is the
882      * phone process's main thread.
883      * @param dataServiceManagers Data service managers.
884      * @param dataProfile The data profile for establishing the data network.
885      * @param networkRequestList The initial network requests attached to this data network.
886      * @param transport The initial transport of the data network.
887      * @param dataAllowedReason The reason that why setting up this data network is allowed.
888      * @param callback The callback to receives data network state update.
889      */
DataNetwork(@onNull Phone phone, @NonNull Looper looper, @NonNull SparseArray<DataServiceManager> dataServiceManagers, @NonNull DataProfile dataProfile, @NonNull NetworkRequestList networkRequestList, @TransportType int transport, @NonNull DataAllowedReason dataAllowedReason, @NonNull DataNetworkCallback callback)890     public DataNetwork(@NonNull Phone phone, @NonNull Looper looper,
891             @NonNull SparseArray<DataServiceManager> dataServiceManagers,
892             @NonNull DataProfile dataProfile,
893             @NonNull NetworkRequestList networkRequestList,
894             @TransportType int transport,
895             @NonNull DataAllowedReason dataAllowedReason,
896             @NonNull DataNetworkCallback callback) {
897         super("DataNetwork", looper);
898         // State machine should be initialized at the top of constructor. log() can be only used
899         // after state machine initialized (because getCurrentState() crashes if state machine has
900         // not started.)
901         initializeStateMachine();
902 
903         mPhone = phone;
904         mSubId = phone.getSubId();
905         mRil = mPhone.mCi;
906         mLinkProperties = new LinkProperties();
907         mDataServiceManagers = dataServiceManagers;
908         mAccessNetworksManager = phone.getAccessNetworksManager();
909         mVcnManager = mPhone.getContext().getSystemService(VcnManager.class);
910         mDataNetworkController = phone.getDataNetworkController();
911         mDataNetworkControllerCallback = new DataNetworkController.DataNetworkControllerCallback(
912                 getHandler()::post) {
913             @Override
914             public void onSubscriptionPlanOverride() {
915                 sendMessage(EVENT_SUBSCRIPTION_PLAN_OVERRIDE);
916             }};
917         mDataNetworkController.registerDataNetworkControllerCallback(
918                 mDataNetworkControllerCallback);
919         mDataConfigManager = mDataNetworkController.getDataConfigManager();
920         mDataCallSessionStats = new DataCallSessionStats(mPhone);
921         mDataNetworkCallback = callback;
922         mDataProfile = dataProfile;
923         if (dataProfile.getTrafficDescriptor() != null) {
924             // The initial traffic descriptor is from the data profile. After that traffic
925             // descriptors will be updated by modem through setup data call response and data call
926             // list changed event.
927             mTrafficDescriptors.add(dataProfile.getTrafficDescriptor());
928         }
929         mTransport = transport;
930         mLastKnownDataNetworkType = getDataNetworkType();
931         mLastKnownRoamingState = mPhone.getServiceState().getDataRoamingFromRegistration();
932         mDataAllowedReason = dataAllowedReason;
933         dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime());
934         mAttachedNetworkRequestList.addAll(networkRequestList);
935         for (int transportType : mAccessNetworksManager.getAvailableTransports()) {
936             mCid.put(transportType, INVALID_CID);
937         }
938         mTelephonyDisplayInfo = mPhone.getDisplayInfoController().getTelephonyDisplayInfo();
939         mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo);
940 
941         for (TelephonyNetworkRequest networkRequest : networkRequestList) {
942             networkRequest.setAttachedNetwork(DataNetwork.this);
943             networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
944         }
945 
946         // Update the capabilities in the constructor is to make sure the data network has initial
947         // capability immediately after created. Doing this connecting state creates the window that
948         // DataNetworkController might check if existing data network's capability can satisfy the
949         // next network request within this window.
950         updateNetworkCapabilities();
951     }
952 
953     /**
954      * Initialize and start the state machine.
955      */
initializeStateMachine()956     private void initializeStateMachine() {
957         addState(mDefaultState);
958         addState(mConnectingState, mDefaultState);
959         addState(mConnectedState, mDefaultState);
960         addState(mHandoverState, mDefaultState);
961         addState(mDisconnectingState, mDefaultState);
962         addState(mDisconnectedState, mDefaultState);
963         setInitialState(mConnectingState);
964         start();
965     }
966 
967     /**
968      * @return {@code true} if 464xlat should be skipped.
969      */
shouldSkip464Xlat()970     private boolean shouldSkip464Xlat() {
971         if (mDataProfile.getApnSetting() != null) {
972             switch (mDataProfile.getApnSetting().getSkip464Xlat()) {
973                 case Telephony.Carriers.SKIP_464XLAT_ENABLE:
974                     return true;
975                 case Telephony.Carriers.SKIP_464XLAT_DISABLE:
976                     return false;
977                 case Telephony.Carriers.SKIP_464XLAT_DEFAULT:
978                 default:
979                     break;
980             }
981         }
982 
983         // As default, return true if ims and no internet
984         final NetworkCapabilities nc = getNetworkCapabilities();
985         return nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
986                 && !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
987     }
988 
989     /**
990      * Create the telephony network agent.
991      *
992      * @return The telephony network agent.
993      */
createNetworkAgent()994     private @NonNull TelephonyNetworkAgent createNetworkAgent() {
995         final NetworkAgentConfig.Builder configBuilder = new NetworkAgentConfig.Builder();
996         configBuilder.setLegacyType(ConnectivityManager.TYPE_MOBILE);
997         configBuilder.setLegacyTypeName("MOBILE");
998         int networkType = getDataNetworkType();
999         configBuilder.setLegacySubType(networkType);
1000         configBuilder.setLegacySubTypeName(TelephonyManager.getNetworkTypeName(networkType));
1001         if (mDataProfile.getApnSetting() != null) {
1002             configBuilder.setLegacyExtraInfo(mDataProfile.getApnSetting().getApnName());
1003         }
1004 
1005         final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent();
1006         if (carrierSignalAgent.hasRegisteredReceivers(TelephonyManager
1007                 .ACTION_CARRIER_SIGNAL_REDIRECTED)) {
1008             // carrierSignal Receivers will place the carrier-specific provisioning notification
1009             configBuilder.setProvisioningNotificationEnabled(false);
1010         }
1011 
1012         // Fill the IMSI
1013         final String subscriberId = mPhone.getSubscriberId();
1014         if (!TextUtils.isEmpty(subscriberId)) {
1015             configBuilder.setSubscriberId(subscriberId);
1016         }
1017 
1018         // set skip464xlat if it is not default otherwise
1019         if (shouldSkip464Xlat()) {
1020             configBuilder.setNat64DetectionEnabled(false);
1021         }
1022 
1023         final NetworkFactory factory = PhoneFactory.getNetworkFactory(
1024                 mPhone.getPhoneId());
1025         final NetworkProvider provider = (null == factory) ? null : factory.getProvider();
1026 
1027         mNetworkScore = getNetworkScore();
1028         return new TelephonyNetworkAgent(mPhone, getHandler().getLooper(), this,
1029                 new NetworkScore.Builder().setLegacyInt(mNetworkScore).build(),
1030                 configBuilder.build(), provider,
1031                 new TelephonyNetworkAgentCallback(getHandler()::post) {
1032                     @Override
1033                     public void onValidationStatus(@ValidationStatus int status,
1034                             @Nullable Uri redirectUri) {
1035                         mDataNetworkCallback.invokeFromExecutor(
1036                                 () -> mDataNetworkCallback.onValidationStatusChanged(
1037                                         DataNetwork.this, status, redirectUri));
1038                     }
1039                 });
1040     }
1041 
1042     /**
1043      * The default state. Any events that were not handled by the child states fallback to this
1044      * state.
1045      *
1046      * @see DataNetwork for the state machine diagram.
1047      */
1048     private final class DefaultState extends State {
1049         @Override
1050         public void enter() {
1051             logv("Registering all events.");
1052             mDataConfigManagerCallback = new DataConfigManagerCallback(getHandler()::post) {
1053                 @Override
1054                 public void onCarrierConfigChanged() {
1055                     sendMessage(EVENT_DATA_CONFIG_UPDATED);
1056                 }
1057             };
1058             mRil.registerForPcoData(getHandler(), EVENT_PCO_DATA_RECEIVED, null);
1059 
1060             mDataConfigManager.registerCallback(mDataConfigManagerCallback);
1061             mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged(
1062                     getHandler(), EVENT_DISPLAY_INFO_CHANGED, null);
1063             mPhone.getServiceStateTracker().registerForServiceStateChanged(getHandler(),
1064                     EVENT_SERVICE_STATE_CHANGED, null);
1065             for (int transport : mAccessNetworksManager.getAvailableTransports()) {
1066                 mDataServiceManagers.get(transport)
1067                         .registerForDataCallListChanged(getHandler(), EVENT_DATA_STATE_CHANGED);
1068             }
1069 
1070             mCarrierPrivilegesCallback =
1071                     (Set<String> privilegedPackageNames, Set<Integer> privilegedUids) -> {
1072                         log("onCarrierPrivilegesChanged, Uids=" + privilegedUids.toString());
1073                         Message message = obtainMessage(EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED);
1074                         AsyncResult.forMessage(
1075                                 message,
1076                                 privilegedUids.stream().mapToInt(i -> i).toArray(),
1077                                 null /* ex */);
1078                         sendMessage(message);
1079                     };
1080             TelephonyManager tm = mPhone.getContext().getSystemService(TelephonyManager.class);
1081             if (tm != null) {
1082                 tm.registerCarrierPrivilegesCallback(
1083                         mPhone.getPhoneId(), getHandler()::post, mCarrierPrivilegesCallback);
1084             }
1085 
1086             mPhone.getServiceStateTracker().registerForCssIndicatorChanged(
1087                     getHandler(), EVENT_CSS_INDICATOR_CHANGED, null);
1088             mPhone.getCallTracker().registerForVoiceCallStarted(
1089                     getHandler(), EVENT_VOICE_CALL_STARTED, null);
1090             mPhone.getCallTracker().registerForVoiceCallEnded(
1091                     getHandler(), EVENT_VOICE_CALL_ENDED, null);
1092             // Check null for devices not supporting FEATURE_TELEPHONY_IMS.
1093             if (mPhone.getImsPhone() != null) {
1094                 mPhone.getImsPhone().getCallTracker().registerForVoiceCallStarted(
1095                         getHandler(), EVENT_VOICE_CALL_STARTED, null);
1096                 mPhone.getImsPhone().getCallTracker().registerForVoiceCallEnded(
1097                         getHandler(), EVENT_VOICE_CALL_ENDED, null);
1098             }
1099 
1100             // Only add symmetric code here, for example, registering and unregistering.
1101             // DefaultState.enter() is the starting point in the life cycle of the DataNetwork,
1102             // and DefaultState.exit() is the end. For non-symmetric initializing works, put them
1103             // in ConnectingState.enter().
1104         }
1105 
1106         @Override
1107         public void exit() {
1108             logv("Unregistering all events.");
1109             // Check null for devices not supporting FEATURE_TELEPHONY_IMS.
1110             if (mPhone.getImsPhone() != null) {
1111                 mPhone.getImsPhone().getCallTracker().unregisterForVoiceCallStarted(getHandler());
1112                 mPhone.getImsPhone().getCallTracker().unregisterForVoiceCallEnded(getHandler());
1113             }
1114             mPhone.getCallTracker().unregisterForVoiceCallStarted(getHandler());
1115             mPhone.getCallTracker().unregisterForVoiceCallEnded(getHandler());
1116 
1117             mPhone.getServiceStateTracker().unregisterForCssIndicatorChanged(getHandler());
1118             TelephonyManager tm = mPhone.getContext().getSystemService(TelephonyManager.class);
1119             if (tm != null && mCarrierPrivilegesCallback != null) {
1120                 tm.unregisterCarrierPrivilegesCallback(mCarrierPrivilegesCallback);
1121             }
1122             for (int transport : mAccessNetworksManager.getAvailableTransports()) {
1123                 mDataServiceManagers.get(transport)
1124                         .unregisterForDataCallListChanged(getHandler());
1125             }
1126             mPhone.getServiceStateTracker().unregisterForServiceStateChanged(getHandler());
1127             mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged(
1128                     getHandler());
1129             mRil.unregisterForPcoData(getHandler());
1130             mDataConfigManager.unregisterCallback(mDataConfigManagerCallback);
1131         }
1132 
1133         @Override
1134         public boolean processMessage(Message msg) {
1135             switch (msg.what) {
1136                 case EVENT_DATA_CONFIG_UPDATED:
1137                     onCarrierConfigUpdated();
1138                     break;
1139                 case EVENT_SERVICE_STATE_CHANGED: {
1140                     int networkType = getDataNetworkType();
1141                     mDataCallSessionStats.onDrsOrRatChanged(networkType);
1142                     if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN) {
1143                         mLastKnownDataNetworkType = networkType;
1144                     }
1145                     NetworkRegistrationInfo nri =
1146                             mPhone.getServiceState()
1147                                     .getNetworkRegistrationInfo(
1148                                             NetworkRegistrationInfo.DOMAIN_PS,
1149                                             AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
1150                     if (nri != null && nri.isInService()) {
1151                         mLastKnownRoamingState = nri.getNetworkRegistrationState()
1152                                 == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING;
1153                     }
1154                     updateSuspendState();
1155                     updateNetworkCapabilities();
1156                     break;
1157                 }
1158                 case EVENT_ATTACH_NETWORK_REQUEST: {
1159                     onAttachNetworkRequests((NetworkRequestList) msg.obj);
1160                     updateNetworkScore();
1161                     break;
1162                 }
1163                 case EVENT_DETACH_NETWORK_REQUEST: {
1164                     onDetachNetworkRequest((TelephonyNetworkRequest) msg.obj,
1165                             msg.arg1 != 0 /* shouldRetry */);
1166                     updateNetworkScore();
1167                     break;
1168                 }
1169                 case EVENT_DETACH_ALL_NETWORK_REQUESTS: {
1170                     for (TelephonyNetworkRequest networkRequest : mAttachedNetworkRequestList) {
1171                         networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_UNSATISFIED);
1172                         networkRequest.setAttachedNetwork(null);
1173                     }
1174                     log("All network requests detached.");
1175                     mAttachedNetworkRequestList.clear();
1176                     break;
1177                 }
1178                 case EVENT_DATA_STATE_CHANGED: {
1179                     AsyncResult ar = (AsyncResult) msg.obj;
1180                     int transport = (int) ar.userObj;
1181                     onDataStateChanged(transport, (List<DataCallResponse>) ar.result);
1182                     break;
1183                 }
1184                 case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED: {
1185                     AsyncResult asyncResult = (AsyncResult) msg.obj;
1186                     int[] administratorUids = (int[]) asyncResult.result;
1187                     mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length);
1188                     updateNetworkCapabilities();
1189                     break;
1190                 }
1191                 case EVENT_PCO_DATA_RECEIVED: {
1192                     AsyncResult ar = (AsyncResult) msg.obj;
1193                     onPcoDataReceived((PcoData) ar.result);
1194                     break;
1195                 }
1196                 case EVENT_NOTIFY_HANDOVER_CANCELLED_RESPONSE:
1197                     log("Notified handover cancelled.");
1198                     break;
1199                 case EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED:
1200                 case EVENT_TEAR_DOWN_NETWORK:
1201                 case EVENT_STUCK_IN_TRANSIENT_STATE:
1202                 case EVENT_DISPLAY_INFO_CHANGED:
1203                 case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
1204                 case EVENT_CSS_INDICATOR_CHANGED:
1205                 case EVENT_VOICE_CALL_STARTED:
1206                 case EVENT_VOICE_CALL_ENDED:
1207                     // Ignore the events when not in the correct state.
1208                     log("Ignored " + eventToString(msg.what));
1209                     break;
1210                 case EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE:
1211                 case EVENT_NOTIFY_HANDOVER_STARTED:
1212                     // We reach here if network is not in the right state.
1213                     if (msg.obj != null) {
1214                         // Cancel it because it's either HO in progress or will soon disconnect.
1215                         // Either case we want to clean up obsolete retry attempts.
1216                         DataHandoverRetryEntry retryEntry = (DataHandoverRetryEntry) msg.obj;
1217                         retryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED);
1218                     }
1219                     log("Ignore handover to " + AccessNetworkConstants
1220                             .transportTypeToString(msg.arg1) + " request.");
1221                     break;
1222                 case EVENT_RADIO_NOT_AVAILABLE:
1223                     mFailCause = DataFailCause.RADIO_NOT_AVAILABLE;
1224                     loge(eventToString(msg.what) + ": transition to disconnected state");
1225                     transitionTo(mDisconnectedState);
1226                     break;
1227                 default:
1228                     loge("Unhandled event " + eventToString(msg.what));
1229                     break;
1230             }
1231             return HANDLED;
1232         }
1233     }
1234 
1235     /**
1236      * The connecting state. This is the initial state of a data network.
1237      *
1238      * @see DataNetwork for the state machine diagram.
1239      */
1240     private final class ConnectingState extends State {
1241         @Override
1242         public void enter() {
1243             sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
1244                     mDataConfigManager.getAnomalyNetworkConnectingTimeoutMs());
1245             mNetworkAgent = createNetworkAgent();
1246             mInitialNetworkAgentId = mNetworkAgent.getId();
1247             mLogTag = "DN-" + mInitialNetworkAgentId + "-"
1248                     + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I");
1249 
1250             // Get carrier config package uid. Note that this uid will not change through the life
1251             // cycle of this data network. So there is no need to listen to the change event.
1252             mCarrierServicePackageUid = mPhone.getCarrierPrivilegesTracker()
1253                     .getCarrierServicePackageUid();
1254 
1255             notifyPreciseDataConnectionState();
1256             if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
1257                 // Defer setupData until we get the PDU session ID response
1258                 allocatePduSessionId();
1259                 return;
1260             }
1261 
1262             setupData();
1263         }
1264 
1265         @Override
1266         public void exit() {
1267             removeMessages(EVENT_STUCK_IN_TRANSIENT_STATE);
1268         }
1269 
1270         @Override
1271         public boolean processMessage(Message msg) {
1272             logv("event=" + eventToString(msg.what));
1273             switch (msg.what) {
1274                 case EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE:
1275                     AsyncResult ar = (AsyncResult) msg.obj;
1276                     if (ar.exception == null) {
1277                         mPduSessionId = (int) ar.result;
1278                         log("Set PDU session id to " + mPduSessionId);
1279                     } else {
1280                         loge("Failed to allocate PDU session id. e=" + ar.exception);
1281                     }
1282                     setupData();
1283                     break;
1284                 case EVENT_SETUP_DATA_NETWORK_RESPONSE:
1285                     int resultCode = msg.arg1;
1286                     DataCallResponse dataCallResponse =
1287                             msg.getData().getParcelable(DataServiceManager.DATA_CALL_RESPONSE);
1288                     onSetupResponse(resultCode, dataCallResponse);
1289                     break;
1290                 case EVENT_NOTIFY_HANDOVER_STARTED:
1291                 case EVENT_TEAR_DOWN_NETWORK:
1292                 case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
1293                     // Defer the request until connected or disconnected.
1294                     log("Defer message " + eventToString(msg.what));
1295                     deferMessage(msg);
1296                     break;
1297                 case EVENT_STUCK_IN_TRANSIENT_STATE:
1298                     reportAnomaly("Data network stuck in connecting state for "
1299                             + TimeUnit.MILLISECONDS.toSeconds(
1300                             mDataConfigManager.getAnomalyNetworkConnectingTimeoutMs())
1301                             + " seconds.", "58c56403-7ea7-4e56-a0c7-e467114d09b8");
1302                     // Setup data failed. Use the retry logic defined in
1303                     // CarrierConfigManager.KEY_TELEPHONY_DATA_SETUP_RETRY_RULES_STRING_ARRAY.
1304                     mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
1305                     mFailCause = DataFailCause.NO_RETRY_FAILURE;
1306                     transitionTo(mDisconnectedState);
1307                     break;
1308                 default:
1309                     return NOT_HANDLED;
1310             }
1311             return HANDLED;
1312         }
1313     }
1314 
1315     /**
1316      * The connected state. This is the state when data network becomes usable.
1317      *
1318      * @see DataNetwork for the state machine diagram.
1319      */
1320     private final class ConnectedState extends State {
1321         @Override
1322         public void enter() {
1323             // Note that reaching here could mean from connecting -> connected, or from
1324             // handover -> connected.
1325             if (!mEverConnected) {
1326                 // Transited from ConnectingState
1327                 log("network connected.");
1328                 mEverConnected = true;
1329                 mNetworkAgent.markConnected();
1330                 mDataNetworkCallback.invokeFromExecutor(
1331                         () -> mDataNetworkCallback.onConnected(DataNetwork.this));
1332 
1333                 mQosCallbackTracker = new QosCallbackTracker(mNetworkAgent, mPhone);
1334                 mQosCallbackTracker.updateSessions(mQosBearerSessions);
1335                 mKeepaliveTracker = new KeepaliveTracker(mPhone,
1336                         getHandler().getLooper(), DataNetwork.this, mNetworkAgent);
1337                 if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
1338                     registerForWwanEvents();
1339                 }
1340 
1341                 // Create the VCN policy changed listener. When the policy changed, we might need
1342                 // to tear down the VCN-managed network.
1343                 if (mVcnManager != null) {
1344                     mVcnPolicyChangeListener = () -> {
1345                         log("VCN policy changed.");
1346                         if (mVcnManager.applyVcnNetworkPolicy(mNetworkCapabilities, mLinkProperties)
1347                                 .isTeardownRequested()) {
1348                             tearDown(TEAR_DOWN_REASON_VCN_REQUESTED);
1349                         } else {
1350                             updateNetworkCapabilities();
1351                         }
1352                     };
1353                     mVcnManager.addVcnNetworkPolicyChangeListener(
1354                             getHandler()::post, mVcnPolicyChangeListener);
1355                 }
1356             }
1357 
1358             // If we've ever received PCO data before connected, now it's the time to process it.
1359             mPcoData.getOrDefault(mCid.get(mTransport), Collections.emptyMap())
1360                     .forEach((pcoId, pcoData) -> {
1361                         onPcoDataChanged(pcoData);
1362                     });
1363 
1364             mDataNetworkCallback.invokeFromExecutor(
1365                     () -> mDataNetworkCallback.onLinkStatusChanged(DataNetwork.this, mLinkStatus));
1366             notifyPreciseDataConnectionState();
1367             updateSuspendState();
1368         }
1369 
1370         @Override
1371         public boolean processMessage(Message msg) {
1372             logv("event=" + eventToString(msg.what));
1373             switch (msg.what) {
1374                 case EVENT_TEAR_DOWN_NETWORK:
1375                     if (mInvokedDataDeactivation) {
1376                         log("Ignore tear down request because network is being torn down.");
1377                         break;
1378                     }
1379 
1380                     int tearDownReason = msg.arg1;
1381 
1382                     removeMessages(EVENT_TEAR_DOWN_NETWORK);
1383                     removeDeferredMessages(EVENT_TEAR_DOWN_NETWORK);
1384                     transitionTo(mDisconnectingState);
1385                     onTearDown(tearDownReason);
1386                     break;
1387                 case EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED:
1388                     AsyncResult ar = (AsyncResult) msg.obj;
1389                     if (ar.exception != null) {
1390                         log("EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED: error ignoring, e="
1391                                 + ar.exception);
1392                         break;
1393                     }
1394                     onBandwidthUpdatedFromModem((List<LinkCapacityEstimate>) ar.result);
1395                     break;
1396                 case EVENT_DISPLAY_INFO_CHANGED:
1397                     onDisplayInfoChanged();
1398                     break;
1399                 case EVENT_NOTIFY_HANDOVER_STARTED:
1400                     // Notify source transport that handover is about to start. Note this will not
1401                     // initiate the handover process on target transport, but more for notifying
1402                     // the source transport so that PDU session id can be preserved if network
1403                     // notifies PDN lost during handover. The real handover process will kick off
1404                     // after receiving EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE.
1405                     log("Notifying source transport "
1406                             + AccessNetworkConstants.transportTypeToString(mTransport)
1407                             + " that handover is about to start.");
1408                     mDataServiceManagers.get(mTransport).startHandover(mCid.get(mTransport),
1409                             obtainMessage(EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE, 0, msg.arg2,
1410                                     msg.obj));
1411                     // We enter handover state here because this is the first action we do for
1412                     // handover.
1413                     transitionTo(mHandoverState);
1414                     break;
1415                 case EVENT_SUBSCRIPTION_PLAN_OVERRIDE:
1416                     updateMeteredAndCongested();
1417                     break;
1418                 case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
1419                     int resultCode = msg.arg1;
1420                     onDeactivateResponse(resultCode);
1421                     break;
1422                 case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
1423                     transitionTo(mDisconnectingState);
1424                     sendMessageDelayed(EVENT_TEAR_DOWN_NETWORK, msg.arg1, msg.arg2);
1425                     break;
1426                 case EVENT_VOICE_CALL_STARTED:
1427                 case EVENT_VOICE_CALL_ENDED:
1428                 case EVENT_CSS_INDICATOR_CHANGED:
1429                     updateSuspendState();
1430                     updateNetworkCapabilities();
1431                     break;
1432                 default:
1433                     return NOT_HANDLED;
1434             }
1435             return HANDLED;
1436         }
1437     }
1438 
1439     /**
1440      * The handover state. This is the state when data network handover between IWLAN and cellular.
1441      *
1442      * @see DataNetwork for the state machine diagram.
1443      */
1444     private final class HandoverState extends State {
1445         @Override
1446         public void enter() {
1447             sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
1448                     mDataConfigManager.getNetworkHandoverTimeoutMs());
1449             notifyPreciseDataConnectionState();
1450         }
1451 
1452         @Override
1453         public void exit() {
1454             removeMessages(EVENT_STUCK_IN_TRANSIENT_STATE);
1455         }
1456 
1457         @Override
1458         public boolean processMessage(Message msg) {
1459             logv("event=" + eventToString(msg.what));
1460             switch (msg.what) {
1461                 case EVENT_DATA_STATE_CHANGED:
1462                     // The data call list changed event should be conditionally deferred.
1463                     // Otherwise the deferred message might be incorrectly treated as "disconnected"
1464                     // signal. So we only defer the related data call list changed event, and drop
1465                     // the unrelated.
1466                     AsyncResult ar = (AsyncResult) msg.obj;
1467                     int transport = (int) ar.userObj;
1468                     List<DataCallResponse> responseList = (List<DataCallResponse>) ar.result;
1469                     if (transport != mTransport) {
1470                         log("Dropped unrelated "
1471                                 + AccessNetworkConstants.transportTypeToString(transport)
1472                                 + " data call list changed event. " + responseList);
1473                     } else {
1474                         log("Defer message " + eventToString(msg.what) + ":" + responseList);
1475                         deferMessage(msg);
1476                     }
1477                     break;
1478                 case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
1479                 case EVENT_DISPLAY_INFO_CHANGED:
1480                 case EVENT_TEAR_DOWN_NETWORK:
1481                 case EVENT_CSS_INDICATOR_CHANGED:
1482                 case EVENT_VOICE_CALL_ENDED:
1483                 case EVENT_VOICE_CALL_STARTED:
1484                     // Defer the request until handover succeeds or fails.
1485                     log("Defer message " + eventToString(msg.what));
1486                     deferMessage(msg);
1487                     break;
1488                 case EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE:
1489                     onStartHandover(msg.arg2, (DataHandoverRetryEntry) msg.obj);
1490                     break;
1491                 case EVENT_HANDOVER_RESPONSE:
1492                     int resultCode = msg.arg1;
1493                     DataCallResponse dataCallResponse =
1494                             msg.getData().getParcelable(DataServiceManager.DATA_CALL_RESPONSE);
1495                     onHandoverResponse(resultCode, dataCallResponse,
1496                             (DataHandoverRetryEntry) msg.obj);
1497                     break;
1498                 case EVENT_STUCK_IN_TRANSIENT_STATE:
1499                     // enable detection only for valid timeout range
1500                     reportAnomaly("Data service did not respond the handover request within "
1501                                     + TimeUnit.MILLISECONDS.toSeconds(
1502                             mDataConfigManager.getNetworkHandoverTimeoutMs()) + " seconds.",
1503                             "1afe68cb-8b41-4964-a737-4f34372429ea");
1504                     // Handover failed. Use the retry logic defined in
1505                     // CarrierConfigManager.KEY_TELEPHONY_DATA_HANDOVER_RETRY_RULES_STRING_ARRAY.
1506                     long retry = DataCallResponse.RETRY_DURATION_UNDEFINED;
1507                     int handoverFailureMode =
1508                             DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL;
1509                     mFailCause = DataFailCause.ERROR_UNSPECIFIED;
1510                     mDataNetworkCallback.invokeFromExecutor(
1511                             () -> mDataNetworkCallback.onHandoverFailed(DataNetwork.this,
1512                                     mFailCause, retry, handoverFailureMode));
1513                     // No matter handover succeeded or not, transit back to connected state.
1514                     transitionTo(mConnectedState);
1515                     break;
1516                 default:
1517                     return NOT_HANDLED;
1518             }
1519             return HANDLED;
1520         }
1521     }
1522 
1523     /**
1524      * The disconnecting state. This is the state when data network is about to be disconnected.
1525      * The network is still usable in this state, but the clients should be prepared to lose the
1526      * network in any moment. This state is particular useful for IMS graceful tear down, where
1527      * the network enters disconnecting state while waiting for IMS de-registration signal.
1528      *
1529      * @see DataNetwork for the state machine diagram.
1530      */
1531     private final class DisconnectingState extends State {
1532         @Override
1533         public void enter() {
1534             sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
1535                     mDataConfigManager.getAnomalyNetworkDisconnectingTimeoutMs());
1536             notifyPreciseDataConnectionState();
1537         }
1538 
1539         @Override
1540         public void exit() {
1541             removeMessages(EVENT_STUCK_IN_TRANSIENT_STATE);
1542         }
1543 
1544         @Override
1545         public boolean processMessage(Message msg) {
1546             logv("event=" + eventToString(msg.what));
1547             switch (msg.what) {
1548                 case EVENT_TEAR_DOWN_NETWORK:
1549                     if (mInvokedDataDeactivation) {
1550                         log("Ignore tear down request because network is being torn down.");
1551                         break;
1552                     }
1553                     removeMessages(EVENT_TEAR_DOWN_NETWORK);
1554                     removeDeferredMessages(EVENT_TEAR_DOWN_NETWORK);
1555                     onTearDown(msg.arg1);
1556                     break;
1557                 case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
1558                     int resultCode = msg.arg1;
1559                     onDeactivateResponse(resultCode);
1560                     break;
1561                 case EVENT_STUCK_IN_TRANSIENT_STATE:
1562                     // After frameworks issues deactivate data call request, RIL should report
1563                     // data disconnected through data call list changed event subsequently.
1564 
1565                     reportAnomaly("RIL did not send data call list changed event after "
1566                             + "deactivate data call request within "
1567                             + TimeUnit.MILLISECONDS.toSeconds(
1568                             mDataConfigManager.getAnomalyNetworkDisconnectingTimeoutMs())
1569                             + " seconds.", "d0e4fa1c-c57b-4ba5-b4b6-8955487012cc");
1570                     mFailCause = DataFailCause.LOST_CONNECTION;
1571                     transitionTo(mDisconnectedState);
1572                     break;
1573                 case EVENT_DISPLAY_INFO_CHANGED:
1574                     onDisplayInfoChanged();
1575                     break;
1576                 case EVENT_CSS_INDICATOR_CHANGED:
1577                 case EVENT_VOICE_CALL_STARTED:
1578                 case EVENT_VOICE_CALL_ENDED:
1579                     updateSuspendState();
1580                     updateNetworkCapabilities();
1581                     break;
1582                 default:
1583                     return NOT_HANDLED;
1584             }
1585             return HANDLED;
1586         }
1587     }
1588 
1589     /**
1590      * The disconnected state. This is the final state of a data network.
1591      *
1592      * @see DataNetwork for the state machine diagram.
1593      */
1594     private final class DisconnectedState extends State {
1595         @Override
1596         public void enter() {
1597             logl("Data network disconnected. mEverConnected=" + mEverConnected);
1598             // Preserve the list for onSetupDataFailed callback, because we need to pass that list
1599             // back to DataNetworkController, but after EVENT_DETACH_ALL_NETWORK_REQUESTS gets
1600             // processed, the network request list would become empty.
1601             NetworkRequestList requestList = new NetworkRequestList(mAttachedNetworkRequestList);
1602 
1603             // The detach all network requests must be the last message to handle.
1604             sendMessage(EVENT_DETACH_ALL_NETWORK_REQUESTS);
1605             // Gracefully handle all the un-processed events then quit the state machine.
1606             // quit() throws a QUIT event to the end of message queue. All the events before quit()
1607             // will be processed. Events after quit() will not be processed.
1608             quit();
1609 
1610             //************************************************************//
1611             // DO NOT POST ANY EVENTS AFTER HERE.                         //
1612             // THE STATE MACHINE WONT PROCESS EVENTS AFTER QUIT.          //
1613             // ONLY CLEANUP SHOULD BE PERFORMED AFTER THIS.               //
1614             //************************************************************//
1615 
1616             if (mEverConnected) {
1617                 mLinkStatus = DataCallResponse.LINK_STATUS_INACTIVE;
1618                 mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
1619                         .onLinkStatusChanged(DataNetwork.this, mLinkStatus));
1620                 mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
1621                         .onDisconnected(DataNetwork.this, mFailCause, mTearDownReason));
1622                 if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
1623                     unregisterForWwanEvents();
1624                 }
1625             } else {
1626                 mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
1627                         .onSetupDataFailed(DataNetwork.this,
1628                                 requestList, mFailCause, mRetryDelayMillis));
1629             }
1630             notifyPreciseDataConnectionState();
1631             mNetworkAgent.unregister();
1632             mDataNetworkController.unregisterDataNetworkControllerCallback(
1633                     mDataNetworkControllerCallback);
1634             mDataCallSessionStats.onDataCallDisconnected(mFailCause);
1635 
1636             if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN
1637                     && mPduSessionId != DataCallResponse.PDU_SESSION_ID_NOT_SET) {
1638                 mRil.releasePduSessionId(null, mPduSessionId);
1639             }
1640 
1641             if (mVcnManager != null && mVcnPolicyChangeListener != null) {
1642                 mVcnManager.removeVcnNetworkPolicyChangeListener(mVcnPolicyChangeListener);
1643             }
1644         }
1645 
1646         @Override
1647         public boolean processMessage(Message msg) {
1648             logv("event=" + eventToString(msg.what));
1649             return NOT_HANDLED;
1650         }
1651     }
1652 
1653     /**
1654      * Register for events that can only happen on cellular networks.
1655      */
1656     private void registerForWwanEvents() {
1657         registerForBandwidthUpdate();
1658         mKeepaliveTracker.registerForKeepaliveStatus();
1659         mRil.registerForNotAvailable(this.getHandler(), EVENT_RADIO_NOT_AVAILABLE, null);
1660     }
1661 
1662     /**
1663      * Unregister for events that can only happen on cellular networks.
1664      */
1665     private void unregisterForWwanEvents() {
1666         unregisterForBandwidthUpdate();
1667         mKeepaliveTracker.unregisterForKeepaliveStatus();
1668         mRil.unregisterForNotAvailable(this.getHandler());
1669     }
1670 
1671     @Override
1672     protected void unhandledMessage(Message msg) {
1673         IState state = getCurrentState();
1674         loge("Unhandled message " + msg.what + " in state "
1675                 + (state == null ? "null" : state.getName()));
1676     }
1677 
1678     /**
1679      * Attempt to attach the network request list to this data network. Whether the network can
1680      * satisfy the request or not will be checked when EVENT_ATTACH_NETWORK_REQUEST is processed.
1681      * If the request can't be attached, {@link DataNetworkCallback#onAttachFailed(
1682      * DataNetwork, NetworkRequestList)}.
1683      *
1684      * @param requestList Network request list to attach.
1685      * @return {@code false} if the network is already disconnected. {@code true} means the request
1686      * has been scheduled to attach to the network. If attach succeeds, the network request's state
1687      * will be set to {@link TelephonyNetworkRequest#REQUEST_STATE_SATISFIED}. If failed, the
1688      * callback {@link DataNetworkCallback#onAttachFailed(DataNetwork, NetworkRequestList)} will
1689      * be called.
1690      */
1691     public boolean attachNetworkRequests(@NonNull NetworkRequestList requestList) {
1692         // If the network is already ended, we still attach the network request to the data network,
1693         // so it can be retried later by data network controller.
1694         if (getCurrentState() == null || isDisconnected()) {
1695             // The state machine has already stopped. This is due to data network is disconnected.
1696             return false;
1697         }
1698         sendMessage(obtainMessage(EVENT_ATTACH_NETWORK_REQUEST, requestList));
1699         return true;
1700     }
1701 
1702     /**
1703      * Called when attaching network request list to this data network.
1704      *
1705      * @param requestList Network request list to attach.
1706      */
1707     public void onAttachNetworkRequests(@NonNull NetworkRequestList requestList) {
1708         NetworkRequestList failedList = new NetworkRequestList();
1709         for (TelephonyNetworkRequest networkRequest : requestList) {
1710             if (!mDataNetworkController.isNetworkRequestExisting(networkRequest)) {
1711                 failedList.add(networkRequest);
1712                 log("Attached failed. Network request was already removed. " + networkRequest);
1713             } else if (!networkRequest.canBeSatisfiedBy(getNetworkCapabilities())) {
1714                 failedList.add(networkRequest);
1715                 log("Attached failed. Cannot satisfy the network request "
1716                         + networkRequest);
1717             } else {
1718                 mAttachedNetworkRequestList.add(networkRequest);
1719                 networkRequest.setAttachedNetwork(DataNetwork.this);
1720                 networkRequest.setState(
1721                         TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
1722                 log("Successfully attached network request " + networkRequest);
1723             }
1724         }
1725         if (failedList.size() > 0) {
1726             mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
1727                     .onAttachFailed(DataNetwork.this, failedList));
1728         }
1729     }
1730 
1731     /**
1732      * Called when detaching the network request from this data network.
1733      *
1734      * @param networkRequest Network request to detach.
1735      * @param shouldRetry {@code true} if the detached network request should be retried.
1736      */
1737     private void onDetachNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest,
1738             boolean shouldRetry) {
1739         mAttachedNetworkRequestList.remove(networkRequest);
1740         networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_UNSATISFIED);
1741         networkRequest.setAttachedNetwork(null);
1742 
1743         if (shouldRetry) {
1744             // Inform DataNetworkController that a network request was detached and should be
1745             // scheduled to retry.
1746             mDataNetworkCallback.invokeFromExecutor(
1747                     () -> mDataNetworkCallback.onRetryUnsatisfiedNetworkRequest(networkRequest));
1748         }
1749 
1750         if (mAttachedNetworkRequestList.isEmpty()) {
1751             log("All network requests are detached.");
1752 
1753             // If there is no network request attached, and we are not preferred data phone, then
1754             // this detach is likely due to temp DDS switch. We should tear down the network when
1755             // all requests are detached so the other network on preferred data sub can be
1756             // established properly.
1757             int preferredDataPhoneId = PhoneSwitcher.getInstance().getPreferredDataPhoneId();
1758             if (preferredDataPhoneId != SubscriptionManager.INVALID_PHONE_INDEX
1759                     && preferredDataPhoneId != mPhone.getPhoneId()) {
1760                 tearDown(TEAR_DOWN_REASON_PREFERRED_DATA_SWITCHED);
1761             }
1762         }
1763     }
1764 
1765     /**
1766      * Detach the network request from this data network. Note that this will not tear down the
1767      * network.
1768      *
1769      * @param networkRequest Network request to detach.
1770      * @param shouldRetry {@code true} if the detached network request should be retried.
1771      */
1772     public void detachNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest,
1773             boolean shouldRetry) {
1774         if (getCurrentState() == null || isDisconnected()) {
1775             return;
1776         }
1777         sendMessage(obtainMessage(EVENT_DETACH_NETWORK_REQUEST, shouldRetry ? 1 : 0, 0,
1778                 networkRequest));
1779     }
1780 
1781     /**
1782      * Register for bandwidth update.
1783      */
1784     private void registerForBandwidthUpdate() {
1785         int bandwidthEstimateSource = mDataConfigManager.getBandwidthEstimateSource();
1786         if (bandwidthEstimateSource == BANDWIDTH_SOURCE_MODEM) {
1787             mPhone.mCi.registerForLceInfo(
1788                     getHandler(), EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED, null);
1789         } else if (bandwidthEstimateSource == BANDWIDTH_SOURCE_BANDWIDTH_ESTIMATOR) {
1790             if (mLinkBandwidthEstimatorCallback == null) {
1791                 mLinkBandwidthEstimatorCallback =
1792                         new LinkBandwidthEstimatorCallback(getHandler()::post) {
1793                             @Override
1794                             public void onBandwidthChanged(int uplinkBandwidthKbps,
1795                                     int downlinkBandwidthKbps) {
1796                                 if (isConnected()) {
1797                                     onBandwidthUpdated(uplinkBandwidthKbps, downlinkBandwidthKbps);
1798                                 }
1799                             }
1800                         };
1801                 mPhone.getLinkBandwidthEstimator().registerCallback(
1802                         mLinkBandwidthEstimatorCallback);
1803             }
1804         } else {
1805             loge("Invalid bandwidth source configuration: " + bandwidthEstimateSource);
1806         }
1807     }
1808 
1809     /**
1810      * Unregister bandwidth update.
1811      */
1812     private void unregisterForBandwidthUpdate() {
1813         int bandwidthEstimateSource = mDataConfigManager.getBandwidthEstimateSource();
1814         if (bandwidthEstimateSource == BANDWIDTH_SOURCE_MODEM) {
1815             mPhone.mCi.unregisterForLceInfo(getHandler());
1816         } else if (bandwidthEstimateSource == BANDWIDTH_SOURCE_BANDWIDTH_ESTIMATOR) {
1817             if (mLinkBandwidthEstimatorCallback != null) {
1818                 mPhone.getLinkBandwidthEstimator()
1819                         .unregisterCallback(mLinkBandwidthEstimatorCallback);
1820                 mLinkBandwidthEstimatorCallback = null;
1821             }
1822         } else {
1823             loge("Invalid bandwidth source configuration: " + bandwidthEstimateSource);
1824         }
1825     }
1826 
1827     /**
1828      * Remove network requests that can't be satisfied anymore.
1829      *
1830      * @param shouldRetry {@code true} if the detached network requests should be retried.
1831      */
1832     private void removeUnsatisfiedNetworkRequests(boolean shouldRetry) {
1833         for (TelephonyNetworkRequest networkRequest : mAttachedNetworkRequestList) {
1834             if (!networkRequest.canBeSatisfiedBy(mNetworkCapabilities)) {
1835                 log("removeUnsatisfiedNetworkRequests: " + networkRequest
1836                         + " can't be satisfied anymore. Will be detached.");
1837                 detachNetworkRequest(networkRequest, shouldRetry);
1838             }
1839         }
1840     }
1841 
1842     /**
1843      * Check if the new link properties are compatible with the old link properties. For example,
1844      * if IP changes, that's considered incompatible.
1845      *
1846      * @param oldLinkProperties Old link properties.
1847      * @param newLinkProperties New Link properties.
1848      *
1849      * @return {@code true} if the new link properties is compatible with the old link properties.
1850      */
1851     private boolean isLinkPropertiesCompatible(@NonNull LinkProperties oldLinkProperties,
1852             @NonNull LinkProperties newLinkProperties) {
1853         if (Objects.equals(oldLinkProperties, newLinkProperties)) return true;
1854 
1855         if (!LinkPropertiesUtils.isIdenticalAddresses(oldLinkProperties, newLinkProperties)) {
1856             // If the same address type was removed and added we need to cleanup.
1857             LinkPropertiesUtils.CompareOrUpdateResult<Integer, LinkAddress> result =
1858                     new LinkPropertiesUtils.CompareOrUpdateResult<>(
1859                             oldLinkProperties.getLinkAddresses(),
1860                             newLinkProperties.getLinkAddresses(),
1861                             linkAddress -> Objects.hash(linkAddress.getAddress(),
1862                                     linkAddress.getPrefixLength(), linkAddress.getScope()));
1863             log("isLinkPropertiesCompatible: old=" + oldLinkProperties
1864                     + " new=" + newLinkProperties + " result=" + result);
1865             for (LinkAddress added : result.added) {
1866                 for (LinkAddress removed : result.removed) {
1867                     if (NetUtils.addressTypeMatches(removed.getAddress(), added.getAddress())) {
1868                         return false;
1869                     }
1870                 }
1871             }
1872         }
1873 
1874         return true;
1875     }
1876 
1877     /**
1878      * Check if there are immutable capabilities changed. The connectivity service is not able
1879      * to handle immutable capabilities changed, but in very rare scenarios, immutable capabilities
1880      * need to be changed dynamically, such as in setup data call response, modem responded with the
1881      * same cid. In that case, we need to merge the new capabilities into the existing data network.
1882      *
1883      * @param oldCapabilities The old network capabilities.
1884      * @param newCapabilities The new network capabilities.
1885      * @return {@code true} if there are immutable network capabilities changed.
1886      */
1887     private static boolean areImmutableCapabilitiesChanged(
1888             @NonNull NetworkCapabilities oldCapabilities,
1889             @NonNull NetworkCapabilities newCapabilities) {
1890         if (oldCapabilities == null
1891                 || ArrayUtils.isEmpty(oldCapabilities.getCapabilities())) return false;
1892 
1893         // Remove mutable capabilities from both old and new capabilities, the remaining
1894         // capabilities would be immutable capabilities.
1895         List<Integer> oldImmutableCapabilities = Arrays.stream(oldCapabilities.getCapabilities())
1896                 .boxed().collect(Collectors.toList());
1897         oldImmutableCapabilities.removeAll(MUTABLE_CAPABILITIES);
1898         List<Integer> newImmutableCapabilities = Arrays.stream(newCapabilities.getCapabilities())
1899                 .boxed().collect(Collectors.toList());
1900         newImmutableCapabilities.removeAll(MUTABLE_CAPABILITIES);
1901         return oldImmutableCapabilities.size() != newImmutableCapabilities.size()
1902                 || !oldImmutableCapabilities.containsAll(newImmutableCapabilities);
1903     }
1904 
1905     /**
1906      * In some rare cases we need to re-create the network agent, for example, underlying network
1907      * IP changed, or when we unfortunately need to remove/add a immutable network capability.
1908      */
1909     private void recreateNetworkAgent() {
1910         if (isConnecting() || isDisconnected() || isDisconnecting()) {
1911             loge("Incorrect state for re-creating the network agent.");
1912             return;
1913         }
1914 
1915         // Abandon the network agent because we are going to create a new one.
1916         mNetworkAgent.abandon();
1917         // Create a new network agent and register with connectivity service. Note that the agent
1918         // will always be registered with NOT_SUSPENDED capability.
1919         mNetworkAgent = createNetworkAgent();
1920         mNetworkAgent.markConnected();
1921         // Because network agent is always created with NOT_SUSPENDED, we need to update
1922         // the suspended if it's was in suspended state.
1923         if (mSuspended) {
1924             log("recreateNetworkAgent: The network is in suspended state. Update the network"
1925                     + " capability again. nc=" + mNetworkCapabilities);
1926             mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
1927         }
1928     }
1929 
1930     /**
1931      * Update the network capabilities.
1932      */
1933     private void updateNetworkCapabilities() {
1934         final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder()
1935                 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
1936         boolean roaming = mPhone.getServiceState().getDataRoaming();
1937 
1938         builder.setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder()
1939                 .setSubscriptionId(mSubId).build());
1940         builder.setSubscriptionIds(Collections.singleton(mSubId));
1941 
1942         ApnSetting apnSetting = mDataProfile.getApnSetting();
1943 
1944         if (apnSetting != null) {
1945             apnSetting.getApnTypes().stream()
1946                     .map(DataUtils::apnTypeToNetworkCapability)
1947                     .filter(cap -> cap >= 0)
1948                     .forEach(builder::addCapability);
1949             if (apnSetting.getApnTypes().contains(ApnSetting.TYPE_ENTERPRISE)) {
1950                 builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
1951             }
1952         }
1953 
1954         // Once we set the MMTEL capability, we should never remove it because it's an immutable
1955         // capability defined by connectivity service. When the device enters from VoPS to non-VoPS,
1956         // we should perform grace tear down from data network controller if needed.
1957         if (mNetworkCapabilities != null
1958                 && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)) {
1959             // Previous capability has MMTEL, so add it again.
1960             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL);
1961         } else {
1962             // Always add MMTEL capability on IMS network unless network explicitly indicates VoPS
1963             // not supported.
1964             if (mDataProfile.canSatisfy(NetworkCapabilities.NET_CAPABILITY_IMS)) {
1965                 builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL);
1966                 if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
1967                     NetworkRegistrationInfo nri = getNetworkRegistrationInfo();
1968                     if (nri != null) {
1969                         DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo();
1970                         // Check if the network is non-VoPS.
1971                         if (dsri != null && dsri.getVopsSupportInfo() != null
1972                                 && !dsri.getVopsSupportInfo().isVopsSupported()
1973                                 && !mDataConfigManager.shouldKeepNetworkUpInNonVops()) {
1974                             builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL);
1975                         }
1976                         log("updateNetworkCapabilities: dsri=" + dsri);
1977                     }
1978                 }
1979             }
1980         }
1981 
1982         // Extract network capabilities from the traffic descriptor.
1983         for (TrafficDescriptor trafficDescriptor : mTrafficDescriptors) {
1984             try {
1985                 if (trafficDescriptor.getOsAppId() == null) continue;
1986                 OsAppId osAppId = new OsAppId(trafficDescriptor.getOsAppId());
1987                 if (!osAppId.getOsId().equals(OsAppId.ANDROID_OS_ID)) {
1988                     loge("Received non-Android OS id " + osAppId.getOsId());
1989                     continue;
1990                 }
1991                 int networkCapability = DataUtils.getNetworkCapabilityFromString(
1992                         osAppId.getAppId());
1993                 switch (networkCapability) {
1994                     case NetworkCapabilities.NET_CAPABILITY_ENTERPRISE:
1995                         builder.addCapability(networkCapability);
1996                         // Always add internet if TD contains enterprise.
1997                         builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
1998                         builder.addEnterpriseId(osAppId.getDifferentiator());
1999                         break;
2000                     case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY:
2001                     case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH:
2002                     case NetworkCapabilities.NET_CAPABILITY_CBS:
2003                         builder.addCapability(networkCapability);
2004                         break;
2005                     default:
2006                         loge("Invalid app id " + osAppId.getAppId());
2007                 }
2008             } catch (Exception e) {
2009                 loge("Exception: " + e + ". Failed to create osAppId from "
2010                         + new BigInteger(1, trafficDescriptor.getOsAppId()).toString(16));
2011             }
2012         }
2013 
2014         if (!mCongested) {
2015             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED);
2016         }
2017 
2018         if (mTempNotMeteredSupported && mTempNotMetered) {
2019             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED);
2020         }
2021 
2022         // Always start with NOT_VCN_MANAGED, then remove if VcnManager indicates this is part of a
2023         // VCN.
2024         builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
2025         final VcnNetworkPolicyResult vcnPolicy = getVcnPolicy(builder.build());
2026         if (vcnPolicy != null && !vcnPolicy.getNetworkCapabilities()
2027                 .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)) {
2028             builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
2029         }
2030 
2031         if (!roaming) {
2032             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
2033         }
2034 
2035         if (!mSuspended) {
2036             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
2037         }
2038 
2039         if (mCarrierServicePackageUid != Process.INVALID_UID
2040                 && ArrayUtils.contains(mAdministratorUids, mCarrierServicePackageUid)) {
2041             builder.setOwnerUid(mCarrierServicePackageUid);
2042             builder.setAllowedUids(Collections.singleton(mCarrierServicePackageUid));
2043         }
2044         builder.setAdministratorUids(mAdministratorUids);
2045 
2046         Set<Integer> meteredCapabilities = mDataConfigManager
2047                 .getMeteredNetworkCapabilities(roaming).stream()
2048                 .filter(cap -> mAccessNetworksManager.getPreferredTransportByNetworkCapability(cap)
2049                         == AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
2050                 .collect(Collectors.toSet());
2051         boolean unmeteredNetwork = meteredCapabilities.stream().noneMatch(
2052                 Arrays.stream(builder.build().getCapabilities()).boxed()
2053                         .collect(Collectors.toSet())::contains);
2054 
2055         if (unmeteredNetwork) {
2056             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
2057         }
2058 
2059         // Always start with not-restricted, and then remove if needed.
2060         builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
2061 
2062         // When data is disabled, or data roaming is disabled and the device is roaming, we need
2063         // to remove certain capabilities depending on scenarios.
2064         if (!mDataNetworkController.getDataSettingsManager().isDataEnabled()
2065                 || (mPhone.getServiceState().getDataRoaming()
2066                 && !mDataNetworkController.getDataSettingsManager().isDataRoamingEnabled())) {
2067             // If data is allowed because the request is a restricted network request, we need
2068             // to mark the network as restricted when data is disabled or data roaming is disabled
2069             // and the device is roaming. If we don't do that, non-privileged apps will be able
2070             // to use this network when data is disabled.
2071             if (mDataAllowedReason == DataAllowedReason.RESTRICTED_REQUEST) {
2072                 builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
2073             } else if (mDataAllowedReason == DataAllowedReason.UNMETERED_USAGE
2074                     || mDataAllowedReason == DataAllowedReason.MMS_REQUEST
2075                     || mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL) {
2076                 // If data is allowed due to unmetered usage, or MMS always-allowed, we need to
2077                 // remove unrelated-but-metered capabilities.
2078                 for (int capability : meteredCapabilities) {
2079                     // 1. If it's unmetered usage, remove all metered capabilities.
2080                     // 2. If it's MMS always-allowed, then remove all metered capabilities but MMS.
2081                     // 3/ If it's for emergency SUPL, then remove all metered capabilities but SUPL.
2082                     if ((capability == NetworkCapabilities.NET_CAPABILITY_MMS
2083                             && mDataAllowedReason == DataAllowedReason.MMS_REQUEST)
2084                             || (capability == NetworkCapabilities.NET_CAPABILITY_SUPL
2085                             && mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL)) {
2086                         // Not removing the capability for special uses.
2087                         continue;
2088                     }
2089                     builder.removeCapability(capability);
2090                 }
2091             }
2092         }
2093 
2094         // If one of the capabilities are for special use, for example, IMS, CBS, then this
2095         // network should be restricted, regardless data is enabled or not.
2096         if (NetworkCapabilitiesUtils.inferRestrictedCapability(builder.build())
2097                 || (vcnPolicy != null && !vcnPolicy.getNetworkCapabilities()
2098                         .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED))) {
2099             builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
2100         }
2101 
2102         // Set the bandwidth information.
2103         builder.setLinkDownstreamBandwidthKbps(mNetworkBandwidth.downlinkBandwidthKbps);
2104         builder.setLinkUpstreamBandwidthKbps(mNetworkBandwidth.uplinkBandwidthKbps);
2105 
2106         NetworkCapabilities nc = builder.build();
2107         if (mNetworkCapabilities == null || mNetworkAgent == null) {
2108             // This is the first time when network capabilities is created. The agent is not created
2109             // at this time. Just return here. The network capabilities will be used when network
2110             // agent is created.
2111             mNetworkCapabilities = nc;
2112             logl("Initial capabilities " + mNetworkCapabilities);
2113             return;
2114         }
2115 
2116         if (!nc.equals(mNetworkCapabilities)) {
2117             // Check if we are changing the immutable capabilities. Note that we should be very
2118             // careful and limit the use cases of changing immutable capabilities. Connectivity
2119             // service would not close sockets for clients if a network request becomes
2120             // unsatisfiable.
2121             if (mEverConnected && areImmutableCapabilitiesChanged(mNetworkCapabilities, nc)
2122                     && (isConnected() || isHandoverInProgress())) {
2123                 // Before connectivity service supports making all capabilities mutable, it is
2124                 // suggested to de-register and re-register the network agent if it is needed to
2125                 // add/remove immutable capabilities.
2126                 logl("updateNetworkCapabilities: Immutable capabilities changed. Re-create the "
2127                         + "network agent. Attempted to change from " + mNetworkCapabilities + " to "
2128                         + nc);
2129                 mNetworkCapabilities = nc;
2130                 recreateNetworkAgent();
2131             } else {
2132                 // Now we need to inform connectivity service and data network controller
2133                 // about the capabilities changed.
2134                 mNetworkCapabilities = nc;
2135                 log("Capabilities changed to " + mNetworkCapabilities);
2136                 mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
2137             }
2138 
2139             // Only retry the request when the network is in connected or handover state. This is to
2140             // prevent request is detached during connecting state, and then become a setup/detach
2141             // infinite loop.
2142             boolean shouldRetry = isConnected() || isHandoverInProgress();
2143             removeUnsatisfiedNetworkRequests(shouldRetry);
2144             mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
2145                     .onNetworkCapabilitiesChanged(DataNetwork.this));
2146         } else {
2147             log("updateNetworkCapabilities: Capabilities not changed.");
2148         }
2149     }
2150 
2151     /**
2152      * @return The network capabilities of this data network.
2153      */
2154     public @NonNull NetworkCapabilities getNetworkCapabilities() {
2155         return mNetworkCapabilities;
2156     }
2157 
2158     /**
2159      * @return The link properties of this data network.
2160      */
2161     public @NonNull LinkProperties getLinkProperties() {
2162         return mLinkProperties;
2163     }
2164 
2165     /**
2166      * @return The data profile of this data network.
2167      */
2168     public @NonNull DataProfile getDataProfile() {
2169         return mDataProfile;
2170     }
2171 
2172     /**
2173      * Update data suspended state.
2174      */
2175     private void updateSuspendState() {
2176         if (isConnecting() || isDisconnected()) {
2177             // Return if not in the right state.
2178             return;
2179         }
2180 
2181         boolean newSuspendedState = false;
2182         // Get the uncombined service state directly.
2183         NetworkRegistrationInfo nri = getNetworkRegistrationInfo();
2184         if (nri == null) return;
2185 
2186         // Never set suspended for emergency apn. Emergency data connection
2187         // can work while device is not in service.
2188         if (mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) {
2189             newSuspendedState = false;
2190             // If we are not in service, change to suspended.
2191         } else if (nri.getRegistrationState()
2192                 != NetworkRegistrationInfo.REGISTRATION_STATE_HOME
2193                 && nri.getRegistrationState()
2194                 != NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING) {
2195             newSuspendedState = true;
2196             // Check voice/data concurrency.
2197         } else if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()
2198                 && mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
2199             newSuspendedState = mPhone.getCallTracker().getState() != PhoneConstants.State.IDLE;
2200         }
2201 
2202         // Only notify when there is a change.
2203         if (mSuspended != newSuspendedState) {
2204             mSuspended = newSuspendedState;
2205             logl("Network becomes " + (mSuspended ? "suspended" : "unsuspended"));
2206             // To update NOT_SUSPENDED capability.
2207             updateNetworkCapabilities();
2208             notifyPreciseDataConnectionState();
2209             mDataNetworkCallback.invokeFromExecutor(() ->
2210                     mDataNetworkCallback.onSuspendedStateChanged(DataNetwork.this, mSuspended));
2211         }
2212     }
2213 
2214     /**
2215      * Allocate PDU session ID from the modem. This is only needed when the data network is
2216      * initiated on IWLAN.
2217      */
2218     private void allocatePduSessionId() {
2219         mRil.allocatePduSessionId(obtainMessage(EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE));
2220     }
2221 
2222     /**
2223      * Setup a data network.
2224      */
2225     private void setupData() {
2226         int dataNetworkType = getDataNetworkType();
2227 
2228         // We need to use the actual modem roaming state instead of the framework roaming state
2229         // here. This flag is only passed down to ril_service for picking the correct protocol (for
2230         // old modem backward compatibility).
2231         boolean isModemRoaming = mPhone.getServiceState().getDataRoamingFromRegistration();
2232 
2233         // Set this flag to true if the user turns on data roaming. Or if we override the roaming
2234         // state in framework, we should set this flag to true as well so the modem will not reject
2235         // the data call setup (because the modem actually thinks the device is roaming).
2236         boolean allowRoaming = mPhone.getDataRoamingEnabled()
2237                 || (isModemRoaming && (!mPhone.getServiceState().getDataRoaming()
2238                 /*|| isUnmeteredUseOnly()*/));
2239 
2240         TrafficDescriptor trafficDescriptor = mDataProfile.getTrafficDescriptor();
2241         final boolean matchAllRuleAllowed = trafficDescriptor == null
2242                 || !TextUtils.isEmpty(trafficDescriptor.getDataNetworkName())
2243                 // Both OsAppId and APN name are null. This helps for modem to handle when we
2244                 // are on 5G or LTE with URSP support in falling back to default network.
2245                 || (TextUtils.isEmpty(trafficDescriptor.getDataNetworkName())
2246                 && trafficDescriptor.getOsAppId() == null);
2247 
2248         int accessNetwork = DataUtils.networkTypeToAccessNetworkType(dataNetworkType);
2249 
2250         mDataServiceManagers.get(mTransport)
2251                 .setupDataCall(accessNetwork, mDataProfile, isModemRoaming, allowRoaming,
2252                         DataService.REQUEST_REASON_NORMAL, null, mPduSessionId, null,
2253                         trafficDescriptor, matchAllRuleAllowed,
2254                         obtainMessage(EVENT_SETUP_DATA_NETWORK_RESPONSE));
2255 
2256         int apnTypeBitmask = mDataProfile.getApnSetting() != null
2257                 ? mDataProfile.getApnSetting().getApnTypeBitmask() : ApnSetting.TYPE_NONE;
2258         mDataCallSessionStats.onSetupDataCall(apnTypeBitmask);
2259 
2260         logl("setupData: accessNetwork="
2261                 + AccessNetworkType.toString(accessNetwork) + ", " + mDataProfile
2262                 + ", isModemRoaming=" + isModemRoaming + ", allowRoaming=" + allowRoaming
2263                 + ", PDU session id=" + mPduSessionId + ", matchAllRuleAllowed="
2264                 + matchAllRuleAllowed);
2265         TelephonyMetrics.getInstance().writeSetupDataCall(mPhone.getPhoneId(),
2266                 ServiceState.networkTypeToRilRadioTechnology(dataNetworkType),
2267                 mDataProfile.getProfileId(), mDataProfile.getApn(), mDataProfile.getProtocolType());
2268     }
2269 
2270     /**
2271      * Get fail cause from {@link DataCallResponse} and the result code.
2272      *
2273      * @param resultCode The result code returned from
2274      * {@link DataServiceCallback#onSetupDataCallComplete(int, DataCallResponse)}.
2275      * @param response The data call response returned from
2276      * {@link DataServiceCallback#onSetupDataCallComplete(int, DataCallResponse)}.
2277      *
2278      * @return The fail cause. {@link DataFailCause#NONE} if succeeds.
2279      */
2280     private @DataFailureCause int getFailCauseFromDataCallResponse(
2281             @DataServiceCallback.ResultCode int resultCode, @Nullable DataCallResponse response) {
2282         int failCause = DataFailCause.NONE;
2283         switch (resultCode) {
2284             case DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE:
2285                 failCause = DataFailCause.RADIO_NOT_AVAILABLE;
2286                 break;
2287             case DataServiceCallback.RESULT_ERROR_BUSY:
2288             case DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE:
2289                 failCause = DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE;
2290                 break;
2291             case DataServiceCallback.RESULT_ERROR_INVALID_ARG:
2292                 failCause = DataFailCause.UNACCEPTABLE_NETWORK_PARAMETER;
2293                 break;
2294             case DataServiceCallback.RESULT_ERROR_UNSUPPORTED:
2295                 failCause = DataFailCause.REQUEST_NOT_SUPPORTED;
2296                 break;
2297             case DataServiceCallback.RESULT_SUCCESS:
2298                 if (response != null) {
2299                     failCause = DataFailCause.getFailCause(response.getCause());
2300                 }
2301                 break;
2302         }
2303         return failCause;
2304     }
2305 
2306     /**
2307      * Update data network based on the latest {@link DataCallResponse}.
2308      *
2309      * @param response The data call response from data service.
2310      */
2311     private void updateDataNetwork(@NonNull DataCallResponse response) {
2312         mCid.put(mTransport, response.getId());
2313         LinkProperties linkProperties = new LinkProperties();
2314 
2315         // Set interface name
2316         linkProperties.setInterfaceName(response.getInterfaceName());
2317 
2318         // Set PDU session id
2319         if (mPduSessionId != response.getPduSessionId()) {
2320             mPduSessionId = response.getPduSessionId();
2321             log("PDU session id updated to " + mPduSessionId);
2322         }
2323 
2324         // Set the link status
2325         if (mLinkStatus != response.getLinkStatus()) {
2326             mLinkStatus = response.getLinkStatus();
2327             log("Link status updated to " + DataUtils.linkStatusToString(mLinkStatus));
2328             if (isConnected()) {
2329                 // If the data network is in a transition state, the link status will be notified
2330                 // upon entering connected or disconnected state. If the data network is already
2331                 // connected, send the updated link status from the updated data call response.
2332                 mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback
2333                         .onLinkStatusChanged(DataNetwork.this, mLinkStatus));
2334             }
2335         }
2336 
2337         // Set link addresses
2338         if (response.getAddresses().size() > 0) {
2339             for (LinkAddress la : response.getAddresses()) {
2340                 if (!la.getAddress().isAnyLocalAddress()) {
2341                     logv("addr/pl=" + la.getAddress() + "/" + la.getPrefixLength());
2342                     linkProperties.addLinkAddress(la);
2343                 }
2344             }
2345         } else {
2346             loge("no address for ifname=" + response.getInterfaceName());
2347         }
2348 
2349         // Set DNS servers
2350         if (response.getDnsAddresses().size() > 0) {
2351             for (InetAddress dns : response.getDnsAddresses()) {
2352                 if (!dns.isAnyLocalAddress()) {
2353                     linkProperties.addDnsServer(dns);
2354                 }
2355             }
2356         } else {
2357             loge("Empty dns response");
2358         }
2359 
2360         // Set PCSCF
2361         if (response.getPcscfAddresses().size() > 0) {
2362             for (InetAddress pcscf : response.getPcscfAddresses()) {
2363                 linkProperties.addPcscfServer(pcscf);
2364             }
2365         }
2366 
2367         // For backwards compatibility, use getMtu() if getMtuV4() is not available.
2368         int mtuV4 = response.getMtuV4() > 0 ? response.getMtuV4() : response.getMtu();
2369 
2370         if (mtuV4 <= 0) {
2371             // Use back up value from data profile.
2372             if (mDataProfile.getApnSetting() != null) {
2373                 mtuV4 = mDataProfile.getApnSetting().getMtuV4();
2374             }
2375             if (mtuV4 <= 0) {
2376                 mtuV4 = mDataConfigManager.getDefaultMtu();
2377             }
2378         }
2379 
2380         // For backwards compatibility, use getMtu() if getMtuV6() is not available.
2381         int mtuV6 = response.getMtuV6() > 0 ? response.getMtuV6() : response.getMtu();
2382         if (mtuV6 <= 0) {
2383             // Use back up value from data profile.
2384             if (mDataProfile.getApnSetting() != null) {
2385                 mtuV6 = mDataProfile.getApnSetting().getMtuV6();
2386             }
2387             if (mtuV6 <= 0) {
2388                 mtuV6 = mDataConfigManager.getDefaultMtu();
2389             }
2390         }
2391 
2392         // Set MTU for each route.
2393         for (InetAddress gateway : response.getGatewayAddresses()) {
2394             int mtu = gateway instanceof java.net.Inet6Address ? mtuV6 : mtuV4;
2395             linkProperties.addRoute(new RouteInfo(null, gateway, null,
2396                     RouteInfo.RTN_UNICAST, mtu));
2397         }
2398 
2399         // LinkProperties.setMtu should be deprecated. The mtu for each route has been already
2400         // provided in addRoute() above. For backwards compatibility, we still need to provide
2401         // a value for the legacy MTU. Use the higher value of v4 and v6 value here.
2402         linkProperties.setMtu(Math.max(mtuV4, mtuV6));
2403 
2404         if (mDataProfile.getApnSetting() != null
2405                 && !TextUtils.isEmpty(mDataProfile.getApnSetting().getProxyAddressAsString())) {
2406             int port = mDataProfile.getApnSetting().getProxyPort();
2407             if (port == -1) {
2408                 port = 8080;
2409             }
2410             ProxyInfo proxy = ProxyInfo.buildDirectProxy(
2411                     mDataProfile.getApnSetting().getProxyAddressAsString(), port);
2412             linkProperties.setHttpProxy(proxy);
2413         }
2414 
2415         linkProperties.setTcpBufferSizes(mTcpBufferSizes);
2416 
2417         mNetworkSliceInfo = response.getSliceInfo();
2418 
2419         mTrafficDescriptors.clear();
2420         mTrafficDescriptors.addAll(response.getTrafficDescriptors());
2421 
2422         mQosBearerSessions.clear();
2423         mQosBearerSessions.addAll(response.getQosBearerSessions());
2424         if (mQosCallbackTracker != null) {
2425             mQosCallbackTracker.updateSessions(mQosBearerSessions);
2426         }
2427 
2428         if (!linkProperties.equals(mLinkProperties)) {
2429             // If the new link properties is not compatible (e.g. IP changes, interface changes),
2430             // then we should de-register the network agent and re-create a new one.
2431             if ((isConnected() || isHandoverInProgress())
2432                     && !isLinkPropertiesCompatible(mLinkProperties, linkProperties)) {
2433                 logl("updateDataNetwork: Incompatible link properties detected. Re-create the "
2434                         + "network agent. Changed from " + mLinkProperties + " to "
2435                         + linkProperties);
2436 
2437                 mLinkProperties = linkProperties;
2438                 recreateNetworkAgent();
2439             } else {
2440                 mLinkProperties = linkProperties;
2441                 log("sendLinkProperties " + mLinkProperties);
2442                 mNetworkAgent.sendLinkProperties(mLinkProperties);
2443             }
2444         }
2445 
2446         updateNetworkCapabilities();
2447     }
2448 
2449     /**
2450      * Called when receiving setup data network response from the data service.
2451      *
2452      * @param resultCode The result code.
2453      * @param response The response.
2454      */
2455     private void onSetupResponse(@DataServiceCallback.ResultCode int resultCode,
2456             @Nullable DataCallResponse response) {
2457         logl("onSetupResponse: resultCode=" + DataServiceCallback.resultCodeToString(resultCode)
2458                 + ", response=" + response);
2459         mFailCause = getFailCauseFromDataCallResponse(resultCode, response);
2460         validateDataCallResponse(response, true /*isSetupResponse*/);
2461         if (mFailCause == DataFailCause.NONE) {
2462             DataNetwork dataNetwork = mDataNetworkController.getDataNetworkByInterface(
2463                     response.getInterfaceName());
2464             if (dataNetwork != null) {
2465                 logl("Interface " + response.getInterfaceName() + " has been already used by "
2466                         + dataNetwork + ". Silently tear down now.");
2467                 // If this is a pre-5G data setup, that means APN database has some problems. For
2468                 // example, different APN settings have the same APN name.
2469                 if (response.getTrafficDescriptors().isEmpty() && dataNetwork.isConnected()) {
2470                     reportAnomaly("Duplicate network interface " + response.getInterfaceName()
2471                             + " detected.", "62f66e7e-8d71-45de-a57b-dc5c78223fd5");
2472                 }
2473 
2474                 // Do not actually invoke onTearDown, otherwise the existing data network will be
2475                 // torn down.
2476                 mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
2477                 mFailCause = DataFailCause.NO_RETRY_FAILURE;
2478                 transitionTo(mDisconnectedState);
2479                 return;
2480             }
2481 
2482             updateDataNetwork(response);
2483 
2484             // TODO: Evaluate all network requests and see if each request still can be satisfied.
2485             //  For requests that can't be satisfied anymore, we need to put them back to the
2486             //  unsatisfied pool. If none of network requests can be satisfied, then there is no
2487             //  need to mark network agent connected. Just silently deactivate the data network.
2488             if (mAttachedNetworkRequestList.size() == 0) {
2489                 log("Tear down the network since there is no live network request.");
2490                 // Directly call onTearDown here. Calling tearDown will cause deadlock because
2491                 // EVENT_TEAR_DOWN_NETWORK is deferred until state machine enters connected state,
2492                 // which will never happen in this case.
2493                 onTearDown(TEAR_DOWN_REASON_NO_LIVE_REQUEST);
2494                 return;
2495             }
2496 
2497             if (mVcnManager != null && mVcnManager.applyVcnNetworkPolicy(mNetworkCapabilities,
2498                     mLinkProperties).isTeardownRequested()) {
2499                 log("VCN service requested to tear down the network.");
2500                 // Directly call onTearDown here. Calling tearDown will cause deadlock because
2501                 // EVENT_TEAR_DOWN_NETWORK is deferred until state machine enters connected state,
2502                 // which will never happen in this case.
2503                 onTearDown(TEAR_DOWN_REASON_VCN_REQUESTED);
2504                 return;
2505             }
2506 
2507             transitionTo(mConnectedState);
2508         } else {
2509             // Setup data failed.
2510             mRetryDelayMillis = response != null ? response.getRetryDurationMillis()
2511                     : DataCallResponse.RETRY_DURATION_UNDEFINED;
2512             transitionTo(mDisconnectedState);
2513         }
2514 
2515         int apnTypeBitmask = ApnSetting.TYPE_NONE;
2516         int protocol = ApnSetting.PROTOCOL_UNKNOWN;
2517         if (mDataProfile.getApnSetting() != null) {
2518             apnTypeBitmask = mDataProfile.getApnSetting().getApnTypeBitmask();
2519             protocol = mDataProfile.getApnSetting().getProtocol();
2520         }
2521         mDataCallSessionStats.onSetupDataCallResponse(response,
2522                 getDataNetworkType(),
2523                 apnTypeBitmask,
2524                 protocol,
2525                 // Log the raw fail cause to avoid large amount of UNKNOWN showing on metrics.
2526                 response != null ? response.getCause() : mFailCause);
2527     }
2528 
2529     /**
2530      * If the {@link DataCallResponse} contains invalid info, triggers an anomaly report.
2531      *
2532      * @param response The response to be validated
2533      * @param isSetupResponse {@code true} if the response is for initial data call setup
2534      */
2535     private void validateDataCallResponse(@Nullable DataCallResponse response,
2536             boolean isSetupResponse) {
2537         if (response == null
2538                 || response.getLinkStatus() == DataCallResponse.LINK_STATUS_INACTIVE) return;
2539         int failCause = response.getCause();
2540         if (failCause == DataFailCause.NONE) {
2541             if (TextUtils.isEmpty(response.getInterfaceName())
2542                     || response.getAddresses().isEmpty()
2543                     // if out of range
2544                     || response.getLinkStatus() < DataCallResponse.LINK_STATUS_UNKNOWN
2545                     || response.getLinkStatus() > DataCallResponse.LINK_STATUS_ACTIVE
2546                     || response.getProtocolType() < ApnSetting.PROTOCOL_UNKNOWN
2547                     || response.getProtocolType() > ApnSetting.PROTOCOL_UNSTRUCTURED
2548                     || response.getHandoverFailureMode()
2549                     < DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN
2550                     || response.getHandoverFailureMode()
2551                     > DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL) {
2552                 loge("Invalid DataCallResponse:" + response);
2553                 reportAnomaly("Invalid DataCallResponse detected",
2554                         "1f273e9d-b09c-46eb-ad1c-421d01f61164");
2555             }
2556             // Check IP for initial setup response
2557             NetworkRegistrationInfo nri = getNetworkRegistrationInfo();
2558             if (isSetupResponse
2559                     && mDataProfile.getApnSetting() != null && nri != null && nri.isInService()) {
2560                 boolean isRoaming = nri.getNetworkRegistrationState()
2561                         == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING;
2562                 int protocol = isRoaming ? mDataProfile.getApnSetting().getRoamingProtocol()
2563                         : mDataProfile.getApnSetting().getProtocol();
2564                 String underlyingDataService = mTransport
2565                         == AccessNetworkConstants.TRANSPORT_TYPE_WWAN
2566                         ? "RIL" : "IWLAN data service";
2567                 if (protocol == ApnSetting.PROTOCOL_IP) {
2568                     if (response.getAddresses().stream().anyMatch(
2569                             la -> la.getAddress() instanceof java.net.Inet6Address)) {
2570                         loge("Invalid DataCallResponse. Requested IPv4 but got IPv6 address. "
2571                                 + response);
2572                         reportAnomaly(underlyingDataService + " reported mismatched IP "
2573                                 + "type. Requested IPv4 but got IPv6 address.",
2574                                 "7744f920-fb64-4db0-ba47-de0eae485a80");
2575                     }
2576                 } else if (protocol == ApnSetting.PROTOCOL_IPV6) {
2577                     if (response.getAddresses().stream().anyMatch(
2578                             la -> la.getAddress() instanceof java.net.Inet4Address)) {
2579                         loge("Invalid DataCallResponse. Requested IPv6 but got IPv4 address. "
2580                                 + response);
2581                         reportAnomaly(underlyingDataService + " reported mismatched IP "
2582                                         + "type. Requested IPv6 but got IPv4 address.",
2583                                 "7744f920-fb64-4db0-ba47-de0eae485a80");
2584                     }
2585                 }
2586             }
2587         } else if (!DataFailCause.isFailCauseExisting(failCause)) { // Setup data failed.
2588             loge("Invalid DataFailCause in " + response);
2589             reportAnomaly("Invalid DataFailCause: (0x" + Integer.toHexString(failCause)
2590                             + ")",
2591                     "6b264f28-9f58-4cbd-9e0e-d7624ba30879");
2592         }
2593     }
2594 
2595     /**
2596      * Called when receiving deactivate data network response from the data service.
2597      *
2598      * @param resultCode The result code.
2599      */
2600     private void onDeactivateResponse(@DataServiceCallback.ResultCode int resultCode) {
2601         logl("onDeactivateResponse: resultCode="
2602                 + DataServiceCallback.resultCodeToString(resultCode));
2603         if (resultCode == DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE) {
2604             log("Remove network since deactivate request returned an error.");
2605             mFailCause = DataFailCause.RADIO_NOT_AVAILABLE;
2606             transitionTo(mDisconnectedState);
2607         } else if (mPhone.getHalVersion(HAL_SERVICE_DATA).less(RIL.RADIO_HAL_VERSION_2_0)) {
2608             log("Remove network on deactivate data response on old HAL "
2609                     + mPhone.getHalVersion(HAL_SERVICE_DATA));
2610             mFailCause = DataFailCause.LOST_CONNECTION;
2611             transitionTo(mDisconnectedState);
2612         }
2613     }
2614 
2615     /**
2616      * Tear down the data network immediately.
2617      *
2618      * @param reason The reason of tearing down the network.
2619      */
2620     public void tearDown(@TearDownReason int reason) {
2621         if (getCurrentState() == null || isDisconnected()) {
2622             return;
2623         }
2624         mTearDownReason = reason;
2625         sendMessage(obtainMessage(EVENT_TEAR_DOWN_NETWORK, reason));
2626     }
2627 
2628     private void onTearDown(@TearDownReason int reason) {
2629         logl("onTearDown: reason=" + tearDownReasonToString(reason));
2630 
2631         // track frequent NetworkAgent.onNetworkUnwanted() call of IMS and INTERNET
2632         if (reason == TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED
2633                 && isConnected()
2634                 && (mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
2635                 || mNetworkCapabilities.hasCapability(
2636                         NetworkCapabilities.NET_CAPABILITY_INTERNET))) {
2637             mDataNetworkCallback.onTrackNetworkUnwanted(this);
2638         }
2639 
2640         mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport),
2641                 reason == TEAR_DOWN_REASON_AIRPLANE_MODE_ON ? DataService.REQUEST_REASON_SHUTDOWN
2642                         : DataService.REQUEST_REASON_NORMAL,
2643                 obtainMessage(EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE));
2644         mDataCallSessionStats.setDeactivateDataCallReason(reason);
2645         mInvokedDataDeactivation = true;
2646     }
2647 
2648     /**
2649      * @return {@code true} if we shall delay tear down this network because an active voice call is
2650      * relying on it and
2651      * {@link CarrierConfigManager#KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL} is enabled.
2652      */
2653     public boolean shouldDelayImsTearDownDueToInCall() {
2654         return mDataConfigManager.isImsDelayTearDownUntilVoiceCallEndEnabled()
2655                 && mNetworkCapabilities != null
2656                 && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)
2657                 && mPhone.getImsPhone() != null
2658                 && mPhone.getImsPhone().getCallTracker().getState()
2659                 != PhoneConstants.State.IDLE;
2660     }
2661 
2662     /**
2663      * Tear down the data network when condition is met or timed out. Data network will enter
2664      * {@link DisconnectingState} immediately and waiting for condition met. When condition is met,
2665      * {@link DataNetworkController} should invoke {@link Consumer#accept(Object)} so the actual
2666      * tear down work can be performed.
2667      *
2668      * This is primarily used for IMS graceful tear down. {@link DataNetworkController} inform
2669      * {@link DataNetwork} to enter {@link DisconnectingState}. IMS service can observe this
2670      * through {@link PreciseDataConnectionState#getState()} and then perform IMS de-registration
2671      * work. After IMS de-registered, {@link DataNetworkController} informs {@link DataNetwork}
2672      * that it's okay to tear down the network.
2673      *
2674      * @param reason The tear down reason.
2675      *
2676      * @param timeoutMillis Timeout in milliseconds. Within the time window, clients will have to
2677      * call {@link Consumer#accept(Object)}, otherwise, data network will be torn down when
2678      * timed out.
2679      *
2680      * @return The runnable for client to execute when condition is met. When executed, tear down
2681      * will be performed. {@code null} if the data network is already disconnected or being
2682      * disconnected.
2683      */
2684     public @Nullable Runnable tearDownWhenConditionMet(@TearDownReason int reason,
2685             long timeoutMillis) {
2686         if (getCurrentState() == null || isDisconnected() || isDisconnecting()) {
2687             loge("tearDownWhenConditionMet: Not in the right state. State=" + getCurrentState());
2688             return null;
2689         }
2690         logl("tearDownWhenConditionMet: reason=" + tearDownReasonToString(reason) + ", timeout="
2691                 + timeoutMillis + "ms.");
2692         sendMessage(EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET, reason, (int) timeoutMillis);
2693         return () -> this.tearDown(reason);
2694     }
2695 
2696     /**
2697      * Called when receiving {@link DataServiceCallback#onDataCallListChanged(List)} from the data
2698      * service.
2699      *
2700      * @param transport The transport where this event from.
2701      * @param responseList The data call response list.
2702      */
2703     private void onDataStateChanged(@TransportType int transport,
2704             @NonNull List<DataCallResponse> responseList) {
2705         // Ignore the update if it's not from the data service on the right transport.
2706         // Also if never received data call response from setup call response, which updates the
2707         // cid, ignore the update here.
2708         logv("onDataStateChanged: " + responseList);
2709         if (transport != mTransport || mCid.get(mTransport) == INVALID_CID || isDisconnected()) {
2710             return;
2711         }
2712 
2713         DataCallResponse response = responseList.stream()
2714                 .filter(r -> mCid.get(mTransport) == r.getId())
2715                 .findFirst()
2716                 .orElse(null);
2717         if (response != null) {
2718             if (!response.equals(mDataCallResponse)) {
2719                 log("onDataStateChanged: " + response);
2720                 validateDataCallResponse(response, false /*isSetupResponse*/);
2721                 mDataCallResponse = response;
2722                 if (response.getLinkStatus() != DataCallResponse.LINK_STATUS_INACTIVE) {
2723                     updateDataNetwork(response);
2724                 } else {
2725                     log("onDataStateChanged: PDN inactive reported by "
2726                             + AccessNetworkConstants.transportTypeToString(mTransport)
2727                             + " data service.");
2728                     mFailCause = mEverConnected ? response.getCause()
2729                             : DataFailCause.NO_RETRY_FAILURE;
2730                     mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
2731                     transitionTo(mDisconnectedState);
2732                 }
2733             }
2734         } else {
2735             // The data call response is missing from the list. This means the PDN is gone. This
2736             // is the PDN lost reported by the modem. We don't send another DEACTIVATE_DATA request
2737             // for that
2738             log("onDataStateChanged: PDN disconnected reported by "
2739                     + AccessNetworkConstants.transportTypeToString(mTransport) + " data service.");
2740             mFailCause = mEverConnected ? DataFailCause.LOST_CONNECTION
2741                     : DataFailCause.NO_RETRY_FAILURE;
2742             mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
2743             transitionTo(mDisconnectedState);
2744         }
2745     }
2746 
2747     /**
2748      * Called when carrier config updated.
2749      */
2750     private void onCarrierConfigUpdated() {
2751         log("onCarrierConfigUpdated");
2752 
2753         updateBandwidthFromDataConfig();
2754         updateTcpBufferSizes();
2755         updateMeteredAndCongested();
2756     }
2757 
2758     /**
2759      * Called when receiving bandwidth update from the modem.
2760      *
2761      * @param linkCapacityEstimates The link capacity estimate list from the modem.
2762      */
2763     private void onBandwidthUpdatedFromModem(
2764             @NonNull List<LinkCapacityEstimate> linkCapacityEstimates) {
2765         Objects.requireNonNull(linkCapacityEstimates);
2766         if (linkCapacityEstimates.isEmpty()) return;
2767 
2768         int uplinkBandwidthKbps = 0, downlinkBandwidthKbps = 0;
2769         for (LinkCapacityEstimate linkCapacityEstimate : linkCapacityEstimates) {
2770             if (linkCapacityEstimate.getType() == LinkCapacityEstimate.LCE_TYPE_COMBINED) {
2771                 uplinkBandwidthKbps = linkCapacityEstimate.getUplinkCapacityKbps();
2772                 downlinkBandwidthKbps = linkCapacityEstimate.getDownlinkCapacityKbps();
2773                 break;
2774             } else if (linkCapacityEstimate.getType() == LinkCapacityEstimate.LCE_TYPE_PRIMARY
2775                     || linkCapacityEstimate.getType() == LinkCapacityEstimate.LCE_TYPE_SECONDARY) {
2776                 uplinkBandwidthKbps += linkCapacityEstimate.getUplinkCapacityKbps();
2777                 downlinkBandwidthKbps += linkCapacityEstimate.getDownlinkCapacityKbps();
2778             } else {
2779                 loge("Invalid LinkCapacityEstimate type " + linkCapacityEstimate.getType());
2780             }
2781         }
2782         onBandwidthUpdated(uplinkBandwidthKbps, downlinkBandwidthKbps);
2783     }
2784 
2785     /**
2786      * Called when bandwidth estimation updated from either modem or the bandwidth estimator.
2787      *
2788      * @param uplinkBandwidthKbps Uplink bandwidth estimate in Kbps.
2789      * @param downlinkBandwidthKbps Downlink bandwidth estimate in Kbps.
2790      */
2791     private void onBandwidthUpdated(int uplinkBandwidthKbps, int downlinkBandwidthKbps) {
2792         log("onBandwidthUpdated: downlinkBandwidthKbps=" + downlinkBandwidthKbps
2793                 + ", uplinkBandwidthKbps=" + uplinkBandwidthKbps);
2794         NetworkBandwidth bandwidthFromConfig = mDataConfigManager.getBandwidthForNetworkType(
2795                 mTelephonyDisplayInfo);
2796 
2797         if (downlinkBandwidthKbps == LinkCapacityEstimate.INVALID && bandwidthFromConfig != null) {
2798             // Fallback to carrier config.
2799             downlinkBandwidthKbps = bandwidthFromConfig.downlinkBandwidthKbps;
2800         }
2801 
2802         if (uplinkBandwidthKbps == LinkCapacityEstimate.INVALID && bandwidthFromConfig != null) {
2803             // Fallback to carrier config.
2804             uplinkBandwidthKbps = bandwidthFromConfig.uplinkBandwidthKbps;
2805         }
2806 
2807         // Make sure uplink is not greater than downlink.
2808         uplinkBandwidthKbps = Math.min(uplinkBandwidthKbps, downlinkBandwidthKbps);
2809         mNetworkBandwidth = new NetworkBandwidth(downlinkBandwidthKbps, uplinkBandwidthKbps);
2810 
2811         updateNetworkCapabilities();
2812     }
2813 
2814     /**
2815      * Called when {@link TelephonyDisplayInfo} changed. This can happen when network types or
2816      * override network types (5G NSA, 5G MMWAVE) change.
2817      */
2818     private void onDisplayInfoChanged() {
2819         mTelephonyDisplayInfo = mPhone.getDisplayInfoController().getTelephonyDisplayInfo();
2820         updateBandwidthFromDataConfig();
2821         updateTcpBufferSizes();
2822         updateMeteredAndCongested();
2823     }
2824 
2825     /**
2826      * Update the bandwidth from carrier config. Note this is no-op if the bandwidth source is not
2827      * carrier config.
2828      */
2829     private void updateBandwidthFromDataConfig() {
2830         if (mDataConfigManager.getBandwidthEstimateSource() != BANDWIDTH_SOURCE_CARRIER_CONFIG) {
2831             return;
2832         }
2833         log("updateBandwidthFromDataConfig");
2834         mNetworkBandwidth = mDataConfigManager.getBandwidthForNetworkType(mTelephonyDisplayInfo);
2835         updateNetworkCapabilities();
2836     }
2837 
2838     /**
2839      * Update the TCP buffer sizes from resource overlays.
2840      */
2841     private void updateTcpBufferSizes() {
2842         log("updateTcpBufferSizes");
2843         mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo);
2844         LinkProperties linkProperties = new LinkProperties(mLinkProperties);
2845         linkProperties.setTcpBufferSizes(mTcpBufferSizes);
2846         if (!linkProperties.equals(mLinkProperties)) {
2847             mLinkProperties = linkProperties;
2848             log("sendLinkProperties " + mLinkProperties);
2849             mNetworkAgent.sendLinkProperties(mLinkProperties);
2850         }
2851     }
2852 
2853     /**
2854      * Update the metered and congested values from carrier configs and subscription overrides
2855      */
2856     private void updateMeteredAndCongested() {
2857         int networkType = mTelephonyDisplayInfo.getNetworkType();
2858         switch (mTelephonyDisplayInfo.getOverrideNetworkType()) {
2859             case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED:
2860             case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA:
2861                 networkType = TelephonyManager.NETWORK_TYPE_NR;
2862                 break;
2863             case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO:
2864             case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA:
2865                 networkType = TelephonyManager.NETWORK_TYPE_LTE_CA;
2866                 break;
2867         }
2868         log("updateMeteredAndCongested: networkType="
2869                 + TelephonyManager.getNetworkTypeName(networkType));
2870         boolean changed = false;
2871         if (mDataConfigManager.isTempNotMeteredSupportedByCarrier() != mTempNotMeteredSupported) {
2872             mTempNotMeteredSupported = !mTempNotMeteredSupported;
2873             changed = true;
2874             log("updateMeteredAndCongested: mTempNotMeteredSupported changed to "
2875                     + mTempNotMeteredSupported);
2876         }
2877         boolean isTempNotMetered = mDataConfigManager.isNetworkTypeUnmetered(
2878                 mTelephonyDisplayInfo, mPhone.getServiceState())
2879                 && (mDataNetworkController.getUnmeteredOverrideNetworkTypes().contains(networkType)
2880                 || isNetworkTypeUnmetered(networkType));
2881         if (isTempNotMetered != mTempNotMetered) {
2882             mTempNotMetered = isTempNotMetered;
2883             changed = true;
2884             log("updateMeteredAndCongested: mTempNotMetered changed to " + mTempNotMetered);
2885         }
2886         if (mDataNetworkController.getCongestedOverrideNetworkTypes().contains(networkType)
2887                 != mCongested) {
2888             mCongested = !mCongested;
2889             changed = true;
2890             log("updateMeteredAndCongested: mCongested changed to " + mCongested);
2891         }
2892         if (changed) {
2893             updateNetworkCapabilities();
2894         }
2895         if (mTempNotMetered && isInternetSupported()) {
2896             // NR NSA and NR have the same network type: NR
2897             mDataCallSessionStats.onUnmeteredUpdate(networkType);
2898         }
2899     }
2900 
2901     /**
2902      * Get whether the network type is unmetered from SubscriptionPlans, from either an unmetered
2903      * general plan or specific plan for the given network type.
2904      *
2905      * @param networkType The network type to check meteredness for
2906      * @return Whether the given network type is unmetered based on SubscriptionPlans
2907      */
2908     private boolean isNetworkTypeUnmetered(@NetworkType int networkType) {
2909         List<SubscriptionPlan> plans = mDataNetworkController.getSubscriptionPlans();
2910         if (plans.isEmpty()) return false;
2911         boolean isGeneralUnmetered = true;
2912         Set<Integer> allNetworkTypes = Arrays.stream(TelephonyManager.getAllNetworkTypes())
2913                 .boxed().collect(Collectors.toSet());
2914         for (SubscriptionPlan plan : plans) {
2915             // Check if plan is general (applies to all network types) or specific
2916             if (Arrays.stream(plan.getNetworkTypes()).boxed().collect(Collectors.toSet())
2917                     .containsAll(allNetworkTypes)) {
2918                 if (plan.getDataLimitBytes() != SubscriptionPlan.BYTES_UNLIMITED) {
2919                     // Metered takes precedence over unmetered for safety
2920                     isGeneralUnmetered = false;
2921                 }
2922             } else {
2923                 // Check if plan applies to given network type
2924                 if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN) {
2925                     for (int planNetworkType : plan.getNetworkTypes()) {
2926                         if (planNetworkType == networkType) {
2927                             return plan.getDataLimitBytes() == SubscriptionPlan.BYTES_UNLIMITED;
2928                         }
2929                     }
2930                 }
2931             }
2932         }
2933         return isGeneralUnmetered;
2934     }
2935 
2936     /**
2937      * @return The unique context id assigned by the data service in
2938      * {@link DataCallResponse#getId()}.
2939      */
2940     public int getId() {
2941         return mCid.get(mTransport);
2942     }
2943 
2944     /**
2945      * @return The current network type reported by the network service.
2946      */
2947     private @NetworkType int getDataNetworkType() {
2948         return getDataNetworkType(mTransport);
2949     }
2950 
2951     /**
2952      * Get the data network type on the specified transport.
2953      *
2954      * @param transport The transport.
2955      * @return The data network type.
2956      */
2957     private @NetworkType int getDataNetworkType(@TransportType int transport) {
2958         // WLAN transport can't have network type other than IWLAN. Ideally service state tracker
2959         // should report the correct RAT, but sometimes race condition could happen that service
2960         // state is reset to out of service and RAT not updated to IWLAN yet.
2961         if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
2962             return TelephonyManager.NETWORK_TYPE_IWLAN;
2963         }
2964 
2965         ServiceState ss = mPhone.getServiceState();
2966         NetworkRegistrationInfo nrs = ss.getNetworkRegistrationInfo(
2967                 NetworkRegistrationInfo.DOMAIN_PS, transport);
2968         if (nrs != null) {
2969             return nrs.getAccessNetworkTechnology();
2970         }
2971         return TelephonyManager.NETWORK_TYPE_UNKNOWN;
2972     }
2973 
2974     /**
2975      * @return The physical link status (i.e. RRC state).
2976      */
2977     public @LinkStatus int getLinkStatus() {
2978         return mLinkStatus;
2979     }
2980 
2981     /**
2982      * Update the network score and report to connectivity service if necessary.
2983      */
2984     private void updateNetworkScore() {
2985         int networkScore = getNetworkScore();
2986         if (networkScore != mNetworkScore) {
2987             logl("Updating score from " + mNetworkScore + " to " + networkScore);
2988             mNetworkScore = networkScore;
2989             mNetworkAgent.sendNetworkScore(mNetworkScore);
2990         }
2991     }
2992 
2993     /**
2994      * @return The network score. The higher score of the network has higher chance to be
2995      * selected by the connectivity service as active network.
2996      */
2997     private int getNetworkScore() {
2998         // If it's serving a network request that asks NET_CAPABILITY_INTERNET and doesn't have
2999         // specify a sub id, this data network is considered to be default internet data
3000         // connection. In this case we assign a slightly higher score of 50. The intention is
3001         // it will not be replaced by other data networks accidentally in DSDS use case.
3002         int score = OTHER_NETWORK_SCORE;
3003         for (TelephonyNetworkRequest networkRequest : mAttachedNetworkRequestList) {
3004             if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
3005                     && networkRequest.getNetworkSpecifier() == null) {
3006                 score = DEFAULT_INTERNET_NETWORK_SCORE;
3007             }
3008         }
3009 
3010         return score;
3011     }
3012 
3013     /**
3014      * @return Network registration info on the current transport.
3015      */
3016     private @Nullable NetworkRegistrationInfo getNetworkRegistrationInfo() {
3017         NetworkRegistrationInfo nri = mPhone.getServiceStateTracker().getServiceState()
3018                 .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, mTransport);
3019         if (nri == null) {
3020             loge("Can't get network registration info for "
3021                     + AccessNetworkConstants.transportTypeToString(mTransport));
3022             return null;
3023         }
3024         return nri;
3025     }
3026 
3027     /**
3028      * Get the APN type network capability. If there are more than one capabilities that are
3029      * APN types, then return the highest priority one which also has associated network request.
3030      * For example, if the network supports both MMS and internet, but only internet request
3031      * attached at this time, then the capability would be internet. Later on if MMS network request
3032      * attached to this network, then the APN type capability would be MMS.
3033      *
3034      * @return The APN type network capability from this network.
3035      *
3036      * @see #getPriority()
3037      */
3038     public @NetCapability int getApnTypeNetworkCapability() {
3039         if (!mAttachedNetworkRequestList.isEmpty()) {
3040             // The highest priority network request is always at the top of list.
3041             return mAttachedNetworkRequestList.get(0).getApnTypeNetworkCapability();
3042         } else {
3043             return Arrays.stream(getNetworkCapabilities().getCapabilities()).boxed()
3044                     .filter(cap -> DataUtils.networkCapabilityToApnType(cap)
3045                             != ApnSetting.TYPE_NONE)
3046                     .max(Comparator.comparingInt(mDataConfigManager::getNetworkCapabilityPriority))
3047                     .orElse(-1);
3048         }
3049     }
3050 
3051     /**
3052      * Get the priority of the network. The priority is derived from the highest priority capability
3053      * which also has such associated network request. For example, if the network supports both
3054      * MMS and internet, but only has internet request attached, then this network has internet's
3055      * priority. Later on when the MMS request attached to this network, the network's priority will
3056      * be updated to MMS's priority.
3057      *
3058      * @return The priority of the network.
3059      *
3060      * @see #getApnTypeNetworkCapability()
3061      */
3062     public int getPriority() {
3063         if (!mAttachedNetworkRequestList.isEmpty()) {
3064             // The highest priority network request is always at the top of list.
3065             return mAttachedNetworkRequestList.get(0).getPriority();
3066         } else {
3067             // If all network requests are already detached, then just pick the highest priority
3068             // capability's priority.
3069             return Arrays.stream(getNetworkCapabilities().getCapabilities()).boxed()
3070                     .map(mDataConfigManager::getNetworkCapabilityPriority)
3071                     .max(Integer::compare)
3072                     .orElse(0);
3073         }
3074     }
3075 
3076     /**
3077      * @return The attached network request list.
3078      */
3079     public @NonNull NetworkRequestList getAttachedNetworkRequestList() {
3080         return mAttachedNetworkRequestList;
3081     }
3082 
3083     /**
3084      * @return {@code true} if in connecting state.
3085      */
3086     public boolean isConnecting() {
3087         return getCurrentState() == mConnectingState;
3088     }
3089 
3090     /**
3091      * @return {@code true} if in connected state.
3092      */
3093     public boolean isConnected() {
3094         return getCurrentState() == mConnectedState;
3095     }
3096 
3097     /**
3098      * @return {@code true} if in disconnecting state.
3099      */
3100     public boolean isDisconnecting() {
3101         return getCurrentState() == mDisconnectingState;
3102     }
3103 
3104     /**
3105      * @return {@code true} if in disconnected state.
3106      */
3107     public boolean isDisconnected() {
3108         return getCurrentState() == mDisconnectedState;
3109     }
3110 
3111     /**
3112      * @return {@code true} if in handover state.
3113      */
3114     public boolean isHandoverInProgress() {
3115         return getCurrentState() == mHandoverState;
3116     }
3117 
3118     /**
3119      * @return {@code true} if the data network is suspended.
3120      */
3121     public boolean isSuspended() {
3122         return getState() == TelephonyManager.DATA_SUSPENDED;
3123     }
3124 
3125     /**
3126      * @return The current transport of the data network.
3127      */
3128     public @TransportType int getTransport() {
3129         return mTransport;
3130     }
3131 
3132     private @DataState int getState() {
3133         IState state = getCurrentState();
3134         if (state == null || isDisconnected()) {
3135             return TelephonyManager.DATA_DISCONNECTED;
3136         } else if (isConnecting()) {
3137             return TelephonyManager.DATA_CONNECTING;
3138         } else if (isConnected()) {
3139             // The data connection can only be suspended when it's in active state.
3140             if (mSuspended) {
3141                 return TelephonyManager.DATA_SUSPENDED;
3142             }
3143             return TelephonyManager.DATA_CONNECTED;
3144         } else if (isDisconnecting()) {
3145             return TelephonyManager.DATA_DISCONNECTING;
3146         } else if (isHandoverInProgress()) {
3147             return TelephonyManager.DATA_HANDOVER_IN_PROGRESS;
3148         }
3149 
3150         return TelephonyManager.DATA_UNKNOWN;
3151     }
3152 
3153     /**
3154      * @return {@code true} if this data network supports internet.
3155      */
3156     public boolean isInternetSupported() {
3157         return mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
3158                 && mNetworkCapabilities.hasCapability(
3159                         NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
3160                 && mNetworkCapabilities.hasCapability(
3161                         NetworkCapabilities.NET_CAPABILITY_TRUSTED)
3162                 && mNetworkCapabilities.hasCapability(
3163                         NetworkCapabilities.NET_CAPABILITY_NOT_VPN);
3164     }
3165 
3166     /**
3167      * @return {@code true} if this network was setup for SUPL during emergency call. {@code false}
3168      * otherwise.
3169      */
3170     public boolean isEmergencySupl() {
3171         return mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL;
3172     }
3173 
3174     /**
3175      * Get precise data connection state
3176      *
3177      * @return The {@link PreciseDataConnectionState}
3178      */
3179     private PreciseDataConnectionState getPreciseDataConnectionState() {
3180         return new PreciseDataConnectionState.Builder()
3181                 .setTransportType(mTransport)
3182                 .setId(mCid.get(mTransport))
3183                 .setState(getState())
3184                 .setApnSetting(mDataProfile.getApnSetting())
3185                 .setLinkProperties(mLinkProperties)
3186                 .setNetworkType(getDataNetworkType())
3187                 .setFailCause(mFailCause)
3188                 .build();
3189     }
3190 
3191     /**
3192      * Send the precise data connection state to the listener of
3193      * {@link android.telephony.TelephonyCallback.PreciseDataConnectionStateListener}.
3194      */
3195     private void notifyPreciseDataConnectionState() {
3196         PreciseDataConnectionState pdcs = getPreciseDataConnectionState();
3197         logv("notifyPreciseDataConnectionState=" + pdcs);
3198         mPhone.notifyDataConnection(pdcs);
3199     }
3200 
3201     /**
3202      * Request the data network to handover to the target transport.
3203      *
3204      * This is the starting point of initiating IWLAN/cellular handover. It will first call
3205      * {@link DataServiceManager#startHandover(int, Message)} to notify source transport that
3206      * handover is about to start, and then call {@link DataServiceManager#setupDataCall(int,
3207      * DataProfile, boolean, boolean, int, LinkProperties, int, NetworkSliceInfo, TrafficDescriptor,
3208      * boolean, Message)} on target transport to initiate the handover process.
3209      *
3210      * @param targetTransport The target transport.
3211      * @param retryEntry Data handover retry entry. This would be {@code null} for first time
3212      * handover attempt.
3213      * @return {@code true} if the request has been accepted.
3214      */
3215     public boolean startHandover(@TransportType int targetTransport,
3216             @Nullable DataHandoverRetryEntry retryEntry) {
3217         if (getCurrentState() == null || isDisconnected() || isDisconnecting()) {
3218             // Fail the request if not in the appropriate state.
3219             if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED);
3220             return false;
3221         }
3222 
3223         // Before we really initiate the handover process on target transport, we need to notify
3224         // source transport that handover is about to start. Handover will be eventually initiated
3225         // in onStartHandover().
3226         sendMessage(obtainMessage(EVENT_NOTIFY_HANDOVER_STARTED, 0, targetTransport, retryEntry));
3227         return true;
3228     }
3229 
3230     /**
3231      * Called when starting IWLAN/cellular handover process on the target transport.
3232      *
3233      * @param targetTransport The target transport.
3234      * @param retryEntry Data handover retry entry. This would be {@code null} for first time
3235      * handover attempt.
3236      */
3237     private void onStartHandover(@TransportType int targetTransport,
3238             @Nullable DataHandoverRetryEntry retryEntry) {
3239         if (mTransport == targetTransport) {
3240             log("onStartHandover: The network is already on "
3241                     + AccessNetworkConstants.transportTypeToString(mTransport)
3242                     + ", handover is not needed.");
3243             if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED);
3244             return;
3245         }
3246 
3247         // We need to use the actual modem roaming state instead of the framework roaming state
3248         // here. This flag is only passed down to ril_service for picking the correct protocol (for
3249         // old modem backward compatibility).
3250         boolean isModemRoaming = mPhone.getServiceState().getDataRoamingFromRegistration();
3251 
3252         // Set this flag to true if the user turns on data roaming. Or if we override the roaming
3253         // state in framework, we should set this flag to true as well so the modem will not reject
3254         // the data call setup (because the modem actually thinks the device is roaming).
3255         boolean allowRoaming = mPhone.getDataRoamingEnabled()
3256                 || (isModemRoaming && (!mPhone.getServiceState().getDataRoaming()));
3257 
3258         mHandoverDataProfile = mDataProfile;
3259         int targetNetworkType = getDataNetworkType(targetTransport);
3260         if (targetNetworkType != TelephonyManager.NETWORK_TYPE_UNKNOWN
3261                 && !mAttachedNetworkRequestList.isEmpty()) {
3262             TelephonyNetworkRequest networkRequest = mAttachedNetworkRequestList.get(0);
3263             DataProfile dataProfile = mDataNetworkController.getDataProfileManager()
3264                     .getDataProfileForNetworkRequest(networkRequest, targetNetworkType, false);
3265             // Some carriers have different profiles between cellular and IWLAN. We need to
3266             // dynamically switch profile, but only when those profiles have same APN name.
3267             if (dataProfile != null && dataProfile.getApnSetting() != null
3268                     && mDataProfile.getApnSetting() != null
3269                     && TextUtils.equals(dataProfile.getApnSetting().getApnName(),
3270                     mDataProfile.getApnSetting().getApnName())
3271                     && !dataProfile.equals(mDataProfile)) {
3272                 mHandoverDataProfile = dataProfile;
3273                 log("Used different data profile for handover. " + mDataProfile);
3274             }
3275         }
3276 
3277         logl("Start handover from " + AccessNetworkConstants.transportTypeToString(mTransport)
3278                 + " to " + AccessNetworkConstants.transportTypeToString(targetTransport));
3279         // Send the handover request to the target transport data service.
3280         mDataServiceManagers.get(targetTransport).setupDataCall(
3281                 DataUtils.networkTypeToAccessNetworkType(getDataNetworkType(targetTransport)),
3282                 mHandoverDataProfile, isModemRoaming, allowRoaming,
3283                 DataService.REQUEST_REASON_HANDOVER, mLinkProperties, mPduSessionId,
3284                 mNetworkSliceInfo, mHandoverDataProfile.getTrafficDescriptor(), true,
3285                 obtainMessage(EVENT_HANDOVER_RESPONSE, retryEntry));
3286     }
3287 
3288     /**
3289      * Called when receiving handover response from the data service.
3290      *
3291      * @param resultCode The result code.
3292      * @param response The response.
3293      * @param retryEntry Data handover retry entry. This would be {@code null} for first time
3294      * handover attempt.
3295      */
3296     private void onHandoverResponse(@DataServiceCallback.ResultCode int resultCode,
3297             @Nullable DataCallResponse response, @Nullable DataHandoverRetryEntry retryEntry) {
3298         logl("onHandoverResponse: resultCode=" + DataServiceCallback.resultCodeToString(resultCode)
3299                 + ", response=" + response);
3300         mFailCause = getFailCauseFromDataCallResponse(resultCode, response);
3301         validateDataCallResponse(response, false /*isSetupResponse*/);
3302         if (mFailCause == DataFailCause.NONE) {
3303             // Handover succeeded.
3304 
3305             // Clean up on the source transport.
3306             mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport),
3307                     DataService.REQUEST_REASON_HANDOVER, null);
3308             // Switch the transport to the target.
3309             mTransport = DataUtils.getTargetTransport(mTransport);
3310             // Update the logging tag
3311             mLogTag = "DN-" + mInitialNetworkAgentId + "-"
3312                     + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I");
3313             // Switch the data profile. This is no-op in most of the case since almost all carriers
3314             // use same data profile between IWLAN and cellular.
3315             mDataProfile = mHandoverDataProfile;
3316             updateDataNetwork(response);
3317             if (mTransport != AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
3318                 unregisterForWwanEvents();
3319             } else {
3320                 // Handover from WLAN to WWAN
3321                 registerForWwanEvents();
3322             }
3323             if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_SUCCEEDED);
3324             mDataNetworkCallback.invokeFromExecutor(
3325                     () -> mDataNetworkCallback.onHandoverSucceeded(DataNetwork.this));
3326         } else {
3327             // Handover failed.
3328 
3329             // Notify source transport that handover failed on target transport so that PDU session
3330             // id can be released if it is preserved for handover.
3331             mDataServiceManagers.get(mTransport).cancelHandover(mCid.get(mTransport),
3332                     obtainMessage(EVENT_NOTIFY_HANDOVER_CANCELLED_RESPONSE));
3333 
3334             long retry = response != null ? response.getRetryDurationMillis()
3335                     : DataCallResponse.RETRY_DURATION_UNDEFINED;
3336             // If the handover mode is unspecified, default to HANDOVER_FAILURE_MODE_UNKNOWN,
3337             // which will retry handover if retry rules are defined.
3338             int handoverFailureMode = response != null ? response.getHandoverFailureMode()
3339                     : DataCallResponse.HANDOVER_FAILURE_MODE_UNKNOWN;
3340             if (retryEntry != null) retryEntry.setState(DataRetryEntry.RETRY_STATE_FAILED);
3341             mDataNetworkCallback.invokeFromExecutor(
3342                     () -> mDataNetworkCallback.onHandoverFailed(DataNetwork.this,
3343                             mFailCause, retry, handoverFailureMode));
3344             trackHandoverFailure(response != null ? response.getCause() : mFailCause);
3345         }
3346 
3347         // No matter handover succeeded or not, transit back to connected state.
3348         transitionTo(mConnectedState);
3349     }
3350 
3351     /**
3352      * Called when handover failed. Record the source and target RAT{@link NetworkType} and the
3353      * failure cause {@link android.telephony.DataFailCause}.
3354      *
3355      * @param cause The fail cause.
3356      */
3357     private void trackHandoverFailure(int cause) {
3358         int sourceRat = getDataNetworkType();
3359         int targetTransport = DataUtils.getTargetTransport(mTransport);
3360         int targetRat = getDataNetworkType(targetTransport);
3361 
3362         mDataCallSessionStats.onHandoverFailure(cause, sourceRat, targetRat);
3363     }
3364 
3365     /**
3366      * Called when receiving PCO (Protocol Configuration Options) data from the cellular network.
3367      *
3368      * @param pcoData The PCO data.
3369      */
3370     private void onPcoDataChanged(@NonNull PcoData pcoData) {
3371         log("onPcoDataChanged: " + pcoData);
3372         mDataNetworkCallback.invokeFromExecutor(
3373                 () -> mDataNetworkCallback.onPcoDataChanged(DataNetwork.this));
3374         if (mDataProfile.getApnSetting() != null) {
3375             for (int apnType : mDataProfile.getApnSetting().getApnTypes()) {
3376                 Intent intent = new Intent(TelephonyManager.ACTION_CARRIER_SIGNAL_PCO_VALUE);
3377                 intent.putExtra(TelephonyManager.EXTRA_APN_TYPE, apnType);
3378                 intent.putExtra(TelephonyManager.EXTRA_APN_PROTOCOL,
3379                         ApnSetting.getProtocolIntFromString(pcoData.bearerProto));
3380                 intent.putExtra(TelephonyManager.EXTRA_PCO_ID, pcoData.pcoId);
3381                 intent.putExtra(TelephonyManager.EXTRA_PCO_VALUE, pcoData.contents);
3382                 mPhone.getCarrierSignalAgent().notifyCarrierSignalReceivers(intent);
3383             }
3384         }
3385     }
3386 
3387     /**
3388      * Called when receiving PCO (Protocol Configuration Options) data from the cellular network.
3389      *
3390      * @param pcoData PCO data.
3391      */
3392     private void onPcoDataReceived(@NonNull PcoData pcoData) {
3393         // Save all the PCO data received, even though it might be unrelated to this data network.
3394         // The network might be still in connecting state. Save all now and use it when entering
3395         // connected state.
3396         log("onPcoDataReceived: " + pcoData);
3397         PcoData oldData = mPcoData.computeIfAbsent(pcoData.cid, m -> new ArrayMap<>())
3398                 .put(pcoData.pcoId, pcoData);
3399         if (getId() == INVALID_CID || pcoData.cid != getId()) return;
3400         if (!Objects.equals(oldData, pcoData)) {
3401             onPcoDataChanged(pcoData);
3402         }
3403     }
3404 
3405     /**
3406      * @return The last known data network type of the data network.
3407      */
3408     public @NetworkType int getLastKnownDataNetworkType() {
3409         return mLastKnownDataNetworkType;
3410     }
3411 
3412     /**
3413      * @return The last known roaming state of this data network.
3414      */
3415     public boolean getLastKnownRoamingState() {
3416         return mLastKnownRoamingState;
3417     }
3418 
3419     /**
3420      * @return The PCO data received from the network.
3421      */
3422     public @NonNull Map<Integer, PcoData> getPcoData() {
3423         if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN
3424                 || mCid.get(mTransport) == INVALID_CID) {
3425             return Collections.emptyMap();
3426         }
3427         return mPcoData.getOrDefault(mCid.get(mTransport), Collections.emptyMap());
3428     }
3429 
3430     /**
3431      * Check if the this data network is VCN-managed.
3432      *
3433      * @param networkCapabilities The network capabilities of this data network.
3434      * @return The VCN's policy for this DataNetwork.
3435      */
3436     private VcnNetworkPolicyResult getVcnPolicy(NetworkCapabilities networkCapabilities) {
3437         if (mVcnManager == null) {
3438             return null;
3439         }
3440 
3441         return mVcnManager.applyVcnNetworkPolicy(networkCapabilities, getLinkProperties());
3442     }
3443 
3444     /**
3445      * Check if any of the attached request has the specified network capability.
3446      *
3447      * @param netCapability The network capability to check.
3448      * @return {@code true} if at least one network request has specified network capability.
3449      */
3450     public boolean hasNetworkCapabilityInNetworkRequests(@NetCapability int netCapability) {
3451         return mAttachedNetworkRequestList.stream().anyMatch(
3452                 request -> request.hasCapability(netCapability));
3453     }
3454 
3455     /**
3456      * Convert the data tear down reason to string.
3457      *
3458      * @param reason Data deactivation reason.
3459      * @return The deactivation reason in string format.
3460      */
3461     public static @NonNull String tearDownReasonToString(@TearDownReason int reason) {
3462         switch (reason) {
3463             case TEAR_DOWN_REASON_NONE:
3464                 return "NONE";
3465             case TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED:
3466                 return "CONNECTIVITY_SERVICE_UNWANTED";
3467             case TEAR_DOWN_REASON_SIM_REMOVAL:
3468                 return "SIM_REMOVAL";
3469             case TEAR_DOWN_REASON_AIRPLANE_MODE_ON:
3470                 return "AIRPLANE_MODE_ON";
3471             case TEAR_DOWN_REASON_DATA_DISABLED:
3472                 return "DATA_DISABLED";
3473             case TEAR_DOWN_REASON_NO_LIVE_REQUEST:
3474                 return "TEAR_DOWN_REASON_NO_LIVE_REQUEST";
3475             case TEAR_DOWN_REASON_RAT_NOT_ALLOWED:
3476                 return "TEAR_DOWN_REASON_RAT_NOT_ALLOWED";
3477             case TEAR_DOWN_REASON_ROAMING_DISABLED:
3478                 return "TEAR_DOWN_REASON_ROAMING_DISABLED";
3479             case TEAR_DOWN_REASON_CONCURRENT_VOICE_DATA_NOT_ALLOWED:
3480                 return "TEAR_DOWN_REASON_CONCURRENT_VOICE_DATA_NOT_ALLOWED";
3481             case TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY:
3482                 return "TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY";
3483             case TEAR_DOWN_REASON_POWER_OFF_BY_CARRIER:
3484                 return "TEAR_DOWN_REASON_POWER_OFF_BY_CARRIER";
3485             case TEAR_DOWN_REASON_DATA_STALL:
3486                 return "TEAR_DOWN_REASON_DATA_STALL";
3487             case TEAR_DOWN_REASON_HANDOVER_FAILED:
3488                 return "TEAR_DOWN_REASON_HANDOVER_FAILED";
3489             case TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED:
3490                 return "TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED";
3491             case TEAR_DOWN_REASON_VCN_REQUESTED:
3492                 return "TEAR_DOWN_REASON_VCN_REQUESTED";
3493             case TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED:
3494                 return "TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED";
3495             case TEAR_DOWN_REASON_DEFAULT_DATA_UNSELECTED:
3496                 return "TEAR_DOWN_REASON_DEFAULT_DATA_UNSELECTED";
3497             case TEAR_DOWN_REASON_NOT_IN_SERVICE:
3498                 return "TEAR_DOWN_REASON_NOT_IN_SERVICE";
3499             case TEAR_DOWN_REASON_DATA_CONFIG_NOT_READY:
3500                 return "TEAR_DOWN_REASON_DATA_CONFIG_NOT_READY";
3501             case TEAR_DOWN_REASON_PENDING_TEAR_DOWN_ALL:
3502                 return "TEAR_DOWN_REASON_PENDING_TEAR_DOWN_ALL";
3503             case TEAR_DOWN_REASON_NO_SUITABLE_DATA_PROFILE:
3504                 return "TEAR_DOWN_REASON_NO_SUITABLE_DATA_PROFILE";
3505             case TEAR_DOWN_REASON_CDMA_EMERGENCY_CALLBACK_MODE:
3506                 return "TEAR_DOWN_REASON_CDMA_EMERGENCY_CALLBACK_MODE";
3507             case TEAR_DOWN_REASON_RETRY_SCHEDULED:
3508                 return "TEAR_DOWN_REASON_RETRY_SCHEDULED";
3509             case TEAR_DOWN_REASON_DATA_THROTTLED:
3510                 return "TEAR_DOWN_REASON_DATA_THROTTLED";
3511             case TEAR_DOWN_REASON_DATA_PROFILE_INVALID:
3512                 return "TEAR_DOWN_REASON_DATA_PROFILE_INVALID";
3513             case TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED:
3514                 return "TEAR_DOWN_REASON_DATA_PROFILE_NOT_PREFERRED";
3515             case TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY:
3516                 return "TEAR_DOWN_REASON_NOT_ALLOWED_BY_POLICY";
3517             case TEAR_DOWN_REASON_ILLEGAL_STATE:
3518                 return "TEAR_DOWN_REASON_ILLEGAL_STATE";
3519             case TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK:
3520                 return "TEAR_DOWN_REASON_ONLY_ALLOWED_SINGLE_NETWORK";
3521             case TEAR_DOWN_REASON_PREFERRED_DATA_SWITCHED:
3522                 return "TEAR_DOWN_REASON_PREFERRED_DATA_SWITCHED";
3523             default:
3524                 return "UNKNOWN(" + reason + ")";
3525         }
3526     }
3527 
3528     /**
3529      * Convert event to string
3530      *
3531      * @param event The event
3532      * @return The event in string format.
3533      */
3534     private static @NonNull String eventToString(int event) {
3535         switch (event) {
3536             case EVENT_DATA_CONFIG_UPDATED:
3537                 return "EVENT_DATA_CONFIG_UPDATED";
3538             case EVENT_ATTACH_NETWORK_REQUEST:
3539                 return "EVENT_ATTACH_NETWORK_REQUEST";
3540             case EVENT_DETACH_NETWORK_REQUEST:
3541                 return "EVENT_DETACH_NETWORK_REQUEST";
3542             case EVENT_RADIO_NOT_AVAILABLE:
3543                 return "EVENT_RADIO_NOT_AVAILABLE";
3544             case EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE:
3545                 return "EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE";
3546             case EVENT_SETUP_DATA_NETWORK_RESPONSE:
3547                 return "EVENT_SETUP_DATA_NETWORK_RESPONSE";
3548             case EVENT_TEAR_DOWN_NETWORK:
3549                 return "EVENT_TEAR_DOWN_NETWORK";
3550             case EVENT_DATA_STATE_CHANGED:
3551                 return "EVENT_DATA_STATE_CHANGED";
3552             case EVENT_SERVICE_STATE_CHANGED:
3553                 return "EVENT_DATA_NETWORK_TYPE_REG_STATE_CHANGED";
3554             case EVENT_DETACH_ALL_NETWORK_REQUESTS:
3555                 return "EVENT_DETACH_ALL_NETWORK_REQUESTS";
3556             case EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED:
3557                 return "EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED";
3558             case EVENT_DISPLAY_INFO_CHANGED:
3559                 return "EVENT_DISPLAY_INFO_CHANGED";
3560             case EVENT_HANDOVER_RESPONSE:
3561                 return "EVENT_HANDOVER_RESPONSE";
3562             case EVENT_SUBSCRIPTION_PLAN_OVERRIDE:
3563                 return "EVENT_SUBSCRIPTION_PLAN_OVERRIDE";
3564             case EVENT_PCO_DATA_RECEIVED:
3565                 return "EVENT_PCO_DATA_RECEIVED";
3566             case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED:
3567                 return "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED";
3568             case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
3569                 return "EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE";
3570             case EVENT_STUCK_IN_TRANSIENT_STATE:
3571                 return "EVENT_STUCK_IN_TRANSIENT_STATE";
3572             case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
3573                 return "EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET";
3574             case EVENT_VOICE_CALL_STARTED:
3575                 return "EVENT_VOICE_CALL_STARTED";
3576             case EVENT_VOICE_CALL_ENDED:
3577                 return "EVENT_VOICE_CALL_ENDED";
3578             case EVENT_CSS_INDICATOR_CHANGED:
3579                 return "EVENT_CSS_INDICATOR_CHANGED";
3580             case EVENT_NOTIFY_HANDOVER_STARTED:
3581                 return "EVENT_NOTIFY_HANDOVER_STARTED";
3582             case EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE:
3583                 return "EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE";
3584             case EVENT_NOTIFY_HANDOVER_CANCELLED_RESPONSE:
3585                 return "EVENT_NOTIFY_HANDOVER_CANCELLED_RESPONSE";
3586             default:
3587                 return "Unknown(" + event + ")";
3588         }
3589     }
3590 
3591     @Override
3592     public String toString() {
3593         return "[DataNetwork: " + mLogTag + ", " + (mDataProfile.getApnSetting() != null
3594                 ? mDataProfile.getApnSetting().getApnName() : null) + ", state="
3595                 + (getCurrentState() != null ? getCurrentState().getName() : null) + "]";
3596     }
3597 
3598     /**
3599      * @return The short name of the data network (e.g. DN-C-1)
3600      */
3601     public @NonNull String name() {
3602         return mLogTag;
3603     }
3604 
3605     /**
3606      * Trigger the anomaly report with the specified UUID.
3607      *
3608      * @param anomalyMsg Description of the event
3609      * @param uuid UUID associated with that event
3610      */
3611     private void reportAnomaly(@NonNull String anomalyMsg, @NonNull String uuid) {
3612         logl(anomalyMsg);
3613         AnomalyReporter.reportAnomaly(UUID.fromString(uuid), anomalyMsg, mPhone.getCarrierId());
3614     }
3615 
3616     /**
3617      * Log debug messages.
3618      * @param s debug messages
3619      */
3620     @Override
3621     protected void log(@NonNull String s) {
3622         Rlog.d(mLogTag, (getCurrentState() != null
3623                 ? (getCurrentState().getName() + ": ") : "") + s);
3624     }
3625 
3626     /**
3627      * Log error messages.
3628      * @param s error messages
3629      */
3630     @Override
3631     protected void loge(@NonNull String s) {
3632         Rlog.e(mLogTag, (getCurrentState() != null
3633                 ? (getCurrentState().getName() + ": ") : "") + s);
3634     }
3635 
3636     /**
3637      * Log verbose messages.
3638      * @param s error messages
3639      */
3640     @Override
3641     protected void logv(@NonNull String s) {
3642         if (VDBG) {
3643             Rlog.v(mLogTag, (getCurrentState() != null
3644                     ? (getCurrentState().getName() + ": ") : "") + s);
3645         }
3646     }
3647 
3648     /**
3649      * Log debug messages and also log into the local log.
3650      * @param s debug messages
3651      */
3652     private void logl(@NonNull String s) {
3653         log(s);
3654         mLocalLog.log((getCurrentState() != null ? (getCurrentState().getName() + ": ") : "") + s);
3655     }
3656 
3657     /**
3658      * Dump the state of DataNetwork
3659      *
3660      * @param fd File descriptor
3661      * @param printWriter Print writer
3662      * @param args Arguments
3663      */
3664     public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
3665         IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, "  ");
3666         super.dump(fd, pw, args);
3667         pw.println("Tag: " + name());
3668         pw.increaseIndent();
3669         pw.println("mSubId=" + mSubId);
3670         pw.println("mTransport=" + AccessNetworkConstants.transportTypeToString(mTransport));
3671         pw.println("mLastKnownDataNetworkType=" + TelephonyManager
3672                 .getNetworkTypeName(mLastKnownDataNetworkType));
3673         pw.println("WWAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
3674         pw.println("WLAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
3675         pw.println("mNetworkScore=" + mNetworkScore);
3676         pw.println("mDataAllowedReason=" + mDataAllowedReason);
3677         pw.println("mPduSessionId=" + mPduSessionId);
3678         pw.println("mDataProfile=" + mDataProfile);
3679         pw.println("mNetworkCapabilities=" + mNetworkCapabilities);
3680         pw.println("mLinkProperties=" + mLinkProperties);
3681         pw.println("mNetworkSliceInfo=" + mNetworkSliceInfo);
3682         pw.println("mNetworkBandwidth=" + mNetworkBandwidth);
3683         pw.println("mTcpBufferSizes=" + mTcpBufferSizes);
3684         pw.println("mTelephonyDisplayInfo=" + mTelephonyDisplayInfo);
3685         pw.println("mTempNotMeteredSupported=" + mTempNotMeteredSupported);
3686         pw.println("mTempNotMetered=" + mTempNotMetered);
3687         pw.println("mCongested=" + mCongested);
3688         pw.println("mSuspended=" + mSuspended);
3689         pw.println("mDataCallResponse=" + mDataCallResponse);
3690         pw.println("mFailCause=" + DataFailCause.toString(mFailCause));
3691         pw.println("mAdministratorUids=" + Arrays.toString(mAdministratorUids));
3692         pw.println("mCarrierServicePackageUid=" + mCarrierServicePackageUid);
3693         pw.println("mEverConnected=" + mEverConnected);
3694         pw.println("mInvokedDataDeactivation=" + mInvokedDataDeactivation);
3695 
3696         pw.println("Attached network requests:");
3697         pw.increaseIndent();
3698         for (TelephonyNetworkRequest request : mAttachedNetworkRequestList) {
3699             pw.println(request);
3700         }
3701         pw.decreaseIndent();
3702         pw.println("mQosBearerSessions=" + mQosBearerSessions);
3703 
3704         mNetworkAgent.dump(fd, pw, args);
3705         pw.println("Local logs:");
3706         pw.increaseIndent();
3707         mLocalLog.dump(fd, pw, args);
3708         pw.decreaseIndent();
3709         pw.decreaseIndent();
3710         pw.println("---------------");
3711     }
3712 }
3713