HomeSP.java revision 1d5cd3938f9191184cd9aea3059a3b62bf3a0372
16a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpackage com.android.server.wifi.hotspot2.pps; 26a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport android.util.Log; 477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 507a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvistimport com.android.server.wifi.SIMAccessor; 66a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.ANQPElement; 707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvistimport com.android.server.wifi.anqp.CellularNetwork; 81d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.anqp.Constants; 96a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.DomainNameElement; 106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.NAIRealmElement; 116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.RoamingConsortiumElement; 126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.ThreeGPPNetworkElement; 1371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.AuthMatch; 1477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport com.android.server.wifi.hotspot2.NetworkDetail; 156a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.hotspot2.PasspointMatch; 1671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.Utils; 176a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.ArrayList; 1905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvistimport java.util.Collection; 2077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.Collections; 2177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.HashSet; 226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.List; 236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Map; 246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Set; 256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.ANQPElementType; 276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 286a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class HomeSP { 2977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist private final Map<String, Long> mSSIDs; // SSID, HESSID, [0,N] 3071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist private final String mFQDN; 316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final DomainMatcher mDomainMatcher; 3205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist private final Set<String> mOtherHomePartners; 33a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist private final HashSet<Long> mRoamingConsortiums; // [0,N] 346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final Set<Long> mMatchAnyOIs; // [0,N] 356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final List<Long> mMatchAllOIs; // [0,N] 366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 3771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist private final Credential mCredential; 386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist // Informational: 406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final String mFriendlyName; // [1] 416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final String mIconURL; // [0,1] 426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 431d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Policy mPolicy; 441d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final int mCredentialPriority; 451d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Map<String, String> mAAATrustRoots; 461d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final UpdateInfo mSubscriptionUpdate; 471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final SubscriptionParameters mSubscriptionParameters; 481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist @Deprecated 5077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist public HomeSP(Map<String, Long> ssidMap, 516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ String fqdn, 52a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist /*@NotNull*/ HashSet<Long> roamingConsortiums, 536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ Set<String> otherHomePartners, 546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ Set<Long> matchAnyOIs, 556a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ List<Long> matchAllOIs, 566a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist String friendlyName, 576a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist String iconURL, 5871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist Credential credential) { 596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mSSIDs = ssidMap; 61c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist List<List<String>> otherPartners = new ArrayList<>(otherHomePartners.size()); 626a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist for (String otherPartner : otherHomePartners) { 6371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist otherPartners.add(Utils.splitDomain(otherPartner)); 646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 6505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mOtherHomePartners = otherHomePartners; 6671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mFQDN = fqdn; 6771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners); 686a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mRoamingConsortiums = roamingConsortiums; 696a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mMatchAnyOIs = matchAnyOIs; 706a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mMatchAllOIs = matchAllOIs; 716a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mFriendlyName = friendlyName; 726a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mIconURL = iconURL; 7371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mCredential = credential; 741d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 751d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPolicy = null; 761d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredentialPriority = -1; 771d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mAAATrustRoots = null; 781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionUpdate = null; 791d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionParameters = null; 806a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 816a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 821d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public HomeSP(Map<String, Long> ssidMap, 831d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ String fqdn, 841d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ HashSet<Long> roamingConsortiums, 851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ Set<String> otherHomePartners, 861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ Set<Long> matchAnyOIs, 871d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ List<Long> matchAllOIs, 881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist String friendlyName, 891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist String iconURL, 901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Credential credential, 911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Policy policy, 931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist int credentialPriority, 941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Map<String, String> AAATrustRoots, 951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist UpdateInfo subscriptionUpdate, 961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist SubscriptionParameters subscriptionParameters) { 971d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 981d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSSIDs = ssidMap; 991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist List<List<String>> otherPartners = new ArrayList<>(otherHomePartners.size()); 1001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (String otherPartner : otherHomePartners) { 1011d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist otherPartners.add(Utils.splitDomain(otherPartner)); 102820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist } 1031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mOtherHomePartners = otherHomePartners; 1041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mFQDN = fqdn; 1051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners); 1061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mRoamingConsortiums = roamingConsortiums; 1071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMatchAnyOIs = matchAnyOIs; 1081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMatchAllOIs = matchAllOIs; 1091d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mFriendlyName = friendlyName; 1101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mIconURL = iconURL; 1111d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredential = credential; 1121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1131d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPolicy = policy; 1141d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredentialPriority = credentialPriority; 1151d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mAAATrustRoots = AAATrustRoots; 1161d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionUpdate = subscriptionUpdate; 1171d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionParameters = subscriptionParameters; 1181d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1191d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1201d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public UpdateInfo getSubscriptionUpdate() { 1211d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mSubscriptionUpdate; 1221d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1231d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1241d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public Policy getPolicy() { 1251d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mPolicy; 126820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist } 127820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist 12877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist public PasspointMatch match(NetworkDetail networkDetail, 129a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist Map<ANQPElementType, ANQPElement> anqpElementMap, 13007a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist SIMAccessor simAccessor) { 1316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 13207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist List<String> imsis = simAccessor.getMatchingImsis(mCredential.getImsi()); 133866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 13407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist PasspointMatch spMatch = matchSP(networkDetail, anqpElementMap, imsis); 135866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 136c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist if (spMatch == PasspointMatch.Incomplete || spMatch == PasspointMatch.Declined) { 13707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return spMatch; 138866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 13907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 14007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsiMatch(imsis, (ThreeGPPNetworkElement) 14107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist anqpElementMap.get(ANQPElementType.ANQP3GPPNetwork)) != null) { 142c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // PLMN match, promote sp match to roaming if necessary. 143c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch; 144866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 14507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 14607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist NAIRealmElement naiRealmElement = 14707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist (NAIRealmElement) anqpElementMap.get(ANQPElementType.ANQPNAIRealm); 14807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 149c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist int authMatch = naiRealmElement != null ? 150c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist naiRealmElement.match(mCredential) : 151c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist AuthMatch.Indeterminate; 152c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist 15307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist Log.d(Utils.hs2LogTag(getClass()), networkDetail.toKeyString() + " match on " + mFQDN + 154c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist ": " + spMatch + ", auth " + AuthMatch.toString(authMatch)); 155c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist 156c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist if (authMatch == AuthMatch.None) { 157c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // Distinct auth mismatch, demote authentication. 158c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return PasspointMatch.None; 159c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 160c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist else if ((authMatch & AuthMatch.Realm) == 0) { 161c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // No realm match, return sp match as is. 162c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch; 163c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 164c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist else { 165c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // Realm match, promote sp match to roaming if necessary. 166c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch; 167c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 168866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 169866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 170866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist public PasspointMatch matchSP(NetworkDetail networkDetail, 171866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist Map<ANQPElementType, ANQPElement> anqpElementMap, 17207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist List<String> imsis) { 173866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 17477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (mSSIDs.containsKey(networkDetail.getSSID())) { 17577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist Long hessid = mSSIDs.get(networkDetail.getSSID()); 17677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (hessid == null || networkDetail.getHESSID() == hessid) { 1771c03d75c73b9f5fa24a795a0d546f4f56b82ab9bJan Nordqvist Log.d(Utils.hs2LogTag(getClass()), "match SSID"); 1786a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.HomeProvider; 1796a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1806a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1816a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 18203a529ae85d526110f2a715168739618f0775493Jan Nordqvist Set<Long> anOIs = new HashSet<>(); 1836a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 18477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (networkDetail.getRoamingConsortiums() != null) { 18577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist for (long oi : networkDetail.getRoamingConsortiums()) { 18677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist anOIs.add(oi); 1876a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist boolean validANQP = anqpElementMap != null && 1911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Constants.hasBaseANQPElements(anqpElementMap.keySet()); 1921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist RoamingConsortiumElement rcElement = validANQP ? 19477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist (RoamingConsortiumElement) anqpElementMap.get(ANQPElementType.ANQPRoamingConsortium) 19577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist : null; 19677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (rcElement != null) { 19777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist anOIs.addAll(rcElement.getOIs()); 1986a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1996a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 200866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // It may seem reasonable to check for home provider match prior to checking for roaming 201866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // relationship, but it is possible to avoid an ANQP query if it turns out that the 202866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // "match all" rule fails based only on beacon info only. 203866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist boolean roamingMatch = false; 20471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 20577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (!mMatchAllOIs.isEmpty()) { 20677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist boolean matchesAll = true; 20777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 20877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist for (long spOI : mMatchAllOIs) { 20977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (!anOIs.contains(spOI)) { 21077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist matchesAll = false; 21177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist break; 2126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 21477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (matchesAll) { 215866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist roamingMatch = true; 21677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 21777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist else { 2181d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (validANQP || networkDetail.getAnqpOICount() == 0) { 21977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist return PasspointMatch.Declined; 22077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 22177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist else { 22277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist return PasspointMatch.Incomplete; 2236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 227866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist if (!roamingMatch && 22877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist (!Collections.disjoint(mMatchAnyOIs, anOIs) || 22977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist !Collections.disjoint(mRoamingConsortiums, anOIs))) { 230866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist roamingMatch = true; 23177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 23277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 2331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (!validANQP) { 2346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.Incomplete; 2356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 2376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist DomainNameElement domainNameElement = 2386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist (DomainNameElement) anqpElementMap.get(ANQPElementType.ANQPDomName); 2396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 2406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (domainNameElement != null) { 2416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist for (String domain : domainNameElement.getDomains()) { 24277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist List<String> anLabels = Utils.splitDomain(domain); 24377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist DomainMatcher.Match match = mDomainMatcher.isSubDomain(anLabels); 2446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (match != DomainMatcher.Match.None) { 2456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.HomeProvider; 2466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 247a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist 24807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsiMatch(imsis, anLabels) != null) { 24907a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist return PasspointMatch.HomeProvider; 25077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 2516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 254866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist return roamingMatch ? PasspointMatch.RoamingProvider : PasspointMatch.None; 2556a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2566a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 25707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, ThreeGPPNetworkElement plmnElement) { 25807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsis == null || plmnElement == null || plmnElement.getPlmns().isEmpty()) { 25907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 26007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 26107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (CellularNetwork network : plmnElement.getPlmns()) { 26207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (String mccMnc : network) { 26307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist String imsi = imsiMatch(imsis, mccMnc); 26407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsi != null) { 26507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return imsi; 26607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 26707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 26807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 26907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 27007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 27107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 27207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, List<String> fqdn) { 27307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsis == null) { 27407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 27507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 27607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist String mccMnc = Utils.getMccMnc(fqdn); 27707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return mccMnc != null ? imsiMatch(imsis, mccMnc) : null; 27807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 27907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 28007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, String mccMnc) { 28107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (mCredential.getImsi().matchesMccMnc(mccMnc)) { 28207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (String imsi : imsis) { 28307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsi.startsWith(mccMnc)) { 28407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return imsi; 28507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 28907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 29007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 29103e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public String getFQDN() { return mFQDN; } 29203e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public String getFriendlyName() { return mFriendlyName; } 293a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist public HashSet<Long> getRoamingConsortiums() { return mRoamingConsortiums; } 29403e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public Credential getCredential() { return mCredential; } 2956a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 29605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Map<String, Long> getSSIDs() { 29705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mSSIDs; 29805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 29905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 30005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Collection<String> getOtherHomePartners() { 30105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mOtherHomePartners; 30205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 30305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 30405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Set<Long> getMatchAnyOIs() { 30505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mMatchAnyOIs; 30605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 30705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 30805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public List<Long> getMatchAllOIs() { 30905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mMatchAllOIs; 31005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 31105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 31205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public String getIconURL() { 31305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mIconURL; 31405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 31505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 31605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public boolean deepEquals(HomeSP other) { 31705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mFQDN.equals(other.mFQDN) && 31805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mSSIDs.equals(other.mSSIDs) && 31905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mOtherHomePartners.equals(other.mOtherHomePartners) && 32005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mRoamingConsortiums.equals(other.mRoamingConsortiums) && 32105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mMatchAnyOIs.equals(other.mMatchAnyOIs) && 32205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mMatchAllOIs.equals(other.mMatchAllOIs) && 32305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mFriendlyName.equals(other.mFriendlyName) && 32405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist Utils.compare(mIconURL, other.mIconURL) == 0 && 32505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mCredential.equals(other.mCredential); 32605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 32705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 32871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 32971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public boolean equals(Object thatObject) { 33071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist if (this == thatObject) { 33171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return true; 33271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } else if (thatObject == null || getClass() != thatObject.getClass()) { 33371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return false; 3346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 3356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 33671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist HomeSP that = (HomeSP) thatObject; 33771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return mFQDN.equals(that.mFQDN); 33871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } 33971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 34071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 34171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public int hashCode() { 34271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return mFQDN.hashCode(); 34371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } 34471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 34571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 34671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public String toString() { 34771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return "HomeSP{" + 3481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist "SSIDs=" + mSSIDs + 3491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", FQDN='" + mFQDN + '\'' + 3501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", DomainMatcher=" + mDomainMatcher + 3511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", RoamingConsortiums={" + Utils.roamingConsortiumsToString(mRoamingConsortiums) + 35271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist '}' + 3531d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", MatchAnyOIs={" + Utils.roamingConsortiumsToString(mMatchAnyOIs) + '}' + 3541d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", MatchAllOIs={" + Utils.roamingConsortiumsToString(mMatchAllOIs) + '}' + 3551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", Credential=" + mCredential + 3561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", FriendlyName='" + mFriendlyName + '\'' + 3571d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", IconURL='" + mIconURL + '\'' + 35871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist '}'; 3596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 3606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist} 361