diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiStateMachine.java | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index c22e9edb0..87e0c3af5 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -138,6 +138,7 @@ import java.util.regex.Pattern; public class WifiStateMachine extends StateMachine { private static final String NETWORKTYPE = "WIFI"; + private static final String NETWORKTYPE_UNTRUSTED = "WIFI_UT"; private static boolean DBG = false; private static boolean VDBG = false; private static boolean VVDBG = false; @@ -407,6 +408,7 @@ public class WifiStateMachine extends StateMachine { private int mConnectionRequests = 0; private WifiNetworkFactory mNetworkFactory; + private UntrustedWifiNetworkFactory mUntrustedNetworkFactory; private WifiNetworkAgent mNetworkAgent; // Keep track of various statistics, for retrieval by System Apps, i.e. under @SystemApi @@ -2436,6 +2438,7 @@ public class WifiStateMachine extends StateMachine { pw.println("mLastSetCountryCode " + mLastSetCountryCode); pw.println("mPersistedCountryCode " + mPersistedCountryCode); mNetworkFactory.dump(fd, pw, args); + mUntrustedNetworkFactory.dump(fd, pw, args); pw.println(); mWifiConfigStore.dump(fd, pw, args); } @@ -4595,9 +4598,6 @@ public class WifiStateMachine extends StateMachine { } private class WifiNetworkFactory extends NetworkFactory { - /** Number of outstanding NetworkRequests for untrusted networks. */ - private int mUntrustedReqCount = 0; - public WifiNetworkFactory(Looper l, Context c, String TAG, NetworkCapabilities f) { super(l, c, TAG, f); } @@ -4605,6 +4605,28 @@ public class WifiStateMachine extends StateMachine { @Override protected void needNetworkFor(NetworkRequest networkRequest, int score) { ++mConnectionRequests; + } + + @Override + protected void releaseNetworkFor(NetworkRequest networkRequest) { + --mConnectionRequests; + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("mConnectionRequests " + mConnectionRequests); + } + + } + + private class UntrustedWifiNetworkFactory extends NetworkFactory { + private int mUntrustedReqCount; + + public UntrustedWifiNetworkFactory(Looper l, Context c, String tag, NetworkCapabilities f) { + super(l, c, tag, f); + } + + @Override + protected void needNetworkFor(NetworkRequest networkRequest, int score) { if (!networkRequest.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_TRUSTED)) { if (++mUntrustedReqCount == 1) { @@ -4615,7 +4637,6 @@ public class WifiStateMachine extends StateMachine { @Override protected void releaseNetworkFor(NetworkRequest networkRequest) { - --mConnectionRequests; if (!networkRequest.networkCapabilities.hasCapability( NetworkCapabilities.NET_CAPABILITY_TRUSTED)) { if (--mUntrustedReqCount == 0) { @@ -4625,10 +4646,8 @@ public class WifiStateMachine extends StateMachine { } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("mConnectionRequests " + mConnectionRequests); pw.println("mUntrustedReqCount " + mUntrustedReqCount); } - } void maybeRegisterNetworkFactory() { @@ -4639,6 +4658,13 @@ public class WifiStateMachine extends StateMachine { NETWORKTYPE, mNetworkCapabilitiesFilter); mNetworkFactory.setScoreFilter(60); mNetworkFactory.register(); + + // We can't filter untrusted network in the capabilities filter because a trusted + // network would still satisfy a request that accepts untrusted ones. + mUntrustedNetworkFactory = new UntrustedWifiNetworkFactory(getHandler().getLooper(), + mContext, NETWORKTYPE_UNTRUSTED, mNetworkCapabilitiesFilter); + mUntrustedNetworkFactory.setScoreFilter(Integer.MAX_VALUE); + mUntrustedNetworkFactory.register(); } } } |