Loading core/java/android/net/IConnectivityManager.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.ResultReceiver; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; /** /** Loading Loading @@ -116,6 +117,8 @@ interface IConnectivityManager LegacyVpnInfo getLegacyVpnInfo(); LegacyVpnInfo getLegacyVpnInfo(); VpnInfo[] getAllVpnInfo(); boolean updateLockdownVpn(); boolean updateLockdownVpn(); void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal); void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal); Loading core/java/com/android/internal/net/VpnInfo.aidl 0 → 100644 +19 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.net; parcelable VpnInfo; core/java/com/android/internal/net/VpnInfo.java 0 → 100644 +69 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.internal.net; import android.os.Parcel; import android.os.Parcelable; /** * A lightweight container used to carry information of the ongoing VPN. * Internal use only.. * * @hide */ public class VpnInfo implements Parcelable { public int ownerUid; public String vpnIface; public String primaryUnderlyingIface; @Override public String toString() { return "VpnInfo{" + "ownerUid=" + ownerUid + ", vpnIface='" + vpnIface + '\'' + ", primaryUnderlyingIface='" + primaryUnderlyingIface + '\'' + '}'; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(ownerUid); dest.writeString(vpnIface); dest.writeString(primaryUnderlyingIface); } public static final Parcelable.Creator<VpnInfo> CREATOR = new Parcelable.Creator<VpnInfo>() { @Override public VpnInfo createFromParcel(Parcel source) { VpnInfo info = new VpnInfo(); info.ownerUid = source.readInt(); info.vpnIface = source.readString(); info.primaryUnderlyingIface = source.readString(); return info; } @Override public VpnInfo[] newArray(int size) { return new VpnInfo[size]; } }; } services/core/java/com/android/server/ConnectivityService.java +58 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.net.ConnectivityManager.isNetworkTypeValid; import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.Notification; import android.app.Notification; import android.app.NotificationManager; import android.app.NotificationManager; Loading Loading @@ -100,6 +101,7 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.DctConstants; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; Loading Loading @@ -2978,7 +2980,6 @@ public class ConnectivityService extends IConnectivityManager.Stub * Return the information of the ongoing legacy VPN. This method is used * Return the information of the ongoing legacy VPN. This method is used * by VpnSettings and not available in ConnectivityManager. Permissions * by VpnSettings and not available in ConnectivityManager. Permissions * are checked in Vpn class. * are checked in Vpn class. * @hide */ */ @Override @Override public LegacyVpnInfo getLegacyVpnInfo() { public LegacyVpnInfo getLegacyVpnInfo() { Loading @@ -2989,6 +2990,56 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } } /** * Return the information of all ongoing VPNs. This method is used by NetworkStatsService * and not available in ConnectivityManager. */ @Override public VpnInfo[] getAllVpnInfo() { enforceConnectivityInternalPermission(); if (mLockdownEnabled) { return new VpnInfo[0]; } synchronized(mVpns) { List<VpnInfo> infoList = new ArrayList<>(); for (int i = 0; i < mVpns.size(); i++) { VpnInfo info = createVpnInfo(mVpns.valueAt(i)); if (info != null) { infoList.add(info); } } return infoList.toArray(new VpnInfo[infoList.size()]); } } /** * @return VPN information for accounting, or null if we can't retrieve all required * information, e.g primary underlying iface. */ @Nullable private VpnInfo createVpnInfo(Vpn vpn) { VpnInfo info = vpn.getVpnInfo(); if (info == null) { return null; } Network[] underlyingNetworks = vpn.getUnderlyingNetworks(); // see VpnService.setUnderlyingNetworks()'s javadoc about how to interpret // the underlyingNetworks list. if (underlyingNetworks == null) { NetworkAgentInfo defaultNetwork = getDefaultNetwork(); if (defaultNetwork != null && defaultNetwork.linkProperties != null) { info.primaryUnderlyingIface = getDefaultNetwork().linkProperties.getInterfaceName(); } } else if (underlyingNetworks.length > 0) { LinkProperties linkProperties = getLinkProperties(underlyingNetworks[0]); if (linkProperties != null) { info.primaryUnderlyingIface = linkProperties.getInterfaceName(); } } return info.primaryUnderlyingIface == null ? null : info; } /** /** * Returns the information of the ongoing VPN. This method is used by VpnDialogs and * Returns the information of the ongoing VPN. This method is used by VpnDialogs and * not available in ConnectivityManager. * not available in ConnectivityManager. Loading Loading @@ -4512,8 +4563,13 @@ public class ConnectivityService extends IConnectivityManager.Stub public boolean setUnderlyingNetworksForVpn(Network[] networks) { public boolean setUnderlyingNetworksForVpn(Network[] networks) { throwIfLockdownEnabled(); throwIfLockdownEnabled(); int user = UserHandle.getUserId(Binder.getCallingUid()); int user = UserHandle.getUserId(Binder.getCallingUid()); boolean success; synchronized (mVpns) { synchronized (mVpns) { return mVpns.get(user).setUnderlyingNetworks(networks); success = mVpns.get(user).setUnderlyingNetworks(networks); } if (success) { notifyIfacesChanged(); } } return success; } } } } services/core/java/com/android/server/connectivity/Vpn.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; import com.android.server.net.BaseNetworkObserver; import com.android.server.net.BaseNetworkObserver; Loading Loading @@ -808,6 +809,21 @@ public class Vpn { return mConfig.underlyingNetworks; return mConfig.underlyingNetworks; } } /** * This method should only be called by ConnectivityService. Because it doesn't * have enough data to fill VpnInfo.primaryUnderlyingIface field. */ public synchronized VpnInfo getVpnInfo() { if (!isRunningLocked()) { return null; } VpnInfo info = new VpnInfo(); info.ownerUid = mOwnerUID; info.vpnIface = mInterface; return info; } public synchronized boolean appliesToUid(int uid) { public synchronized boolean appliesToUid(int uid) { if (!isRunningLocked()) { if (!isRunningLocked()) { return false; return false; Loading Loading
core/java/android/net/IConnectivityManager.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.ResultReceiver; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; /** /** Loading Loading @@ -116,6 +117,8 @@ interface IConnectivityManager LegacyVpnInfo getLegacyVpnInfo(); LegacyVpnInfo getLegacyVpnInfo(); VpnInfo[] getAllVpnInfo(); boolean updateLockdownVpn(); boolean updateLockdownVpn(); void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal); void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal); Loading
core/java/com/android/internal/net/VpnInfo.aidl 0 → 100644 +19 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.net; parcelable VpnInfo;
core/java/com/android/internal/net/VpnInfo.java 0 → 100644 +69 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.internal.net; import android.os.Parcel; import android.os.Parcelable; /** * A lightweight container used to carry information of the ongoing VPN. * Internal use only.. * * @hide */ public class VpnInfo implements Parcelable { public int ownerUid; public String vpnIface; public String primaryUnderlyingIface; @Override public String toString() { return "VpnInfo{" + "ownerUid=" + ownerUid + ", vpnIface='" + vpnIface + '\'' + ", primaryUnderlyingIface='" + primaryUnderlyingIface + '\'' + '}'; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(ownerUid); dest.writeString(vpnIface); dest.writeString(primaryUnderlyingIface); } public static final Parcelable.Creator<VpnInfo> CREATOR = new Parcelable.Creator<VpnInfo>() { @Override public VpnInfo createFromParcel(Parcel source) { VpnInfo info = new VpnInfo(); info.ownerUid = source.readInt(); info.vpnIface = source.readString(); info.primaryUnderlyingIface = source.readString(); return info; } @Override public VpnInfo[] newArray(int size) { return new VpnInfo[size]; } }; }
services/core/java/com/android/server/ConnectivityService.java +58 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.net.ConnectivityManager.isNetworkTypeValid; import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.Notification; import android.app.Notification; import android.app.NotificationManager; import android.app.NotificationManager; Loading Loading @@ -100,6 +101,7 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.DctConstants; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; Loading Loading @@ -2978,7 +2980,6 @@ public class ConnectivityService extends IConnectivityManager.Stub * Return the information of the ongoing legacy VPN. This method is used * Return the information of the ongoing legacy VPN. This method is used * by VpnSettings and not available in ConnectivityManager. Permissions * by VpnSettings and not available in ConnectivityManager. Permissions * are checked in Vpn class. * are checked in Vpn class. * @hide */ */ @Override @Override public LegacyVpnInfo getLegacyVpnInfo() { public LegacyVpnInfo getLegacyVpnInfo() { Loading @@ -2989,6 +2990,56 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } } /** * Return the information of all ongoing VPNs. This method is used by NetworkStatsService * and not available in ConnectivityManager. */ @Override public VpnInfo[] getAllVpnInfo() { enforceConnectivityInternalPermission(); if (mLockdownEnabled) { return new VpnInfo[0]; } synchronized(mVpns) { List<VpnInfo> infoList = new ArrayList<>(); for (int i = 0; i < mVpns.size(); i++) { VpnInfo info = createVpnInfo(mVpns.valueAt(i)); if (info != null) { infoList.add(info); } } return infoList.toArray(new VpnInfo[infoList.size()]); } } /** * @return VPN information for accounting, or null if we can't retrieve all required * information, e.g primary underlying iface. */ @Nullable private VpnInfo createVpnInfo(Vpn vpn) { VpnInfo info = vpn.getVpnInfo(); if (info == null) { return null; } Network[] underlyingNetworks = vpn.getUnderlyingNetworks(); // see VpnService.setUnderlyingNetworks()'s javadoc about how to interpret // the underlyingNetworks list. if (underlyingNetworks == null) { NetworkAgentInfo defaultNetwork = getDefaultNetwork(); if (defaultNetwork != null && defaultNetwork.linkProperties != null) { info.primaryUnderlyingIface = getDefaultNetwork().linkProperties.getInterfaceName(); } } else if (underlyingNetworks.length > 0) { LinkProperties linkProperties = getLinkProperties(underlyingNetworks[0]); if (linkProperties != null) { info.primaryUnderlyingIface = linkProperties.getInterfaceName(); } } return info.primaryUnderlyingIface == null ? null : info; } /** /** * Returns the information of the ongoing VPN. This method is used by VpnDialogs and * Returns the information of the ongoing VPN. This method is used by VpnDialogs and * not available in ConnectivityManager. * not available in ConnectivityManager. Loading Loading @@ -4512,8 +4563,13 @@ public class ConnectivityService extends IConnectivityManager.Stub public boolean setUnderlyingNetworksForVpn(Network[] networks) { public boolean setUnderlyingNetworksForVpn(Network[] networks) { throwIfLockdownEnabled(); throwIfLockdownEnabled(); int user = UserHandle.getUserId(Binder.getCallingUid()); int user = UserHandle.getUserId(Binder.getCallingUid()); boolean success; synchronized (mVpns) { synchronized (mVpns) { return mVpns.get(user).setUnderlyingNetworks(networks); success = mVpns.get(user).setUnderlyingNetworks(networks); } if (success) { notifyIfacesChanged(); } } return success; } } } }
services/core/java/com/android/server/connectivity/Vpn.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; import com.android.internal.net.VpnProfile; import com.android.internal.net.VpnProfile; import com.android.server.net.BaseNetworkObserver; import com.android.server.net.BaseNetworkObserver; Loading Loading @@ -808,6 +809,21 @@ public class Vpn { return mConfig.underlyingNetworks; return mConfig.underlyingNetworks; } } /** * This method should only be called by ConnectivityService. Because it doesn't * have enough data to fill VpnInfo.primaryUnderlyingIface field. */ public synchronized VpnInfo getVpnInfo() { if (!isRunningLocked()) { return null; } VpnInfo info = new VpnInfo(); info.ownerUid = mOwnerUID; info.vpnIface = mInterface; return info; } public synchronized boolean appliesToUid(int uid) { public synchronized boolean appliesToUid(int uid) { if (!isRunningLocked()) { if (!isRunningLocked()) { return false; return false; Loading