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

Commit f75ba075 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by android-build-merger
Browse files

Merge "Fix race when starting NetworkMonitor"

am: 78454f3c

Change-Id: I3fe792704b9dfaafe09c83da57081d6668216a97
parents 0196a831 78454f3c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -17,5 +17,5 @@

package android.net;

parcelable NetworkCapabilities;
@JavaOnlyStableParcelable parcelable NetworkCapabilities;
+8 −6
Original line number Diff line number Diff line
@@ -35,7 +35,9 @@ import android.net.INetd;
import android.net.INetworkMonitor;
import android.net.INetworkMonitorCallbacks;
import android.net.INetworkStackConnector;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.PrivateDnsConfigParcel;
import android.net.dhcp.DhcpServer;
import android.net.dhcp.DhcpServingParams;
@@ -307,9 +309,9 @@ public class NetworkStackService extends Service {
        }

        @Override
        public void notifyNetworkConnected() {
        public void notifyNetworkConnected(LinkProperties lp, NetworkCapabilities nc) {
            checkNetworkStackCallingPermission();
            mNm.notifyNetworkConnected();
            mNm.notifyNetworkConnected(lp, nc);
        }

        @Override
@@ -319,15 +321,15 @@ public class NetworkStackService extends Service {
        }

        @Override
        public void notifyLinkPropertiesChanged() {
        public void notifyLinkPropertiesChanged(LinkProperties lp) {
            checkNetworkStackCallingPermission();
            mNm.notifyLinkPropertiesChanged();
            mNm.notifyLinkPropertiesChanged(lp);
        }

        @Override
        public void notifyNetworkCapabilitiesChanged() {
        public void notifyNetworkCapabilitiesChanged(NetworkCapabilities nc) {
            checkNetworkStackCallingPermission();
            mNm.notifyNetworkCapabilitiesChanged();
            mNm.notifyNetworkCapabilitiesChanged(nc);
        }
    }
}
+40 −42
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.RingBufferIndices;
@@ -221,19 +222,31 @@ public class NetworkMonitor extends StateMachine {
     * Message to self indicating captive portal detection is completed.
     * obj = CaptivePortalProbeResult for detection result;
     */
    public static final int CMD_PROBE_COMPLETE = 16;
    private static final int CMD_PROBE_COMPLETE = 16;

    /**
     * ConnectivityService notifies NetworkMonitor of DNS query responses event.
     * arg1 = returncode in OnDnsEvent which indicates the response code for the DNS query.
     */
    public static final int EVENT_DNS_NOTIFICATION = 17;
    private static final int EVENT_DNS_NOTIFICATION = 17;

    /**
     * ConnectivityService notifies NetworkMonitor that the user accepts partial connectivity and
     * NetworkMonitor should ignore the https probe.
     */
    public static final int EVENT_ACCEPT_PARTIAL_CONNECTIVITY = 18;
    private static final int EVENT_ACCEPT_PARTIAL_CONNECTIVITY = 18;

    /**
     * ConnectivityService notifies NetworkMonitor of changed LinkProperties.
     * obj = new LinkProperties.
     */
    private static final int EVENT_LINK_PROPERTIES_CHANGED = 19;

    /**
     * ConnectivityService notifies NetworkMonitor of changed NetworkCapabilities.
     * obj = new NetworkCapabilities.
     */
    private static final int EVENT_NETWORK_CAPABILITIES_CHANGED = 20;

    // Start mReevaluateDelayMs at this value and double.
    private static final int INITIAL_REEVALUATE_DELAY_MS = 1000;
@@ -379,10 +392,8 @@ public class NetworkMonitor extends StateMachine {
        mDataStallValidDnsTimeThreshold = getDataStallValidDnsTimeThreshold();
        mDataStallEvaluationType = getDataStallEvalutionType();

        // mLinkProperties and mNetworkCapbilities must never be null or we will NPE.
        // Provide empty objects in case we are started and the network disconnects before
        // we can ever fetch them.
        // TODO: Delete ASAP.
        // Provide empty LinkProperties and NetworkCapabilities to make sure they are never null,
        // even before notifyNetworkConnected.
        mLinkProperties = new LinkProperties();
        mNetworkCapabilities = new NetworkCapabilities(null);
    }
@@ -434,8 +445,16 @@ public class NetworkMonitor extends StateMachine {
    /**
     * Send a notification to NetworkMonitor indicating that the network is now connected.
     */
    public void notifyNetworkConnected() {
        sendMessage(CMD_NETWORK_CONNECTED);
    public void notifyNetworkConnected(LinkProperties lp, NetworkCapabilities nc) {
        sendMessage(CMD_NETWORK_CONNECTED, new Pair<>(
                new LinkProperties(lp), new NetworkCapabilities(nc)));
    }

    private void updateConnectedNetworkAttributes(Message connectedMsg) {
        final Pair<LinkProperties, NetworkCapabilities> attrs =
                (Pair<LinkProperties, NetworkCapabilities>) connectedMsg.obj;
        mLinkProperties = attrs.first;
        mNetworkCapabilities = attrs.second;
    }

    /**
@@ -448,37 +467,15 @@ public class NetworkMonitor extends StateMachine {
    /**
     * Send a notification to NetworkMonitor indicating that link properties have changed.
     */
    public void notifyLinkPropertiesChanged() {
        getHandler().post(() -> {
            updateLinkProperties();
        });
    }

    private void updateLinkProperties() {
        final LinkProperties lp = mCm.getLinkProperties(mNetwork);
        // If null, we should soon get a message that the network was disconnected, and will stop.
        if (lp != null) {
            // TODO: send LinkProperties parceled in notifyLinkPropertiesChanged() and start().
            mLinkProperties = lp;
        }
    public void notifyLinkPropertiesChanged(final LinkProperties lp) {
        sendMessage(EVENT_LINK_PROPERTIES_CHANGED, new LinkProperties(lp));
    }

    /**
     * Send a notification to NetworkMonitor indicating that network capabilities have changed.
     */
    public void notifyNetworkCapabilitiesChanged() {
        getHandler().post(() -> {
            updateNetworkCapabilities();
        });
    }

    private void updateNetworkCapabilities() {
        final NetworkCapabilities nc = mCm.getNetworkCapabilities(mNetwork);
        // If null, we should soon get a message that the network was disconnected, and will stop.
        if (nc != null) {
            // TODO: send NetworkCapabilities parceled in notifyNetworkCapsChanged() and start().
            mNetworkCapabilities = nc;
        }
    public void notifyNetworkCapabilitiesChanged(final NetworkCapabilities nc) {
        sendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, new NetworkCapabilities(nc));
    }

    /**
@@ -546,17 +543,11 @@ public class NetworkMonitor extends StateMachine {
    // DefaultState is the parent of all States.  It exists only to handle CMD_* messages but
    // does not entail any real state (hence no enter() or exit() routines).
    private class DefaultState extends State {
        @Override
        public void enter() {
            // TODO: have those passed parceled in start() and remove this
            updateLinkProperties();
            updateNetworkCapabilities();
        }

        @Override
        public boolean processMessage(Message message) {
            switch (message.what) {
                case CMD_NETWORK_CONNECTED:
                    updateConnectedNetworkAttributes(message);
                    logNetworkEvent(NetworkEvent.NETWORK_CONNECTED);
                    transitionTo(mEvaluatingState);
                    return HANDLED;
@@ -660,6 +651,12 @@ public class NetworkMonitor extends StateMachine {
                case EVENT_ACCEPT_PARTIAL_CONNECTIVITY:
                    mAcceptPartialConnectivity = true;
                    break;
                case EVENT_LINK_PROPERTIES_CHANGED:
                    mLinkProperties = (LinkProperties) message.obj;
                    break;
                case EVENT_NETWORK_CAPABILITIES_CHANGED:
                    mNetworkCapabilities = (NetworkCapabilities) message.obj;
                    break;
                default:
                    break;
            }
@@ -684,6 +681,7 @@ public class NetworkMonitor extends StateMachine {
        public boolean processMessage(Message message) {
            switch (message.what) {
                case CMD_NETWORK_CONNECTED:
                    updateConnectedNetworkAttributes(message);
                    transitionTo(mValidatedState);
                    break;
                case CMD_EVALUATE_PRIVATE_DNS:
+84 −96

File changed.

Preview size limit exceeded, changes collapsed.

+9 −18
Original line number Diff line number Diff line
@@ -5392,7 +5392,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
                mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mDnsResolver,
                mNMS, factorySerialNumber);
        // Make sure the network capabilities reflect what the agent info says.
        nai.networkCapabilities = mixInCapabilities(nai, nc);
        nai.setNetworkCapabilities(mixInCapabilities(nai, nc));
        final String extraInfo = networkInfo.getExtraInfo();
        final String name = TextUtils.isEmpty(extraInfo)
                ? nai.networkCapabilities.getSSID() : extraInfo;
@@ -5485,12 +5485,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // Start or stop DNS64 detection and 464xlat according to network state.
            networkAgent.clatd.update();
            notifyIfacesChangedForNetworkStats();
            if (networkAgent.everConnected) {
            try {
                    networkAgent.networkMonitor().notifyLinkPropertiesChanged();
                networkAgent.networkMonitor().notifyLinkPropertiesChanged(newLp);
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
            if (networkAgent.everConnected) {
                notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
            }
        }
@@ -5718,7 +5718,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        final NetworkCapabilities prevNc;
        synchronized (nai) {
            prevNc = nai.networkCapabilities;
            nai.networkCapabilities = newNc;
            nai.setNetworkCapabilities(newNc);
        }

        updateUids(nai, prevNc, newNc);
@@ -5733,11 +5733,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // If the requestable capabilities have changed or the score changed, we can't have been
            // called by rematchNetworkAndRequests, so it's safe to start a rematch.
            rematchAllNetworksAndRequests(nai, oldScore);
            try {
                nai.networkMonitor().notifyNetworkCapabilitiesChanged();
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
            notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
        }

@@ -5996,11 +5991,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }

        if (capabilitiesChanged) {
            try {
                nai.networkMonitor().notifyNetworkCapabilitiesChanged();
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
            notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
        }

@@ -6409,7 +6399,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
                if (networkAgent.networkMisc.acceptPartialConnectivity) {
                    networkAgent.networkMonitor().setAcceptPartialConnectivity();
                }
                networkAgent.networkMonitor().notifyNetworkConnected();
                networkAgent.networkMonitor().notifyNetworkConnected(
                        networkAgent.linkProperties, networkAgent.networkCapabilities);
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
Loading