diff options
author | Vinit Deshpande <vinitd@google.com> | 2015-03-15 13:37:52 -0700 |
---|---|---|
committer | Vinit Deshpande <vinitd@google.com> | 2015-03-15 13:37:52 -0700 |
commit | fc19120fc7c91ae1295ec80f59327d0e44f8b58a (patch) | |
tree | d5c6980e3f39707199d10b259b8b5e582c7eafd2 /wifi | |
parent | a0127fd5023ba6a6a16d3bbda2979feaa4a99810 (diff) | |
parent | 5d7768ff5ec406f76baacd12a9d6c100a5d22ec3 (diff) | |
download | frameworks_base-fc19120fc7c91ae1295ec80f59327d0e44f8b58a.zip frameworks_base-fc19120fc7c91ae1295ec80f59327d0e44f8b58a.tar.gz frameworks_base-fc19120fc7c91ae1295ec80f59327d0e44f8b58a.tar.bz2 |
am "Revert "Initial Passpoint code.""
merged from goog/mirror-m-wireless-internal-release
5d7768f Revert "Initial Passpoint code."
Diffstat (limited to 'wifi')
41 files changed, 0 insertions, 3433 deletions
diff --git a/wifi/java/android/net/wifi/anqp/ANQPElement.java b/wifi/java/android/net/wifi/anqp/ANQPElement.java deleted file mode 100644 index 581f981..0000000 --- a/wifi/java/android/net/wifi/anqp/ANQPElement.java +++ /dev/null @@ -1,16 +0,0 @@ -package android.net.wifi.anqp; - -/** - * Base class for an IEEE802.11u ANQP element. - */ -public abstract class ANQPElement { - private final Constants.ANQPElementType mID; - - protected ANQPElement(Constants.ANQPElementType id) { - mID = id; - } - - public Constants.ANQPElementType getID() { - return mID; - } -} diff --git a/wifi/java/android/net/wifi/anqp/ANQPFactory.java b/wifi/java/android/net/wifi/anqp/ANQPFactory.java deleted file mode 100644 index 7860926..0000000 --- a/wifi/java/android/net/wifi/anqp/ANQPFactory.java +++ /dev/null @@ -1,213 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.ListIterator; -import java.util.Set; - -import static android.net.wifi.anqp.Constants.*; - -/** - * Factory to build a collection of 802.11u ANQP elements from a byte buffer. - */ -public class ANQPFactory { - - public static ByteBuffer buildQueryRequest(Set<ANQPElementType> elements, ByteBuffer target) { - List<ANQPElementType> list = new ArrayList<ANQPElementType>(elements); - Collections.sort(list); - - ListIterator<ANQPElementType> elementIterator = list.listIterator(); - - target.order(ByteOrder.LITTLE_ENDIAN); - target.putShort((short) Constants.ANQP_QUERY_LIST); - int lenPos = target.position(); - target.putShort((short) 0); - - while (elementIterator.hasNext()) { - Integer id = Constants.getANQPElementID(elementIterator.next()); - if (id != null) { - target.putShort(id.shortValue()); - } else { - elementIterator.previous(); - } - } - target.putShort(lenPos, (short) (target.position() - lenPos - BYTES_IN_SHORT)); - - // Start a new vendor specific element for HS2.0 elements: - if (elementIterator.hasNext()) { - target.putShort((short) ANQP_VENDOR_SPEC); - int vsLenPos = target.position(); - target.putShort((short) 0); - - target.putInt(Constants.HS20_PREFIX); - target.put((byte) Constants.HS_QUERY_LIST); - target.put((byte) 0); - - while (elementIterator.hasNext()) { - ANQPElementType elementType = elementIterator.next(); - Integer id = Constants.getHS20ElementID(elementType); - if (id == null) { - throw new RuntimeException("Unmapped ANQPElementType: " + elementType); - } else { - target.put(id.byteValue()); - } - } - target.putShort(vsLenPos, (short) (target.position() - vsLenPos - BYTES_IN_SHORT)); - } - - target.flip(); - return target; - } - - public static ByteBuffer buildHomeRealmRequest(List<String> realmNames, ByteBuffer target) { - target.order(ByteOrder.LITTLE_ENDIAN); - target.putShort((short) ANQP_VENDOR_SPEC); - int lenPos = target.position(); - target.putShort((short) 0); - - target.putInt(Constants.HS20_PREFIX); - target.put((byte) Constants.HS_NAI_HOME_REALM_QUERY); - target.put((byte) 0); - - target.put((byte) realmNames.size()); - for (String realmName : realmNames) { - target.put((byte) UTF8_INDICATOR); - byte[] octets = realmName.getBytes(StandardCharsets.UTF_8); - target.put((byte) octets.length); - target.put(octets); - } - target.putShort(lenPos, (short) (target.position() - lenPos - BYTES_IN_SHORT)); - - target.flip(); - return target; - } - - public static ByteBuffer buildIconRequest(String fileName, ByteBuffer target) { - target.order(ByteOrder.LITTLE_ENDIAN); - target.putShort((short) ANQP_VENDOR_SPEC); - int lenPos = target.position(); - target.putShort((short) 0); - - target.putInt(Constants.HS20_PREFIX); - target.put((byte) Constants.HS_ICON_REQUEST); - target.put((byte) 0); - - target.put(fileName.getBytes(StandardCharsets.UTF_8)); - target.putShort(lenPos, (short) (target.position() - lenPos - BYTES_IN_SHORT)); - - target.flip(); - return target; - } - - public static List<ANQPElement> parsePayload(ByteBuffer payload) throws ProtocolException { - payload.order(ByteOrder.LITTLE_ENDIAN); - List<ANQPElement> elements = new ArrayList<ANQPElement>(); - while (payload.hasRemaining()) { - elements.add(buildElement(payload)); - } - return elements; - } - - private static ANQPElement buildElement(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 4) - throw new ProtocolException("Runt payload: " + payload.remaining()); - - int infoIDNumber = payload.getShort() & SHORT_MASK; - ANQPElementType infoID = Constants.mapANQPElement(infoIDNumber); - if (infoID == null) { - throw new ProtocolException("Bad info ID: " + infoIDNumber); - } - int length = payload.getShort() & SHORT_MASK; - - if (payload.remaining() < length) { - throw new ProtocolException("Truncated payload"); - } - - ByteBuffer elementPayload = payload.duplicate(); - payload.position(payload.position() + length); - elementPayload.limit(elementPayload.position() + length); - - switch (infoID) { - case ANQPCapabilityList: - return new CapabilityListElement(infoID, elementPayload); - case ANQPVenueName: - return new VenueNameElement(infoID, elementPayload); - case ANQPEmergencyNumber: - return new EmergencyNumberElement(infoID, elementPayload); - case ANQPNwkAuthType: - return new NetworkAuthenticationTypeElement(infoID, elementPayload); - case ANQPRoamingConsortium: - return new RoamingConsortiumElement(infoID, elementPayload); - case ANQPIPAddrAvailability: - return new IPAddressTypeAvailabilityElement(infoID, elementPayload); - case ANQPNAIRealm: - return new NAIRealmElement(infoID, elementPayload); - case ANQP3GPPNetwork: - return new ThreeGPPNetworkElement(infoID, elementPayload); - case ANQPGeoLoc: - return new GEOLocationElement(infoID, elementPayload); - case ANQPCivicLoc: - return new CivicLocationElement(infoID, elementPayload); - case ANQPLocURI: - return new GenericStringElement(infoID, elementPayload); - case ANQPDomName: - return new DomainNameElement(infoID, elementPayload); - case ANQPEmergencyAlert: - return new GenericStringElement(infoID, elementPayload); - case ANQPTDLSCap: - return new GenericBlobElement(infoID, elementPayload); - case ANQPEmergencyNAI: - return new GenericStringElement(infoID, elementPayload); - case ANQPNeighborReport: - return new GenericBlobElement(infoID, elementPayload); - case ANQPVendorSpec: - if (elementPayload.remaining() > 5) { - int oi = elementPayload.getInt(); - if (oi != Constants.HS20_PREFIX) { - return null; - } - int subType = elementPayload.get() & BYTE_MASK; - elementPayload.get(); - return buildHS20Element(subType, elementPayload); - } else { - return new GenericBlobElement(infoID, elementPayload); - } - default: - throw new ProtocolException("Unknown element ID: " + infoID); - } - } - - private static ANQPElement buildHS20Element(int subType, ByteBuffer payload) - throws ProtocolException { - - ANQPElementType infoID = Constants.mapHS20Element(subType); - - if (infoID == null) { - throw new ProtocolException("Bad HS20 info ID: " + subType); - } - - switch (infoID) { - case HSCapabilityList: - return new HSCapabilityListElement(infoID, payload); - case HSFriendlyName: - return new HSFriendlyNameElement(infoID, payload); - case HSWANMetrics: - return new HSWanMetricsElement(infoID, payload); - case HSConnCapability: - return new HSConnectionCapabilityElement(infoID, payload); - case HSOperatingclass: - return new GenericBlobElement(infoID, payload); - case HSOSUProviders: - return new HSOsuProvidersElement(infoID, payload); - case HSIconFile: - return new HSIconFileElement(infoID, payload); - default: - throw new ProtocolException("Unknown HS20 sub type: " + subType); - } - } -} diff --git a/wifi/java/android/net/wifi/anqp/CapabilityListElement.java b/wifi/java/android/net/wifi/anqp/CapabilityListElement.java deleted file mode 100644 index 00ee6d1..0000000 --- a/wifi/java/android/net/wifi/anqp/CapabilityListElement.java +++ /dev/null @@ -1,44 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.Arrays; - -import static android.net.wifi.anqp.Constants.ANQPElementType; -import static android.net.wifi.anqp.Constants.BYTES_IN_SHORT; -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * The ANQP Capability List element, 802.11-2012 section 8.4.4.3 - */ -public class CapabilityListElement extends ANQPElement { - private final ANQPElementType[] mCapabilities; - - public CapabilityListElement(ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - if ((payload.remaining() & 1) == 1) - throw new ProtocolException("Odd length"); - mCapabilities = new ANQPElementType[payload.remaining() / BYTES_IN_SHORT]; - - int index = 0; - while (payload.hasRemaining()) { - int capID = payload.getShort() & SHORT_MASK; - ANQPElementType capability = Constants.mapANQPElement(capID); - if (capability == null) - throw new ProtocolException("Unknown capability: " + capID); - mCapabilities[index++] = capability; - } - } - - public ANQPElementType[] getCapabilities() { - return mCapabilities; - } - - @Override - public String toString() { - return "CapabilityListElement{" + - "mCapabilities=" + Arrays.toString(mCapabilities) + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/CivicLocationElement.java b/wifi/java/android/net/wifi/anqp/CivicLocationElement.java deleted file mode 100644 index 2cf3c75..0000000 --- a/wifi/java/android/net/wifi/anqp/CivicLocationElement.java +++ /dev/null @@ -1,201 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * The Civic Location ANQP Element, IEEE802.11-2012 section 8.4.4.13 - */ -public class CivicLocationElement extends ANQPElement { - public enum LocationType {DHCPServer, NwkElement, Client} - - private static final int GEOCONF_CIVIC4 = 99; - private static final int RFC4776 = 0; // Table 8-77, 1=vendor specific - - private final LocationType mLocationType; - private final Locale mLocale; - private final Map<CAType, String> mValues; - - public CivicLocationElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - if (payload.remaining() < 6) { - throw new ProtocolException("Runt civic location:" + payload.remaining()); - } - - int locType = payload.get() & BYTE_MASK; - if (locType != RFC4776) { - throw new ProtocolException("Bad Civic location type: " + locType); - } - - int locSubType = payload.get() & BYTE_MASK; - if (locSubType != GEOCONF_CIVIC4) { - throw new ProtocolException("Unexpected Civic location sub-type: " + locSubType + - " (cannot handle sub elements)"); - } - - int length = payload.get() & BYTE_MASK; - if (length > payload.remaining()) { - throw new ProtocolException("Invalid CA type length: " + length); - } - - int what = payload.get() & BYTE_MASK; - mLocationType = what < LocationType.values().length ? LocationType.values()[what] : null; - - mLocale = Locale.forLanguageTag(Constants.getString(payload, 2, StandardCharsets.US_ASCII)); - - mValues = new HashMap<CAType, String>(); - while (payload.hasRemaining()) { - int caTypeNumber = payload.get() & BYTE_MASK; - CAType caType = s_caTypes.get(caTypeNumber); - - int caValLen = payload.get() & BYTE_MASK; - if (caValLen > payload.remaining()) { - throw new ProtocolException("Bad CA value length: " + caValLen); - } - byte[] caValOctets = new byte[caValLen]; - payload.get(caValOctets); - - if (caType != null) { - mValues.put(caType, new String(caValOctets, StandardCharsets.UTF_8)); - } - } - } - - public LocationType getLocationType() { - return mLocationType; - } - - public Locale getLocale() { - return mLocale; - } - - public Map<CAType, String> getValues() { - return Collections.unmodifiableMap(mValues); - } - - @Override - public String toString() { - return "CivicLocationElement{" + - "mLocationType=" + mLocationType + - ", mLocale=" + mLocale + - ", mValues=" + mValues + - '}'; - } - - private static final Map<Integer, CAType> s_caTypes = new HashMap<Integer, CAType>(); - - public static final int LANGUAGE = 0; - public static final int STATE_PROVINCE = 1; - public static final int COUNTY_DISTRICT = 2; - public static final int CITY = 3; - public static final int DIVISION_BOROUGH = 4; - public static final int BLOCK = 5; - public static final int STREET_GROUP = 6; - public static final int STREET_DIRECTION = 16; - public static final int LEADING_STREET_SUFFIX = 17; - public static final int STREET_SUFFIX = 18; - public static final int HOUSE_NUMBER = 19; - public static final int HOUSE_NUMBER_SUFFIX = 20; - public static final int LANDMARK = 21; - public static final int ADDITIONAL_LOCATION = 22; - public static final int NAME = 23; - public static final int POSTAL_ZIP = 24; - public static final int BUILDING = 25; - public static final int UNIT = 26; - public static final int FLOOR = 27; - public static final int ROOM = 28; - public static final int TYPE = 29; - public static final int POSTAL_COMMUNITY = 30; - public static final int PO_BOX = 31; - public static final int ADDITIONAL_CODE = 32; - public static final int SEAT_DESK = 33; - public static final int PRIMARY_ROAD = 34; - public static final int ROAD_SECTION = 35; - public static final int BRANCH_ROAD = 36; - public static final int SUB_BRANCH_ROAD = 37; - public static final int STREET_NAME_PRE_MOD = 38; - public static final int STREET_NAME_POST_MOD = 39; - public static final int SCRIPT = 128; - public static final int RESERVED = 255; - - public enum CAType { - Language, - StateProvince, - CountyDistrict, - City, - DivisionBorough, - Block, - StreetGroup, - StreetDirection, - LeadingStreetSuffix, - StreetSuffix, - HouseNumber, - HouseNumberSuffix, - Landmark, - AdditionalLocation, - Name, - PostalZIP, - Building, - Unit, - Floor, - Room, - Type, - PostalCommunity, - POBox, - AdditionalCode, - SeatDesk, - PrimaryRoad, - RoadSection, - BranchRoad, - SubBranchRoad, - StreetNamePreMod, - StreetNamePostMod, - Script, - Reserved - } - - static { - s_caTypes.put(LANGUAGE, CAType.Language); - s_caTypes.put(STATE_PROVINCE, CAType.StateProvince); - s_caTypes.put(COUNTY_DISTRICT, CAType.CountyDistrict); - s_caTypes.put(CITY, CAType.City); - s_caTypes.put(DIVISION_BOROUGH, CAType.DivisionBorough); - s_caTypes.put(BLOCK, CAType.Block); - s_caTypes.put(STREET_GROUP, CAType.StreetGroup); - s_caTypes.put(STREET_DIRECTION, CAType.StreetDirection); - s_caTypes.put(LEADING_STREET_SUFFIX, CAType.LeadingStreetSuffix); - s_caTypes.put(STREET_SUFFIX, CAType.StreetSuffix); - s_caTypes.put(HOUSE_NUMBER, CAType.HouseNumber); - s_caTypes.put(HOUSE_NUMBER_SUFFIX, CAType.HouseNumberSuffix); - s_caTypes.put(LANDMARK, CAType.Landmark); - s_caTypes.put(ADDITIONAL_LOCATION, CAType.AdditionalLocation); - s_caTypes.put(NAME, CAType.Name); - s_caTypes.put(POSTAL_ZIP, CAType.PostalZIP); - s_caTypes.put(BUILDING, CAType.Building); - s_caTypes.put(UNIT, CAType.Unit); - s_caTypes.put(FLOOR, CAType.Floor); - s_caTypes.put(ROOM, CAType.Room); - s_caTypes.put(TYPE, CAType.Type); - s_caTypes.put(POSTAL_COMMUNITY, CAType.PostalCommunity); - s_caTypes.put(PO_BOX, CAType.POBox); - s_caTypes.put(ADDITIONAL_CODE, CAType.AdditionalCode); - s_caTypes.put(SEAT_DESK, CAType.SeatDesk); - s_caTypes.put(PRIMARY_ROAD, CAType.PrimaryRoad); - s_caTypes.put(ROAD_SECTION, CAType.RoadSection); - s_caTypes.put(BRANCH_ROAD, CAType.BranchRoad); - s_caTypes.put(SUB_BRANCH_ROAD, CAType.SubBranchRoad); - s_caTypes.put(STREET_NAME_PRE_MOD, CAType.StreetNamePreMod); - s_caTypes.put(STREET_NAME_POST_MOD, CAType.StreetNamePostMod); - s_caTypes.put(SCRIPT, CAType.Script); - s_caTypes.put(RESERVED, CAType.Reserved); - } -} diff --git a/wifi/java/android/net/wifi/anqp/Constants.java b/wifi/java/android/net/wifi/anqp/Constants.java deleted file mode 100644 index 17af6de..0000000 --- a/wifi/java/android/net/wifi/anqp/Constants.java +++ /dev/null @@ -1,195 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.HashMap; -import java.util.Map; - -/** - * ANQP related constants (802.11-2012) - */ -public class Constants { - - public static final int BYTE_MASK = 0xff; - public static final int SHORT_MASK = 0xffff; - public static final long INT_MASK = 0xffffffffL; - public static final int BYTES_IN_SHORT = 2; - public static final int BYTES_IN_INT = 4; - - public static final int HS20_PREFIX = 0x119a6f50; // Note that is represented as a LE int - public static final int UTF8_INDICATOR = 1; - - public enum IconStatus {Success, FileNotFound, Unspecified} - - public static final int ANQP_QUERY_LIST = 256; - public static final int ANQP_CAPABILITY_LIST = 257; - public static final int ANQP_VENUE_NAME = 258; - public static final int ANQP_EMERGENCY_NUMBER = 259; - public static final int ANQP_NWK_AUTH_TYPE = 260; - public static final int ANQP_ROAMING_CONSORTIUM = 261; - public static final int ANQP_IP_ADDR_AVAILABILITY = 262; - public static final int ANQP_NAI_REALM = 263; - public static final int ANQP_3GPP_NETWORK = 264; - public static final int ANQP_GEO_LOC = 265; - public static final int ANQP_CIVIC_LOC = 266; - public static final int ANQP_LOC_URI = 267; - public static final int ANQP_DOM_NAME = 268; - public static final int ANQP_EMERGENCY_ALERT = 269; - public static final int ANQP_TDLS_CAP = 270; - public static final int ANQP_EMERGENCY_NAI = 271; - public static final int ANQP_NEIGHBOR_REPORT = 272; - public static final int ANQP_VENDOR_SPEC = 56797; - - public static final int HS_QUERY_LIST = 1; - public static final int HS_CAPABILITY_LIST = 2; - public static final int HS_FRIENDLY_NAME = 3; - public static final int HS_WAN_METRICS = 4; - public static final int HS_CONN_CAPABILITY = 5; - public static final int HS_NAI_HOME_REALM_QUERY = 6; - public static final int HS_OPERATING_CLASS = 7; - public static final int HS_OSU_PROVIDERS = 8; - public static final int HS_ICON_REQUEST = 10; - public static final int HS_ICON_FILE = 11; - - public enum ANQPElementType { - ANQPQueryList, - ANQPCapabilityList, - ANQPVenueName, - ANQPEmergencyNumber, - ANQPNwkAuthType, - ANQPRoamingConsortium, - ANQPIPAddrAvailability, - ANQPNAIRealm, - ANQP3GPPNetwork, - ANQPGeoLoc, - ANQPCivicLoc, - ANQPLocURI, - ANQPDomName, - ANQPEmergencyAlert, - ANQPTDLSCap, - ANQPEmergencyNAI, - ANQPNeighborReport, - ANQPVendorSpec, - HSQueryList, - HSCapabilityList, - HSFriendlyName, - HSWANMetrics, - HSConnCapability, - HSNAIHomeRealmQuery, - HSOperatingclass, - HSOSUProviders, - HSIconRequest, - HSIconFile - } - - private static final Map<Integer, ANQPElementType> sAnqpMap = new HashMap<Integer, ANQPElementType>(); - private static final Map<Integer, ANQPElementType> sHs20Map = new HashMap<Integer, ANQPElementType>(); - private static final Map<ANQPElementType, Integer> sRevAnqpmap = new HashMap<ANQPElementType, Integer>(); - private static final Map<ANQPElementType, Integer> sRevHs20map = new HashMap<ANQPElementType, Integer>(); - - static { - sAnqpMap.put(ANQP_QUERY_LIST, ANQPElementType.ANQPQueryList); - sAnqpMap.put(ANQP_CAPABILITY_LIST, ANQPElementType.ANQPCapabilityList); - sAnqpMap.put(ANQP_VENUE_NAME, ANQPElementType.ANQPVenueName); - sAnqpMap.put(ANQP_EMERGENCY_NUMBER, ANQPElementType.ANQPEmergencyNumber); - sAnqpMap.put(ANQP_NWK_AUTH_TYPE, ANQPElementType.ANQPNwkAuthType); - sAnqpMap.put(ANQP_ROAMING_CONSORTIUM, ANQPElementType.ANQPRoamingConsortium); - sAnqpMap.put(ANQP_IP_ADDR_AVAILABILITY, ANQPElementType.ANQPIPAddrAvailability); - sAnqpMap.put(ANQP_NAI_REALM, ANQPElementType.ANQPNAIRealm); - sAnqpMap.put(ANQP_3GPP_NETWORK, ANQPElementType.ANQP3GPPNetwork); - sAnqpMap.put(ANQP_GEO_LOC, ANQPElementType.ANQPGeoLoc); - sAnqpMap.put(ANQP_CIVIC_LOC, ANQPElementType.ANQPCivicLoc); - sAnqpMap.put(ANQP_LOC_URI, ANQPElementType.ANQPLocURI); - sAnqpMap.put(ANQP_DOM_NAME, ANQPElementType.ANQPDomName); - sAnqpMap.put(ANQP_EMERGENCY_ALERT, ANQPElementType.ANQPEmergencyAlert); - sAnqpMap.put(ANQP_TDLS_CAP, ANQPElementType.ANQPTDLSCap); - sAnqpMap.put(ANQP_EMERGENCY_NAI, ANQPElementType.ANQPEmergencyNAI); - sAnqpMap.put(ANQP_NEIGHBOR_REPORT, ANQPElementType.ANQPNeighborReport); - sAnqpMap.put(ANQP_VENDOR_SPEC, ANQPElementType.ANQPVendorSpec); - - sHs20Map.put(HS_QUERY_LIST, ANQPElementType.HSQueryList); - sHs20Map.put(HS_CAPABILITY_LIST, ANQPElementType.HSCapabilityList); - sHs20Map.put(HS_FRIENDLY_NAME, ANQPElementType.HSFriendlyName); - sHs20Map.put(HS_WAN_METRICS, ANQPElementType.HSWANMetrics); - sHs20Map.put(HS_CONN_CAPABILITY, ANQPElementType.HSConnCapability); - sHs20Map.put(HS_NAI_HOME_REALM_QUERY, ANQPElementType.HSNAIHomeRealmQuery); - sHs20Map.put(HS_OPERATING_CLASS, ANQPElementType.HSOperatingclass); - sHs20Map.put(HS_OSU_PROVIDERS, ANQPElementType.HSOSUProviders); - sHs20Map.put(HS_ICON_REQUEST, ANQPElementType.HSIconRequest); - sHs20Map.put(HS_ICON_FILE, ANQPElementType.HSIconFile); - - for (Map.Entry<Integer, ANQPElementType> entry : sAnqpMap.entrySet()) { - sRevAnqpmap.put(entry.getValue(), entry.getKey()); - } - for (Map.Entry<Integer, ANQPElementType> entry : sHs20Map.entrySet()) { - sRevHs20map.put(entry.getValue(), entry.getKey()); - } - } - - public static ANQPElementType mapANQPElement(int id) { - return sAnqpMap.get(id); - } - - public static ANQPElementType mapHS20Element(int id) { - return sHs20Map.get(id); - } - - public static Integer getANQPElementID(ANQPElementType elementType) { - return sRevAnqpmap.get(elementType); - } - - public static Integer getHS20ElementID(ANQPElementType elementType) { - return sRevHs20map.get(elementType); - } - - public static long getInteger(ByteBuffer payload, int size) { - byte[] octets = new byte[size]; - payload.get(octets); - long value = 0; - for (int n = octets.length - 1; n >= 0; n--) { - value = (value << Byte.SIZE) | (octets[n] & BYTE_MASK); - } - return value; - } - - public static String getPrefixedString(ByteBuffer payload, int lengthLength, Charset charset) - throws ProtocolException { - if (payload.remaining() < lengthLength) { - throw new ProtocolException("Runt string: " + payload.remaining()); - } - return getString(payload, (int) getInteger(payload, lengthLength), charset, false); - } - - public static String getString(ByteBuffer payload, int length, Charset charset) - throws ProtocolException { - return getString(payload, length, charset, false); - } - - public static String getString(ByteBuffer payload, int length, Charset charset, boolean useNull) - throws ProtocolException { - if (length > payload.remaining()) { - throw new ProtocolException("Bad string length: " + length); - } - if (useNull && length == 0) { - return null; - } - byte[] octets = new byte[length]; - return new String(octets, charset); - } - - public static String toHexString(byte[] data) { - StringBuilder sb = new StringBuilder(data.length * 3); - - boolean first = true; - for (byte b : data) { - if (first) { - first = false; - } else { - sb.append(' '); - } - sb.append(String.format("%02x", b & BYTE_MASK)); - } - return sb.toString(); - } -} diff --git a/wifi/java/android/net/wifi/anqp/DomainNameElement.java b/wifi/java/android/net/wifi/anqp/DomainNameElement.java deleted file mode 100644 index e683b64..0000000 --- a/wifi/java/android/net/wifi/anqp/DomainNameElement.java +++ /dev/null @@ -1,37 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * The Domain Name ANQP Element, IEEE802.11-2012 section 8.4.4.15 - */ -public class DomainNameElement extends ANQPElement { - private final List<String> mDomains; - - public DomainNameElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - mDomains = new ArrayList<String>(); - - while (payload.hasRemaining()) { - // Use latin-1 to decode for now - safe for ASCII and retains encoding - mDomains.add(Constants.getPrefixedString(payload, 1, StandardCharsets.ISO_8859_1)); - } - } - - public List<String> getDomains() { - return Collections.unmodifiableList(mDomains); - } - - @Override - public String toString() { - return "DomainNameElement{" + - "mDomains=" + mDomains + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/EmergencyNumberElement.java b/wifi/java/android/net/wifi/anqp/EmergencyNumberElement.java deleted file mode 100644 index c7d6b56..0000000 --- a/wifi/java/android/net/wifi/anqp/EmergencyNumberElement.java +++ /dev/null @@ -1,36 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -/** - * The Emergency Number ANQP Element, IEEE802.11-2012 section 8.4.4.5 - */ -public class EmergencyNumberElement extends ANQPElement { - private final List<String> mNumbers; - - public EmergencyNumberElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mNumbers = new ArrayList<String>(); - - while (payload.hasRemaining()) { - mNumbers.add(Constants.getPrefixedString(payload, 1, StandardCharsets.UTF_8)); - } - } - - public List<String> getNumbers() { - return mNumbers; - } - - @Override - public String toString() { - return "EmergencyNumberElement{" + - "mNumbers=" + mNumbers + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/GEOLocationElement.java b/wifi/java/android/net/wifi/anqp/GEOLocationElement.java deleted file mode 100644 index 691fdad..0000000 --- a/wifi/java/android/net/wifi/anqp/GEOLocationElement.java +++ /dev/null @@ -1,314 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * Holds an AP Geospatial Location ANQP Element, as specified in IEEE802.11-2012 section - * 8.4.4.12. - * <p/> - * <p> - * Section 8.4.2.24.10 of the IEEE802.11-2012 specification refers to RFC-3825 for the format of the - * Geospatial location information. RFC-3825 has subsequently been obsoleted by RFC-6225 which - * defines the same basic binary format for the DHCPv4 payload except that a few unused bits of the - * Datum field have been reserved for other uses. - * </p> - * <p/> - * <p> - * RFC-3825 defines a resolution field for each of latitude, longitude and altitude as "the number - * of significant bits" of precision in the respective values and implies through examples and - * otherwise that the non-significant bits should be simply disregarded and the range of values are - * calculated as the numeric interval obtained by varying the range of "insignificant bits" between - * its extremes. As a simple example, consider the value 33 as a simple 8-bit number with three - * significant bits: 33 is 00100001 binary and the leading 001 are the significant bits. With the - * above definition, the range of numbers are [32,63] with 33 asymmetrically located at the low end - * of the interval. In a more realistic setting an instrument, such as a GPS, would most likely - * deliver measurements with a gaussian distribution around the exact value, meaning it is more - * reasonable to assume the value as a "center" value with a symmetric uncertainty interval. - * RFC-6225 redefines the "resolution" from RFC-3825 with an "uncertainty" value with these - * properties, which is also the definition suggested here. - * </p> - * <p/> - * <p> - * The res fields provides the resolution as the exponent to a power of two, - * e.g. 8 means 2^8 = +/- 256, 0 means 2^0 = +/- 1 and -7 means 2^-7 +/- 0.00781250. - * Unknown resolution is indicated by not setting the respective resolution field in the RealValue. - * </p> - */ -public class GEOLocationElement extends ANQPElement { - public enum AltitudeType {Unknown, Meters, Floors} - - public enum Datum {Unknown, WGS84, NAD83Land, NAD83Water} - - private static final int ELEMENT_ID = 123; // ??? - private static final int GEO_LOCATION_LENGTH = 16; - - private static final int LL_FRACTION_SIZE = 25; - private static final int LL_WIDTH = 34; - private static final int ALT_FRACTION_SIZE = 8; - private static final int ALT_WIDTH = 30; - private static final int RES_WIDTH = 6; - private static final int ALT_TYPE_WIDTH = 4; - private static final int DATUM_WIDTH = 8; - - private final RealValue mLatitude; - private final RealValue mLongitude; - private final RealValue mAltitude; - private final AltitudeType mAltitudeType; - private final Datum mDatum; - - public static class RealValue { - private final double mValue; - private final boolean mResolutionSet; - private final int mResolution; - - public RealValue(double value) { - mValue = value; - mResolution = Integer.MIN_VALUE; - mResolutionSet = false; - } - - public RealValue(double value, int resolution) { - mValue = value; - mResolution = resolution; - mResolutionSet = true; - } - - public double getValue() { - return mValue; - } - - public boolean isResolutionSet() { - return mResolutionSet; - } - - public int getResolution() { - return mResolution; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(String.format("%f", mValue)); - if (mResolutionSet) { - sb.append("+/-2^").append(mResolution); - } - return sb.toString(); - } - } - - public GEOLocationElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - payload.get(); - int locLength = payload.get() & BYTE_MASK; - - if (locLength != GEO_LOCATION_LENGTH) { - throw new ProtocolException("GeoLocation length field value " + locLength + - " incorrect, expected 16"); - } - if (payload.remaining() != GEO_LOCATION_LENGTH) { - throw new ProtocolException("Bad buffer length " + payload.remaining() + - ", expected 16"); - } - - ReverseBitStream reverseBitStream = new ReverseBitStream(payload); - - int rawLatRes = (int) reverseBitStream.sliceOff(RES_WIDTH); - double latitude = - fixToFloat(reverseBitStream.sliceOff(LL_WIDTH), LL_FRACTION_SIZE, LL_WIDTH); - - mLatitude = rawLatRes != 0 ? - new RealValue(latitude, bitsToAbsResolution(rawLatRes, LL_WIDTH, - LL_FRACTION_SIZE)) : - new RealValue(latitude); - - int rawLonRes = (int) reverseBitStream.sliceOff(RES_WIDTH); - double longitude = - fixToFloat(reverseBitStream.sliceOff(LL_WIDTH), LL_FRACTION_SIZE, LL_WIDTH); - - mLongitude = rawLonRes != 0 ? - new RealValue(longitude, bitsToAbsResolution(rawLonRes, LL_WIDTH, - LL_FRACTION_SIZE)) : - new RealValue(longitude); - - int altType = (int) reverseBitStream.sliceOff(ALT_TYPE_WIDTH); - mAltitudeType = altType < AltitudeType.values().length ? - AltitudeType.values()[altType] : - AltitudeType.Unknown; - - int rawAltRes = (int) reverseBitStream.sliceOff(RES_WIDTH); - double altitude = fixToFloat(reverseBitStream.sliceOff(ALT_WIDTH), ALT_FRACTION_SIZE, - ALT_WIDTH); - - mAltitude = rawAltRes != 0 ? - new RealValue(altitude, bitsToAbsResolution(rawAltRes, ALT_WIDTH, - ALT_FRACTION_SIZE)) : - new RealValue(altitude); - - int datumValue = (int) reverseBitStream.sliceOff(DATUM_WIDTH); - mDatum = datumValue < Datum.values().length ? Datum.values()[datumValue] : Datum.Unknown; - } - - public RealValue getLatitude() { - return mLatitude; - } - - public RealValue getLongitude() { - return mLongitude; - } - - public RealValue getAltitude() { - return mAltitude; - } - - public AltitudeType getAltitudeType() { - return mAltitudeType; - } - - public Datum getDatum() { - return mDatum; - } - - @Override - public String toString() { - return "GEOLocationElement{" + - "mLatitude=" + mLatitude + - ", mLongitude=" + mLongitude + - ", mAltitude=" + mAltitude + - ", mAltitudeType=" + mAltitudeType + - ", mDatum=" + mDatum + - '}'; - } - - private static class ReverseBitStream { - - private final byte[] mOctets; - private int mBitoffset; - - private ReverseBitStream(ByteBuffer octets) { - mOctets = new byte[octets.remaining()]; - octets.get(mOctets); - } - - private long sliceOff(int bits) { - final int bn = mBitoffset + bits; - int remaining = bits; - long value = 0; - - while (mBitoffset < bn) { - int sbit = mBitoffset & 0x7; // Bit #0 is MSB, inclusive - int octet = mBitoffset >>> 3; - - // Copy the minimum of what's to the right of sbit - // and how much more goes to the target - int width = Math.min(Byte.SIZE - sbit, remaining); - - value = (value << width) | getBits(mOctets[octet], sbit, width); - - mBitoffset += width; - remaining -= width; - } - - System.out.printf(" - Sliced off %d bits: %x\n", bits, value); - return value; - } - - private static int getBits(byte b, int b0, int width) { - int mask = (1 << width) - 1; - return (b >> (Byte.SIZE - b0 - width)) & mask; - } - } - - private static class BitStream { - - private final byte[] data; - private int bitOffset; // bit 0 is MSB of data[0] - - private BitStream(int octets) { - data = new byte[octets]; - } - - private void append(long value, int width) { - System.out.printf("Appending %x:%d\n", value, width); - for (int sbit = width - 1; sbit >= 0; ) { - int b0 = bitOffset >>> 3; - int dbit = bitOffset & 0x7; - - int shr = sbit - 7 + dbit; - int dmask = 0xff >>> dbit; - - if (shr >= 0) { - data[b0] = (byte) ((data[b0] & ~dmask) | ((value >>> shr) & dmask)); - bitOffset += Byte.SIZE - dbit; - sbit -= Byte.SIZE - dbit; - } else { - data[b0] = (byte) ((data[b0] & ~dmask) | ((value << -shr) & dmask)); - bitOffset += sbit + 1; - sbit = -1; - } - } - } - - private byte[] getOctets() { - return data; - } - } - - static double fixToFloat(long value, int fractionSize, int width) { - long sign = 1L << (width - 1); - if ((value & sign) != 0) { - value = -value; - return -(double) (value & (sign - 1)) / (double) (1L << fractionSize); - } else { - return (double) (value & (sign - 1)) / (double) (1L << fractionSize); - } - } - - private static long floatToFix(double value, int fractionSize, int width) { - return Math.round(value * (1L << fractionSize)) & ((1L << width) - 1); - } - - private static final double LOG2_FACTOR = 1.0 / Math.log(2.0); - - /** - * Convert an absolute variance value into absolute resolution representation, - * where the variance = 2^resolution. - * - * @param variance The absolute variance - * @return the absolute resolution. - */ - private static int getResolution(double variance) { - return (int) Math.ceil(Math.log(variance) * LOG2_FACTOR); - } - - /** - * Convert an absolute resolution, into the "number of significant bits" for the given fixed - * point notation as defined in RFC-3825 and refined in RFC-6225. - * - * @param resolution absolute resolution given as 2^resolution. - * @param fieldWidth Full width of the fixed point number used to represent the value. - * @param fractionBits Number of fraction bits in the fixed point number used to represent the - * value. - * @return The number of "significant bits". - */ - private static int absResolutionToBits(int resolution, int fieldWidth, int fractionBits) { - return fieldWidth - fractionBits - 1 - resolution; - } - - /** - * Convert the protocol definition of "number of significant bits" into an absolute resolution. - * - * @param bits The number of "significant bits" from the binary protocol. - * @param fieldWidth Full width of the fixed point number used to represent the value. - * @param fractionBits Number of fraction bits in the fixed point number used to represent the - * value. - * @return The absolute resolution given as 2^resolution. - */ - private static int bitsToAbsResolution(long bits, int fieldWidth, int fractionBits) { - return fieldWidth - fractionBits - 1 - (int) bits; - } -} diff --git a/wifi/java/android/net/wifi/anqp/GenericBlobElement.java b/wifi/java/android/net/wifi/anqp/GenericBlobElement.java deleted file mode 100644 index ecdf939..0000000 --- a/wifi/java/android/net/wifi/anqp/GenericBlobElement.java +++ /dev/null @@ -1,25 +0,0 @@ -package android.net.wifi.anqp; - -import java.nio.ByteBuffer; - -/** - * ANQP Element to hold a raw, unparsed, octet blob - */ -public class GenericBlobElement extends ANQPElement { - private final byte[] mData; - - public GenericBlobElement(Constants.ANQPElementType infoID, ByteBuffer payload) { - super(infoID); - mData = new byte[payload.remaining()]; - payload.get(mData); - } - - public byte[] getData() { - return mData; - } - - @Override - public String toString() { - return "Element ID " + getID() + ": " + Constants.toHexString(mData); - } -} diff --git a/wifi/java/android/net/wifi/anqp/GenericStringElement.java b/wifi/java/android/net/wifi/anqp/GenericStringElement.java deleted file mode 100644 index d304444..0000000 --- a/wifi/java/android/net/wifi/anqp/GenericStringElement.java +++ /dev/null @@ -1,26 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -/** - * ANQP Element to hold a generic (UTF-8 decoded) character string - */ -public class GenericStringElement extends ANQPElement { - private final String mText; - - public GenericStringElement(Constants.ANQPElementType infoID, ByteBuffer payload) throws ProtocolException { - super(infoID); - mText = Constants.getString(payload, payload.remaining(), StandardCharsets.UTF_8); - } - - public String getM_text() { - return mText; - } - - @Override - public String toString() { - return "Element ID " + getID() + ": '" + mText + "'"; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSCapabilityListElement.java b/wifi/java/android/net/wifi/anqp/HSCapabilityListElement.java deleted file mode 100644 index 367dde5..0000000 --- a/wifi/java/android/net/wifi/anqp/HSCapabilityListElement.java +++ /dev/null @@ -1,43 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.Arrays; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * The HS Capability list vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.2 - */ -public class HSCapabilityListElement extends ANQPElement { - private final Constants.ANQPElementType[] mCapabilities; - - public HSCapabilityListElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mCapabilities = new Constants.ANQPElementType[payload.remaining()]; - - int index = 0; - while (payload.hasRemaining()) { - int capID = payload.get() & BYTE_MASK; - Constants.ANQPElementType capability = Constants.mapANQPElement(capID); - if (capability == null) - throw new ProtocolException("Unknown capability: " + capID); - mCapabilities[index++] = capability; - } - } - - public Constants.ANQPElementType[] getCapabilities() { - return mCapabilities; - } - - @Override - public String toString() { - return "HSCapabilityListElement{" + - "mCapabilities=" + Arrays.toString(mCapabilities) + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSConnectionCapabilityElement.java b/wifi/java/android/net/wifi/anqp/HSConnectionCapabilityElement.java deleted file mode 100644 index 8937859..0000000 --- a/wifi/java/android/net/wifi/anqp/HSConnectionCapabilityElement.java +++ /dev/null @@ -1,82 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * The Connection Capability vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.5 - */ -public class HSConnectionCapabilityElement extends ANQPElement { - - public enum ProtoStatus {Closed, Open, Unknown} - - private final List<ProtocolTuple> mStatusList; - - public static class ProtocolTuple { - private final int mProtocol; - private final int mPort; - private final ProtoStatus mStatus; - - private ProtocolTuple(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 4) { - throw new ProtocolException("Runt protocol tuple: " + payload.remaining()); - } - mProtocol = payload.get() & BYTE_MASK; - mPort = payload.getShort() & SHORT_MASK; - int statusNumber = payload.get() & BYTE_MASK; - mStatus = statusNumber < ProtoStatus.values().length ? - ProtoStatus.values()[statusNumber] : - null; - } - - public int getProtocol() { - return mProtocol; - } - - public int getPort() { - return mPort; - } - - public ProtoStatus getStatus() { - return mStatus; - } - - @Override - public String toString() { - return "ProtocolTuple{" + - "mProtocol=" + mProtocol + - ", mPort=" + mPort + - ", mStatus=" + mStatus + - '}'; - } - } - - public HSConnectionCapabilityElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mStatusList = new ArrayList<ProtocolTuple>(); - while (payload.hasRemaining()) { - mStatusList.add(new ProtocolTuple(payload)); - } - } - - public List<ProtocolTuple> getStatusList() { - return Collections.unmodifiableList(mStatusList); - } - - @Override - public String toString() { - return "HSConnectionCapabilityElement{" + - "mStatusList=" + mStatusList + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSFriendlyNameElement.java b/wifi/java/android/net/wifi/anqp/HSFriendlyNameElement.java deleted file mode 100644 index 0fe3692..0000000 --- a/wifi/java/android/net/wifi/anqp/HSFriendlyNameElement.java +++ /dev/null @@ -1,38 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * The Operator Friendly Name vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.3 - */ -public class HSFriendlyNameElement extends ANQPElement { - private final List<I18Name> mNames; - - public HSFriendlyNameElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mNames = new ArrayList<I18Name>(); - - while (payload.hasRemaining()) { - mNames.add(new I18Name(payload)); - } - } - - public List<I18Name> getNames() { - return Collections.unmodifiableList(mNames); - } - - @Override - public String toString() { - return "HSFriendlyNameElement{" + - "mNames=" + mNames + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSIconFileElement.java b/wifi/java/android/net/wifi/anqp/HSIconFileElement.java deleted file mode 100644 index 791ae93..0000000 --- a/wifi/java/android/net/wifi/anqp/HSIconFileElement.java +++ /dev/null @@ -1,59 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * The Icon Binary File vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.11 - */ -public class HSIconFileElement extends ANQPElement { - - public enum StatusCode {Success, FileNotFound, Unspecified} - - private final StatusCode mStatusCode; - private final String mType; - private final byte[] mIconData; - - public HSIconFileElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - if (payload.remaining() < 4) { - throw new ProtocolException("Truncated icon file: " + payload.remaining()); - } - - int statusID = payload.get() & BYTE_MASK; - mStatusCode = statusID < StatusCode.values().length ? StatusCode.values()[statusID] : null; - mType = Constants.getString(payload, 1, StandardCharsets.US_ASCII); - - int dataLength = payload.getShort() & SHORT_MASK; - mIconData = new byte[dataLength]; - payload.get(mIconData); - } - - public StatusCode getStatusCode() { - return mStatusCode; - } - - public String getType() { - return mType; - } - - public byte[] getIconData() { - return mIconData; - } - - @Override - public String toString() { - return "HSIconFileElement{" + - "mStatusCode=" + mStatusCode + - ", mType='" + mType + '\'' + - ", mIconData=" + mIconData.length + " bytes }"; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSOsuProvidersElement.java b/wifi/java/android/net/wifi/anqp/HSOsuProvidersElement.java deleted file mode 100644 index 61e28c5..0000000 --- a/wifi/java/android/net/wifi/anqp/HSOsuProvidersElement.java +++ /dev/null @@ -1,51 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * The OSU Providers List vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.8 - */ -public class HSOsuProvidersElement extends ANQPElement { - private final String mSSID; - private final List<OSUProvider> mProviders; - - public HSOsuProvidersElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mSSID = Constants.getPrefixedString(payload, 1, StandardCharsets.UTF_8); - int providerCount = payload.get() & BYTE_MASK; - - mProviders = new ArrayList<OSUProvider>(providerCount); - - while (providerCount > 0) { - mProviders.add(new OSUProvider(payload)); - providerCount--; - } - } - - public String getSSID() { - return mSSID; - } - - public List<OSUProvider> getProviders() { - return Collections.unmodifiableList(mProviders); - } - - @Override - public String toString() { - return "HSOsuProvidersElement{" + - "mSSID='" + mSSID + '\'' + - ", mProviders=" + mProviders + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/HSWanMetricsElement.java b/wifi/java/android/net/wifi/anqp/HSWanMetricsElement.java deleted file mode 100644 index 1f792a3..0000000 --- a/wifi/java/android/net/wifi/anqp/HSWanMetricsElement.java +++ /dev/null @@ -1,92 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.INT_MASK; -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * The WAN Metrics vendor specific ANQP Element, - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.4 - */ -public class HSWanMetricsElement extends ANQPElement { - - public enum LinkStatus {Reserved, Up, Down, Test} - - private final LinkStatus mStatus; - private final boolean mSymmetric; - private final boolean mCapped; - private final long mDlSpeed; - private final long mUlSpeed; - private final int mDlLoad; - private final int mUlLoad; - private final int mLMD; - - public HSWanMetricsElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - if (payload.remaining() != 13) { - throw new ProtocolException("Bad WAN metrics length: " + payload.remaining()); - } - - int status = payload.get() & BYTE_MASK; - mStatus = LinkStatus.values()[status & 0x03]; - mSymmetric = (status & 0x04) != 0; - mCapped = (status & 0x08) != 0; - mDlSpeed = payload.getInt() & INT_MASK; - mUlSpeed = payload.getInt() & INT_MASK; - mDlLoad = payload.get() & BYTE_MASK; - mUlLoad = payload.get() & BYTE_MASK; - mLMD = payload.getShort() & SHORT_MASK; - } - - public LinkStatus getStatus() { - return mStatus; - } - - public boolean isSymmetric() { - return mSymmetric; - } - - public boolean isCapped() { - return mCapped; - } - - public long getDlSpeed() { - return mDlSpeed; - } - - public long getUlSpeed() { - return mUlSpeed; - } - - public int getDlLoad() { - return mDlLoad; - } - - public int getUlLoad() { - return mUlLoad; - } - - public int getLMD() { - return mLMD; - } - - @Override - public String toString() { - return "HSWanMetricsElement{" + - "mStatus=" + mStatus + - ", mSymmetric=" + mSymmetric + - ", mCapped=" + mCapped + - ", mDlSpeed=" + mDlSpeed + - ", mUlSpeed=" + mUlSpeed + - ", mDlLoad=" + mDlLoad + - ", mUlLoad=" + mUlLoad + - ", mLMD=" + mLMD + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/I18Name.java b/wifi/java/android/net/wifi/anqp/I18Name.java deleted file mode 100644 index 0ceeb18..0000000 --- a/wifi/java/android/net/wifi/anqp/I18Name.java +++ /dev/null @@ -1,45 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Locale; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * A generic Internationalized name used in ANQP elements as specified in 802.11-2012 and - * "Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00" - */ -public class I18Name { - private static final int LANG_CODE_LENGTH = 3; - - private final Locale mLocale; - private final String mText; - - public I18Name(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 4) { - throw new ProtocolException("Truncated I18Name: " + payload.remaining()); - } - int nameLength = payload.get() & BYTE_MASK; - if (nameLength < 3) { - throw new ProtocolException("Runt I18Name: " + nameLength); - } - String language = Constants.getString(payload, LANG_CODE_LENGTH, StandardCharsets.US_ASCII); - mLocale = Locale.forLanguageTag(language); - mText = Constants.getString(payload, nameLength - LANG_CODE_LENGTH, StandardCharsets.UTF_8); - } - - public Locale getLocale() { - return mLocale; - } - - public String getText() { - return mText; - } - - @Override - public String toString() { - return mText + ':' + mLocale.getLanguage(); - } -} diff --git a/wifi/java/android/net/wifi/anqp/IPAddressTypeAvailabilityElement.java b/wifi/java/android/net/wifi/anqp/IPAddressTypeAvailabilityElement.java deleted file mode 100644 index 8c8d388..0000000 --- a/wifi/java/android/net/wifi/anqp/IPAddressTypeAvailabilityElement.java +++ /dev/null @@ -1,52 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -/** - * The IP Address Type availability ANQP Element, IEEE802.11-2012 section 8.4.4.9 - */ -public class IPAddressTypeAvailabilityElement extends ANQPElement { - public enum IPv4Availability { - NotAvailable, Public, PortRestricted, SingleNATA, DoubleNAT, - PortRestrictedAndSingleNAT, PortRestrictedAndDoubleNAT, Unknown - } - - public enum IPv6Availability {NotAvailable, Available, Unknown, Reserved} - - private final IPv4Availability mV4Availability; - private final IPv6Availability mV6Availability; - - public IPAddressTypeAvailabilityElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - if (payload.remaining() != 1) - throw new ProtocolException("Bad IP Address Type Availability length: " + - payload.remaining()); - - int ipField = payload.get(); - mV6Availability = IPv6Availability.values()[ipField & 0x3]; - - ipField = (ipField >> 2) & 0x3f; - mV4Availability = ipField <= IPv4Availability.values().length ? - IPv4Availability.values()[ipField] : - IPv4Availability.Unknown; - } - - public IPv4Availability getV4Availability() { - return mV4Availability; - } - - public IPv6Availability getV6Availability() { - return mV6Availability; - } - - @Override - public String toString() { - return "IPAddressTypeAvailabilityElement{" + - "mV4Availability=" + mV4Availability + - ", mV6Availability=" + mV6Availability + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/IconInfo.java b/wifi/java/android/net/wifi/anqp/IconInfo.java deleted file mode 100644 index 33d4c77..0000000 --- a/wifi/java/android/net/wifi/anqp/IconInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Locale; - -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * The Icons available OSU Providers sub field, as specified in - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.8.1.4 - */ -public class IconInfo { - private final int mWidth; - private final int mHeight; - private final Locale mLocale; - private final String mIconType; - private final String mFileName; - - public IconInfo(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 9) { - throw new ProtocolException("Truncated icon meta data"); - } - - mWidth = payload.getShort() & SHORT_MASK; - mHeight = payload.getShort() & SHORT_MASK; - mLocale = Locale.forLanguageTag(Constants.getString(payload, 3, StandardCharsets.US_ASCII)); - mIconType = Constants.getPrefixedString(payload, 1, StandardCharsets.US_ASCII); - mFileName = Constants.getPrefixedString(payload, 1, StandardCharsets.UTF_8); - } - - public int getWidth() { - return mWidth; - } - - public int getHeight() { - return mHeight; - } - - public Locale getLocale() { - return mLocale; - } - - public String getIconType() { - return mIconType; - } - - public String getFileName() { - return mFileName; - } - - @Override - public String toString() { - return "IconInfo{" + - "mWidth=" + mWidth + - ", mHeight=" + mHeight + - ", mLocale=" + mLocale + - ", mIconType='" + mIconType + '\'' + - ", mFileName='" + mFileName + '\'' + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/NAIRealmData.java b/wifi/java/android/net/wifi/anqp/NAIRealmData.java deleted file mode 100644 index 14d5aaf..0000000 --- a/wifi/java/android/net/wifi/anqp/NAIRealmData.java +++ /dev/null @@ -1,68 +0,0 @@ -package android.net.wifi.anqp; - -import android.net.wifi.anqp.eap.EAPMethod; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.SHORT_MASK; -import static android.net.wifi.anqp.Constants.UTF8_INDICATOR; - -/** - * The NAI Realm Data ANQP sub-element, IEEE802.11-2012 section 8.4.4.10 figure 8-418 - */ -public class NAIRealmData { - private final List<String> mRealms; - private final List<EAPMethod> mEAPMethods; - - public NAIRealmData(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 5) { - throw new ProtocolException("Runt payload: " + payload.remaining()); - } - - int length = payload.getShort() & SHORT_MASK; - if (length > payload.remaining()) { - throw new ProtocolException("Invalid data length: " + length); - } - boolean utf8 = (payload.get() & 1) == UTF8_INDICATOR; - - String realm = Constants.getPrefixedString(payload, 1, utf8 ? - StandardCharsets.UTF_8 : - StandardCharsets.US_ASCII); - String[] realms = realm.split(";"); - mRealms = new ArrayList<String>(); - for (String realmElement : realms) { - if (realmElement.length() > 0) { - mRealms.add(realmElement); - } - } - - int methodCount = payload.get() & BYTE_MASK; - mEAPMethods = new ArrayList<EAPMethod>(methodCount); - while (methodCount > 0) { - mEAPMethods.add(new EAPMethod(payload)); - methodCount--; - } - } - - public List<String> getRealms() { - return Collections.unmodifiableList(mRealms); - } - - public List<EAPMethod> getEAPMethods() { - return Collections.unmodifiableList(mEAPMethods); - } - - @Override - public String toString() { - return "NAIRealmData{" + - "mRealms='" + mRealms + '\'' + - ", mEAPMethods=" + mEAPMethods + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/NAIRealmElement.java b/wifi/java/android/net/wifi/anqp/NAIRealmElement.java deleted file mode 100644 index 9083518..0000000 --- a/wifi/java/android/net/wifi/anqp/NAIRealmElement.java +++ /dev/null @@ -1,49 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTES_IN_SHORT; -import static android.net.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<NAIRealmData>(count); - while (count > 0) { - mRealmData.add(new NAIRealmData(payload)); - count--; - } - } - - public List<NAIRealmData> getRealmData() { - return Collections.unmodifiableList(mRealmData); - } - - @Override - public String toString() { - return "NAIRealmElement{" + - "mRealmData=" + mRealmData + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/NetworkAuthenticationTypeElement.java b/wifi/java/android/net/wifi/anqp/NetworkAuthenticationTypeElement.java deleted file mode 100644 index d26c19d..0000000 --- a/wifi/java/android/net/wifi/anqp/NetworkAuthenticationTypeElement.java +++ /dev/null @@ -1,75 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * The Network Authentication Type ANQP Element, IEEE802.11-2012 section 8.4.4.6 - */ -public class NetworkAuthenticationTypeElement extends ANQPElement { - - private final List<NetworkAuthentication> m_authenticationTypes; - - public enum NwkAuthTypeEnum { - TermsAndConditions, - OnLineEnrollment, - HTTPRedirection, - DNSRedirection, - Reserved - } - - public static class NetworkAuthentication { - private final NwkAuthTypeEnum m_type; - private final String m_url; - - private NetworkAuthentication(NwkAuthTypeEnum type, String url) { - m_type = type; - m_url = url; - } - - public NwkAuthTypeEnum getType() { - return m_type; - } - - public String getURL() { - return m_url; - } - - @Override - public String toString() { - return "NetworkAuthentication{" + - "m_type=" + m_type + - ", m_url='" + m_url + '\'' + - '}'; - } - } - - public NetworkAuthenticationTypeElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - - super(infoID); - - m_authenticationTypes = new ArrayList<NetworkAuthentication>(); - - while (payload.hasRemaining()) { - int typeNumber = payload.get() & BYTE_MASK; - NwkAuthTypeEnum type; - type = typeNumber >= NwkAuthTypeEnum.values().length ? - NwkAuthTypeEnum.Reserved : - NwkAuthTypeEnum.values()[typeNumber]; - - m_authenticationTypes.add(new NetworkAuthentication(type, - Constants.getPrefixedString(payload, 2, StandardCharsets.UTF_8))); - } - } - - public List<NetworkAuthentication> getAuthenticationTypes() { - return Collections.unmodifiableList(m_authenticationTypes); - } -} diff --git a/wifi/java/android/net/wifi/anqp/OSUProvider.java b/wifi/java/android/net/wifi/anqp/OSUProvider.java deleted file mode 100644 index aead563..0000000 --- a/wifi/java/android/net/wifi/anqp/OSUProvider.java +++ /dev/null @@ -1,117 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.SHORT_MASK; - -/** - * An OSU Provider, as specified in - * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, - * section 4.8.1 - */ -public class OSUProvider { - - public enum OSUMethod {OmaDm, SoapXml} - - private final List<I18Name> mNames; - private final String mOSUServer; - private final List<OSUMethod> mOSUMethods; - private final List<IconInfo> mIcons; - private final String mOsuNai; - private final List<I18Name> mServiceDescriptions; - - public OSUProvider(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 11) { - throw new ProtocolException("Truncated OSU provider: " + payload.remaining()); - } - - int length = payload.getShort() & SHORT_MASK; - int namesLength = payload.getShort() & SHORT_MASK; - - ByteBuffer namesBuffer = payload.duplicate(); - namesBuffer.limit(namesBuffer.position() + namesLength); - payload.position(payload.position() + namesLength); - - mNames = new ArrayList<I18Name>(); - - while (namesBuffer.hasRemaining()) { - mNames.add(new I18Name(namesBuffer)); - } - - mOSUServer = Constants.getPrefixedString(payload, 1, StandardCharsets.UTF_8); - int methodLength = payload.get() & BYTE_MASK; - mOSUMethods = new ArrayList<OSUMethod>(methodLength); - while (methodLength > 0) { - int methodID = payload.get() & BYTE_MASK; - mOSUMethods.add(methodID < OSUMethod.values().length ? - OSUMethod.values()[methodID] : - null); - methodLength--; - } - - int iconsLength = payload.getShort() & SHORT_MASK; - ByteBuffer iconsBuffer = payload.duplicate(); - iconsBuffer.limit(iconsBuffer.position() + iconsLength); - payload.position(payload.position() + iconsLength); - - mIcons = new ArrayList<IconInfo>(); - - while (iconsBuffer.hasRemaining()) { - mIcons.add(new IconInfo(iconsBuffer)); - } - - mOsuNai = Constants.getString(payload, 1, StandardCharsets.UTF_8, true); - - int descriptionsLength = payload.getShort() & SHORT_MASK; - ByteBuffer descriptionsBuffer = payload.duplicate(); - descriptionsBuffer.limit(descriptionsBuffer.position() + descriptionsLength); - payload.position(payload.position() + descriptionsLength); - - mServiceDescriptions = new ArrayList<I18Name>(); - - while (descriptionsBuffer.hasRemaining()) { - mServiceDescriptions.add(new I18Name(descriptionsBuffer)); - } - } - - public List<I18Name> getNames() { - return mNames; - } - - public String getOSUServer() { - return mOSUServer; - } - - public List<OSUMethod> getOSUMethods() { - return mOSUMethods; - } - - public List<IconInfo> getIcons() { - return mIcons; - } - - public String getOsuNai() { - return mOsuNai; - } - - public List<I18Name> getServiceDescriptions() { - return mServiceDescriptions; - } - - @Override - public String toString() { - return "OSUProvider{" + - "mNames=" + mNames + - ", mOSUServer='" + mOSUServer + '\'' + - ", mOSUMethods=" + mOSUMethods + - ", mIcons=" + mIcons + - ", mOsuNai='" + mOsuNai + '\'' + - ", mServiceDescriptions=" + mServiceDescriptions + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/RoamingConsortiumElement.java b/wifi/java/android/net/wifi/anqp/RoamingConsortiumElement.java deleted file mode 100644 index ff8727e..0000000 --- a/wifi/java/android/net/wifi/anqp/RoamingConsortiumElement.java +++ /dev/null @@ -1,44 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; -import static android.net.wifi.anqp.Constants.getInteger; - -/** - * The Roaming Consortium ANQP Element, IEEE802.11-2012 section 8.4.4.7 - */ -public class RoamingConsortiumElement extends ANQPElement { - - private final List<Long> mOis; - - public RoamingConsortiumElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - mOis = new ArrayList<Long>(); - - while (payload.hasRemaining()) { - int length = payload.get() & BYTE_MASK; - if (length > payload.remaining()) { - throw new ProtocolException("Bad OI length: " + length); - } - mOis.add(getInteger(payload, length)); - } - } - - public List<Long> getOIs() { - return Collections.unmodifiableList(mOis); - } - - @Override - public String toString() { - return "RoamingConsortiumElement{" + - "mOis=" + mOis + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/ThreeGPPNetworkElement.java b/wifi/java/android/net/wifi/anqp/ThreeGPPNetworkElement.java deleted file mode 100644 index 57dbe77..0000000 --- a/wifi/java/android/net/wifi/anqp/ThreeGPPNetworkElement.java +++ /dev/null @@ -1,28 +0,0 @@ -package android.net.wifi.anqp; - -import java.nio.ByteBuffer; - -/** - * The 3GPP Cellular Network ANQP Element, IEEE802.11-2012 section 8.4.4.11 - */ -public class ThreeGPPNetworkElement extends ANQPElement { - - private final byte[] mData; - - public ThreeGPPNetworkElement(Constants.ANQPElementType infoID, ByteBuffer payload) { - super(infoID); - mData = new byte[payload.remaining()]; - payload.get(mData); - } - - public byte[] getData() { - return mData; - } - - @Override - public String toString() { - return "ThreeGPPNetworkElement{" + - "mData=" + Constants.toHexString(mData) + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/VenueNameElement.java b/wifi/java/android/net/wifi/anqp/VenueNameElement.java deleted file mode 100644 index bb71524..0000000 --- a/wifi/java/android/net/wifi/anqp/VenueNameElement.java +++ /dev/null @@ -1,194 +0,0 @@ -package android.net.wifi.anqp; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * The Venue Name ANQP Element, IEEE802.11-2012 section 8.4.4.4 - */ -public class VenueNameElement extends ANQPElement { - private final VenueGroup mGroup; - private final VenueType mType; - private final List<I18Name> mNames; - - private static final Map<VenueGroup, Integer> s_groupBases = - new EnumMap<VenueGroup, Integer>(VenueGroup.class); - - public VenueNameElement(Constants.ANQPElementType infoID, ByteBuffer payload) - throws ProtocolException { - super(infoID); - - if (payload.remaining() < 2) - throw new ProtocolException("Runt Venue Name"); - - int group = payload.get() & BYTE_MASK; - int type = payload.get() & BYTE_MASK; - - if (group >= VenueGroup.values().length) { - mGroup = VenueGroup.Reserved; - mType = VenueType.Reserved; - } else { - mGroup = VenueGroup.values()[group]; - type += s_groupBases.get(mGroup); - if (type >= VenueType.values().length) { - mType = VenueType.Reserved; - } else { - mType = VenueType.values()[type]; - } - } - - mNames = new ArrayList<I18Name>(); - while (payload.hasRemaining()) { - mNames.add(new I18Name(payload)); - } - } - - public VenueGroup getGroup() { - return mGroup; - } - - public VenueType getType() { - return mType; - } - - public List<I18Name> getNames() { - return Collections.unmodifiableList(mNames); - } - - @Override - public String toString() { - return "VenueNameElement{" + - "m_group=" + mGroup + - ", m_type=" + mType + - ", m_names=" + mNames + - '}'; - } - - public enum VenueGroup { - Unspecified, - Assembly, - Business, - Educational, - FactoryIndustrial, - Institutional, - Mercantile, - Residential, - Storage, - UtilityMiscellaneous, - Vehicular, - Outdoor, - Reserved - } - - public enum VenueType { - Unspecified, - - UnspecifiedAssembly, - Arena, - Stadium, - PassengerTerminal, - Amphitheater, - AmusementPark, - PlaceOfWorship, - ConventionCenter, - Library, - Museum, - Restaurant, - Theater, - Bar, - CoffeeShop, - ZooOrAquarium, - EmergencyCoordinationCenter, - - UnspecifiedBusiness, - DoctorDentistoffice, - Bank, - FireStation, - PoliceStation, - PostOffice, - ProfessionalOffice, - ResearchDevelopmentFacility, - AttorneyOffice, - - UnspecifiedEducational, - SchoolPrimary, - SchoolSecondary, - UniversityCollege, - - UnspecifiedFactoryIndustrial, - Factory, - - UnspecifiedInstitutional, - Hospital, - LongTermCareFacility, - AlcoholAndDrugRehabilitationCenter, - GroupHome, - PrisonJail, - - UnspecifiedMercantile, - RetailStore, - GroceryMarket, - AutomotiveServiceStation, - ShoppingMall, - GasStation, - - UnspecifiedResidential, - PrivateResidence, - HotelMotel, - Dormitory, - BoardingHouse, - - UnspecifiedStorage, - - UnspecifiedUtilityMiscellaneous, - - AutomobileOrTruck, - Airplane, - Bus, - Ferry, - ShipOrBoat, - Train, - MotorBike, - - UnspecifiedOutdoor, - MuniMeshNetwork, - CityPark, - RestArea, - TrafficControl, - BusStop, - Kiosk, - - Reserved - } - - private static final VenueType[] PerGroup = - { - VenueType.Unspecified, - VenueType.UnspecifiedAssembly, - VenueType.UnspecifiedBusiness, - VenueType.UnspecifiedEducational, - VenueType.UnspecifiedFactoryIndustrial, - VenueType.UnspecifiedInstitutional, - VenueType.UnspecifiedMercantile, - VenueType.UnspecifiedResidential, - VenueType.UnspecifiedStorage, - VenueType.UnspecifiedUtilityMiscellaneous, - VenueType.AutomobileOrTruck, - VenueType.UnspecifiedOutdoor, - null - }; - - static { - int index = 0; - for (VenueType venue : PerGroup) { - s_groupBases.put(VenueGroup.values()[index++], venue.ordinal()); - } - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/AuthParam.java b/wifi/java/android/net/wifi/anqp/eap/AuthParam.java deleted file mode 100644 index 9c40300..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/AuthParam.java +++ /dev/null @@ -1,9 +0,0 @@ -package android.net.wifi.anqp.eap; - -/** - * An Authentication parameter, part of the NAI Realm ANQP element, specified in - * IEEE802.11-2012 section 8.4.4.10, table 8-188 - */ -public interface AuthParam { - public EAP.AuthInfoID getAuthInfoID(); -} diff --git a/wifi/java/android/net/wifi/anqp/eap/Credential.java b/wifi/java/android/net/wifi/anqp/eap/Credential.java deleted file mode 100644 index df77b89..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/Credential.java +++ /dev/null @@ -1,74 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * An EAP authentication parameter, IEEE802.11-2012, table 8-188 - */ -public class Credential implements AuthParam { - - public enum CredType { - Reserved, - SIM, - USIM, - NFC, - HWToken, - Softoken, - Certificate, - Username, - None, - Anonymous, - VendorSpecific} - - private final EAP.AuthInfoID mAuthInfoID; - private final CredType mCredType; - - public Credential(EAP.AuthInfoID infoID, ByteBuffer payload) throws ProtocolException { - mAuthInfoID = infoID; - - if (payload.remaining() != 1) { - throw new ProtocolException("Bad length: " + payload.remaining()); - } - - int typeID = payload.get() & BYTE_MASK; - mCredType = typeID < CredType.values().length ? - CredType.values()[typeID] : - CredType.Reserved; - } - - @Override - public EAP.AuthInfoID getAuthInfoID() { - return mAuthInfoID; - } - - @Override - public int hashCode() { - return mAuthInfoID.hashCode() * 31 + mCredType.hashCode(); - } - - @Override - public boolean equals(Object thatObject) { - if (thatObject == this) { - return true; - } else if (thatObject == null || thatObject.getClass() != AuthParam.class) { - return false; - } else { - return ((Credential) thatObject).getCredType() == getCredType(); - } - } - - public CredType getCredType() { - return mCredType; - } - - @Override - public String toString() { - return "Credential{" + - "mAuthInfoID=" + mAuthInfoID + - ", mCredType=" + mCredType + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/EAP.java b/wifi/java/android/net/wifi/anqp/eap/EAP.java deleted file mode 100644 index 35d28d9..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/EAP.java +++ /dev/null @@ -1,132 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.util.HashMap; -import java.util.Map; - -/** - * EAP Related constants for the ANQP NAIRealm element, IEEE802.11-2012 section 8.4.4.10 - */ -public abstract class EAP { - - private static final Map<Integer, EAPMethodID> s_eapIds = new HashMap<Integer, EAPMethodID>(); - - public static final int EAP_MD5 = 4; - public static final int EAP_OTP = 5; - public static final int EAP_RSA = 9; - public static final int EAP_KEA = 11; - public static final int EAP_KEA_VALIDATE = 12; - public static final int EAP_TLS = 13; - public static final int EAP_LEAP = 17; - public static final int EAP_SIM = 18; - public static final int EAP_TTLS = 21; - public static final int EAP_AKA = 23; - public static final int EAP_3Com = 24; - public static final int EAP_MSCHAPv2 = 26; - public static final int EAP_PEAP = 29; - public static final int EAP_POTP = 32; - public static final int EAP_ActiontecWireless = 35; - public static final int EAP_HTTPDigest = 38; - public static final int EAP_SPEKE = 41; - public static final int EAP_MOBAC = 42; - public static final int EAP_FAST = 43; - public static final int EAP_ZLXEAP = 44; - public static final int EAP_Link = 45; - public static final int EAP_PAX = 46; - public static final int EAP_PSK = 47; - public static final int EAP_SAKE = 48; - public static final int EAP_IKEv2 = 49; - public static final int EAP_AKAPrim = 50; - public static final int EAP_GPSK = 51; - public static final int EAP_PWD = 52; - public static final int EAP_EKE = 53; - public static final int EAP_TEAP = 55; - - public enum EAPMethodID { - EAP_MD5, - EAP_OTP, - EAP_RSA, - EAP_KEA, - EAP_KEA_VALIDATE, - EAP_TLS, - EAP_LEAP, - EAP_SIM, - EAP_TTLS, - EAP_AKA, - EAP_3Com, - EAP_MSCHAPv2, - EAP_PEAP, - EAP_POTP, - EAP_ActiontecWireless, - EAP_HTTPDigest, - EAP_SPEKE, - EAP_MOBAC, - EAP_FAST, - EAP_ZLXEAP, - EAP_Link, - EAP_PAX, - EAP_PSK, - EAP_SAKE, - EAP_IKEv2, - EAP_AKAPrim, - EAP_GPSK, - EAP_PWD, - EAP_EKE, - EAP_TEAP - } - - public static final int ExpandedEAPMethod = 1; - public static final int NonEAPInnerAuthType = 2; - public static final int InnerAuthEAPMethodType = 3; - public static final int ExpandedInnerEAPMethod = 4; - public static final int CredentialType = 5; - public static final int TunneledEAPMethodCredType = 6; - public static final int VendorSpecific = 221; - - public enum AuthInfoID { - Undefined, - ExpandedEAPMethod, - NonEAPInnerAuthType, - InnerAuthEAPMethodType, - ExpandedInnerEAPMethod, - CredentialType, - TunneledEAPMethodCredType, - VendorSpecific - } - - static { - s_eapIds.put(EAP_MD5, EAPMethodID.EAP_MD5); - s_eapIds.put(EAP_OTP, EAPMethodID.EAP_OTP); - s_eapIds.put(EAP_RSA, EAPMethodID.EAP_RSA); - s_eapIds.put(EAP_KEA, EAPMethodID.EAP_KEA); - s_eapIds.put(EAP_KEA_VALIDATE, EAPMethodID.EAP_KEA_VALIDATE); - s_eapIds.put(EAP_TLS, EAPMethodID.EAP_TLS); - s_eapIds.put(EAP_LEAP, EAPMethodID.EAP_LEAP); - s_eapIds.put(EAP_SIM, EAPMethodID.EAP_SIM); - s_eapIds.put(EAP_TTLS, EAPMethodID.EAP_TTLS); - s_eapIds.put(EAP_AKA, EAPMethodID.EAP_AKA); - s_eapIds.put(EAP_3Com, EAPMethodID.EAP_3Com); - s_eapIds.put(EAP_MSCHAPv2, EAPMethodID.EAP_MSCHAPv2); - s_eapIds.put(EAP_PEAP, EAPMethodID.EAP_PEAP); - s_eapIds.put(EAP_POTP, EAPMethodID.EAP_POTP); - s_eapIds.put(EAP_ActiontecWireless, EAPMethodID.EAP_ActiontecWireless); - s_eapIds.put(EAP_HTTPDigest, EAPMethodID.EAP_HTTPDigest); - s_eapIds.put(EAP_SPEKE, EAPMethodID.EAP_SPEKE); - s_eapIds.put(EAP_MOBAC, EAPMethodID.EAP_MOBAC); - s_eapIds.put(EAP_FAST, EAPMethodID.EAP_FAST); - s_eapIds.put(EAP_ZLXEAP, EAPMethodID.EAP_ZLXEAP); - s_eapIds.put(EAP_Link, EAPMethodID.EAP_Link); - s_eapIds.put(EAP_PAX, EAPMethodID.EAP_PAX); - s_eapIds.put(EAP_PSK, EAPMethodID.EAP_PSK); - s_eapIds.put(EAP_SAKE, EAPMethodID.EAP_SAKE); - s_eapIds.put(EAP_IKEv2, EAPMethodID.EAP_IKEv2); - s_eapIds.put(EAP_AKAPrim, EAPMethodID.EAP_AKAPrim); - s_eapIds.put(EAP_GPSK, EAPMethodID.EAP_GPSK); - s_eapIds.put(EAP_PWD, EAPMethodID.EAP_PWD); - s_eapIds.put(EAP_EKE, EAPMethodID.EAP_EKE); - s_eapIds.put(EAP_TEAP, EAPMethodID.EAP_TEAP); - } - - public static EAPMethodID mapEAPMethod(int methodID) { - return s_eapIds.get(methodID); - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/EAPMethod.java b/wifi/java/android/net/wifi/anqp/eap/EAPMethod.java deleted file mode 100644 index 968da36..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/EAPMethod.java +++ /dev/null @@ -1,134 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * An EAP Method, part of the NAI Realm ANQP element, specified in - * IEEE802.11-2012 section 8.4.4.10, figure 8-420 - */ -public class EAPMethod { - private final EAP.EAPMethodID mEAPMethodID; - private final Map<EAP.AuthInfoID, Set<AuthParam>> mAuthParams; - - public EAPMethod(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 3) { - throw new ProtocolException("Runt EAP Method: " + payload.remaining()); - } - - int length = payload.get() & BYTE_MASK; - int methodID = payload.get() & BYTE_MASK; - int count = payload.get() & BYTE_MASK; - - mEAPMethodID = EAP.mapEAPMethod(methodID); - mAuthParams = new EnumMap<EAP.AuthInfoID, Set<AuthParam>>(EAP.AuthInfoID.class); - - int realCount = 0; - - ByteBuffer paramPayload = payload.duplicate(); - paramPayload.limit(paramPayload.position() + length); - payload.position(payload.position() + length); - while (paramPayload.hasRemaining()) { - int id = paramPayload.get() & BYTE_MASK; - - EAP.AuthInfoID authInfoID; - - if (id == EAP.VendorSpecific) { - authInfoID = EAP.AuthInfoID.VendorSpecific; - } else if (id <= EAP.AuthInfoID.TunneledEAPMethodCredType.ordinal() && id > 0) { - authInfoID = EAP.AuthInfoID.values()[id]; - } else { - throw new ProtocolException("Unknown auth parameter ID: " + id); - } - - switch (authInfoID) { - case ExpandedEAPMethod: - addAuthParam(new ExpandedEAPMethod(authInfoID, paramPayload)); - break; - case NonEAPInnerAuthType: - addAuthParam(new NonEAPInnerAuth(paramPayload)); - break; - case InnerAuthEAPMethodType: - addAuthParam(new InnerAuthEAP(paramPayload)); - break; - case ExpandedInnerEAPMethod: - addAuthParam(new ExpandedEAPMethod(authInfoID, paramPayload)); - break; - case CredentialType: - addAuthParam(new Credential(authInfoID, paramPayload)); - break; - case TunneledEAPMethodCredType: - addAuthParam(new Credential(authInfoID, paramPayload)); - break; - case VendorSpecific: - addAuthParam(new VendorSpecificAuth(paramPayload)); - break; - } - - realCount++; - } - if (realCount != count) - throw new ProtocolException("Invalid parameter count: " + realCount + - ", expected " + count); - } - - private void addAuthParam(AuthParam param) { - Set<AuthParam> authParams = mAuthParams.get(param.getAuthInfoID()); - if (authParams == null) { - authParams = new HashSet<AuthParam>(); - mAuthParams.put(param.getAuthInfoID(), authParams); - } - authParams.add(param); - } - - public Map<EAP.AuthInfoID, Set<AuthParam>> getAuthParams() { - return Collections.unmodifiableMap(mAuthParams); - } - - public EAP.EAPMethodID getEAPMethodID() { - return mEAPMethodID; - } - - public boolean matchesAuthParams(EAPMethod other) { - for (Map.Entry<EAP.AuthInfoID, Set<AuthParam>> entry : other.getAuthParams().entrySet()) { - - Set<AuthParam> myParams = mAuthParams.get(entry.getKey()); - if (myParams == null) - continue; - - Set<AuthParam> otherParams = entry.getValue(); - - Set<AuthParam> iterationSet; - Set<AuthParam> seekSet; - if (myParams.size() >= otherParams.size()) { - seekSet = myParams; - iterationSet = otherParams; - } else { - seekSet = otherParams; - iterationSet = myParams; - } - - for (AuthParam param : iterationSet) { - if (seekSet.contains(param)) { - return true; - } - } - } - return false; - } - - @Override - public String toString() { - return "EAPMethod{" + - "mEAPMethodID=" + mEAPMethodID + - ", mAuthParams=" + mAuthParams + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/ExpandedEAPMethod.java b/wifi/java/android/net/wifi/anqp/eap/ExpandedEAPMethod.java deleted file mode 100644 index 635d3b1..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/ExpandedEAPMethod.java +++ /dev/null @@ -1,66 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.INT_MASK; -import static android.net.wifi.anqp.Constants.getInteger; - -/** - * An EAP authentication parameter, IEEE802.11-2012, table 8-188 - */ -public class ExpandedEAPMethod implements AuthParam { - - private final EAP.AuthInfoID m_authInfoID; - private final int m_vendorID; - private final long m_vendorType; - - public ExpandedEAPMethod(EAP.AuthInfoID authInfoID, ByteBuffer payload) throws ProtocolException { - m_authInfoID = authInfoID; - if (payload.remaining() != 7) { - throw new ProtocolException("Bad length: " + payload.remaining()); - } - - m_vendorID = (int) getInteger(payload, 3); - m_vendorType = payload.getInt() & INT_MASK; - } - - @Override - public EAP.AuthInfoID getAuthInfoID() { - return m_authInfoID; - } - - @Override - public int hashCode() { - return (m_authInfoID.hashCode() * 31 + m_vendorID) * 31 + (int) m_vendorType; - } - - @Override - public boolean equals(Object thatObject) { - if (thatObject == this) { - return true; - } else if (thatObject == null || thatObject.getClass() != ExpandedEAPMethod.class) { - return false; - } else { - ExpandedEAPMethod that = (ExpandedEAPMethod) thatObject; - return that.getVendorID() == getVendorID() && that.getVendorType() == getVendorType(); - } - } - - public int getVendorID() { - return m_vendorID; - } - - public long getVendorType() { - return m_vendorType; - } - - @Override - public String toString() { - return "ExpandedEAPMethod{" + - "m_authInfoID=" + m_authInfoID + - ", m_vendorID=" + m_vendorID + - ", m_vendorType=" + m_vendorType + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/InnerAuthEAP.java b/wifi/java/android/net/wifi/anqp/eap/InnerAuthEAP.java deleted file mode 100644 index 06ce0f3..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/InnerAuthEAP.java +++ /dev/null @@ -1,55 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * An EAP authentication parameter, IEEE802.11-2012, table 8-188 - */ -public class InnerAuthEAP implements AuthParam { - - private final EAP.EAPMethodID mEapMethodID; - - public InnerAuthEAP(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() != 1) { - throw new ProtocolException("Bad length: " + payload.remaining()); - } - - int typeID = payload.get() & BYTE_MASK; - mEapMethodID = EAP.mapEAPMethod(typeID); - } - - @Override - public EAP.AuthInfoID getAuthInfoID() { - return EAP.AuthInfoID.InnerAuthEAPMethodType; - } - - public EAP.EAPMethodID getEAPMethodID() { - return mEapMethodID; - } - - @Override - public int hashCode() { - return mEapMethodID.hashCode(); - } - - @Override - public boolean equals(Object thatObject) { - if (thatObject == this) { - return true; - } else if (thatObject == null || thatObject.getClass() != InnerAuthEAP.class) { - return false; - } else { - return ((InnerAuthEAP) thatObject).getEAPMethodID() == getEAPMethodID(); - } - } - - @Override - public String toString() { - return "InnerAuthEAP{" + - "EapMethodID=" + mEapMethodID + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/NonEAPInnerAuth.java b/wifi/java/android/net/wifi/anqp/eap/NonEAPInnerAuth.java deleted file mode 100644 index 188472c..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/NonEAPInnerAuth.java +++ /dev/null @@ -1,59 +0,0 @@ -package android.net.wifi.anqp.eap; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * An EAP authentication parameter, IEEE802.11-2012, table 8-188 - */ -public class NonEAPInnerAuth implements AuthParam { - - public enum NonEAPType {Reserved, PAP, CHAP, MSCHAP, MSCHAPv2} - - private final NonEAPType mType; - - public NonEAPInnerAuth(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() != 1) { - throw new ProtocolException("Bad length: " + payload.remaining()); - } - - int typeID = payload.get() & BYTE_MASK; - mType = typeID < NonEAPType.values().length ? - NonEAPType.values()[typeID] : - NonEAPType.Reserved; - } - - @Override - public EAP.AuthInfoID getAuthInfoID() { - return EAP.AuthInfoID.NonEAPInnerAuthType; - } - - public NonEAPType getType() { - return mType; - } - - @Override - public int hashCode() { - return mType.hashCode(); - } - - @Override - public boolean equals(Object thatObject) { - if (thatObject == this) { - return true; - } else if (thatObject == null || thatObject.getClass() != NonEAPInnerAuth.class) { - return false; - } else { - return ((NonEAPInnerAuth) thatObject).getType() == getType(); - } - } - - @Override - public String toString() { - return "NonEAPInnerAuth{" + - "mType=" + mType + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/anqp/eap/VendorSpecificAuth.java b/wifi/java/android/net/wifi/anqp/eap/VendorSpecificAuth.java deleted file mode 100644 index eaefd91..0000000 --- a/wifi/java/android/net/wifi/anqp/eap/VendorSpecificAuth.java +++ /dev/null @@ -1,61 +0,0 @@ -package android.net.wifi.anqp.eap; - -import android.net.wifi.anqp.Constants; - -import java.net.ProtocolException; -import java.nio.ByteBuffer; -import java.util.Arrays; - -import static android.net.wifi.anqp.Constants.BYTE_MASK; - -/** - * An EAP authentication parameter, IEEE802.11-2012, table 8-188 - */ -public class VendorSpecificAuth implements AuthParam { - - private final byte[] mData; - - public VendorSpecificAuth(ByteBuffer payload) throws ProtocolException { - if (payload.remaining() < 1 || payload.remaining() > 256) { - throw new ProtocolException("Bad length: " + payload.remaining()); - } - - int length = payload.get() & BYTE_MASK; - if (length > payload.remaining()) { - throw new ProtocolException("Excessive length: " + length); - } - mData = new byte[length]; - payload.get(mData); - } - - @Override - public EAP.AuthInfoID getAuthInfoID() { - return EAP.AuthInfoID.VendorSpecific; - } - - public int hashCode() { - return Arrays.hashCode(mData); - } - - @Override - public boolean equals(Object thatObject) { - if (thatObject == this) { - return true; - } else if (thatObject == null || thatObject.getClass() != VendorSpecificAuth.class) { - return false; - } else { - return Arrays.equals(((VendorSpecificAuth) thatObject).getData(), getData()); - } - } - - public byte[] getData() { - return mData; - } - - @Override - public String toString() { - return "VendorSpecificAuth{" + - "mData=" + Constants.toHexString(mData) + - '}'; - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/ANQPData.java b/wifi/java/android/net/wifi/hotspot2/ANQPData.java deleted file mode 100644 index 626fdb1..0000000 --- a/wifi/java/android/net/wifi/hotspot2/ANQPData.java +++ /dev/null @@ -1,26 +0,0 @@ -package android.net.wifi.hotspot2; - -import android.net.wifi.anqp.ANQPElement; - -import java.util.Collections; -import java.util.List; - -/** - * Created by jannq on 1/21/15. - */ -public class ANQPData { - private final List<ANQPElement> mANQPElements; - private final long mCtime; - private volatile long mAtime; - - public ANQPData( List<ANQPElement> ANQPElements ) { - mANQPElements = Collections.unmodifiableList( ANQPElements ); - mCtime = System.currentTimeMillis(); - mAtime = mCtime; - } - - public List<ANQPElement> getANQPElements() { - mAtime = System.currentTimeMillis(); - return mANQPElements; - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/NetworkInfo.java b/wifi/java/android/net/wifi/hotspot2/NetworkInfo.java deleted file mode 100644 index add5fde..0000000 --- a/wifi/java/android/net/wifi/hotspot2/NetworkInfo.java +++ /dev/null @@ -1,141 +0,0 @@ -package android.net.wifi.hotspot2; - -import android.net.wifi.anqp.VenueNameElement; - -/** - * Created by jannq on 1/20/15. - */ -public class NetworkInfo { - - public enum Ant { - Private, - PrivateWithGuest, - ChargeablePublic, - FreePublic, - Personal, - EmergencyOnly, - TestOrExperimental, - Wildcard - } - - public enum HSRelease { - R1, - R2, - Unknown - } - - // General identifiers: - private final String mSSID; - private final String mHESSID; - private final long mBSSID; - - // BSS Load element: - private final int mStationCount; - private final int mChannelUtilization; - private final int mCapacity; - - /* - * From Interworking element: - * mAnt non null indicates the presence of Interworking, i.e. 802.11u - * mVenueGroup and mVenueType may be null if not present in the Interworking element. - */ - private final Ant mAnt; - private final boolean mInternet; - private final VenueNameElement.VenueGroup mVenueGroup; - private final VenueNameElement.VenueType mVenueType; - - /* - * From HS20 Indication element: - * mHSRelease is null only if the HS20 Indication element was not present. - * mAnqpDomainID is set to -1 if not present in the element. - */ - private final HSRelease mHSRelease; - private final int mAnqpDomainID; - - /* - * From beacon: - * mRoamingConsortiums is either null, if the element was not present, or is an array of - * 1, 2 or 3 longs in which the roaming consortium values occupy the LSBs. - */ - private final long[] mRoamingConsortiums; - - public NetworkInfo(String SSID, - String HESSID, - long BSSID, - int stationCount, - int channelUtilization, - int capacity, - Ant ant, - boolean internet, - VenueNameElement.VenueGroup venueGroup, - VenueNameElement.VenueType venueType, - HSRelease HSRelease, - int anqpDomainID, - long[] roamingConsortiums) { - mSSID = SSID; - mHESSID = HESSID; - mBSSID = BSSID; - mStationCount = stationCount; - mChannelUtilization = channelUtilization; - mCapacity = capacity; - mAnt = ant; - mInternet = internet; - mVenueGroup = venueGroup; - mVenueType = venueType; - mHSRelease = HSRelease; - mAnqpDomainID = anqpDomainID; - mRoamingConsortiums = roamingConsortiums; - } - - public String getSSID() { - return mSSID; - } - - public String getHESSID() { - return mHESSID; - } - - public long getBSSID() { - return mBSSID; - } - - public int getStationCount() { - return mStationCount; - } - - public int getChannelUtilization() { - return mChannelUtilization; - } - - public int getCapacity() { - return mCapacity; - } - - public Ant getAnt() { - return mAnt; - } - - public boolean isInternet() { - return mInternet; - } - - public VenueNameElement.VenueGroup getVenueGroup() { - return mVenueGroup; - } - - public VenueNameElement.VenueType getVenueType() { - return mVenueType; - } - - public HSRelease getHSRelease() { - return mHSRelease; - } - - public int getAnqpDomainID() { - return mAnqpDomainID; - } - - public long[] getRoamingConsortiums() { - return mRoamingConsortiums; - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/NetworkKey.java b/wifi/java/android/net/wifi/hotspot2/NetworkKey.java deleted file mode 100644 index 0631a35..0000000 --- a/wifi/java/android/net/wifi/hotspot2/NetworkKey.java +++ /dev/null @@ -1,50 +0,0 @@ -package android.net.wifi.hotspot2; - -/** - * Created by jannq on 1/20/15. - */ -public class NetworkKey { - private final String mSSID; - private final long mBSSID; - private final int mANQPDomainID; - - public NetworkKey(String SSID, long BSSID, int ANQPDomainID) { - mSSID = SSID; - mBSSID = BSSID; - mANQPDomainID = ANQPDomainID; - } - - public String getSSID() { - return mSSID; - } - - public long getBSSID() { - return mBSSID; - } - - public int getANQPDomainID() { - return mANQPDomainID; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - NetworkKey that = (NetworkKey) o; - - if (mANQPDomainID != that.mANQPDomainID) return false; - if (mBSSID != that.mBSSID) return false; - if (!mSSID.equals(that.mSSID)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = mSSID.hashCode(); - result = 31 * result + (int) (mBSSID ^ (mBSSID >>> 32)); - result = 31 * result + mANQPDomainID; - return result; - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointMatch.java b/wifi/java/android/net/wifi/hotspot2/PasspointMatch.java deleted file mode 100644 index 0f430e5..0000000 --- a/wifi/java/android/net/wifi/hotspot2/PasspointMatch.java +++ /dev/null @@ -1,12 +0,0 @@ -package android.net.wifi.hotspot2; - -/** - * Created by jannq on 1/21/15. - */ -public enum PasspointMatch { - HomeProvider, - RoamingProvider, - Incomplete, - None, - Declined -} diff --git a/wifi/java/android/net/wifi/hotspot2/SelectionManager.java b/wifi/java/android/net/wifi/hotspot2/SelectionManager.java deleted file mode 100644 index 8f2de36..0000000 --- a/wifi/java/android/net/wifi/hotspot2/SelectionManager.java +++ /dev/null @@ -1,122 +0,0 @@ -package android.net.wifi.hotspot2; - -import android.net.wifi.anqp.ANQPElement; -import android.net.wifi.hotspot2.pps.HomeSP; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * Created by jannq on 1/20/15. - */ -public class SelectionManager { - private final List<HomeSP> mHomeSPs; - private final Map<NetworkKey,ANQPData> mANQPCache; - private final Map<NetworkKey,NetworkInfo> mPendingANQP; - private final List<ScoredNetwork> mScoredNetworks; - - private static class ScoredNetwork implements Comparable<ScoredNetwork> { - private final PasspointMatch mMatch; - private final NetworkInfo mNetworkInfo; - - private ScoredNetwork(PasspointMatch match, NetworkInfo networkInfo) { - mMatch = match; - mNetworkInfo = networkInfo; - // !!! Further score on BSS Load, ANT, "Internet" and HSRelease - } - - public PasspointMatch getMatch() { - return mMatch; - } - - public NetworkInfo getNetworkInfo() { - return mNetworkInfo; - } - - @Override - public int compareTo( ScoredNetwork other ) { - if ( getMatch() == other.getMatch() ) { - return 0; - } - else { - return getMatch().ordinal() > other.getMatch().ordinal() ? 1 : -1; - } - } - } - - public SelectionManager( List<HomeSP> homeSPs ) { - mHomeSPs = homeSPs; - mANQPCache = new HashMap<NetworkKey,ANQPData>(); - mPendingANQP = new HashMap<NetworkKey, NetworkInfo>(); - mScoredNetworks = new ArrayList<ScoredNetwork>(); - } - - public NetworkInfo findNetwork( NetworkInfo networkInfo ) { - - NetworkKey networkKey = new NetworkKey( networkInfo.getSSID(), networkInfo.getBSSID(), networkInfo.getAnqpDomainID() ); - ANQPData anqpData = mANQPCache.get( networkKey ); - List<ANQPElement> anqpElements = anqpData != null ? anqpData.getANQPElements() : null; - for ( HomeSP homeSP : mHomeSPs ) { - PasspointMatch match = homeSP.match( networkInfo, anqpElements ); - if ( match == PasspointMatch.HomeProvider || match == PasspointMatch.RoamingProvider ) { - mScoredNetworks.add( new ScoredNetwork( match, networkInfo ) ); - } - else if ( match == PasspointMatch.Incomplete && networkInfo.getAnt() != null ) { - mPendingANQP.put(networkKey, networkInfo); - } - } - - // !!! Should really return a score-sorted list. - Collections.sort( mScoredNetworks ); - if ( ! mScoredNetworks.isEmpty() && - mScoredNetworks.get( 0 ).getMatch() == PasspointMatch.HomeProvider ) { - return mScoredNetworks.get( 0 ).getNetworkInfo(); - } - else { - return null; - } - } - - public void notifyANQPResponse( NetworkInfo networkInfo, List<ANQPElement> anqpElements ) { - NetworkKey networkKey = new NetworkKey( networkInfo.getSSID(), networkInfo.getBSSID(), networkInfo.getAnqpDomainID() ); - mPendingANQP.remove( networkKey ); - mANQPCache.put( networkKey, new ANQPData( anqpElements ) ); - - for ( HomeSP homeSP : mHomeSPs ) { - PasspointMatch match = homeSP.match( networkInfo, anqpElements ); - if ( match == PasspointMatch.HomeProvider || match == PasspointMatch.RoamingProvider ) { - mScoredNetworks.add( new ScoredNetwork( match, networkInfo ) ); - } - else if ( match == PasspointMatch.Declined ) { - Iterator<ScoredNetwork> scoredNetworkIterator = mScoredNetworks.iterator(); - while ( scoredNetworkIterator.hasNext() ) { - ScoredNetwork scoredNetwork = scoredNetworkIterator.next(); - if ( scoredNetwork.getNetworkInfo().getBSSID() == networkInfo.getBSSID() && - scoredNetwork.getNetworkInfo().getSSID().equals( networkInfo.getSSID() ) ) { - scoredNetworkIterator.remove(); - break; - } - } - } - } - Collections.sort( mScoredNetworks ); - if ( ! mScoredNetworks.isEmpty() && - mScoredNetworks.get( 0 ).getMatch() == PasspointMatch.HomeProvider ) { - // Kill mPendingANQP? - // Connect to mScoredNetworks.get( 0 ).getNetworkInfo()? - } - } - - private void sendANQPQuery( NetworkInfo network ) { - if ( network.getHSRelease() != null ) { - // Query for 802.11u + potential HS2.0 elements - } - else if ( network.getAnt() != null ) { - // !!! Query for 802.11u - } - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/pps/DomainMatcher.java b/wifi/java/android/net/wifi/hotspot2/pps/DomainMatcher.java deleted file mode 100644 index 7e906d7..0000000 --- a/wifi/java/android/net/wifi/hotspot2/pps/DomainMatcher.java +++ /dev/null @@ -1,70 +0,0 @@ -package android.net.wifi.hotspot2.pps; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * Created by jannq on 1/21/15. - */ -public class DomainMatcher { - - public enum Match { None, Primary, Secondary } - - private final Label mRoot; - - private static class Label { - private final Map<String,Label> mSubDomains; - private final Match mMatch; - - private Label( Match match ) { - mMatch = match; - mSubDomains = match == Match.None ? null : new HashMap<String,Label>(); - } - - private void addDomain( Iterator<String> labels, Match match ) { - String labelName = labels.next(); - if ( labels.hasNext() ) { - Label subLabel = new Label( Match.None ); - mSubDomains.put( labelName, subLabel ); - subLabel.addDomain( labels, match ); - } - else { - mSubDomains.put( labelName, new Label( match ) ); - } - } - - private Label getSubLabel( String labelString ) { - return mSubDomains.get( labelString ); - } - - public Match getMatch() { - return mMatch; - } - } - - public DomainMatcher( List<String> primary, List<List<String>> secondary ) { - mRoot = new Label( Match.None ); - for ( List<String> secondaryLabel : secondary ) { - mRoot.addDomain( secondaryLabel.iterator(), Match.Secondary ); - } - // Primary overwrites secondary. - mRoot.addDomain( primary.iterator(), Match.Primary ); - } - - public Match isSubDomain( List<String> domain ) { - - Label label = mRoot; - for ( String labelString : domain ) { - label = label.getSubLabel( labelString ); - if ( label == null ) { - return Match.None; - } - else if ( label.getMatch() != Match.None ) { - return label.getMatch(); - } - } - return Match.None; // Domain is a super domain - } -} diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSP.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSP.java deleted file mode 100644 index de9423c..0000000 --- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSP.java +++ /dev/null @@ -1,214 +0,0 @@ -package android.net.wifi.hotspot2.pps; - -import android.net.wifi.anqp.ANQPElement; -import android.net.wifi.anqp.DomainNameElement; -import android.net.wifi.anqp.HSConnectionCapabilityElement; -import android.net.wifi.anqp.HSWanMetricsElement; -import android.net.wifi.anqp.IPAddressTypeAvailabilityElement; -import android.net.wifi.anqp.NAIRealmData; -import android.net.wifi.anqp.NAIRealmElement; -import android.net.wifi.anqp.RoamingConsortiumElement; -import android.net.wifi.anqp.ThreeGPPNetworkElement; -import android.net.wifi.anqp.eap.EAP; -import android.net.wifi.anqp.eap.EAPMethod; -import android.net.wifi.hotspot2.NetworkInfo; -import android.net.wifi.hotspot2.PasspointMatch; - -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static android.net.wifi.anqp.Constants.ANQPElementType; - -/** - * Created by jannq on 1/20/15. - */ -public class HomeSP { - private final Map<String, String> mSSIDs; // SSID, HESSID, [0,N] - private final DomainMatcher mDomainMatcher; - private final Set<Long> mRoamingConsortiums; // [0,N] - private final Set<Long> mMatchAnyOIs; // [0,N] - private final List<Long> mMatchAllOIs; // [0,N] - - private final Map<EAP.EAPMethodID, EAPMethod> mCredentials; - - // Informational: - private final String mFriendlyName; // [1] - private final String mIconURL; // [0,1] - - public HomeSP(Map<String, String> ssidMap, - /*@NotNull*/ String fqdn, - /*@NotNull*/ Set<Long> roamingConsortiums, - /*@NotNull*/ Set<String> otherHomePartners, - /*@NotNull*/ Set<Long> matchAnyOIs, - /*@NotNull*/ List<Long> matchAllOIs, - String friendlyName, - String iconURL, - Map<EAP.EAPMethodID, EAPMethod> credentials) { - - mSSIDs = ssidMap; - List<List<String>> otherPartners = new ArrayList<List<String>>(otherHomePartners.size()); - for (String otherPartner : otherHomePartners) { - otherPartners.add(splitDomain(otherPartner)); - } - mDomainMatcher = new DomainMatcher(splitDomain(fqdn), otherPartners); - mRoamingConsortiums = roamingConsortiums; - mMatchAnyOIs = matchAnyOIs; - mMatchAllOIs = matchAllOIs; - mFriendlyName = friendlyName; - mIconURL = iconURL; - mCredentials = credentials; - } - - public PasspointMatch match(NetworkInfo networkInfo, List<ANQPElement> anqpElements) { - - if (mSSIDs.containsKey(networkInfo.getSSID())) { - String hessid = mSSIDs.get(networkInfo.getSSID()); - if (hessid == null || networkInfo.getHESSID().equals(hessid)) { - return PasspointMatch.HomeProvider; - } - } - - List<Long> allOIs = null; - - if (networkInfo.getRoamingConsortiums() != null) { - allOIs = new ArrayList<Long>(); - for (long oi : networkInfo.getRoamingConsortiums()) { - allOIs.add(oi); - } - } - - Map<ANQPElementType, ANQPElement> anqpElementMap = null; - - if (anqpElements != null) { - anqpElementMap = new EnumMap<ANQPElementType, ANQPElement>(ANQPElementType.class); - for (ANQPElement element : anqpElements) { - anqpElementMap.put(element.getID(), element); - if (element.getID() == ANQPElementType.ANQPRoamingConsortium) { - RoamingConsortiumElement rcElement = (RoamingConsortiumElement) element; - if (!rcElement.getOIs().isEmpty()) { - if (allOIs == null) { - allOIs = new ArrayList<Long>(rcElement.getOIs()); - } else { - allOIs.addAll(rcElement.getOIs()); - } - } - } - } - } - - if (allOIs != null) { - if (!mRoamingConsortiums.isEmpty()) { - for (long oi : allOIs) { - if (mRoamingConsortiums.contains(oi)) { - return PasspointMatch.HomeProvider; - } - } - } - if (!mMatchAnyOIs.isEmpty() || !mMatchAllOIs.isEmpty()) { - for (long anOI : allOIs) { - - boolean oneMatchesAll = true; - - for (long spOI : mMatchAllOIs) { - if (spOI != anOI) { - oneMatchesAll = false; - break; - } - } - - if (oneMatchesAll) { - return PasspointMatch.HomeProvider; - } - - if (mMatchAnyOIs.contains(anOI)) { - return PasspointMatch.HomeProvider; - } - } - } - } - - if (anqpElementMap == null) { - return PasspointMatch.Incomplete; - } - - DomainNameElement domainNameElement = - (DomainNameElement) anqpElementMap.get(ANQPElementType.ANQPDomName); - NAIRealmElement naiRealmElement = - (NAIRealmElement) anqpElementMap.get(ANQPElementType.ANQPNAIRealm); - ThreeGPPNetworkElement threeGPPNetworkElement = - (ThreeGPPNetworkElement) anqpElementMap.get(ANQPElementType.ANQP3GPPNetwork); - - // For future policy decisions: - IPAddressTypeAvailabilityElement ipAddressAvailabilityElement = - (IPAddressTypeAvailabilityElement) anqpElementMap.get( - ANQPElementType.ANQPIPAddrAvailability); - HSConnectionCapabilityElement hsConnCapElement = - (HSConnectionCapabilityElement) anqpElementMap.get( - ANQPElementType.HSConnCapability); - HSWanMetricsElement hsWanMetricsElement = - (HSWanMetricsElement) anqpElementMap.get(ANQPElementType.HSWANMetrics); - - if (domainNameElement != null) { - for (String domain : domainNameElement.getDomains()) { - DomainMatcher.Match match = mDomainMatcher.isSubDomain(splitDomain(domain)); - if (match != DomainMatcher.Match.None) { - return PasspointMatch.HomeProvider; - } - } - } - - /* - if ( threeGPPNetworkElement != null ) { - !!! Insert matching based on 3GPP credentials here - } - */ - - if (naiRealmElement != null) { - - for (NAIRealmData naiRealmData : naiRealmElement.getRealmData()) { - - DomainMatcher.Match match = DomainMatcher.Match.None; - for (String anRealm : naiRealmData.getRealms()) { - match = mDomainMatcher.isSubDomain(splitDomain(anRealm)); - if (match != DomainMatcher.Match.None) { - break; - } - } - if (match != DomainMatcher.Match.None) { - if (mCredentials == null) { - return PasspointMatch.RoamingProvider; - } else { - for (EAPMethod anMethod : naiRealmData.getEAPMethods()) { - EAPMethod spMethod = mCredentials.get(anMethod.getEAPMethodID()); - if (spMethod.matchesAuthParams(anMethod)) { - return PasspointMatch.RoamingProvider; - } - } - } - } - } - } - return PasspointMatch.None; - } - - private static List<String> splitDomain(String domain) { - - if (domain.endsWith(".")) - domain = domain.substring(0, domain.length() - 1); - int at = domain.indexOf('@'); - if (at >= 0) - domain = domain.substring(at + 1); - - String[] labels = domain.split("\\."); - LinkedList<String> labelList = new LinkedList<String>(); - for (String label : labels) { - labelList.addFirst(label); - } - - return labelList; - } -} |