Merge "Minor fixes for netd restarts and StrictController." am: 2f5ca257b5
am: 25e0f60f54
Change-Id: I5789138530ad115a004231a539c5165af1d6358e
This commit is contained in:
@@ -66,6 +66,7 @@ import android.net.NetworkStats;
|
||||
import android.net.NetworkUtils;
|
||||
import android.net.RouteInfo;
|
||||
import android.net.UidRange;
|
||||
import android.net.util.NetdService;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiConfiguration.KeyMgmt;
|
||||
import android.os.BatteryStats;
|
||||
@@ -361,7 +362,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
if (DBG) Slog.d(TAG, "Awaiting socket connection");
|
||||
connectedSignal.await();
|
||||
if (DBG) Slog.d(TAG, "Connected");
|
||||
if (DBG) Slog.d(TAG, "Connecting native netd service");
|
||||
service.connectNativeNetdService();
|
||||
if (DBG) Slog.d(TAG, "Connected");
|
||||
return service;
|
||||
}
|
||||
|
||||
@@ -573,14 +576,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
}
|
||||
|
||||
private void connectNativeNetdService() {
|
||||
boolean nativeServiceAvailable = false;
|
||||
try {
|
||||
mNetdService = INetd.Stub.asInterface(ServiceManager.getService(NETD_SERVICE_NAME));
|
||||
nativeServiceAvailable = mNetdService.isAlive();
|
||||
} catch (RemoteException e) {}
|
||||
if (!nativeServiceAvailable) {
|
||||
Slog.wtf(TAG, "Can't connect to NativeNetdService " + NETD_SERVICE_NAME);
|
||||
}
|
||||
mNetdService = NetdService.get();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -593,37 +589,31 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
|
||||
// only enable bandwidth control when support exists
|
||||
final boolean hasKernelSupport = new File("/proc/net/xt_qtaguid/ctrl").exists();
|
||||
if (hasKernelSupport) {
|
||||
Slog.d(TAG, "enabling bandwidth control");
|
||||
try {
|
||||
mConnector.execute("bandwidth", "enable");
|
||||
mBandwidthControlEnabled = true;
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
Log.wtf(TAG, "problem enabling bandwidth controls", e);
|
||||
}
|
||||
} else {
|
||||
Slog.i(TAG, "not enabling bandwidth control");
|
||||
}
|
||||
|
||||
SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0");
|
||||
|
||||
if (mBandwidthControlEnabled) {
|
||||
try {
|
||||
getBatteryStats().noteNetworkStatsEnabled();
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
mConnector.execute("strict", "enable");
|
||||
mStrictEnabled = true;
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
Log.wtf(TAG, "Failed strict enable", e);
|
||||
}
|
||||
|
||||
// push any existing quota or UID rules
|
||||
synchronized (mQuotaLock) {
|
||||
|
||||
if (hasKernelSupport) {
|
||||
Slog.d(TAG, "enabling bandwidth control");
|
||||
try {
|
||||
mConnector.execute("bandwidth", "enable");
|
||||
mBandwidthControlEnabled = true;
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
Log.wtf(TAG, "problem enabling bandwidth controls", e);
|
||||
}
|
||||
} else {
|
||||
Slog.i(TAG, "not enabling bandwidth control");
|
||||
}
|
||||
|
||||
SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0");
|
||||
|
||||
try {
|
||||
mConnector.execute("strict", "enable");
|
||||
mStrictEnabled = true;
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
Log.wtf(TAG, "Failed strict enable", e);
|
||||
}
|
||||
|
||||
setDataSaverModeEnabled(mDataSaverMode);
|
||||
|
||||
int size = mActiveQuotas.size();
|
||||
@@ -701,6 +691,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mBandwidthControlEnabled) {
|
||||
try {
|
||||
getBatteryStats().noteNetworkStatsEnabled();
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1757,6 +1755,30 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
}
|
||||
}
|
||||
|
||||
private void applyUidCleartextNetworkPolicy(int uid, int policy) {
|
||||
final String policyString;
|
||||
switch (policy) {
|
||||
case StrictMode.NETWORK_POLICY_ACCEPT:
|
||||
policyString = "accept";
|
||||
break;
|
||||
case StrictMode.NETWORK_POLICY_LOG:
|
||||
policyString = "log";
|
||||
break;
|
||||
case StrictMode.NETWORK_POLICY_REJECT:
|
||||
policyString = "reject";
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown policy " + policy);
|
||||
}
|
||||
|
||||
try {
|
||||
mConnector.execute("strict", "set_uid_cleartext_policy", uid, policyString);
|
||||
mUidCleartextPolicy.put(uid, policy);
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
throw e.rethrowAsParcelableException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUidCleartextNetworkPolicy(int uid, int policy) {
|
||||
if (Binder.getCallingUid() != uid) {
|
||||
@@ -1766,6 +1788,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
synchronized (mQuotaLock) {
|
||||
final int oldPolicy = mUidCleartextPolicy.get(uid, StrictMode.NETWORK_POLICY_ACCEPT);
|
||||
if (oldPolicy == policy) {
|
||||
// This also ensures we won't needlessly apply an ACCEPT policy if we've just
|
||||
// enabled strict and the underlying iptables rules are empty.
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1776,28 +1800,15 @@ public class NetworkManagementService extends INetworkManagementService.Stub
|
||||
return;
|
||||
}
|
||||
|
||||
final String policyString;
|
||||
switch (policy) {
|
||||
case StrictMode.NETWORK_POLICY_ACCEPT:
|
||||
policyString = "accept";
|
||||
break;
|
||||
case StrictMode.NETWORK_POLICY_LOG:
|
||||
policyString = "log";
|
||||
break;
|
||||
case StrictMode.NETWORK_POLICY_REJECT:
|
||||
policyString = "reject";
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown policy " + policy);
|
||||
}
|
||||
|
||||
try {
|
||||
mConnector.execute("strict", "set_uid_cleartext_policy", uid, policyString);
|
||||
mUidCleartextPolicy.put(uid, policy);
|
||||
} catch (NativeDaemonConnectorException e) {
|
||||
throw e.rethrowAsParcelableException();
|
||||
// netd does not keep state on strict mode policies, and cannot replace a non-accept
|
||||
// policy without deleting it first. Rather than add state to netd, just always send
|
||||
// it an accept policy when switching between two non-accept policies.
|
||||
if (oldPolicy != StrictMode.NETWORK_POLICY_ACCEPT &&
|
||||
policy != StrictMode.NETWORK_POLICY_ACCEPT) {
|
||||
applyUidCleartextNetworkPolicy(uid, policy);
|
||||
}
|
||||
}
|
||||
applyUidCleartextNetworkPolicy(uid, policy);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user