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