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