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 282e814680f4dd27a5f825afab189843582235cedcJan Nordqvist/** 292e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * This object describes the Home SP sub tree in the "PerProviderSubscription MO" described in 302e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * the Hotspot 2.0 specification, section 9.1. 312e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * As a convenience, the object also refers to the other sub-parts of the full 322e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * PerProviderSubscription tree. 332e814680f4dd27a5f825afab189843582235cedcJan Nordqvist */ 346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class HomeSP { 3577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist private final Map<String, Long> mSSIDs; // SSID, HESSID, [0,N] 3671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist private final String mFQDN; 376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final DomainMatcher mDomainMatcher; 3805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist private final Set<String> mOtherHomePartners; 39a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist private final HashSet<Long> mRoamingConsortiums; // [0,N] 406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final Set<Long> mMatchAnyOIs; // [0,N] 416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final List<Long> mMatchAllOIs; // [0,N] 426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 4371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist private final Credential mCredential; 446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist // Informational: 466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final String mFriendlyName; // [1] 476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final String mIconURL; // [0,1] 486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Policy mPolicy; 501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final int mCredentialPriority; 511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Map<String, String> mAAATrustRoots; 521d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final UpdateInfo mSubscriptionUpdate; 531d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final SubscriptionParameters mSubscriptionParameters; 542e814680f4dd27a5f825afab189843582235cedcJan Nordqvist private final int mUpdateIdentifier; 551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist @Deprecated 5777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist public HomeSP(Map<String, Long> ssidMap, 586a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ String fqdn, 59a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist /*@NotNull*/ HashSet<Long> roamingConsortiums, 606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ Set<String> otherHomePartners, 616a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ Set<Long> matchAnyOIs, 626a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist /*@NotNull*/ List<Long> matchAllOIs, 636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist String friendlyName, 646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist String iconURL, 6571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist Credential credential) { 666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mSSIDs = ssidMap; 68c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist List<List<String>> otherPartners = new ArrayList<>(otherHomePartners.size()); 696a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist for (String otherPartner : otherHomePartners) { 7071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist otherPartners.add(Utils.splitDomain(otherPartner)); 716a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 7205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mOtherHomePartners = otherHomePartners; 7371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mFQDN = fqdn; 7471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners); 756a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mRoamingConsortiums = roamingConsortiums; 766a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mMatchAnyOIs = matchAnyOIs; 776a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mMatchAllOIs = matchAllOIs; 786a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mFriendlyName = friendlyName; 796a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mIconURL = iconURL; 8071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist mCredential = credential; 811d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 821d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPolicy = null; 831d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredentialPriority = -1; 841d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mAAATrustRoots = null; 851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionUpdate = null; 861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionParameters = null; 872e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mUpdateIdentifier = -1; 886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public HomeSP(Map<String, Long> ssidMap, 911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ String fqdn, 921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ HashSet<Long> roamingConsortiums, 931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ Set<String> otherHomePartners, 941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ Set<Long> matchAnyOIs, 951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist /*@NotNull*/ List<Long> matchAllOIs, 961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist String friendlyName, 971d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist String iconURL, 981d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Credential credential, 991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Policy policy, 1011d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist int credentialPriority, 1021d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Map<String, String> AAATrustRoots, 1031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist UpdateInfo subscriptionUpdate, 1042e814680f4dd27a5f825afab189843582235cedcJan Nordqvist SubscriptionParameters subscriptionParameters, 1052e814680f4dd27a5f825afab189843582235cedcJan Nordqvist int updateIdentifier) { 1061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSSIDs = ssidMap; 1081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist List<List<String>> otherPartners = new ArrayList<>(otherHomePartners.size()); 1091d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (String otherPartner : otherHomePartners) { 1101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist otherPartners.add(Utils.splitDomain(otherPartner)); 111820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist } 1121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mOtherHomePartners = otherHomePartners; 1131d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mFQDN = fqdn; 1141d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners); 1151d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mRoamingConsortiums = roamingConsortiums; 1161d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMatchAnyOIs = matchAnyOIs; 1171d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMatchAllOIs = matchAllOIs; 1181d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mFriendlyName = friendlyName; 1191d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mIconURL = iconURL; 1201d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredential = credential; 1211d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1221d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPolicy = policy; 1231d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mCredentialPriority = credentialPriority; 1241d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mAAATrustRoots = AAATrustRoots; 1251d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionUpdate = subscriptionUpdate; 1261d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSubscriptionParameters = subscriptionParameters; 1272e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mUpdateIdentifier = updateIdentifier; 1282e814680f4dd27a5f825afab189843582235cedcJan Nordqvist } 1292e814680f4dd27a5f825afab189843582235cedcJan Nordqvist 1302e814680f4dd27a5f825afab189843582235cedcJan Nordqvist public int getUpdateIdentifier() { 1312e814680f4dd27a5f825afab189843582235cedcJan Nordqvist return mUpdateIdentifier; 1321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1341d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public UpdateInfo getSubscriptionUpdate() { 1351d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mSubscriptionUpdate; 1361d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1371d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public Policy getPolicy() { 1391d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mPolicy; 140820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist } 141820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist 14277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist public PasspointMatch match(NetworkDetail networkDetail, 143a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist Map<ANQPElementType, ANQPElement> anqpElementMap, 14407a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist SIMAccessor simAccessor) { 1456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 14607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist List<String> imsis = simAccessor.getMatchingImsis(mCredential.getImsi()); 147866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 14807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist PasspointMatch spMatch = matchSP(networkDetail, anqpElementMap, imsis); 149866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 150c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist if (spMatch == PasspointMatch.Incomplete || spMatch == PasspointMatch.Declined) { 15107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return spMatch; 152866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 15307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 15407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsiMatch(imsis, (ThreeGPPNetworkElement) 15507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist anqpElementMap.get(ANQPElementType.ANQP3GPPNetwork)) != null) { 156c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // PLMN match, promote sp match to roaming if necessary. 157c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch; 158866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 15907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 16007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist NAIRealmElement naiRealmElement = 16107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist (NAIRealmElement) anqpElementMap.get(ANQPElementType.ANQPNAIRealm); 16207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 163c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist int authMatch = naiRealmElement != null ? 164c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist naiRealmElement.match(mCredential) : 165c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist AuthMatch.Indeterminate; 166c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist 16707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist Log.d(Utils.hs2LogTag(getClass()), networkDetail.toKeyString() + " match on " + mFQDN + 168c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist ": " + spMatch + ", auth " + AuthMatch.toString(authMatch)); 169c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist 170c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist if (authMatch == AuthMatch.None) { 171c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // Distinct auth mismatch, demote authentication. 172c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return PasspointMatch.None; 173c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 174c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist else if ((authMatch & AuthMatch.Realm) == 0) { 175c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // No realm match, return sp match as is. 176c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch; 177c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 178c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist else { 179c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist // Realm match, promote sp match to roaming if necessary. 180c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist return spMatch == PasspointMatch.None ? PasspointMatch.RoamingProvider : spMatch; 181c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist } 182866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 183866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 184866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist public PasspointMatch matchSP(NetworkDetail networkDetail, 185866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist Map<ANQPElementType, ANQPElement> anqpElementMap, 18607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist List<String> imsis) { 187866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 18877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (mSSIDs.containsKey(networkDetail.getSSID())) { 18977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist Long hessid = mSSIDs.get(networkDetail.getSSID()); 19077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (hessid == null || networkDetail.getHESSID() == hessid) { 1911c03d75c73b9f5fa24a795a0d546f4f56b82ab9bJan Nordqvist Log.d(Utils.hs2LogTag(getClass()), "match SSID"); 1926a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.HomeProvider; 1936a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1946a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 1956a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 19603a529ae85d526110f2a715168739618f0775493Jan Nordqvist Set<Long> anOIs = new HashSet<>(); 1976a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 19877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (networkDetail.getRoamingConsortiums() != null) { 19977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist for (long oi : networkDetail.getRoamingConsortiums()) { 20077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist anOIs.add(oi); 2016a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2026a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 2041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist boolean validANQP = anqpElementMap != null && 2051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist Constants.hasBaseANQPElements(anqpElementMap.keySet()); 2061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 2071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist RoamingConsortiumElement rcElement = validANQP ? 20877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist (RoamingConsortiumElement) anqpElementMap.get(ANQPElementType.ANQPRoamingConsortium) 20977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist : null; 21077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (rcElement != null) { 21177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist anOIs.addAll(rcElement.getOIs()); 2126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 214866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // It may seem reasonable to check for home provider match prior to checking for roaming 215866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // relationship, but it is possible to avoid an ANQP query if it turns out that the 216866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist // "match all" rule fails based only on beacon info only. 217866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist boolean roamingMatch = false; 21871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 21977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (!mMatchAllOIs.isEmpty()) { 22077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist boolean matchesAll = true; 22177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 22277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist for (long spOI : mMatchAllOIs) { 22377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (!anOIs.contains(spOI)) { 22477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist matchesAll = false; 22577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist break; 2266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 22877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist if (matchesAll) { 229866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist roamingMatch = true; 23077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 23177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist else { 2321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (validANQP || networkDetail.getAnqpOICount() == 0) { 23377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist return PasspointMatch.Declined; 23477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 23577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist else { 23677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist return PasspointMatch.Incomplete; 2376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 241866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist if (!roamingMatch && 24277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist (!Collections.disjoint(mMatchAnyOIs, anOIs) || 24377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist !Collections.disjoint(mRoamingConsortiums, anOIs))) { 244866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist roamingMatch = true; 24577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 24677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 2471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (!validANQP) { 2486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.Incomplete; 2496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2506a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 2516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist DomainNameElement domainNameElement = 2526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist (DomainNameElement) anqpElementMap.get(ANQPElementType.ANQPDomName); 2536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 2546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (domainNameElement != null) { 2556a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist for (String domain : domainNameElement.getDomains()) { 25677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist List<String> anLabels = Utils.splitDomain(domain); 25777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist DomainMatcher.Match match = mDomainMatcher.isSubDomain(anLabels); 2586a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (match != DomainMatcher.Match.None) { 2596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return PasspointMatch.HomeProvider; 2606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 261a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist 26207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsiMatch(imsis, anLabels) != null) { 26307a3f9d97394b97965e6754271fb66c1d6bd1753Jan Nordqvist return PasspointMatch.HomeProvider; 26477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 2656a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 268866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist return roamingMatch ? PasspointMatch.RoamingProvider : PasspointMatch.None; 2696a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 2706a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 27107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, ThreeGPPNetworkElement plmnElement) { 27207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsis == null || plmnElement == null || plmnElement.getPlmns().isEmpty()) { 27307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 27407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 27507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (CellularNetwork network : plmnElement.getPlmns()) { 27607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (String mccMnc : network) { 27707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist String imsi = imsiMatch(imsis, mccMnc); 27807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsi != null) { 27907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return imsi; 28007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 28407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 28507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 28607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, List<String> fqdn) { 28707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsis == null) { 28807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 28907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 29007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist String mccMnc = Utils.getMccMnc(fqdn); 29107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return mccMnc != null ? imsiMatch(imsis, mccMnc) : null; 29207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 29307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 29407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist private String imsiMatch(List<String> imsis, String mccMnc) { 29507f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (mCredential.getImsi().matchesMccMnc(mccMnc)) { 29607f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist for (String imsi : imsis) { 29707f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist if (imsi.startsWith(mccMnc)) { 29807f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return imsi; 29907f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 30007f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 30107f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 30207f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist return null; 30307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist } 30407f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvist 30503e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public String getFQDN() { return mFQDN; } 30603e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public String getFriendlyName() { return mFriendlyName; } 307a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist public HashSet<Long> getRoamingConsortiums() { return mRoamingConsortiums; } 30803e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande public Credential getCredential() { return mCredential; } 3096a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 31005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Map<String, Long> getSSIDs() { 31105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mSSIDs; 31205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 31305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 31405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Collection<String> getOtherHomePartners() { 31505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mOtherHomePartners; 31605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 31705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 31805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public Set<Long> getMatchAnyOIs() { 31905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mMatchAnyOIs; 32005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 32105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 32205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public List<Long> getMatchAllOIs() { 32305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mMatchAllOIs; 32405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 32505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 32605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public String getIconURL() { 32705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mIconURL; 32805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 32905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 33005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist public boolean deepEquals(HomeSP other) { 33105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist return mFQDN.equals(other.mFQDN) && 33205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mSSIDs.equals(other.mSSIDs) && 33305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mOtherHomePartners.equals(other.mOtherHomePartners) && 33405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mRoamingConsortiums.equals(other.mRoamingConsortiums) && 33505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mMatchAnyOIs.equals(other.mMatchAnyOIs) && 33605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mMatchAllOIs.equals(other.mMatchAllOIs) && 33705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mFriendlyName.equals(other.mFriendlyName) && 33805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist Utils.compare(mIconURL, other.mIconURL) == 0 && 33905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist mCredential.equals(other.mCredential); 34005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist } 34105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist 34271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 34371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public boolean equals(Object thatObject) { 34471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist if (this == thatObject) { 34571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return true; 34671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } else if (thatObject == null || getClass() != thatObject.getClass()) { 34771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return false; 3486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 3496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 35071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist HomeSP that = (HomeSP) thatObject; 35171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return mFQDN.equals(that.mFQDN); 35271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } 35371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 35471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 35571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public int hashCode() { 35671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return mFQDN.hashCode(); 35771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist } 35871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist 35971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist @Override 36071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist public String toString() { 36171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist return "HomeSP{" + 3621d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist "SSIDs=" + mSSIDs + 3631d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", FQDN='" + mFQDN + '\'' + 3641d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", DomainMatcher=" + mDomainMatcher + 3651d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", RoamingConsortiums={" + Utils.roamingConsortiumsToString(mRoamingConsortiums) + 36671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist '}' + 3671d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", MatchAnyOIs={" + Utils.roamingConsortiumsToString(mMatchAnyOIs) + '}' + 3681d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", MatchAllOIs={" + Utils.roamingConsortiumsToString(mMatchAllOIs) + '}' + 3691d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", Credential=" + mCredential + 3701d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", FriendlyName='" + mFriendlyName + '\'' + 3711d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", IconURL='" + mIconURL + '\'' + 37271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist '}'; 3736a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 3746a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist} 375