1 package com.android.server.wifi.anqp; 2 3 import com.android.server.wifi.SIMAccessor; 4 import com.android.server.wifi.hotspot2.AuthMatch; 5 import com.android.server.wifi.hotspot2.Utils; 6 import com.android.server.wifi.hotspot2.pps.Credential; 7 import com.android.server.wifi.hotspot2.pps.HomeSP; 8 9 import java.net.ProtocolException; 10 import java.nio.ByteBuffer; 11 import java.util.ArrayList; 12 import java.util.Collections; 13 import java.util.List; 14 15 import static com.android.server.wifi.anqp.Constants.BYTES_IN_SHORT; 16 import static com.android.server.wifi.anqp.Constants.SHORT_MASK; 17 18 /** 19 * The NAI Realm ANQP Element, IEEE802.11-2012 section 8.4.4.10 20 */ 21 public class NAIRealmElement extends ANQPElement { 22 private final List<NAIRealmData> mRealmData; 23 24 public NAIRealmElement(Constants.ANQPElementType infoID, ByteBuffer payload) 25 throws ProtocolException { 26 super(infoID); 27 28 if (!payload.hasRemaining()) { 29 mRealmData = Collections.emptyList(); 30 return; 31 } 32 33 if (payload.remaining() < BYTES_IN_SHORT) { 34 throw new ProtocolException("Runt NAI Realm: " + payload.remaining()); 35 } 36 37 int count = payload.getShort() & SHORT_MASK; 38 mRealmData = new ArrayList<>(count); 39 while (count > 0) { 40 mRealmData.add(new NAIRealmData(payload)); 41 count--; 42 } 43 } 44 45 public List<NAIRealmData> getRealmData() { 46 return Collections.unmodifiableList(mRealmData); 47 } 48 49 public int match(Credential credential) { 50 if (mRealmData.isEmpty()) 51 return AuthMatch.Indeterminate; 52 53 List<String> credLabels = Utils.splitDomain(credential.getRealm()); 54 int best = AuthMatch.None; 55 for (NAIRealmData realmData : mRealmData) { 56 int match = realmData.match(credLabels, credential); 57 if (match > best) { 58 best = match; 59 if (best == AuthMatch.Exact) { 60 return best; 61 } 62 } 63 } 64 return best; 65 } 66 67 @Override 68 public String toString() { 69 StringBuilder sb = new StringBuilder(); 70 sb.append("NAI Realm:\n"); 71 for (NAIRealmData data : mRealmData) { 72 sb.append(data); 73 } 74 return sb.toString(); 75 } 76 } 77