Merge changes I5a6174a4,Idfbfdf54 am: 33a04d0ff9
am: 8898e7c094
Change-Id: Ibbbf2445fa4094733227f4ece643160fb7ca7c46
This commit is contained in:
@@ -50,6 +50,8 @@ public class NetworkStack {
|
|||||||
|
|
||||||
public static final String NETWORKSTACK_PACKAGE_NAME = "com.android.mainline.networkstack";
|
public static final String NETWORKSTACK_PACKAGE_NAME = "com.android.mainline.networkstack";
|
||||||
|
|
||||||
|
private static final int NETWORKSTACK_TIMEOUT_MS = 10_000;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@GuardedBy("mPendingNetStackRequests")
|
@GuardedBy("mPendingNetStackRequests")
|
||||||
private final ArrayList<NetworkStackCallback> mPendingNetStackRequests = new ArrayList<>();
|
private final ArrayList<NetworkStackCallback> mPendingNetStackRequests = new ArrayList<>();
|
||||||
@@ -57,6 +59,8 @@ public class NetworkStack {
|
|||||||
@GuardedBy("mPendingNetStackRequests")
|
@GuardedBy("mPendingNetStackRequests")
|
||||||
private INetworkStackConnector mConnector;
|
private INetworkStackConnector mConnector;
|
||||||
|
|
||||||
|
private volatile boolean mNetworkStackStartRequested = false;
|
||||||
|
|
||||||
private interface NetworkStackCallback {
|
private interface NetworkStackCallback {
|
||||||
void onNetworkStackConnected(INetworkStackConnector connector);
|
void onNetworkStackConnected(INetworkStackConnector connector);
|
||||||
}
|
}
|
||||||
@@ -134,6 +138,7 @@ public class NetworkStack {
|
|||||||
* started.
|
* started.
|
||||||
*/
|
*/
|
||||||
public void start(Context context) {
|
public void start(Context context) {
|
||||||
|
mNetworkStackStartRequested = true;
|
||||||
// Try to bind in-process if the library is available
|
// Try to bind in-process if the library is available
|
||||||
IBinder connector = null;
|
IBinder connector = null;
|
||||||
try {
|
try {
|
||||||
@@ -170,15 +175,54 @@ public class NetworkStack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: use this method to obtain the connector when implementing network stack operations
|
/**
|
||||||
|
* For non-system server clients, get the connector registered by the system server.
|
||||||
|
*/
|
||||||
|
private INetworkStackConnector getRemoteConnector() {
|
||||||
|
// Block until the NetworkStack connector is registered in ServiceManager.
|
||||||
|
// <p>This is only useful for non-system processes that do not have a way to be notified of
|
||||||
|
// registration completion. Adding a callback system would be too heavy weight considering
|
||||||
|
// that the connector is registered on boot, so it is unlikely that a client would request
|
||||||
|
// it before it is registered.
|
||||||
|
// TODO: consider blocking boot on registration and simplify much of the logic in this class
|
||||||
|
IBinder connector;
|
||||||
|
try {
|
||||||
|
final long before = System.currentTimeMillis();
|
||||||
|
while ((connector = ServiceManager.getService(Context.NETWORK_STACK_SERVICE)) == null) {
|
||||||
|
Thread.sleep(20);
|
||||||
|
if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) {
|
||||||
|
Slog.e(TAG, "Timeout waiting for NetworkStack connector");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Slog.e(TAG, "Error waiting for NetworkStack connector", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return INetworkStackConnector.Stub.asInterface(connector);
|
||||||
|
}
|
||||||
|
|
||||||
private void requestConnector(@NonNull NetworkStackCallback request) {
|
private void requestConnector(@NonNull NetworkStackCallback request) {
|
||||||
// TODO: PID check.
|
// TODO: PID check.
|
||||||
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
|
final int caller = Binder.getCallingUid();
|
||||||
|
if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
|
||||||
// Don't even attempt to obtain the connector and give a nice error message
|
// Don't even attempt to obtain the connector and give a nice error message
|
||||||
throw new SecurityException(
|
throw new SecurityException(
|
||||||
"Only the system server should try to bind to the network stack.");
|
"Only the system server should try to bind to the network stack.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mNetworkStackStartRequested) {
|
||||||
|
// The network stack is not being started in this process, e.g. this process is not
|
||||||
|
// the system server. Get a remote connector registered by the system server.
|
||||||
|
final INetworkStackConnector connector = getRemoteConnector();
|
||||||
|
synchronized (mPendingNetStackRequests) {
|
||||||
|
mConnector = connector;
|
||||||
|
}
|
||||||
|
request.onNetworkStackConnected(connector);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final INetworkStackConnector connector;
|
final INetworkStackConnector connector;
|
||||||
synchronized (mPendingNetStackRequests) {
|
synchronized (mPendingNetStackRequests) {
|
||||||
connector = mConnector;
|
connector = mConnector;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
|
|||||||
import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
|
import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
|
||||||
import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
|
import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
|
||||||
|
|
||||||
|
import static com.android.server.util.PermissionUtil.checkDumpPermission;
|
||||||
import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
|
import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
@@ -139,7 +140,7 @@ public class NetworkStackService extends Service {
|
|||||||
@Override
|
@Override
|
||||||
protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
|
protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
|
||||||
@Nullable String[] args) {
|
@Nullable String[] args) {
|
||||||
checkNetworkStackCallingPermission();
|
checkDumpPermission();
|
||||||
final IndentingPrintWriter pw = new IndentingPrintWriter(fout, " ");
|
final IndentingPrintWriter pw = new IndentingPrintWriter(fout, " ");
|
||||||
pw.println("NetworkStack logs:");
|
pw.println("NetworkStack logs:");
|
||||||
mLog.dump(fd, pw, args);
|
mLog.dump(fd, pw, args);
|
||||||
|
|||||||
@@ -31,8 +31,21 @@ public final class PermissionUtil {
|
|||||||
*/
|
*/
|
||||||
public static void checkNetworkStackCallingPermission() {
|
public static void checkNetworkStackCallingPermission() {
|
||||||
// TODO: check that the calling PID is the system server.
|
// TODO: check that the calling PID is the system server.
|
||||||
if (getCallingUid() != Process.SYSTEM_UID && getCallingUid() != Process.ROOT_UID) {
|
final int caller = getCallingUid();
|
||||||
throw new SecurityException("Invalid caller: " + getCallingUid());
|
if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
|
||||||
|
throw new SecurityException("Invalid caller: " + caller);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that the caller is allowed to dump the network stack, e.g. dumpsys.
|
||||||
|
* @throws SecurityException The caller is not allowed to dump the network stack.
|
||||||
|
*/
|
||||||
|
public static void checkDumpPermission() {
|
||||||
|
final int caller = getCallingUid();
|
||||||
|
if (caller != Process.SYSTEM_UID && caller != Process.ROOT_UID
|
||||||
|
&& caller != Process.SHELL_UID) {
|
||||||
|
throw new SecurityException("No dump permissions for caller: " + caller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user