Specify netId when adding/removing routes.
Change-Id: I07fd950aee726e9721153f75c3e4c10d8e19d8e9
This commit is contained in:
committed by
Lorenzo Colitti
parent
a5c33ff4f2
commit
a5b0928e5a
@@ -1691,7 +1691,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
final long token = Binder.clearCallingIdentity();
|
final long token = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
LinkProperties lp = tracker.getLinkProperties();
|
LinkProperties lp = tracker.getLinkProperties();
|
||||||
boolean ok = addRouteToAddress(lp, addr, exempt);
|
boolean ok = addRouteToAddress(lp, addr, exempt, tracker.getNetwork().netId);
|
||||||
if (DBG) log("requestRouteToHostAddress ok=" + ok);
|
if (DBG) log("requestRouteToHostAddress ok=" + ok);
|
||||||
return ok;
|
return ok;
|
||||||
} finally {
|
} finally {
|
||||||
@@ -1700,24 +1700,25 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean addRoute(LinkProperties p, RouteInfo r, boolean toDefaultTable,
|
private boolean addRoute(LinkProperties p, RouteInfo r, boolean toDefaultTable,
|
||||||
boolean exempt) {
|
boolean exempt, int netId) {
|
||||||
return modifyRoute(p, r, 0, ADD, toDefaultTable, exempt);
|
return modifyRoute(p, r, 0, ADD, toDefaultTable, exempt, netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean removeRoute(LinkProperties p, RouteInfo r, boolean toDefaultTable) {
|
private boolean removeRoute(LinkProperties p, RouteInfo r, boolean toDefaultTable, int netId) {
|
||||||
return modifyRoute(p, r, 0, REMOVE, toDefaultTable, UNEXEMPT);
|
return modifyRoute(p, r, 0, REMOVE, toDefaultTable, UNEXEMPT, netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean addRouteToAddress(LinkProperties lp, InetAddress addr, boolean exempt) {
|
private boolean addRouteToAddress(LinkProperties lp, InetAddress addr, boolean exempt,
|
||||||
return modifyRouteToAddress(lp, addr, ADD, TO_DEFAULT_TABLE, exempt);
|
int netId) {
|
||||||
|
return modifyRouteToAddress(lp, addr, ADD, TO_DEFAULT_TABLE, exempt, netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean removeRouteToAddress(LinkProperties lp, InetAddress addr) {
|
private boolean removeRouteToAddress(LinkProperties lp, InetAddress addr, int netId) {
|
||||||
return modifyRouteToAddress(lp, addr, REMOVE, TO_DEFAULT_TABLE, UNEXEMPT);
|
return modifyRouteToAddress(lp, addr, REMOVE, TO_DEFAULT_TABLE, UNEXEMPT, netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean modifyRouteToAddress(LinkProperties lp, InetAddress addr, boolean doAdd,
|
private boolean modifyRouteToAddress(LinkProperties lp, InetAddress addr, boolean doAdd,
|
||||||
boolean toDefaultTable, boolean exempt) {
|
boolean toDefaultTable, boolean exempt, int netId) {
|
||||||
RouteInfo bestRoute = RouteInfo.selectBestRoute(lp.getAllRoutes(), addr);
|
RouteInfo bestRoute = RouteInfo.selectBestRoute(lp.getAllRoutes(), addr);
|
||||||
if (bestRoute == null) {
|
if (bestRoute == null) {
|
||||||
bestRoute = RouteInfo.makeHostRoute(addr, lp.getInterfaceName());
|
bestRoute = RouteInfo.makeHostRoute(addr, lp.getInterfaceName());
|
||||||
@@ -1732,11 +1733,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
bestRoute = RouteInfo.makeHostRoute(addr, bestRoute.getGateway(), iface);
|
bestRoute = RouteInfo.makeHostRoute(addr, bestRoute.getGateway(), iface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return modifyRoute(lp, bestRoute, 0, doAdd, toDefaultTable, exempt);
|
return modifyRoute(lp, bestRoute, 0, doAdd, toDefaultTable, exempt, netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean modifyRoute(LinkProperties lp, RouteInfo r, int cycleCount, boolean doAdd,
|
private boolean modifyRoute(LinkProperties lp, RouteInfo r, int cycleCount, boolean doAdd,
|
||||||
boolean toDefaultTable, boolean exempt) {
|
boolean toDefaultTable, boolean exempt, int netId) {
|
||||||
if ((lp == null) || (r == null)) {
|
if ((lp == null) || (r == null)) {
|
||||||
if (DBG) log("modifyRoute got unexpected null: " + lp + ", " + r);
|
if (DBG) log("modifyRoute got unexpected null: " + lp + ", " + r);
|
||||||
return false;
|
return false;
|
||||||
@@ -1765,7 +1766,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
bestRoute.getGateway(),
|
bestRoute.getGateway(),
|
||||||
ifaceName);
|
ifaceName);
|
||||||
}
|
}
|
||||||
modifyRoute(lp, bestRoute, cycleCount+1, doAdd, toDefaultTable, exempt);
|
modifyRoute(lp, bestRoute, cycleCount+1, doAdd, toDefaultTable, exempt, netId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (doAdd) {
|
if (doAdd) {
|
||||||
@@ -1775,7 +1776,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
synchronized (mRoutesLock) {
|
synchronized (mRoutesLock) {
|
||||||
// only track default table - only one apps can effect
|
// only track default table - only one apps can effect
|
||||||
mAddedRoutes.add(r);
|
mAddedRoutes.add(r);
|
||||||
mNetd.addRoute(ifaceName, r);
|
mNetd.addRoute(netId, r);
|
||||||
if (exempt) {
|
if (exempt) {
|
||||||
LinkAddress dest = r.getDestination();
|
LinkAddress dest = r.getDestination();
|
||||||
if (!mExemptAddresses.contains(dest)) {
|
if (!mExemptAddresses.contains(dest)) {
|
||||||
@@ -1785,7 +1786,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mNetd.addSecondaryRoute(ifaceName, r);
|
mNetd.addRoute(netId, r);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// never crash - catch them all
|
// never crash - catch them all
|
||||||
@@ -1801,7 +1802,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
if (mAddedRoutes.contains(r) == false) {
|
if (mAddedRoutes.contains(r) == false) {
|
||||||
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
||||||
try {
|
try {
|
||||||
mNetd.removeRoute(ifaceName, r);
|
mNetd.removeRoute(netId, r);
|
||||||
LinkAddress dest = r.getDestination();
|
LinkAddress dest = r.getDestination();
|
||||||
if (mExemptAddresses.contains(dest)) {
|
if (mExemptAddresses.contains(dest)) {
|
||||||
mNetd.clearHostExemption(dest);
|
mNetd.clearHostExemption(dest);
|
||||||
@@ -1819,7 +1820,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
} else {
|
} else {
|
||||||
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
||||||
try {
|
try {
|
||||||
mNetd.removeSecondaryRoute(ifaceName, r);
|
mNetd.removeRoute(netId, r);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// never crash - catch them all
|
// never crash - catch them all
|
||||||
if (VDBG) loge("Exception trying to remove a route: " + e);
|
if (VDBG) loge("Exception trying to remove a route: " + e);
|
||||||
@@ -2608,7 +2609,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mCurrentLinkProperties[netType] = newLp;
|
mCurrentLinkProperties[netType] = newLp;
|
||||||
boolean resetDns = updateRoutes(newLp, curLp, mNetConfigs[netType].isDefault(), exempt);
|
boolean resetDns = updateRoutes(newLp, curLp, mNetConfigs[netType].isDefault(), exempt,
|
||||||
|
mNetTrackers[netType].getNetwork().netId);
|
||||||
|
|
||||||
if (resetMask != 0 || resetDns) {
|
if (resetMask != 0 || resetDns) {
|
||||||
if (VDBG) log("handleConnectivityChange: resetting");
|
if (VDBG) log("handleConnectivityChange: resetting");
|
||||||
@@ -2687,7 +2689,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
* returns a boolean indicating the routes changed
|
* returns a boolean indicating the routes changed
|
||||||
*/
|
*/
|
||||||
private boolean updateRoutes(LinkProperties newLp, LinkProperties curLp,
|
private boolean updateRoutes(LinkProperties newLp, LinkProperties curLp,
|
||||||
boolean isLinkDefault, boolean exempt) {
|
boolean isLinkDefault, boolean exempt, int netId) {
|
||||||
Collection<RouteInfo> routesToAdd = null;
|
Collection<RouteInfo> routesToAdd = null;
|
||||||
CompareResult<InetAddress> dnsDiff = new CompareResult<InetAddress>();
|
CompareResult<InetAddress> dnsDiff = new CompareResult<InetAddress>();
|
||||||
CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>();
|
CompareResult<RouteInfo> routeDiff = new CompareResult<RouteInfo>();
|
||||||
@@ -2705,20 +2707,20 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
for (RouteInfo r : routeDiff.removed) {
|
for (RouteInfo r : routeDiff.removed) {
|
||||||
if (isLinkDefault || ! r.isDefaultRoute()) {
|
if (isLinkDefault || ! r.isDefaultRoute()) {
|
||||||
if (VDBG) log("updateRoutes: default remove route r=" + r);
|
if (VDBG) log("updateRoutes: default remove route r=" + r);
|
||||||
removeRoute(curLp, r, TO_DEFAULT_TABLE);
|
removeRoute(curLp, r, TO_DEFAULT_TABLE, netId);
|
||||||
}
|
}
|
||||||
if (isLinkDefault == false) {
|
if (isLinkDefault == false) {
|
||||||
// remove from a secondary route table
|
// remove from a secondary route table
|
||||||
removeRoute(curLp, r, TO_SECONDARY_TABLE);
|
removeRoute(curLp, r, TO_SECONDARY_TABLE, netId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (RouteInfo r : routeDiff.added) {
|
for (RouteInfo r : routeDiff.added) {
|
||||||
if (isLinkDefault || ! r.isDefaultRoute()) {
|
if (isLinkDefault || ! r.isDefaultRoute()) {
|
||||||
addRoute(newLp, r, TO_DEFAULT_TABLE, exempt);
|
addRoute(newLp, r, TO_DEFAULT_TABLE, exempt, netId);
|
||||||
} else {
|
} else {
|
||||||
// add to a secondary route table
|
// add to a secondary route table
|
||||||
addRoute(newLp, r, TO_SECONDARY_TABLE, UNEXEMPT);
|
addRoute(newLp, r, TO_SECONDARY_TABLE, UNEXEMPT, netId);
|
||||||
|
|
||||||
// many radios add a default route even when we don't want one.
|
// many radios add a default route even when we don't want one.
|
||||||
// remove the default route unless somebody else has asked for it
|
// remove the default route unless somebody else has asked for it
|
||||||
@@ -2727,7 +2729,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
if (!TextUtils.isEmpty(ifaceName) && !mAddedRoutes.contains(r)) {
|
if (!TextUtils.isEmpty(ifaceName) && !mAddedRoutes.contains(r)) {
|
||||||
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
if (VDBG) log("Removing " + r + " for interface " + ifaceName);
|
||||||
try {
|
try {
|
||||||
mNetd.removeRoute(ifaceName, r);
|
mNetd.removeRoute(netId, r);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// never crash - catch them all
|
// never crash - catch them all
|
||||||
if (DBG) loge("Exception trying to remove a route: " + e);
|
if (DBG) loge("Exception trying to remove a route: " + e);
|
||||||
@@ -3122,7 +3124,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
// connection will fail until the provisioning network
|
// connection will fail until the provisioning network
|
||||||
// is enabled.
|
// is enabled.
|
||||||
for (RouteInfo r : lp.getRoutes()) {
|
for (RouteInfo r : lp.getRoutes()) {
|
||||||
removeRoute(lp, r, TO_DEFAULT_TABLE);
|
removeRoute(lp, r, TO_DEFAULT_TABLE,
|
||||||
|
mNetTrackers[info.getType()].getNetwork().netId);
|
||||||
}
|
}
|
||||||
} else if (state == NetworkInfo.State.DISCONNECTED) {
|
} else if (state == NetworkInfo.State.DISCONNECTED) {
|
||||||
handleDisconnect(info);
|
handleDisconnect(info);
|
||||||
|
|||||||
Reference in New Issue
Block a user