Search in sources :

Example 46 with NetworkRequest

use of android.net.NetworkRequest in project android_frameworks_base by DirtyUnicorns.

the class ConnectivityServiceTest method testAvoidBadWifi.

@SmallTest
public void testAvoidBadWifi() throws Exception {
    final ContentResolver cr = mServiceContext.getContentResolver();
    final WrappedAvoidBadWifiTracker tracker = mService.getAvoidBadWifiTracker();
    // Pretend we're on a carrier that restricts switching away from bad wifi.
    tracker.configRestrictsAvoidBadWifi = true;
    // File a request for cell to ensure it doesn't go down.
    final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback();
    final NetworkRequest cellRequest = new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
    mCm.requestNetwork(cellRequest, cellNetworkCallback);
    TestNetworkCallback defaultCallback = new TestNetworkCallback();
    mCm.registerDefaultNetworkCallback(defaultCallback);
    NetworkRequest validatedWifiRequest = new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).addCapability(NET_CAPABILITY_VALIDATED).build();
    TestNetworkCallback validatedWifiCallback = new TestNetworkCallback();
    mCm.registerNetworkCallback(validatedWifiRequest, validatedWifiCallback);
    Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 0);
    tracker.reevaluate();
    // Bring up validated cell.
    mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
    mCellNetworkAgent.connect(true);
    cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    Network cellNetwork = mCellNetworkAgent.getNetwork();
    // Bring up validated wifi.
    mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
    mWiFiNetworkAgent.connect(true);
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
    // Fail validation on wifi.
    mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
    mCm.reportNetworkConnectivity(wifiNetwork, false);
    validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
    // Because avoid bad wifi is off, we don't switch to cellular.
    defaultCallback.assertNoCallback();
    assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertEquals(mCm.getActiveNetwork(), wifiNetwork);
    // Simulate switching to a carrier that does not restrict avoiding bad wifi, and expect
    // that we switch back to cell.
    tracker.configRestrictsAvoidBadWifi = false;
    tracker.reevaluate();
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    assertEquals(mCm.getActiveNetwork(), cellNetwork);
    // Switch back to a restrictive carrier.
    tracker.configRestrictsAvoidBadWifi = true;
    tracker.reevaluate();
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    assertEquals(mCm.getActiveNetwork(), wifiNetwork);
    // Simulate the user selecting "switch" on the dialog, and check that we switch to cell.
    mCm.setAvoidUnvalidated(wifiNetwork);
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertEquals(mCm.getActiveNetwork(), cellNetwork);
    // Disconnect and reconnect wifi to clear the one-time switch above.
    mWiFiNetworkAgent.disconnect();
    mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
    mWiFiNetworkAgent.connect(true);
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    wifiNetwork = mWiFiNetworkAgent.getNetwork();
    // Fail validation on wifi and expect the dialog to appear.
    mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
    mCm.reportNetworkConnectivity(wifiNetwork, false);
    validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
    // Simulate the user selecting "switch" and checking the don't ask again checkbox.
    Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1);
    tracker.reevaluate();
    // We now switch to cell.
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability(NET_CAPABILITY_VALIDATED));
    assertEquals(mCm.getActiveNetwork(), cellNetwork);
    // Simulate the user turning the cellular fallback setting off and then on.
    // We switch to wifi and then to cell.
    Settings.Global.putString(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, null);
    tracker.reevaluate();
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    assertEquals(mCm.getActiveNetwork(), wifiNetwork);
    Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1);
    tracker.reevaluate();
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
    assertEquals(mCm.getActiveNetwork(), cellNetwork);
    // If cell goes down, we switch to wifi.
    mCellNetworkAgent.disconnect();
    defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
    defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
    validatedWifiCallback.assertNoCallback();
    mCm.unregisterNetworkCallback(cellNetworkCallback);
    mCm.unregisterNetworkCallback(validatedWifiCallback);
    mCm.unregisterNetworkCallback(defaultCallback);
}
Also used : Network(android.net.Network) NetworkRequest(android.net.NetworkRequest) ContentResolver(android.content.ContentResolver) MockContentResolver(android.test.mock.MockContentResolver) SmallTest(android.test.suitebuilder.annotation.SmallTest)

Example 47 with NetworkRequest

use of android.net.NetworkRequest in project android_frameworks_base by DirtyUnicorns.

the class ConnectivityService method handleReleaseNetworkRequest.

private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) {
    final NetworkRequestInfo nri = getNriForAppRequest(request, callingUid, "release NetworkRequest");
    if (nri == null)
        return;
    if (VDBG || (DBG && nri.request.isRequest()))
        log("releasing " + request);
    nri.unlinkDeathRecipient();
    mNetworkRequests.remove(request);
    synchronized (mUidToNetworkRequestCount) {
        int requests = mUidToNetworkRequestCount.get(nri.mUid, 0);
        if (requests < 1) {
            Slog.wtf(TAG, "BUG: too small request count " + requests + " for UID " + nri.mUid);
        } else if (requests == 1) {
            mUidToNetworkRequestCount.removeAt(mUidToNetworkRequestCount.indexOfKey(nri.mUid));
        } else {
            mUidToNetworkRequestCount.put(nri.mUid, requests - 1);
        }
    }
    mNetworkRequestInfoLogs.log("RELEASE " + nri);
    if (nri.request.isRequest()) {
        boolean wasKept = false;
        NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
        if (nai != null) {
            boolean wasBackgroundNetwork = nai.isBackgroundNetwork();
            nai.removeRequest(nri.request.requestId);
            if (VDBG) {
                log(" Removing from current network " + nai.name() + ", leaving " + nai.numNetworkRequests() + " requests.");
            }
            // If there are still lingered requests on this network, don't tear it down,
            // but resume lingering instead.
            updateLingerState(nai, SystemClock.elapsedRealtime());
            if (unneeded(nai, UnneededFor.TEARDOWN)) {
                if (DBG)
                    log("no live requests for " + nai.name() + "; disconnecting");
                teardownUnneededNetwork(nai);
            } else {
                wasKept = true;
            }
            mNetworkForRequestId.remove(nri.request.requestId);
            if (!wasBackgroundNetwork && nai.isBackgroundNetwork()) {
                // Went from foreground to background.
                updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities);
            }
        }
        // network satisfying it, so this loop is wasteful
        for (NetworkAgentInfo otherNai : mNetworkAgentInfos.values()) {
            if (otherNai.isSatisfyingRequest(nri.request.requestId) && otherNai != nai) {
                Slog.wtf(TAG, "Request " + nri.request + " satisfied by " + otherNai.name() + ", but mNetworkAgentInfos says " + (nai != null ? nai.name() : "null"));
            }
        }
        // phantom disconnect for this type.
        if (nri.request.legacyType != TYPE_NONE && nai != null) {
            boolean doRemove = true;
            if (wasKept) {
                // same legacy type - if so, don't remove the nai
                for (int i = 0; i < nai.numNetworkRequests(); i++) {
                    NetworkRequest otherRequest = nai.requestAt(i);
                    if (otherRequest.legacyType == nri.request.legacyType && otherRequest.isRequest()) {
                        if (DBG)
                            log(" still have other legacy request - leaving");
                        doRemove = false;
                    }
                }
            }
            if (doRemove) {
                mLegacyTypeTracker.remove(nri.request.legacyType, nai, false);
            }
        }
        for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
            nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_CANCEL_REQUEST, nri.request);
        }
    } else {
        // if this listen request applies and remove it.
        for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
            nai.removeRequest(nri.request.requestId);
            if (nri.request.networkCapabilities.hasSignalStrength() && nai.satisfiesImmutableCapabilitiesOf(nri.request)) {
                updateSignalStrengthThresholds(nai, "RELEASE", nri.request);
            }
        }
    }
    callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED, 0);
}
Also used : NetworkAgentInfo(com.android.server.connectivity.NetworkAgentInfo) NetworkRequest(android.net.NetworkRequest)

Example 48 with NetworkRequest

use of android.net.NetworkRequest in project android_frameworks_base by DirtyUnicorns.

the class ConnectivityService method sendUpdatedScoreToFactories.

private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
    for (int i = 0; i < nai.numNetworkRequests(); i++) {
        NetworkRequest nr = nai.requestAt(i);
        // Don't send listening requests to factories. b/17393458
        if (nr.isListen())
            continue;
        sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
    }
}
Also used : NetworkRequest(android.net.NetworkRequest)

Example 49 with NetworkRequest

use of android.net.NetworkRequest in project android_frameworks_base by DirtyUnicorns.

the class ConnectivityService method pendingRequestForNetwork.

@Override
public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities, PendingIntent operation) {
    checkNotNull(operation, "PendingIntent cannot be null.");
    networkCapabilities = new NetworkCapabilities(networkCapabilities);
    enforceNetworkRequestPermissions(networkCapabilities);
    enforceMeteredApnPolicy(networkCapabilities);
    ensureRequestableCapabilities(networkCapabilities);
    NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
    NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation);
    if (DBG)
        log("pendingRequest for " + nri);
    mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT, nri));
    return networkRequest;
}
Also used : NetworkRequest(android.net.NetworkRequest) NetworkCapabilities(android.net.NetworkCapabilities)

Example 50 with NetworkRequest

use of android.net.NetworkRequest in project android_frameworks_base by DirtyUnicorns.

the class NetworkAgentInfo method removeRequest.

/**
     * Remove the specified request from this network.
     */
public void removeRequest(int requestId) {
    NetworkRequest existing = mNetworkRequests.get(requestId);
    if (existing == null)
        return;
    updateRequestCounts(REMOVE, existing);
    mNetworkRequests.remove(requestId);
    if (existing.isRequest()) {
        unlingerRequest(existing);
    }
}
Also used : NetworkRequest(android.net.NetworkRequest)

Aggregations

NetworkRequest (android.net.NetworkRequest)158 NetworkCapabilities (android.net.NetworkCapabilities)48 SmallTest (android.test.suitebuilder.annotation.SmallTest)43 ConditionVariable (android.os.ConditionVariable)24 LargeTest (android.test.suitebuilder.annotation.LargeTest)21 RemoteException (android.os.RemoteException)20 NetworkCallback (android.net.ConnectivityManager.NetworkCallback)18 Network (android.net.Network)16 NetworkAgentInfo (com.android.server.connectivity.NetworkAgentInfo)15 LinkProperties (android.net.LinkProperties)14 ArrayList (java.util.ArrayList)9 ContentResolver (android.content.ContentResolver)8 HandlerThread (android.os.HandlerThread)8 MockContentResolver (android.test.mock.MockContentResolver)8 ConnectivityManager (android.net.ConnectivityManager)6 NetworkPolicyManager.uidRulesToString (android.net.NetworkPolicyManager.uidRulesToString)6 Intent (android.content.Intent)5 Bundle (android.os.Bundle)5 Message (android.os.Message)5 IBatteryStats (com.android.internal.app.IBatteryStats)5