ConnectivityService: Implement VPN callbacks to update DNS servers.

Change-Id: I7b5063f0344a2a5c2754600386982e870adc1161
This commit is contained in:
Chia-chi Yeh
2011-07-14 18:01:57 -07:00
parent 8f3e3bca45
commit cc844502e2

View File

@@ -155,7 +155,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private boolean mInetConditionChangeInFlight = false; private boolean mInetConditionChangeInFlight = false;
private int mDefaultConnectionSequence = 0; private int mDefaultConnectionSequence = 0;
private Object mDnsLock = new Object();
private int mNumDnsEntries; private int mNumDnsEntries;
private boolean mDnsOverridden = false;
private boolean mTestMode; private boolean mTestMode;
private static ConnectivityService sServiceInstance; private static ConnectivityService sServiceInstance;
@@ -244,6 +246,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private static final int EVENT_SET_DEPENDENCY_MET = private static final int EVENT_SET_DEPENDENCY_MET =
MAX_NETWORK_STATE_TRACKER_EVENT + 10; MAX_NETWORK_STATE_TRACKER_EVENT + 10;
/**
* used internally to restore DNS properties back to the
* default network
*/
private static final int EVENT_RESTORE_DNS =
MAX_NETWORK_STATE_TRACKER_EVENT + 11;
private Handler mHandler; private Handler mHandler;
// list of DeathRecipients used to make sure features are turned off when // list of DeathRecipients used to make sure features are turned off when
@@ -1889,6 +1898,50 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mContext.sendBroadcast(intent); mContext.sendBroadcast(intent);
} }
// Caller must grab mDnsLock.
private boolean updateDns(String network, Collection<InetAddress> dnses, String domains) {
boolean changed = false;
int last = 0;
if (dnses.size() == 0 && mDefaultDns != null) {
++last;
String value = mDefaultDns.getHostAddress();
if (!value.equals(SystemProperties.get("net.dns1"))) {
if (DBG) {
log("no dns provided for " + network + " - using " + value);
}
changed = true;
SystemProperties.set("net.dns1", value);
}
} else {
for (InetAddress dns : dnses) {
++last;
String key = "net.dns" + last;
String value = dns.getHostAddress();
if (!changed && value.equals(SystemProperties.get(key))) {
continue;
}
if (DBG) {
log("adding dns " + value + " for " + network);
}
changed = true;
SystemProperties.set(key, value);
}
}
for (int i = last + 1; i <= mNumDnsEntries; ++i) {
String key = "net.dns" + i;
if (DBG) log("erasing " + key);
changed = true;
SystemProperties.set(key, "");
}
mNumDnsEntries = last;
if (!domains.equals(SystemProperties.get("net.dns.search"))) {
SystemProperties.set("net.dns.search", domains);
changed = true;
}
return changed;
}
private void handleDnsConfigurationChange(int netType) { private void handleDnsConfigurationChange(int netType) {
// add default net's dns entries // add default net's dns entries
NetworkStateTracker nt = mNetTrackers[netType]; NetworkStateTracker nt = mNetTrackers[netType];
@@ -1898,40 +1951,12 @@ public class ConnectivityService extends IConnectivityManager.Stub {
Collection<InetAddress> dnses = p.getDnses(); Collection<InetAddress> dnses = p.getDnses();
boolean changed = false; boolean changed = false;
if (mNetConfigs[netType].isDefault()) { if (mNetConfigs[netType].isDefault()) {
int j = 1; String network = nt.getNetworkInfo().getTypeName();
if (dnses.size() == 0 && mDefaultDns != null) { synchronized (mDnsLock) {
String dnsString = mDefaultDns.getHostAddress(); if (!mDnsOverridden) {
if (!dnsString.equals(SystemProperties.get("net.dns1"))) { changed = updateDns(network, dnses, "");
if (DBG) {
log("no dns provided - using " + dnsString);
}
changed = true;
SystemProperties.set("net.dns1", dnsString);
}
j++;
} else {
for (InetAddress dns : dnses) {
String dnsString = dns.getHostAddress();
if (!changed && dnsString.equals(SystemProperties.get("net.dns" + j))) {
j++;
continue;
}
if (DBG) {
log("adding dns " + dns + " for " +
nt.getNetworkInfo().getTypeName());
}
changed = true;
SystemProperties.set("net.dns" + j++, dnsString);
} }
} }
for (int k=j ; k<mNumDnsEntries; k++) {
if (changed || !TextUtils.isEmpty(SystemProperties.get("net.dns" + k))) {
if (DBG) log("erasing net.dns" + k);
changed = true;
SystemProperties.set("net.dns" + k, "");
}
}
mNumDnsEntries = j;
} else { } else {
// set per-pid dns for attached secondary nets // set per-pid dns for attached secondary nets
List pids = mNetRequestersPids[netType]; List pids = mNetRequestersPids[netType];
@@ -2138,6 +2163,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
handleSetDependencyMet(msg.arg2, met); handleSetDependencyMet(msg.arg2, met);
break; break;
} }
case EVENT_RESTORE_DNS:
{
if (mActiveDefaultNetwork != -1) {
handleDnsConfigurationChange(mActiveDefaultNetwork);
}
break;
}
} }
} }
} }
@@ -2585,12 +2617,57 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private VpnCallback() { private VpnCallback() {
} }
public synchronized void override(List<String> dnsServers, List<String> searchDomains) { public void override(List<String> dnsServers, List<String> searchDomains) {
// TODO: override DNS servers and http proxy. if (dnsServers == null) {
restore();
return;
}
// Convert DNS servers into addresses.
List<InetAddress> addresses = new ArrayList<InetAddress>();
for (String address : dnsServers) {
// Double check the addresses and remove invalid ones.
try {
addresses.add(InetAddress.parseNumericAddress(address));
} catch (Exception e) {
// ignore
}
}
if (addresses.isEmpty()) {
restore();
return;
}
// Concatenate search domains into a string.
StringBuilder buffer = new StringBuilder();
if (searchDomains != null) {
for (String domain : searchDomains) {
buffer.append(domain).append(' ');
}
}
String domains = buffer.toString().trim();
// Apply DNS changes.
boolean changed = false;
synchronized (mDnsLock) {
changed = updateDns("VPN", addresses, domains);
mDnsOverridden = true;
}
if (changed) {
bumpDns();
}
// TODO: temporarily remove http proxy?
} }
public synchronized void restore() { public void restore() {
// TODO: restore VPN changes. synchronized (mDnsLock) {
if (!mDnsOverridden) {
return;
}
mDnsOverridden = false;
}
mHandler.sendEmptyMessage(EVENT_RESTORE_DNS);
} }
} }
} }