diff options
| -rwxr-xr-x | core/res/res/values/config.xml | 8 | ||||
| -rw-r--r-- | services/java/com/android/server/ConnectivityService.java | 26 |
2 files changed, 33 insertions, 1 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 843259dd7589..f49be427d119 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -115,6 +115,14 @@ <item>"mobile_cbs,12,0,2,60000,true"</item> </string-array> + <!-- Array of ConnectivityManager.TYPE_xxxx constants for networks that may only + be controlled by systemOrSignature apps. --> + <integer-array translatable="false" name="config_protectedNetworks"> + <item>10</item> + <item>11</item> + <item>12</item> + </integer-array> + <!-- This string array should be overridden by the device to present a list of radio attributes. This is used by the connectivity manager to decide which networks can coexist based on the hardware --> diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index a8ddc152240a..e11190f99c90 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -250,6 +250,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { } RadioAttributes[] mRadioAttributes; + // the set of network types that can only be enabled by system/sig apps + List mProtectedNetworks; + public static synchronized ConnectivityService getInstance(Context context) { if (sServiceInstance == null) { sServiceInstance = new ConnectivityService(context); @@ -349,6 +352,17 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } + mProtectedNetworks = new ArrayList<Integer>(); + int[] protectedNetworks = context.getResources().getIntArray( + com.android.internal.R.array.config_protectedNetworks); + for (int p : protectedNetworks) { + if ((mNetConfigs[p] != null) && (mProtectedNetworks.contains(p) == false)) { + mProtectedNetworks.add(p); + } else { + if (DBG) loge("Ignoring protectedNetwork " + p); + } + } + // high priority first mPriorityList = new int[mNetworksDefined]; { @@ -678,6 +692,11 @@ public class ConnectivityService extends IConnectivityManager.Stub { usedNetworkType = networkType; } } + + if (mProtectedNetworks.contains(usedNetworkType)) { + enforceConnectivityInternalPermission(); + } + NetworkStateTracker network = mNetTrackers[usedNetworkType]; if (network != null) { Integer currentPid = new Integer(getCallingPid()); @@ -888,6 +907,10 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ public boolean requestRouteToHostAddress(int networkType, byte[] hostAddress) { enforceChangePermission(); + if (mProtectedNetworks.contains(networkType)) { + enforceConnectivityInternalPermission(); + } + if (!ConnectivityManager.isNetworkTypeValid(networkType)) { return false; } @@ -1005,7 +1028,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public void setDataDependency(int networkType, boolean met) { - enforceChangePermission(); + enforceConnectivityInternalPermission(); + if (DBG) { log("setDataDependency(" + networkType + ", " + met + ")"); } |