Loading core/java/android/net/LinkProperties.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -58,8 +58,8 @@ public class LinkProperties implements Parcelable { private ProxyProperties mHttpProxy; private ProxyProperties mHttpProxy; public static class CompareResult<T> { public static class CompareResult<T> { public ArrayList<T> removed = new ArrayList<T>(); public Collection<T> removed = new ArrayList<T>(); public ArrayList<T> added = new ArrayList<T>(); public Collection<T> added = new ArrayList<T>(); @Override @Override public String toString() { public String toString() { Loading services/java/com/android/server/ConnectivityService.java +56 −30 Original line number Original line Diff line number Diff line Loading @@ -963,7 +963,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { try { try { InetAddress addr = InetAddress.getByAddress(hostAddress); InetAddress addr = InetAddress.getByAddress(hostAddress); LinkProperties lp = tracker.getLinkProperties(); LinkProperties lp = tracker.getLinkProperties(); return addRoute(lp, RouteInfo.makeHostRoute(addr)); return addRouteToAddress(lp, addr); } catch (UnknownHostException e) {} } catch (UnknownHostException e) {} return false; return false; } } Loading @@ -976,6 +976,31 @@ public class ConnectivityService extends IConnectivityManager.Stub { return modifyRoute(p.getInterfaceName(), p, r, 0, false); return modifyRoute(p.getInterfaceName(), p, r, 0, false); } } private boolean addRouteToAddress(LinkProperties lp, InetAddress addr) { return modifyRouteToAddress(lp, addr, true); } private boolean removeRouteToAddress(LinkProperties lp, InetAddress addr) { return modifyRouteToAddress(lp, addr, false); } private boolean modifyRouteToAddress(LinkProperties lp, InetAddress addr, boolean doAdd) { RouteInfo bestRoute = RouteInfo.selectBestRoute(lp.getRoutes(), addr); if (bestRoute == null) { bestRoute = RouteInfo.makeHostRoute(addr); } else { if (bestRoute.getGateway().equals(addr)) { // if there is no better route, add the implied hostroute for our gateway bestRoute = RouteInfo.makeHostRoute(addr); } else { // if we will connect to this through another route, add a direct route // to it's gateway bestRoute = RouteInfo.makeHostRoute(addr, bestRoute.getGateway()); } } return modifyRoute(lp.getInterfaceName(), lp, bestRoute, 0, doAdd); } private boolean modifyRoute(String ifaceName, LinkProperties lp, RouteInfo r, int cycleCount, private boolean modifyRoute(String ifaceName, LinkProperties lp, RouteInfo r, int cycleCount, boolean doAdd) { boolean doAdd) { if ((ifaceName == null) || (lp == null) || (r == null)) return false; if ((ifaceName == null) || (lp == null) || (r == null)) return false; Loading Loading @@ -1548,49 +1573,50 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ */ private void updateRoutes(LinkProperties newLp, LinkProperties curLp, boolean isLinkDefault) { private void updateRoutes(LinkProperties newLp, LinkProperties curLp, boolean isLinkDefault) { Collection<RouteInfo> routesToAdd = null; Collection<RouteInfo> routesToAdd = null; CompareResult<InetAddress> dnsDiff = null; CompareResult<InetAddress> dnsDiff = new CompareResult<InetAddress>(); CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>(); if (curLp != null) { if (curLp != null) { // check for the delta between the current set and the new // check for the delta between the current set and the new CompareResult<RouteInfo> routeDiff = curLp.compareRoutes(newLp); routeDiff = curLp.compareRoutes(newLp); dnsDiff = curLp.compareDnses(newLp); dnsDiff = curLp.compareDnses(newLp); } else if (newLp != null) { routeDiff.added = newLp.getRoutes(); dnsDiff.added = newLp.getDnses(); } for (RouteInfo r : routeDiff.removed) { for (RouteInfo r : routeDiff.removed) { if (isLinkDefault || ! r.isDefaultRoute()) { if (isLinkDefault || ! r.isDefaultRoute()) { removeRoute(curLp, r); removeRoute(curLp, r); } } } } routesToAdd = routeDiff.added; } if (newLp != null) { // if we didn't get a diff from cur -> new, then just use the new if (routesToAdd == null) { routesToAdd = newLp.getRoutes(); } for (RouteInfo r : routesToAdd) { for (RouteInfo r : routeDiff.added) { if (isLinkDefault || ! r.isDefaultRoute()) { if (isLinkDefault || ! r.isDefaultRoute()) { addRoute(newLp, r); addRoute(newLp, r); } } } } } if (!isLinkDefault) { if (!isLinkDefault) { // handle DNS routes // handle DNS routes Collection<InetAddress> dnsToAdd = null; if (routeDiff.removed.size() == 0 && routeDiff.added.size() == 0) { if (dnsDiff != null) { // no change in routes, check for change in dns themselves dnsToAdd = dnsDiff.added; for (InetAddress oldDns : dnsDiff.removed) { for (InetAddress dnsAddress : dnsDiff.removed) { removeRouteToAddress(curLp, oldDns); removeRoute(curLp, RouteInfo.makeHostRoute(dnsAddress)); } for (InetAddress newDns : dnsDiff.added) { addRouteToAddress(newLp, newDns); } } else { // routes changed - remove all old dns entries and add new if (curLp != null) { for (InetAddress oldDns : curLp.getDnses()) { removeRouteToAddress(curLp, oldDns); } } } } if (newLp != null) { if (newLp != null) { if (dnsToAdd == null) { for (InetAddress newDns : newLp.getDnses()) { dnsToAdd = newLp.getDnses(); addRouteToAddress(newLp, newDns); } } for(InetAddress dnsAddress : dnsToAdd) { addRoute(newLp, RouteInfo.makeHostRoute(dnsAddress)); } } } } } } Loading Loading
core/java/android/net/LinkProperties.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -58,8 +58,8 @@ public class LinkProperties implements Parcelable { private ProxyProperties mHttpProxy; private ProxyProperties mHttpProxy; public static class CompareResult<T> { public static class CompareResult<T> { public ArrayList<T> removed = new ArrayList<T>(); public Collection<T> removed = new ArrayList<T>(); public ArrayList<T> added = new ArrayList<T>(); public Collection<T> added = new ArrayList<T>(); @Override @Override public String toString() { public String toString() { Loading
services/java/com/android/server/ConnectivityService.java +56 −30 Original line number Original line Diff line number Diff line Loading @@ -963,7 +963,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { try { try { InetAddress addr = InetAddress.getByAddress(hostAddress); InetAddress addr = InetAddress.getByAddress(hostAddress); LinkProperties lp = tracker.getLinkProperties(); LinkProperties lp = tracker.getLinkProperties(); return addRoute(lp, RouteInfo.makeHostRoute(addr)); return addRouteToAddress(lp, addr); } catch (UnknownHostException e) {} } catch (UnknownHostException e) {} return false; return false; } } Loading @@ -976,6 +976,31 @@ public class ConnectivityService extends IConnectivityManager.Stub { return modifyRoute(p.getInterfaceName(), p, r, 0, false); return modifyRoute(p.getInterfaceName(), p, r, 0, false); } } private boolean addRouteToAddress(LinkProperties lp, InetAddress addr) { return modifyRouteToAddress(lp, addr, true); } private boolean removeRouteToAddress(LinkProperties lp, InetAddress addr) { return modifyRouteToAddress(lp, addr, false); } private boolean modifyRouteToAddress(LinkProperties lp, InetAddress addr, boolean doAdd) { RouteInfo bestRoute = RouteInfo.selectBestRoute(lp.getRoutes(), addr); if (bestRoute == null) { bestRoute = RouteInfo.makeHostRoute(addr); } else { if (bestRoute.getGateway().equals(addr)) { // if there is no better route, add the implied hostroute for our gateway bestRoute = RouteInfo.makeHostRoute(addr); } else { // if we will connect to this through another route, add a direct route // to it's gateway bestRoute = RouteInfo.makeHostRoute(addr, bestRoute.getGateway()); } } return modifyRoute(lp.getInterfaceName(), lp, bestRoute, 0, doAdd); } private boolean modifyRoute(String ifaceName, LinkProperties lp, RouteInfo r, int cycleCount, private boolean modifyRoute(String ifaceName, LinkProperties lp, RouteInfo r, int cycleCount, boolean doAdd) { boolean doAdd) { if ((ifaceName == null) || (lp == null) || (r == null)) return false; if ((ifaceName == null) || (lp == null) || (r == null)) return false; Loading Loading @@ -1548,49 +1573,50 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ */ private void updateRoutes(LinkProperties newLp, LinkProperties curLp, boolean isLinkDefault) { private void updateRoutes(LinkProperties newLp, LinkProperties curLp, boolean isLinkDefault) { Collection<RouteInfo> routesToAdd = null; Collection<RouteInfo> routesToAdd = null; CompareResult<InetAddress> dnsDiff = null; CompareResult<InetAddress> dnsDiff = new CompareResult<InetAddress>(); CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>(); if (curLp != null) { if (curLp != null) { // check for the delta between the current set and the new // check for the delta between the current set and the new CompareResult<RouteInfo> routeDiff = curLp.compareRoutes(newLp); routeDiff = curLp.compareRoutes(newLp); dnsDiff = curLp.compareDnses(newLp); dnsDiff = curLp.compareDnses(newLp); } else if (newLp != null) { routeDiff.added = newLp.getRoutes(); dnsDiff.added = newLp.getDnses(); } for (RouteInfo r : routeDiff.removed) { for (RouteInfo r : routeDiff.removed) { if (isLinkDefault || ! r.isDefaultRoute()) { if (isLinkDefault || ! r.isDefaultRoute()) { removeRoute(curLp, r); removeRoute(curLp, r); } } } } routesToAdd = routeDiff.added; } if (newLp != null) { // if we didn't get a diff from cur -> new, then just use the new if (routesToAdd == null) { routesToAdd = newLp.getRoutes(); } for (RouteInfo r : routesToAdd) { for (RouteInfo r : routeDiff.added) { if (isLinkDefault || ! r.isDefaultRoute()) { if (isLinkDefault || ! r.isDefaultRoute()) { addRoute(newLp, r); addRoute(newLp, r); } } } } } if (!isLinkDefault) { if (!isLinkDefault) { // handle DNS routes // handle DNS routes Collection<InetAddress> dnsToAdd = null; if (routeDiff.removed.size() == 0 && routeDiff.added.size() == 0) { if (dnsDiff != null) { // no change in routes, check for change in dns themselves dnsToAdd = dnsDiff.added; for (InetAddress oldDns : dnsDiff.removed) { for (InetAddress dnsAddress : dnsDiff.removed) { removeRouteToAddress(curLp, oldDns); removeRoute(curLp, RouteInfo.makeHostRoute(dnsAddress)); } for (InetAddress newDns : dnsDiff.added) { addRouteToAddress(newLp, newDns); } } else { // routes changed - remove all old dns entries and add new if (curLp != null) { for (InetAddress oldDns : curLp.getDnses()) { removeRouteToAddress(curLp, oldDns); } } } } if (newLp != null) { if (newLp != null) { if (dnsToAdd == null) { for (InetAddress newDns : newLp.getDnses()) { dnsToAdd = newLp.getDnses(); addRouteToAddress(newLp, newDns); } } for(InetAddress dnsAddress : dnsToAdd) { addRoute(newLp, RouteInfo.makeHostRoute(dnsAddress)); } } } } } } Loading