HomeSP.java revision 03e92b925a595a1a467290a2d54ca2602cce9b9e
16a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpackage com.android.server.wifi.hotspot2.pps;
26a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
36a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.ANQPElement;
471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.anqp.CellularNetwork;
56a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.DomainNameElement;
66a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.HSConnectionCapabilityElement;
76a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.HSWanMetricsElement;
86a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.IPAddressTypeAvailabilityElement;
96a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.anqp.NAIRealmData;
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;
146a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.hotspot2.NetworkInfo;
156a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport com.android.server.wifi.hotspot2.PasspointMatch;
1671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.Utils;
176a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.ArrayList;
196a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.EnumMap;
206a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.List;
216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Map;
226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Set;
236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.ANQPElementType;
256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class HomeSP {
276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final Map<String, String> mSSIDs;        // SSID, HESSID, [0,N]
2871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mFQDN;
296a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final DomainMatcher mDomainMatcher;
306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final Set<Long> mRoamingConsortiums;    // [0,N]
316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final Set<Long> mMatchAnyOIs;           // [0,N]
326a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final List<Long> mMatchAllOIs;          // [0,N]
336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
3471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final Credential mCredential;
356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    // Informational:
376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final String mFriendlyName;             // [1]
386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final String mIconURL;                  // [0,1]
396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public HomeSP(Map<String, String> ssidMap,
416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ String fqdn,
426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ Set<Long> roamingConsortiums,
436a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ Set<String> otherHomePartners,
446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ Set<Long> matchAnyOIs,
456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   /*@NotNull*/ List<Long> matchAllOIs,
466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   String friendlyName,
476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                   String iconURL,
4871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                   Credential credential) {
496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
506a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mSSIDs = ssidMap;
516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        List<List<String>> otherPartners = new ArrayList<List<String>>(otherHomePartners.size());
526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        for (String otherPartner : otherHomePartners) {
5371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            otherPartners.add(Utils.splitDomain(otherPartner));
546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
5571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mFQDN = fqdn;
5671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mDomainMatcher = new DomainMatcher(Utils.splitDomain(fqdn), otherPartners);
576a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mRoamingConsortiums = roamingConsortiums;
586a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mMatchAnyOIs = matchAnyOIs;
596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mMatchAllOIs = matchAllOIs;
606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mFriendlyName = friendlyName;
616a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mIconURL = iconURL;
6271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCredential = credential;
636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
656a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public PasspointMatch match(NetworkInfo networkInfo, List<ANQPElement> anqpElements) {
666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (mSSIDs.containsKey(networkInfo.getSSID())) {
686a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            String hessid = mSSIDs.get(networkInfo.getSSID());
696a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            if (hessid == null || networkInfo.getHESSID().equals(hessid)) {
7071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                System.out.println("-- SSID");
716a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                return PasspointMatch.HomeProvider;
726a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
736a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
746a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
756a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        List<Long> allOIs = null;
766a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
776a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (networkInfo.getRoamingConsortiums() != null) {
786a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            allOIs = new ArrayList<Long>();
796a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            for (long oi : networkInfo.getRoamingConsortiums()) {
806a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                allOIs.add(oi);
816a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
826a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
836a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
846a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        Map<ANQPElementType, ANQPElement> anqpElementMap = null;
856a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
866a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (anqpElements != null) {
876a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            anqpElementMap = new EnumMap<ANQPElementType, ANQPElement>(ANQPElementType.class);
886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            for (ANQPElement element : anqpElements) {
896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                anqpElementMap.put(element.getID(), element);
906a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                if (element.getID() == ANQPElementType.ANQPRoamingConsortium) {
916a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    RoamingConsortiumElement rcElement = (RoamingConsortiumElement) element;
926a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    if (!rcElement.getOIs().isEmpty()) {
936a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        if (allOIs == null) {
946a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                            allOIs = new ArrayList<Long>(rcElement.getOIs());
956a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        } else {
966a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                            allOIs.addAll(rcElement.getOIs());
976a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        }
986a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
996a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1006a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1016a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1026a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
10371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        // !!! wlan.mnc<MNC>.mcc<MCC>.3gppnetwork.org
10471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
1056a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (allOIs != null) {
1066a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            if (!mRoamingConsortiums.isEmpty()) {
1076a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                for (long oi : allOIs) {
1086a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    if (mRoamingConsortiums.contains(oi)) {
10971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        System.out.println("-- RC");
1106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        return PasspointMatch.HomeProvider;
1116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
1126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1146a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            if (!mMatchAnyOIs.isEmpty() || !mMatchAllOIs.isEmpty()) {
1156a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                for (long anOI : allOIs) {
1166a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
11771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    boolean oneMatchesAll = !mMatchAllOIs.isEmpty();
1186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1196a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    for (long spOI : mMatchAllOIs) {
1206a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        if (spOI != anOI) {
1216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                            oneMatchesAll = false;
1226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                            break;
1236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        }
1246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
1256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    if (oneMatchesAll) {
12771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        System.out.println("-- 1inAll");
1286a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        return PasspointMatch.HomeProvider;
1296a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
1306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    if (mMatchAnyOIs.contains(anOI)) {
13271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        System.out.println("-- 1ofAll");
1336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        return PasspointMatch.HomeProvider;
1346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
1356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (anqpElementMap == null) {
1406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            return PasspointMatch.Incomplete;
1416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1436a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        DomainNameElement domainNameElement =
1446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (DomainNameElement) anqpElementMap.get(ANQPElementType.ANQPDomName);
1456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        NAIRealmElement naiRealmElement =
1466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (NAIRealmElement) anqpElementMap.get(ANQPElementType.ANQPNAIRealm);
1476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        ThreeGPPNetworkElement threeGPPNetworkElement =
1486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (ThreeGPPNetworkElement) anqpElementMap.get(ANQPElementType.ANQP3GPPNetwork);
1496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1506a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        // For future policy decisions:
1516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        IPAddressTypeAvailabilityElement ipAddressAvailabilityElement =
1526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (IPAddressTypeAvailabilityElement) anqpElementMap.get(
1536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        ANQPElementType.ANQPIPAddrAvailability);
1546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        HSConnectionCapabilityElement hsConnCapElement =
1556a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (HSConnectionCapabilityElement) anqpElementMap.get(
1566a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        ANQPElementType.HSConnCapability);
1576a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        HSWanMetricsElement hsWanMetricsElement =
1586a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                (HSWanMetricsElement) anqpElementMap.get(ANQPElementType.HSWANMetrics);
1596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (domainNameElement != null) {
1616a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            for (String domain : domainNameElement.getDomains()) {
16271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                DomainMatcher.Match match = mDomainMatcher.isSubDomain(Utils.splitDomain(domain));
1636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                if (match != DomainMatcher.Match.None) {
1646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    return PasspointMatch.HomeProvider;
1656a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
1666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
1676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
1686a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
16971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        if (naiRealmElement != null) {
17071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            AuthMatch authMatch = matchRealms(naiRealmElement, threeGPPNetworkElement);
17171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            if (authMatch != AuthMatch.None) {
17271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                return PasspointMatch.RoamingProvider;
17371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            }
1746a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
17571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return PasspointMatch.None;
17671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
1776a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
17871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private AuthMatch matchRealms(NAIRealmElement naiRealmElement,
17971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                                  ThreeGPPNetworkElement threeGPPNetworkElement) {
18071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        List<String> credRealm = Utils.splitDomain(mCredential.getRealm());
1816a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
18271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        for (NAIRealmData naiRealmData : naiRealmElement.getRealmData()) {
1836a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
18471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            DomainMatcher.Match match = DomainMatcher.Match.None;
18571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            for (String anRealm : naiRealmData.getRealms()) {
18671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                List<String> anRealmLabels = Utils.splitDomain(anRealm);
18771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                match = mDomainMatcher.isSubDomain(anRealmLabels);
1886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                if (match != DomainMatcher.Match.None) {
18971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    break;
19071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                }
19171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                if (anRealmLabels.equals(credRealm)) {
19271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    match = DomainMatcher.Match.Secondary;
19371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    break;
19471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                }
19571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            }
19671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
19771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            if (match != DomainMatcher.Match.None) {
19871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                if (mCredential.getImsi() != null) {
19971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    // All the device has is one of EAP-SIM, AKA or AKA',
20071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    // so a 3GPP element must appear and contain a matching MNC/MCC
20171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    if (threeGPPNetworkElement == null) {
20271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        return AuthMatch.None;
20371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    }
20471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    for (CellularNetwork network : threeGPPNetworkElement.getPlmns()) {
20571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        if (network.matchIMSI(mCredential.getImsi())) {
20671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                            AuthMatch authMatch =
20771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                                    naiRealmData.matchEAPMethods(mCredential.getEAPMethod());
20871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                            if (authMatch != AuthMatch.None) {
20971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                                return authMatch;
2106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                            }
2116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                        }
2126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                    }
21371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                } else {
21471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    AuthMatch authMatch = naiRealmData.matchEAPMethods(mCredential.getEAPMethod());
21571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    if (authMatch != AuthMatch.None) {
21671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        // Note: Something more intelligent could be done here based on the
21771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        // authMatch value. It may be useful to have a secondary score to
21871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        // distinguish more predictable EAP method/parameter matching.
21971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                        return authMatch;
22071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                    }
2216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist                }
2226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            }
2236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
22471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return AuthMatch.None;
2256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
2266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
22703e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public String getFQDN() { return mFQDN; }
22803e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public String getFriendlyName() { return mFriendlyName; }
22903e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public Set<Long> getRoamingConsortiums() { return mRoamingConsortiums; }
23003e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    public Credential getCredential() { return mCredential; }
2316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
23271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
23371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public boolean equals(Object thatObject) {
23471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        if (this == thatObject) {
23571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return true;
23671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        } else if (thatObject == null || getClass() != thatObject.getClass()) {
23771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return false;
2386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
2396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
24071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        HomeSP that = (HomeSP) thatObject;
24171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mFQDN.equals(that.mFQDN);
24271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
24371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
24471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
24571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public int hashCode() {
24671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mFQDN.hashCode();
24771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
24871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
24971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
25071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public String toString() {
25171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return "HomeSP{" +
25271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                "mSSIDs=" + mSSIDs +
25371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mFQDN='" + mFQDN + '\'' +
25471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mDomainMatcher=" + mDomainMatcher +
25571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mRoamingConsortiums={" + Utils.roamingConsortiumsToString(mRoamingConsortiums) +
25671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                '}' +
25771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mMatchAnyOIs={" + Utils.roamingConsortiumsToString(mMatchAnyOIs) + '}' +
25871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mMatchAllOIs={" + Utils.roamingConsortiumsToString(mMatchAllOIs) + '}' +
25971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mCredential=" + mCredential +
26071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mFriendlyName='" + mFriendlyName + '\'' +
26171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mIconURL='" + mIconURL + '\'' +
26271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                '}';
2636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
2646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist}
265