HomeSP.java revision 2e814680f4dd27a5f825afab189843582235cedc
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