diff options
| -rw-r--r-- | core/res/res/values/config.xml | 7 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 44 |
3 files changed, 36 insertions, 17 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8df8197b221a..39698feba7a4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -284,6 +284,13 @@ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. --> <integer translatable="false" name="config_networkAvoidBadWifi">1</integer> + <!-- If the hardware supports specially marking packets that caused a wakeup of the + main CPU, set this value to the mark used. --> + <integer name="config_networkWakeupPacketMark">0</integer> + + <!-- Mask to use when checking skb mark defined in config_networkWakeupPacketMark above. --> + <integer name="config_networkWakeupPacketMask">0</integer> + <!-- Default value for ConnectivityManager.getMultipathPreference() on metered networks. Actual device behaviour is controlled by Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE. This is the default value of that setting. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 389333a1bb51..d1417664f2ab 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1834,6 +1834,8 @@ <java-symbol type="integer" name="config_networkNotifySwitchType" /> <java-symbol type="array" name="config_networkNotifySwitches" /> <java-symbol type="integer" name="config_networkAvoidBadWifi" /> + <java-symbol type="integer" name="config_networkWakeupPacketMark" /> + <java-symbol type="integer" name="config_networkWakeupPacketMask" /> <java-symbol type="integer" name="config_networkMeteredMultipathPreference" /> <java-symbol type="integer" name="config_notificationsBatteryFullARGB" /> <java-symbol type="integer" name="config_notificationsBatteryLedOff" /> diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index e49241cffeff..9e08ac8bc670 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -210,13 +210,6 @@ public class ConnectivityService extends IConnectivityManager.Stub // See Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS private final int mReleasePendingIntentDelayMs; - // Driver specific constants used to select packets received via - // WiFi that caused the phone to exit sleep state. Currently there - // is only one kernel implementation so we can get away with - // constants. - private static final int mWakeupPacketMark = 0x80000000; - private static final int mWakeupPacketMask = 0x80000000; - private MockableSystemProperties mSystemProperties; private Tethering mTethering; @@ -2282,6 +2275,10 @@ public class ConnectivityService extends IConnectivityManager.Stub notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST); mKeepaliveTracker.handleStopAllKeepalives(nai, ConnectivityManager.PacketKeepalive.ERROR_INVALID_NETWORK); + for (String iface : nai.linkProperties.getAllInterfaceNames()) { + // Disable wakeup packet monitoring for each interface. + wakeupModifyInterface(iface, nai.networkCapabilities, false); + } nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED); mNetworkAgentInfos.remove(msg.replyTo); updateClat(null, nai.linkProperties, nai); @@ -4401,22 +4398,35 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - private void wakeupAddInterface(String iface, NetworkCapabilities caps) throws RemoteException { + private void wakeupModifyInterface(String iface, NetworkCapabilities caps, boolean add) { // Marks are only available on WiFi interaces. Checking for // marks on unsupported interfaces is harmless. if (!caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { return; } - mNetd.getNetdService().wakeupAddInterface( - iface, "iface:" + iface, mWakeupPacketMark, mWakeupPacketMask); - } - private void wakeupDelInterface(String iface, NetworkCapabilities caps) throws RemoteException { - if (!caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + int mark = mContext.getResources().getInteger( + com.android.internal.R.integer.config_networkWakeupPacketMark); + int mask = mContext.getResources().getInteger( + com.android.internal.R.integer.config_networkWakeupPacketMask); + + // Mask/mark of zero will not detect anything interesting. + // Don't install rules unless both values are nonzero. + if (mark == 0 || mask == 0) { return; } - mNetd.getNetdService().wakeupDelInterface( - iface, "iface:" + iface, mWakeupPacketMark, mWakeupPacketMask); + + final String prefix = "iface:" + iface; + try { + if (add) { + mNetd.getNetdService().wakeupAddInterface(iface, prefix, mark, mask); + } else { + mNetd.getNetdService().wakeupDelInterface(iface, prefix, mark, mask); + } + } catch (Exception e) { + loge("Exception modifying wakeup packet monitoring: " + e); + } + } private void updateInterfaces(LinkProperties newLp, LinkProperties oldLp, int netId, @@ -4431,7 +4441,7 @@ public class ConnectivityService extends IConnectivityManager.Stub try { if (DBG) log("Adding iface " + iface + " to network " + netId); mNetd.addInterfaceToNetwork(iface, netId); - wakeupAddInterface(iface, caps); + wakeupModifyInterface(iface, caps, true); } catch (Exception e) { loge("Exception adding interface: " + e); } @@ -4439,8 +4449,8 @@ public class ConnectivityService extends IConnectivityManager.Stub for (String iface : interfaceDiff.removed) { try { if (DBG) log("Removing iface " + iface + " from network " + netId); + wakeupModifyInterface(iface, caps, false); mNetd.removeInterfaceFromNetwork(iface, netId); - wakeupDelInterface(iface, caps); } catch (Exception e) { loge("Exception removing interface: " + e); } |