ConnectivityService: Implement VPN callbacks to update DNS servers.
Change-Id: I7b5063f0344a2a5c2754600386982e870adc1161
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void restore() {
|
// Convert DNS servers into addresses.
|
||||||
// TODO: restore VPN changes.
|
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 void restore() {
|
||||||
|
synchronized (mDnsLock) {
|
||||||
|
if (!mDnsOverridden) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mDnsOverridden = false;
|
||||||
|
}
|
||||||
|
mHandler.sendEmptyMessage(EVENT_RESTORE_DNS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user