Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c295fb5b authored by Jack Yu's avatar Jack Yu
Browse files

Fixed network agent config not set properly

Added the missing information in network agent
config. Migrated the logic from the old data stack
DataConnection.

Fix: 220648274
Test: atest DataNetworkTest

Merged-In: I2eaa020b48873135dc2bc0b8ecb35b8f8bdf27bd
Change-Id: I2eaa020b48873135dc2bc0b8ecb35b8f8bdf27bd
parent 8eb81ca7
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.SystemClock;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.AccessNetworkConstants.TransportType;
@@ -80,6 +81,7 @@ import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseIntArray;

import com.android.internal.telephony.CarrierSignalAgent;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
@@ -854,6 +856,28 @@ public class DataNetwork extends StateMachine {
        // Do not add more stuffs here.
    }

    /**
     * @return {@code true} if 464xlat should be skipped.
     */
    private boolean shouldSkip464Xlat() {
        if (mDataProfile.getApnSetting() != null) {
            switch (mDataProfile.getApnSetting().getSkip464Xlat()) {
                case Telephony.Carriers.SKIP_464XLAT_ENABLE:
                    return true;
                case Telephony.Carriers.SKIP_464XLAT_DISABLE:
                    return false;
                case Telephony.Carriers.SKIP_464XLAT_DEFAULT:
                default:
                    break;
            }
        }

        // As default, return true if ims and no internet
        final NetworkCapabilities nc = getNetworkCapabilities();
        return nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
                && !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    }

    /**
     * Create the telephony network agent.
     *
@@ -870,6 +894,24 @@ public class DataNetwork extends StateMachine {
            configBuilder.setLegacyExtraInfo(mDataProfile.getApnSetting().getApnName());
        }

        final CarrierSignalAgent carrierSignalAgent = mPhone.getCarrierSignalAgent();
        if (carrierSignalAgent.hasRegisteredReceivers(TelephonyManager
                .ACTION_CARRIER_SIGNAL_REDIRECTED)) {
            // carrierSignal Receivers will place the carrier-specific provisioning notification
            configBuilder.setProvisioningNotificationEnabled(false);
        }

        // Fill the IMSI
        final String subscriberId = mPhone.getSubscriberId();
        if (!TextUtils.isEmpty(subscriberId)) {
            configBuilder.setSubscriberId(subscriberId);
        }

        // set skip464xlat if it is not default otherwise
        if (shouldSkip464Xlat()) {
            configBuilder.setNat64DetectionEnabled(false);
        }

        final NetworkFactory factory = PhoneFactory.getNetworkFactory(
                mPhone.getPhoneId());
        final NetworkProvider provider = (null == factory) ? null : factory.getProvider();
+4 −0
Original line number Diff line number Diff line
@@ -66,6 +66,9 @@ public class TelephonyNetworkAgent extends NetworkAgent implements NotifyQosSess
    /** The parent data network. */
    private final @NonNull DataNetwork mDataNetwork;

    /** Network agent config. For unit test use only. */
    private final @NonNull NetworkAgentConfig mNetworkAgentConfig;

    /** This is the id from {@link NetworkAgent#register()}. */
    private final int mId;

@@ -166,6 +169,7 @@ public class TelephonyNetworkAgent extends NetworkAgent implements NotifyQosSess
                config, provider);
        register();
        mDataNetwork = dataNetwork;
        mNetworkAgentConfig = config;
        mTelephonyNetworkAgentCallbacks.add(callback);
        mPhone = phone;
        mId = getNetwork().getNetId();
+96 −0
Original line number Diff line number Diff line
@@ -31,9 +31,12 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.annotation.NonNull;
import android.net.ConnectivityManager;
import android.net.InetAddresses;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener;
@@ -74,6 +77,7 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -88,6 +92,8 @@ public class DataNetworkTest extends TelephonyTest {
    private static final int ADMIN_UID1 = 1234;
    private static final int ADMIN_UID2 = 5678;

    private static final String FAKE_IMSI = "123456789";

    private DataNetwork mDataNetworkUT;

    private final SparseArray<DataServiceManager> mDataServiceManagers = new SparseArray<>();
@@ -227,6 +233,16 @@ public class DataNetworkTest extends TelephonyTest {
                new AsyncResult(null, new Pair<>(dataRegState, rat), null)).sendToTarget();
    }

    private @NonNull NetworkAgentConfig getNetworkAgentConfig() throws Exception {
        Field field = DataNetwork.class.getDeclaredField("mNetworkAgent");
        field.setAccessible(true);
        TelephonyNetworkAgent networkAgent = (TelephonyNetworkAgent) field.get(mDataNetworkUT);

        field = TelephonyNetworkAgent.class.getDeclaredField("mNetworkAgentConfig");
        field.setAccessible(true);
        return (NetworkAgentConfig) field.get(networkAgent);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
@@ -245,6 +261,7 @@ public class DataNetworkTest extends TelephonyTest {
                .getPreferredTransportByNetworkCapability(anyInt());
        doReturn(DataNetwork.BANDWIDTH_SOURCE_BANDWIDTH_ESTIMATOR)
                .when(mDataConfigManager).getBandwidthEstimateSource();
        doReturn(FAKE_IMSI).when(mPhone).getSubscriberId();
    }

    @After
@@ -357,6 +374,71 @@ public class DataNetworkTest extends TelephonyTest {
        verify(mDataNetworkCallback).onConnected(eq(mDataNetworkUT));
    }

    @Test
    public void testCreateImsDataNetwork() throws Exception {
        DataNetworkController.NetworkRequestList
                networkRequestList = new DataNetworkController.NetworkRequestList();
        networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_IMS)
                .build(), mPhone));

        setSuccessfulSetupDataResponse(mMockedWwanDataServiceManager, 123);

        mDataNetworkUT = new DataNetwork(mPhone, Looper.myLooper(), mDataServiceManagers,
                mImsDataProfile, networkRequestList,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                DataAllowedReason.NORMAL, mDataNetworkCallback);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);

        processAllMessages();
        verify(mSimulatedCommandsVerifier, never()).allocatePduSessionId(any(Message.class));
        verify(mMockedWwanDataServiceManager).setupDataCall(eq(AccessNetworkType.EUTRAN),
                eq(mImsDataProfile), eq(false), eq(false),
                eq(DataService.REQUEST_REASON_NORMAL), nullable(LinkProperties.class),
                eq(DataCallResponse.PDU_SESSION_ID_NOT_SET), nullable(NetworkSliceInfo.class),
                any(TrafficDescriptor.class), eq(true), any(Message.class));
        assertThat(mDataNetworkUT.getId()).isEqualTo(123);
        assertThat(networkRequestList.get(0).getState())
                .isEqualTo(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
        LinkProperties lp = mDataNetworkUT.getLinkProperties();
        assertThat(lp.getAddresses()).containsExactly(
                InetAddresses.parseNumericAddress(IPV4_ADDRESS),
                InetAddresses.parseNumericAddress(IPV6_ADDRESS));

        ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
                ArgumentCaptor.forClass(PreciseDataConnectionState.class);
        verify(mPhone, times(2)).notifyDataConnection(pdcsCaptor.capture());
        List<PreciseDataConnectionState> pdcsList = pdcsCaptor.getAllValues();

        assertThat(pdcsList.get(0).getApnSetting()).isEqualTo(mImsApnSetting);
        assertThat(pdcsList.get(0).getState()).isEqualTo(TelephonyManager.DATA_CONNECTING);
        assertThat(pdcsList.get(0).getId()).isEqualTo(-1);
        assertThat(pdcsList.get(0).getNetworkType()).isEqualTo(TelephonyManager.NETWORK_TYPE_LTE);
        assertThat(pdcsList.get(0).getTransportType())
                .isEqualTo(AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        assertThat(pdcsList.get(0).getLinkProperties()).isEqualTo(new LinkProperties());

        assertThat(pdcsList.get(1).getApnSetting()).isEqualTo(mImsApnSetting);
        assertThat(pdcsList.get(1).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED);
        assertThat(pdcsList.get(1).getId()).isEqualTo(123);
        assertThat(pdcsList.get(1).getNetworkType()).isEqualTo(TelephonyManager.NETWORK_TYPE_LTE);
        assertThat(pdcsList.get(1).getTransportType())
                .isEqualTo(AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        assertThat(pdcsList.get(1).getLinkProperties().getAddresses().get(0))
                .isEqualTo(InetAddresses.parseNumericAddress(IPV4_ADDRESS));
        assertThat(pdcsList.get(1).getLinkProperties().getAddresses().get(1))
                .isEqualTo(InetAddresses.parseNumericAddress(IPV6_ADDRESS));
        assertThat(mDataNetworkUT.getNetworkCapabilities().hasCapability(
                NetworkCapabilities.NET_CAPABILITY_IMS)).isTrue();
        assertThat(mDataNetworkUT.getNetworkCapabilities().hasCapability(
                NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isFalse();

        verify(mDataNetworkCallback).onConnected(eq(mDataNetworkUT));
    }

    @Test
    public void testCreateDataNetworkOnEnterpriseSlice() throws Exception {
        DataNetworkController.NetworkRequestList
@@ -796,4 +878,18 @@ public class DataNetworkTest extends TelephonyTest {
                DataFailCause.RADIO_NOT_AVAILABLE));
        assertThat(mDataNetworkUT.isConnected()).isFalse();
    }

    @Test
    public void testNetworkAgentConfig() throws Exception {
        testCreateImsDataNetwork();
        NetworkAgentConfig networkAgentConfig = getNetworkAgentConfig();

        assertThat(networkAgentConfig.getSubscriberId()).isEqualTo(FAKE_IMSI);
        assertThat(networkAgentConfig.getLegacyExtraInfo()).isEqualTo(
                mImsApnSetting.getApnName());
        assertThat(networkAgentConfig.getLegacyType()).isEqualTo(ConnectivityManager.TYPE_MOBILE);
        assertThat(networkAgentConfig.getLegacyTypeName()).isEqualTo("MOBILE");
        assertThat(networkAgentConfig.legacySubType).isEqualTo(TelephonyManager.NETWORK_TYPE_LTE);
        assertThat(networkAgentConfig.skip464xlat).isTrue();
    }
}