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

Commit 16952dce authored by Benedict Wong's avatar Benedict Wong
Browse files

Add dump to VcnManagementService

This change adds basic dump functionality for debugging purposes to the
VcnManagementService

Test: atest FrameworksVcnTests
Change-Id: Id9494f69450ffff57945701255181052f52bbb37
parent 7cd588e2
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server;

import static android.Manifest.permission.DUMP;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
@@ -69,6 +70,7 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;
import com.android.net.module.util.LocationPermissionChecker;
import com.android.server.vcn.TelephonySubscriptionTracker;
import com.android.server.vcn.Vcn;
@@ -76,7 +78,9 @@ import com.android.server.vcn.VcnContext;
import com.android.server.vcn.VcnNetworkProvider;
import com.android.server.vcn.util.PersistableBundleUtils;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -929,6 +933,33 @@ public class VcnManagementService extends IVcnManagementService.Stub {
        }
    }

    /**
     * Dumps the state of the VcnManagementService for logging and debugging purposes.
     *
     * <p>PII and credentials MUST NEVER be dumped here.
     */
    @Override
    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
        mContext.enforceCallingOrSelfPermission(DUMP, TAG);

        final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");

        pw.println("VcnManagementService dump:");
        pw.increaseIndent();

        mNetworkProvider.dump(pw);

        synchronized (mLock) {
            pw.println("mVcns:");
            for (Vcn vcn : mVcns.values()) {
                vcn.dump(pw);
            }
            pw.println();
        }

        pw.decreaseIndent();
    }

    // TODO(b/180452282): Make name more generic and implement directly with VcnManagementService
    /** Callback for Vcn signals sent up to VcnManagementService. */
    public interface VcnCallback {
+23 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.VcnManagementService.VcnCallback;
import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;

@@ -328,6 +329,8 @@ public class Vcn extends Handler {

    private void handleNetworkRequested(
            @NonNull NetworkRequest request, int score, int providerId) {
        Slog.v(getLogTag(), "Received request " + request);

        if (score > getNetworkScore()) {
            if (VDBG) {
                Slog.v(
@@ -409,6 +412,26 @@ public class Vcn extends Handler {
        return TAG + " [" + mSubscriptionGroup.hashCode() + "]";
    }

    /**
     * Dumps the state of this Vcn for logging and debugging purposes.
     *
     * <p>PII and credentials MUST NEVER be dumped here.
     */
    public void dump(IndentingPrintWriter pw) {
        pw.println("Vcn (" + mSubscriptionGroup + "):");
        pw.increaseIndent();

        pw.println("mCurrentStatus: " + mCurrentStatus);

        pw.println("mVcnGatewayConnections:");
        for (VcnGatewayConnection gw : mVcnGatewayConnections.values()) {
            gw.dump(pw);
        }
        pw.println();

        pw.decreaseIndent();
    }

    /** Retrieves the network score for a VCN Network */
    // Package visibility for use in VcnGatewayConnection
    static int getNetworkScore() {
+22 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.internal.util.WakeupMessage;
@@ -1924,6 +1925,27 @@ public class VcnGatewayConnection extends StateMachine {
        }
    }

    /**
     * Dumps the state of this VcnGatewayConnection for logging and debugging purposes.
     *
     * <p>PII and credentials MUST NEVER be dumped here.
     */
    public void dump(IndentingPrintWriter pw) {
        pw.println("VcnGatewayConnection (" + mConnectionConfig.getGatewayConnectionName() + "):");
        pw.increaseIndent();

        pw.println("Current state: " + getCurrentState().getClass().getSimpleName());
        pw.println("mIsQuitting: " + mIsQuitting);
        pw.println("mIsInSafeMode: " + mIsInSafeMode);
        pw.println("mCurrentToken: " + mCurrentToken);
        pw.println("mFailedAttempts: " + mFailedAttempts);
        pw.println(
                "mNetworkAgent.getNetwork(): "
                        + (mNetworkAgent == null ? null : mNetworkAgent.getNetwork()));

        pw.decreaseIndent();
    }

    @VisibleForTesting(visibility = Visibility.PRIVATE)
    void setTunnelInterface(IpSecTunnelInterface tunnelIface) {
        mTunnelIface = tunnelIface;
+41 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;

import java.util.Objects;
import java.util.Set;
@@ -129,10 +130,50 @@ public class VcnNetworkProvider extends NetworkProvider {
            mScore = score;
            mProviderId = providerId;
        }

        /**
         * Dumps the state of this NetworkRequestEntry for logging and debugging purposes.
         *
         * <p>PII and credentials MUST NEVER be dumped here.
         */
        public void dump(IndentingPrintWriter pw) {
            pw.println("NetworkRequestEntry:");
            pw.increaseIndent();

            pw.println("mRequest: " + mRequest);
            pw.println("mScore: " + mScore);
            pw.println("mProviderId: " + mProviderId);

            pw.decreaseIndent();
        }
    }

    // package-private
    interface NetworkRequestListener {
        void onNetworkRequested(@NonNull NetworkRequest request, int score, int providerId);
    }

    /**
     * Dumps the state of this VcnNetworkProvider for logging and debugging purposes.
     *
     * <p>PII and credentials MUST NEVER be dumped here.
     */
    public void dump(IndentingPrintWriter pw) {
        pw.println("VcnNetworkProvider:");
        pw.increaseIndent();

        pw.println("mListeners:");
        for (NetworkRequestListener listener : mListeners) {
            pw.println(listener);
        }
        pw.println();

        pw.println("mRequests.values:");
        for (NetworkRequestEntry entry : mRequests.values()) {
            entry.dump(pw);
        }
        pw.println();

        pw.decreaseIndent();
    }
}