Search in sources :

Example 36 with NetworkAgentInfo

use of com.android.server.connectivity.NetworkAgentInfo in project android_frameworks_base by AOSPA.

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 37 with NetworkAgentInfo

use of com.android.server.connectivity.NetworkAgentInfo in project android_frameworks_base by AOSPA.

the class ConnectivityService method requestBandwidthUpdate.

@Override
public boolean requestBandwidthUpdate(Network network) {
    enforceAccessPermission();
    NetworkAgentInfo nai = null;
    if (network == null) {
        return false;
    }
    synchronized (mNetworkForNetId) {
        nai = mNetworkForNetId.get(network.netId);
    }
    if (nai != null) {
        nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE);
        return true;
    }
    return false;
}
Also used : NetworkAgentInfo(com.android.server.connectivity.NetworkAgentInfo)

Example 38 with NetworkAgentInfo

use of com.android.server.connectivity.NetworkAgentInfo in project android_frameworks_base by AOSPA.

the class ConnectivityService method getAllNetworkState.

@Override
public NetworkState[] getAllNetworkState() {
    // Require internal since we're handing out IMSI details
    enforceConnectivityInternalPermission();
    final ArrayList<NetworkState> result = Lists.newArrayList();
    for (Network network : getAllNetworks()) {
        final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
        if (nai != null) {
            result.add(nai.getNetworkState());
        }
    }
    return result.toArray(new NetworkState[result.size()]);
}
Also used : NetworkAgentInfo(com.android.server.connectivity.NetworkAgentInfo) Network(android.net.Network) NetworkState(android.net.NetworkState)

Example 39 with NetworkAgentInfo

use of com.android.server.connectivity.NetworkAgentInfo in project android_frameworks_base by AOSPA.

the class ConnectivityService method handlePromptUnvalidated.

private void handlePromptUnvalidated(Network network) {
    if (VDBG)
        log("handlePromptUnvalidated " + network);
    NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
    // Also don't prompt on captive portals because we're already prompting the user to sign in.
    if (nai == null || nai.everValidated || nai.everCaptivePortalDetected || !nai.networkMisc.explicitlySelected || nai.networkMisc.acceptUnvalidated) {
        return;
    }
    showValidationNotification(nai, NotificationType.NO_INTERNET);
}
Also used : NetworkAgentInfo(com.android.server.connectivity.NetworkAgentInfo)

Example 40 with NetworkAgentInfo

use of com.android.server.connectivity.NetworkAgentInfo in project android_frameworks_base by AOSPA.

the class ConnectivityService method handleAsyncChannelDisconnected.

private void handleAsyncChannelDisconnected(Message msg) {
    NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
    if (nai != null) {
        if (DBG) {
            log(nai.name() + " got DISCONNECTED, was satisfying " + nai.numNetworkRequests());
        }
        // disconnect the channel.
        if (nai.networkInfo.isConnected()) {
            nai.networkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null);
        }
        final boolean wasDefault = isDefaultNetwork(nai);
        if (wasDefault) {
            mDefaultInetConditionPublished = 0;
            // Log default network disconnection before required book-keeping.
            // Let rematchAllNetworksAndRequests() below record a new default network event
            // if there is a fallback. Taken together, the two form a X -> 0, 0 -> Y sequence
            // whose timestamps tell how long it takes to recover a default network.
            logDefaultNetworkEvent(null, nai);
        }
        notifyIfacesChangedForNetworkStats();
        // TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied
        // by other networks that are already connected. Perhaps that can be done by
        // sending all CALLBACK_LOST messages (for requests, not listens) at the end
        // of rematchAllNetworksAndRequests
        notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST);
        mKeepaliveTracker.handleStopAllKeepalives(nai, ConnectivityManager.PacketKeepalive.ERROR_INVALID_NETWORK);
        nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED);
        mNetworkAgentInfos.remove(msg.replyTo);
        updateClat(null, nai.linkProperties, nai);
        synchronized (mNetworkForNetId) {
            // Remove the NetworkAgent, but don't mark the netId as
            // available until we've told netd to delete it below.
            mNetworkForNetId.remove(nai.network.netId);
        }
        // Remove all previously satisfied requests.
        for (int i = 0; i < nai.numNetworkRequests(); i++) {
            NetworkRequest request = nai.requestAt(i);
            NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(request.requestId);
            if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
                mNetworkForRequestId.remove(request.requestId);
                sendUpdatedScoreToFactories(request, 0);
            }
        }
        nai.clearLingerState();
        if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) {
            removeDataActivityTracking(nai);
            notifyLockdownVpn(nai);
            requestNetworkTransitionWakelock(nai.name());
        }
        mLegacyTypeTracker.remove(nai, wasDefault);
        rematchAllNetworksAndRequests(null, 0);
        mLingerMonitor.noteDisconnect(nai);
        if (nai.created) {
            // long time.
            try {
                mNetd.removeNetwork(nai.network.netId);
            } catch (Exception e) {
                loge("Exception removing network: " + e);
            }
        }
        synchronized (mNetworkForNetId) {
            mNetIdInUse.delete(nai.network.netId);
        }
    } else {
        NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo);
        if (DBG && nfi != null)
            log("unregisterNetworkFactory for " + nfi.name);
    }
}
Also used : NetworkAgentInfo(com.android.server.connectivity.NetworkAgentInfo) NetworkRequest(android.net.NetworkRequest) RemoteException(android.os.RemoteException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) FileNotFoundException(java.io.FileNotFoundException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException)

Aggregations

NetworkAgentInfo (com.android.server.connectivity.NetworkAgentInfo)162 LinkProperties (android.net.LinkProperties)40 Network (android.net.Network)25 NetworkPolicyManager.uidRulesToString (android.net.NetworkPolicyManager.uidRulesToString)21 NetworkCapabilities (android.net.NetworkCapabilities)20 NetworkInfo (android.net.NetworkInfo)15 NetworkRequest (android.net.NetworkRequest)15 NetworkState (android.net.NetworkState)15 RemoteException (android.os.RemoteException)14 UnknownHostException (java.net.UnknownHostException)14 AsyncChannel (com.android.internal.util.AsyncChannel)10 Vpn (com.android.server.connectivity.Vpn)10 ArrayList (java.util.ArrayList)10 FileNotFoundException (java.io.FileNotFoundException)9 IOException (java.io.IOException)9 InetAddress (java.net.InetAddress)9 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)9 Nullable (android.annotation.Nullable)5 PendingIntent (android.app.PendingIntent)5 Intent (android.content.Intent)5