Merge "Use batching to set firewall rules." into nyc-dev am: e821f3d032

am: 09e9877dca

* commit '09e9877dca1db74339e893b3bf7942a1f9d263a5':
  Use batching to set firewall rules.

Change-Id: I13cea9d3960c2d9f851aaa766b6f743f8486d7e7
This commit is contained in:
Felipe Leme
2016-05-18 16:37:15 +00:00
committed by android-build-merger

View File

@@ -556,7 +556,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
// chain. // chain.
if (DBG) Slog.d(TAG, "Pushing " + size + " active firewall " + name + "UID rules"); if (DBG) Slog.d(TAG, "Pushing " + size + " active firewall " + name + "UID rules");
for (int i = 0; i < rules.size(); i++) { for (int i = 0; i < rules.size(); i++) {
setFirewallUidRuleInternal(chain, rules.keyAt(i), rules.valueAt(i)); setFirewallUidRuleLocked(chain, rules.keyAt(i), rules.valueAt(i));
} }
} }
} }
@@ -2240,7 +2240,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
for (int index = uids.length - 1; index >= 0; --index) { for (int index = uids.length - 1; index >= 0; --index) {
int uid = uids[index]; int uid = uids[index];
int rule = rules[index]; int rule = rules[index];
setFirewallUidRule(chain, uid, rule); updateFirewallUidRuleLocked(chain, uid, rule);
newRules.put(uid, rule); newRules.put(uid, rule);
} }
// collect the rules to remove. // collect the rules to remove.
@@ -2254,7 +2254,25 @@ public class NetworkManagementService extends INetworkManagementService.Stub
// remove dead rules // remove dead rules
for (int index = rulesToRemove.size() - 1; index >= 0; --index) { for (int index = rulesToRemove.size() - 1; index >= 0; --index) {
int uid = rulesToRemove.keyAt(index); int uid = rulesToRemove.keyAt(index);
setFirewallUidRuleInternal(chain, uid, FIREWALL_RULE_DEFAULT); updateFirewallUidRuleLocked(chain, uid, FIREWALL_RULE_DEFAULT);
}
try {
switch (chain) {
case FIREWALL_CHAIN_DOZABLE:
mNetdService.firewallReplaceUidChain("fw_dozable", true, uids);
break;
case FIREWALL_CHAIN_STANDBY:
mNetdService.firewallReplaceUidChain("fw_standby", false, uids);
break;
case FIREWALL_CHAIN_POWERSAVE:
mNetdService.firewallReplaceUidChain("fw_powersave", true, uids);
break;
case FIREWALL_CHAIN_NONE:
default:
Slog.d(TAG, "setFirewallUidRules() called on invalid chain: " + chain);
}
} catch (RemoteException e) {
Slog.w(TAG, "Error flushing firewall chain " + chain, e);
} }
} }
} }
@@ -2262,11 +2280,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub
@Override @Override
public void setFirewallUidRule(int chain, int uid, int rule) { public void setFirewallUidRule(int chain, int uid, int rule) {
enforceSystemUid(); enforceSystemUid();
setFirewallUidRuleInternal(chain, uid, rule); synchronized (mQuotaLock) {
setFirewallUidRuleLocked(chain, uid, rule);
}
} }
private void setFirewallUidRuleInternal(int chain, int uid, int rule) { private void setFirewallUidRuleLocked(int chain, int uid, int rule) {
synchronized (mQuotaLock) { if (updateFirewallUidRuleLocked(chain, uid, rule)) {
try {
mConnector.execute("firewall", "set_uid_rule", getFirewallChainName(chain), uid,
getFirewallRuleName(chain, rule));
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
}
// TODO: now that netd supports batching, NMS should not keep these data structures anymore...
private boolean updateFirewallUidRuleLocked(int chain, int uid, int rule) {
SparseIntArray uidFirewallRules = getUidFirewallRules(chain); SparseIntArray uidFirewallRules = getUidFirewallRules(chain);
final int oldUidFirewallRule = uidFirewallRules.get(uid, FIREWALL_RULE_DEFAULT); final int oldUidFirewallRule = uidFirewallRules.get(uid, FIREWALL_RULE_DEFAULT);
@@ -2277,10 +2308,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
if (oldUidFirewallRule == rule) { if (oldUidFirewallRule == rule) {
if (DBG) Slog.d(TAG, "!!!!! Skipping change"); if (DBG) Slog.d(TAG, "!!!!! Skipping change");
// TODO: eventually consider throwing // TODO: eventually consider throwing
return; return false;
} }
try {
String ruleName = getFirewallRuleName(chain, rule); String ruleName = getFirewallRuleName(chain, rule);
String oldRuleName = getFirewallRuleName(chain, oldUidFirewallRule); String oldRuleName = getFirewallRuleName(chain, oldUidFirewallRule);
@@ -2289,15 +2319,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
} else { } else {
uidFirewallRules.put(uid, rule); uidFirewallRules.put(uid, rule);
} }
return !ruleName.equals(oldRuleName);
if (!ruleName.equals(oldRuleName)) {
mConnector.execute("firewall", "set_uid_rule", getFirewallChainName(chain), uid,
ruleName);
}
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
} }
private @NonNull String getFirewallRuleName(int chain, int rule) { private @NonNull String getFirewallRuleName(int chain, int rule) {