Merge "Support "dumpsys connectivity trafficcontroller""
This commit is contained in:
commit
bce8cbabbb
6 changed files with 68 additions and 2 deletions
|
|
@ -24,6 +24,7 @@
|
||||||
#include <nativehelper/JNIHelp.h>
|
#include <nativehelper/JNIHelp.h>
|
||||||
#include <nativehelper/ScopedUtfChars.h>
|
#include <nativehelper/ScopedUtfChars.h>
|
||||||
#include <nativehelper/ScopedPrimitiveArray.h>
|
#include <nativehelper/ScopedPrimitiveArray.h>
|
||||||
|
#include <netjniutils/netjniutils.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
@ -186,6 +187,15 @@ static void native_setPermissionForUids(JNIEnv* env, jobject clazz, jint permiss
|
||||||
mTc.setPermissionForUids(permission, data);
|
mTc.setPermissionForUids(permission, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void native_dump(JNIEnv* env, jobject clazz, jobject javaFd, jboolean verbose) {
|
||||||
|
int fd = netjniutils::GetNativeFileDescriptor(env, javaFd);
|
||||||
|
if (fd < 0) {
|
||||||
|
jniThrowExceptionFmt(env, "java/io/IOException", "Invalid file descriptor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mTc.dump(fd, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* JNI registration.
|
* JNI registration.
|
||||||
*/
|
*/
|
||||||
|
|
@ -216,6 +226,8 @@ static const JNINativeMethod gMethods[] = {
|
||||||
(void*)native_swapActiveStatsMap},
|
(void*)native_swapActiveStatsMap},
|
||||||
{"native_setPermissionForUids", "(I[I)V",
|
{"native_setPermissionForUids", "(I[I)V",
|
||||||
(void*)native_setPermissionForUids},
|
(void*)native_setPermissionForUids},
|
||||||
|
{"native_dump", "(Ljava/io/FileDescriptor;Z)V",
|
||||||
|
(void*)native_dump},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -601,8 +601,10 @@ void dumpBpfMap(const std::string& mapName, DumpWriter& dw, const std::string& h
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficController::dump(DumpWriter& dw, bool verbose) {
|
void TrafficController::dump(int fd, bool verbose) {
|
||||||
std::lock_guard guard(mMutex);
|
std::lock_guard guard(mMutex);
|
||||||
|
DumpWriter dw(fd);
|
||||||
|
|
||||||
ScopedIndent indentTop(dw);
|
ScopedIndent indentTop(dw);
|
||||||
dw.println("TrafficController");
|
dw.println("TrafficController");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ class TrafficController {
|
||||||
netdutils::Status updateOwnerMapEntry(UidOwnerMatchType match, uid_t uid, FirewallRule rule,
|
netdutils::Status updateOwnerMapEntry(UidOwnerMatchType match, uid_t uid, FirewallRule rule,
|
||||||
FirewallType type) EXCLUDES(mMutex);
|
FirewallType type) EXCLUDES(mMutex);
|
||||||
|
|
||||||
void dump(netdutils::DumpWriter& dw, bool verbose) EXCLUDES(mMutex);
|
void dump(int fd, bool verbose) EXCLUDES(mMutex);
|
||||||
|
|
||||||
netdutils::Status replaceRulesInMap(UidOwnerMatchType match, const std::vector<int32_t>& uids)
|
netdutils::Status replaceRulesInMap(UidOwnerMatchType match, const std::vector<int32_t>& uids)
|
||||||
EXCLUDES(mMutex);
|
EXCLUDES(mMutex);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
package com.android.server;
|
package com.android.server;
|
||||||
|
|
||||||
|
import static android.system.OsConstants.EOPNOTSUPP;
|
||||||
|
|
||||||
import android.net.INetd;
|
import android.net.INetd;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceSpecificException;
|
import android.os.ServiceSpecificException;
|
||||||
|
|
@ -24,6 +26,9 @@ import android.util.Log;
|
||||||
|
|
||||||
import com.android.modules.utils.build.SdkLevel;
|
import com.android.modules.utils.build.SdkLevel;
|
||||||
|
|
||||||
|
import java.io.FileDescriptor;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BpfNetMaps is responsible for providing traffic controller relevant functionality.
|
* BpfNetMaps is responsible for providing traffic controller relevant functionality.
|
||||||
*
|
*
|
||||||
|
|
@ -273,6 +278,23 @@ public class BpfNetMaps {
|
||||||
native_setPermissionForUids(permissions, uids);
|
native_setPermissionForUids(permissions, uids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump BPF maps
|
||||||
|
*
|
||||||
|
* @param fd file descriptor to output
|
||||||
|
* @throws IOException when file descriptor is invalid.
|
||||||
|
* @throws ServiceSpecificException when the method is called on an unsupported device.
|
||||||
|
*/
|
||||||
|
public void dump(final FileDescriptor fd, boolean verbose)
|
||||||
|
throws IOException, ServiceSpecificException {
|
||||||
|
if (USE_NETD) {
|
||||||
|
throw new ServiceSpecificException(
|
||||||
|
EOPNOTSUPP, "dumpsys connectivity trafficcontroller dump not available on pre-T"
|
||||||
|
+ " devices, use dumpsys netd trafficcontroller instead.");
|
||||||
|
}
|
||||||
|
native_dump(fd, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
private static native void native_init();
|
private static native void native_init();
|
||||||
private native int native_addNaughtyApp(int uid);
|
private native int native_addNaughtyApp(int uid);
|
||||||
private native int native_removeNaughtyApp(int uid);
|
private native int native_removeNaughtyApp(int uid);
|
||||||
|
|
@ -285,4 +307,5 @@ public class BpfNetMaps {
|
||||||
private native int native_removeUidInterfaceRules(int[] uids);
|
private native int native_removeUidInterfaceRules(int[] uids);
|
||||||
private native int native_swapActiveStatsMap();
|
private native int native_swapActiveStatsMap();
|
||||||
private native void native_setPermissionForUids(int permissions, int[] uids);
|
private native void native_setPermissionForUids(int permissions, int[] uids);
|
||||||
|
private native void native_dump(FileDescriptor fd, boolean verbose);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -313,6 +313,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
public static final String SHORT_ARG = "--short";
|
public static final String SHORT_ARG = "--short";
|
||||||
private static final String NETWORK_ARG = "networks";
|
private static final String NETWORK_ARG = "networks";
|
||||||
private static final String REQUEST_ARG = "requests";
|
private static final String REQUEST_ARG = "requests";
|
||||||
|
private static final String TRAFFICCONTROLLER_ARG = "trafficcontroller";
|
||||||
|
|
||||||
private static final boolean DBG = true;
|
private static final boolean DBG = true;
|
||||||
private static final boolean DDBG = Log.isLoggable(TAG, Log.DEBUG);
|
private static final boolean DDBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
|
|
@ -3217,6 +3218,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
} else if (CollectionUtils.contains(args, REQUEST_ARG)) {
|
} else if (CollectionUtils.contains(args, REQUEST_ARG)) {
|
||||||
dumpNetworkRequests(pw);
|
dumpNetworkRequests(pw);
|
||||||
return;
|
return;
|
||||||
|
} else if (CollectionUtils.contains(args, TRAFFICCONTROLLER_ARG)) {
|
||||||
|
boolean verbose = !CollectionUtils.contains(args, SHORT_ARG);
|
||||||
|
dumpTrafficController(pw, fd, verbose);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pw.print("NetworkProviders for:");
|
pw.print("NetworkProviders for:");
|
||||||
|
|
@ -3434,6 +3439,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void dumpTrafficController(IndentingPrintWriter pw, final FileDescriptor fd,
|
||||||
|
boolean verbose) {
|
||||||
|
try {
|
||||||
|
mBpfNetMaps.dump(fd, verbose);
|
||||||
|
} catch (ServiceSpecificException e) {
|
||||||
|
pw.println(e.getMessage());
|
||||||
|
} catch (IOException e) {
|
||||||
|
loge("Dump BPF maps failed, " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void dumpAllRequestInfoLogsToLogcat() {
|
private void dumpAllRequestInfoLogsToLogcat() {
|
||||||
try (PrintWriter logPw = new PrintWriter(new Writer() {
|
try (PrintWriter logPw = new PrintWriter(new Writer() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -3259,6 +3259,19 @@ public class ConnectivityManagerTest {
|
||||||
assertTrue(dumpOutput, dumpOutput.contains("Active default network"));
|
assertTrue(dumpOutput, dumpOutput.contains("Active default network"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test @IgnoreUpTo(SC_V2)
|
||||||
|
public void testDumpBpfNetMaps() throws Exception {
|
||||||
|
final String[] args = new String[] {"--short", "trafficcontroller"};
|
||||||
|
String dumpOutput = DumpTestUtils.dumpServiceWithShellPermission(
|
||||||
|
Context.CONNECTIVITY_SERVICE, args);
|
||||||
|
assertTrue(dumpOutput, dumpOutput.contains("TrafficController"));
|
||||||
|
assertFalse(dumpOutput, dumpOutput.contains("BPF map content"));
|
||||||
|
|
||||||
|
dumpOutput = DumpTestUtils.dumpServiceWithShellPermission(
|
||||||
|
Context.CONNECTIVITY_SERVICE, args[1]);
|
||||||
|
assertTrue(dumpOutput, dumpOutput.contains("BPF map content"));
|
||||||
|
}
|
||||||
|
|
||||||
private void unregisterRegisteredCallbacks() {
|
private void unregisterRegisteredCallbacks() {
|
||||||
for (NetworkCallback callback: mRegisteredCallbacks) {
|
for (NetworkCallback callback: mRegisteredCallbacks) {
|
||||||
mCm.unregisterNetworkCallback(callback);
|
mCm.unregisterNetworkCallback(callback);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue