diff options
Diffstat (limited to 'services/java/com/android/server/ConnectivityService.java')
-rw-r--r-- | services/java/com/android/server/ConnectivityService.java | 98 |
1 files changed, 75 insertions, 23 deletions
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index e6f443a..41450d2 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -44,7 +44,6 @@ import android.net.NetworkUtils; import android.net.Proxy; import android.net.ProxyProperties; import android.net.RouteInfo; -import android.net.vpn.VpnManager; import android.net.wifi.WifiStateTracker; import android.os.Binder; import android.os.FileUtils; @@ -65,6 +64,7 @@ import android.util.EventLog; import android.util.Slog; import android.util.SparseIntArray; +import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.telephony.Phone; import com.android.server.connectivity.Tethering; @@ -131,8 +131,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { */ private List mNetRequestersPids[]; - private WifiWatchdogService mWifiWatchdogService; - // priority order of the nettrackers // (excluding dynamically set mNetworkPreference) // TODO - move mNetworkTypePreference into this @@ -278,6 +276,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 ConnectivityService( Context context, INetworkManagementService netd, INetworkPolicyManager policyManager) { if (DBG) log("ConnectivityService starting up"); @@ -381,6 +382,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]; { @@ -432,10 +444,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { wifiService.checkAndStartWifi(); mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst; wst.startMonitoring(context, mHandler); - - //TODO: as part of WWS refactor, create only when needed - mWifiWatchdogService = new WifiWatchdogService(context); - break; case ConnectivityManager.TYPE_MOBILE: mNetTrackers[netType] = new MobileDataStateTracker(netType, @@ -488,11 +496,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { mSettingsObserver.observe(mContext); loadGlobalProxy(); - - VpnManager.startVpnService(context); } - /** * Sets the preferred network. * @param preference the new preference @@ -802,6 +807,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()); @@ -1012,6 +1022,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; } @@ -1129,7 +1143,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public void setDataDependency(int networkType, boolean met) { - enforceChangePermission(); + enforceConnectivityInternalPermission(); + if (DBG) { log("setDataDependency(" + networkType + ", " + met + ")"); } @@ -1587,11 +1602,23 @@ public class ConnectivityService extends IConnectivityManager.Stub { if (linkProperties != null) { String iface = linkProperties.getInterfaceName(); if (TextUtils.isEmpty(iface) == false) { - if (DBG) log("resetConnections(" + iface + ")"); - NetworkUtils.resetConnections(iface); + if (DBG) { + log("resetConnections(" + iface + ", NetworkUtils.RESET_ALL_ADDRESSES)"); + } + NetworkUtils.resetConnections(iface, NetworkUtils.RESET_ALL_ADDRESSES); } } } + + // TODO: Temporary notifying upstread change to Tethering. + // @see bug/4455071 + /** Notify TetheringService if interface name has been changed. */ + if (TextUtils.equals(mNetTrackers[netType].getNetworkInfo().getReason(), + Phone.REASON_LINK_PROPERTIES_CHANGED)) { + if (isTetheringSupported()) { + mTethering.handleTetherIfaceChange(); + } + } } private void addPrivateDnsRoutes(NetworkStateTracker nt) { @@ -2017,7 +2044,10 @@ public class ConnectivityService extends IConnectivityManager.Stub { break; case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED: info = (NetworkInfo) msg.obj; - handleConnectivityChange(info.getType(), true); + // TODO: Temporary allowing network configuration + // change not resetting sockets. + // @see bug/4455071 + handleConnectivityChange(info.getType(), false); break; case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: String causedBy = null; @@ -2442,8 +2472,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { /** * Protect a socket from VPN routing rules. This method is used by - * VpnBuilder and not available in ConnectivityManager. Permission - * checks are done in Vpn class. + * VpnBuilder and not available in ConnectivityManager. Permissions + * are checked in Vpn class. * @hide */ @Override @@ -2453,20 +2483,20 @@ public class ConnectivityService extends IConnectivityManager.Stub { /** * Prepare for a VPN application. This method is used by VpnDialogs - * and not available in ConnectivityManager. Permission checks are - * done in Vpn class. + * and not available in ConnectivityManager. Permissions are checked + * in Vpn class. * @hide */ @Override - public String prepareVpn(String packageName) { - return mVpn.prepare(packageName); + public boolean prepareVpn(String oldPackage, String newPackage) { + return mVpn.prepare(oldPackage, newPackage); } /** * Configure a TUN interface and return its file descriptor. Parameters * are encoded and opaque to this class. This method is used by VpnBuilder - * and not available in ConnectivityManager. Permission checks are done - * in Vpn class. + * and not available in ConnectivityManager. Permissions are checked in + * Vpn class. * @hide */ @Override @@ -2474,6 +2504,28 @@ public class ConnectivityService extends IConnectivityManager.Stub { return mVpn.establish(config); } + /** + * Start legacy VPN and return an intent to VpnDialogs. This method is + * used by VpnSettings and not available in ConnectivityManager. + * Permissions are checked in Vpn class. + * @hide + */ + @Override + public void startLegacyVpn(VpnConfig config, String[] racoon, String[] mtpd) { + mVpn.startLegacyVpn(config, racoon, mtpd); + } + + /** + * Return the information of the ongoing legacy VPN. This method is used + * by VpnSettings and not available in ConnectivityManager. Permissions + * are checked in Vpn class. + * @hide + */ + @Override + public LegacyVpnInfo getLegacyVpnInfo() { + return mVpn.getLegacyVpnInfo(); + } + private String getDefaultInterface() { if (ConnectivityManager.isNetworkTypeValid(mActiveDefaultNetwork)) { NetworkStateTracker tracker = mNetTrackers[mActiveDefaultNetwork]; @@ -2502,7 +2554,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { private VpnCallback() { } - public synchronized void override(String[] dnsServers) { + public synchronized void override(List<String> dnsServers, List<String> searchDomains) { // TODO: override DNS servers and http proxy. } |