blob: c21dbee6a6d5392ab188a1e79e1def518ac2f268 [file] [log] [blame]
package com.android.server.wifi.anqp;
import com.android.server.wifi.SIMAccessor;
import com.android.server.wifi.hotspot2.AuthMatch;
import com.android.server.wifi.hotspot2.Utils;
import com.android.server.wifi.hotspot2.pps.Credential;
import com.android.server.wifi.hotspot2.pps.HomeSP;
import java.net.ProtocolException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.android.server.wifi.anqp.Constants.BYTES_IN_SHORT;
import static com.android.server.wifi.anqp.Constants.SHORT_MASK;
/**
* The NAI Realm ANQP Element, IEEE802.11-2012 section 8.4.4.10
*/
public class NAIRealmElement extends ANQPElement {
private final List<NAIRealmData> mRealmData;
public NAIRealmElement(Constants.ANQPElementType infoID, ByteBuffer payload)
throws ProtocolException {
super(infoID);
if (!payload.hasRemaining()) {
mRealmData = Collections.emptyList();
return;
}
if (payload.remaining() < BYTES_IN_SHORT) {
throw new ProtocolException("Runt NAI Realm: " + payload.remaining());
}
int count = payload.getShort() & SHORT_MASK;
mRealmData = new ArrayList<>(count);
while (count > 0) {
mRealmData.add(new NAIRealmData(payload));
count--;
}
}
public List<NAIRealmData> getRealmData() {
return Collections.unmodifiableList(mRealmData);
}
public int match(Credential credential) {
if (mRealmData.isEmpty())
return AuthMatch.Indeterminate;
List<String> credLabels = Utils.splitDomain(credential.getRealm());
int best = AuthMatch.None;
for (NAIRealmData realmData : mRealmData) {
int match = realmData.match(credLabels, credential);
if (match > best) {
best = match;
if (best == AuthMatch.Exact) {
return best;
}
}
}
return best;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("NAI Realm:\n");
for (NAIRealmData data : mRealmData) {
sb.append(data);
}
return sb.toString();
}
}