NetworkDetail.java revision c1072acda7dc8b9d7bc4a9bb0b1177b14ecaf276
177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistpackage com.android.server.wifi.hotspot2;
277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport android.net.wifi.ScanResult;
473185809f4a44a8ee272afe3e5253496aeb966ceLorenzo Colittiimport android.util.Log;
577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport com.android.server.wifi.anqp.ANQPElement;
777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport com.android.server.wifi.anqp.Constants;
877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport com.android.server.wifi.anqp.VenueNameElement;
977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
1077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.net.ProtocolException;
1177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.nio.ByteBuffer;
1277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.nio.ByteOrder;
13fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvistimport java.nio.CharBuffer;
14fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvistimport java.nio.charset.CharacterCodingException;
1577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.nio.charset.Charset;
16fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvistimport java.nio.charset.CharsetDecoder;
1777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.nio.charset.StandardCharsets;
1877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.List;
1977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport java.util.Map;
2077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
2177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport static com.android.server.wifi.anqp.Constants.BYTES_IN_EUI48;
2277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport static com.android.server.wifi.anqp.Constants.BYTE_MASK;
2377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistimport static com.android.server.wifi.anqp.Constants.getInteger;
2473185809f4a44a8ee272afe3e5253496aeb966ceLorenzo Colitti
2577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvistpublic class NetworkDetail {
2677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
2777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_SSID = 0;
2877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_BSSLoad = 11;
29243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private static final int EID_HT_OPERATION = 61;
30243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private static final int EID_VHT_OPERATION = 192;
3177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_Interworking = 107;
3277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_RoamingConsortium = 111;
3377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_ExtendedCaps = 127;
3477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int EID_VSA = 221;
35fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist
3677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final int ANQP_DOMID_BIT = 0x04;
37243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private static final int RTT_RESP_ENABLE_BIT = 70;
3877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
3977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final long SSID_UTF8_BIT = 0x0001000000000000L;
40243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    //turn off when SHIP
41243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private static final boolean DBG = true;
42d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande    private static final boolean VDBG = false;
43d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande
44243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private static final String TAG = "NetworkDetail:";
4577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
4677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public enum Ant {
4777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Private,
4877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        PrivateWithGuest,
4977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        ChargeablePublic,
5077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        FreePublic,
5177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Personal,
5277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        EmergencyOnly,
5377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd6,
5477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd7,
5577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd8,
5677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd9,
5777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd10,
5877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd11,
5977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd12,
6077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Resvd13,
6177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        TestOrExperimental,
6277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Wildcard
6377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
6477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
6577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public enum HSRelease {
6677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        R1,
6777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        R2,
6877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Unknown
6977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
7077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
7177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    // General identifiers:
7277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final String mSSID;
7377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final long mHESSID;
7477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final long mBSSID;
7577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
7677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    // BSS Load element:
7777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final int mStationCount;
7877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final int mChannelUtilization;
7977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final int mCapacity;
8077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
81243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    //channel detailed information
82243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe   /*
83243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    * 0 -- 20 MHz
84243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    * 1 -- 40 MHz
85243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    * 2 -- 80 MHz
86243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    * 3 -- 160 MHz
87243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    * 4 -- 80 + 80 MHz
88243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    */
89243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private final int mChannelWidth;
90243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private final int mPrimaryFreq;
91243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private final int mCenterfreq0;
92243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private final int mCenterfreq1;
93243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    private final boolean m80211McRTTResponder;
9477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    /*
9577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * From Interworking element:
9677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mAnt non null indicates the presence of Interworking, i.e. 802.11u
9777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mVenueGroup and mVenueType may be null if not present in the Interworking element.
9877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     */
9977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final Ant mAnt;
10077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final boolean mInternet;
10177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final VenueNameElement.VenueGroup mVenueGroup;
10277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final VenueNameElement.VenueType mVenueType;
10377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
10477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    /*
10577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * From HS20 Indication element:
10677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mHSRelease is null only if the HS20 Indication element was not present.
10777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mAnqpDomainID is set to -1 if not present in the element.
10877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     */
10977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final HSRelease mHSRelease;
11077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final int mAnqpDomainID;
11177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
11277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    /*
11377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * From beacon:
11477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mAnqpOICount is how many additional OIs are available through ANQP.
11577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * mRoamingConsortiums is either null, if the element was not present, or is an array of
11677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     * 1, 2 or 3 longs in which the roaming consortium values occupy the LSBs.
11777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist     */
11877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final int mAnqpOICount;
11977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final long[] mRoamingConsortiums;
12077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
12177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final Long mExtendedCapabilities;
12277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
12377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private final Map<Constants.ANQPElementType, ANQPElement> mANQPElements;
12477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
125243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    public NetworkDetail(String bssid, String infoElements, List<String> anqpLines, int freq) {
12677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
12777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (infoElements == null) {
12877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            throw new IllegalArgumentException("Null information element string");
12977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
13077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int separator = infoElements.indexOf('=');
13177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (separator<0) {
13277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            throw new IllegalArgumentException("No element separator");
13377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
13477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
13577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mBSSID = parseMac(bssid);
13677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
13777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        ByteBuffer data = ByteBuffer.wrap(Utils.hexToBytes(infoElements.substring(separator + 1)))
13877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                .order(ByteOrder.LITTLE_ENDIAN);
13977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
14077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        String ssid = null;
14177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        byte[] ssidOctets = null;
14277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int stationCount = 0;
14377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int channelUtilization = 0;
14477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int capacity = 0;
14577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
14677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Ant ant = null;
14777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        boolean internet = false;
14877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        VenueNameElement.VenueGroup venueGroup = null;
14977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        VenueNameElement.VenueType venueType = null;
15077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        long hessid = 0L;
15177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
15277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int anqpOICount = 0;
15377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        long[] roamingConsortiums = null;
15477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
15577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        HSRelease hsRelease = null;
156ef1567e413c9ed5f5c4fdb9e354861632f7b2f87Jan Nordqvist        int anqpDomainID = 0;       // No domain ID treated the same as a 0; unique info per AP.
15777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
15877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        Long extendedCapabilities = null;
15977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
160243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        int secondChanelOffset = 0;
161243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        int channelMode = 0;
162243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        int centerFreqIndex1 = 0;
163243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        int centerFreqIndex2 = 0;
164243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        boolean RTTResponder = false;
165c1072acda7dc8b9d7bc4a9bb0b1177b14ecaf276xinhe        RuntimeException exception = null;
166f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
167f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    try {
168f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        while (data.hasRemaining()) {
169f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            int eid = data.get() & Constants.BYTE_MASK;
170f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            int elementLength = data.get() & Constants.BYTE_MASK;
171f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
172f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            if (elementLength > data.remaining()) {
173f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                throw new IllegalArgumentException("Element length " + elementLength +
174f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        " exceeds payload length " + data.remaining() +
175f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        " @ " + data.position());
176f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            }
177f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
178f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            ByteBuffer element;
179f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
180f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            switch (eid) {
181f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_SSID:
182f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    ssidOctets = new byte[elementLength];
183f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    data.get(ssidOctets);
184f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
185f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_BSSLoad:
186f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (elementLength != 5) {
187f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        throw new IllegalArgumentException("BSS Load element length is not 5: " +
188f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                elementLength);
189f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
190f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    stationCount = data.getShort() & Constants.SHORT_MASK;
191f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    channelUtilization = data.get() & Constants.BYTE_MASK;
192f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    capacity = data.getShort() & Constants.SHORT_MASK;
193f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
194f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_HT_OPERATION:
195f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    element = getAndAdvancePayload(data, elementLength);
196f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int primary_channel = element.get();
197f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    secondChanelOffset = element.get() & 0x3;
198f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
199f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_VHT_OPERATION:
200f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    element = getAndAdvancePayload(data, elementLength);
201f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    channelMode = element.get() & Constants.BYTE_MASK;
202f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    centerFreqIndex1 = element.get() & Constants.BYTE_MASK;
203f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    centerFreqIndex2 = element.get() & Constants.BYTE_MASK;
204f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
205f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_Interworking:
206f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int anOptions = data.get() & Constants.BYTE_MASK;
207f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    ant = Ant.values()[anOptions & 0x0f];
208f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    internet = (anOptions & 0x10) != 0;
209f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    // Len 1 none, 3 venue-info, 7 HESSID, 9 venue-info & HESSID
210f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (elementLength == 3 || elementLength == 9) {
211f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        try {
212f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            ByteBuffer vinfo = data.duplicate();
213f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            vinfo.limit(vinfo.position() + 2);
214f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            VenueNameElement vne =
215f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                    new VenueNameElement(Constants.ANQPElementType.ANQPVenueName,
216f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                            vinfo);
217f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            venueGroup = vne.getGroup();
218f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            venueType = vne.getType();
219f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            data.getShort();
220f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        } catch (ProtocolException pe) {
221f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            /*Cannot happen*/
222f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        }
223f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    } else if (elementLength != 1 && elementLength != 7) {
224f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        throw new IllegalArgumentException("Bad Interworking element length: " +
225f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                elementLength);
226f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
227f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (elementLength == 7 || elementLength == 9) {
228f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        hessid = getInteger(data, ByteOrder.BIG_ENDIAN, 6);
229f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
230f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
231f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_RoamingConsortium:
232f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    anqpOICount = data.get() & Constants.BYTE_MASK;
233f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
234f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int oi12Length = data.get() & Constants.BYTE_MASK;
235f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int oi1Length = oi12Length & Constants.NIBBLE_MASK;
236f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int oi2Length = (oi12Length >>> 4) & Constants.NIBBLE_MASK;
237f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int oi3Length = elementLength - 2 - oi1Length - oi2Length;
238f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int oiCount = 0;
239f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (oi1Length > 0) {
240f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        oiCount++;
241f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        if (oi2Length > 0) {
242f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            oiCount++;
243f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            if (oi3Length > 0) {
244f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                oiCount++;
245f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            }
246f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        }
247f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
248f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    roamingConsortiums = new long[oiCount];
249f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (oi1Length > 0) {
250f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        roamingConsortiums[0] =
251f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                getInteger(data, ByteOrder.BIG_ENDIAN, oi1Length);
252f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
253f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (oi2Length > 0) {
254f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        roamingConsortiums[1] =
255f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                getInteger(data, ByteOrder.BIG_ENDIAN, oi2Length);
256f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
257f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (oi3Length > 0) {
258f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        roamingConsortiums[2] =
259f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                getInteger(data, ByteOrder.BIG_ENDIAN, oi3Length);
260f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
261f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
262f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_VSA:
263f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    element = getAndAdvancePayload(data, elementLength);
264f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (elementLength >= 5 && element.getInt() == Constants.HS20_FRAME_PREFIX) {
265f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        int hsConf = element.get() & Constants.BYTE_MASK;
266f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        switch ((hsConf >> 4) & Constants.NIBBLE_MASK) {
267f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            case 0:
268f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                hsRelease = HSRelease.R1;
269f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                break;
270f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            case 1:
271f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                hsRelease = HSRelease.R2;
272f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                break;
273f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            default:
274f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                hsRelease = HSRelease.Unknown;
275f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                break;
276f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        }
277f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        if ((hsConf & ANQP_DOMID_BIT) != 0) {
278f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            if (elementLength < 7) {
279f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                throw new IllegalArgumentException(
280f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                                        "HS20 indication element too short: " + elementLength);
281f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            }
282f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            anqpDomainID = element.getShort() & Constants.SHORT_MASK;
283f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        }
284f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
285f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
286f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                case EID_ExtendedCaps:
287f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    element = data.duplicate();
288f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    extendedCapabilities =
289f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                            Constants.getInteger(data, ByteOrder.LITTLE_ENDIAN, elementLength);
290f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
291f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    int index = RTT_RESP_ENABLE_BIT / 8;
292f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    byte offset = RTT_RESP_ENABLE_BIT % 8;
293f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
294f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    if (elementLength < index + 1) {
295f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        RTTResponder = false;
296f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        element.position(element.position() + elementLength);
297f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                        break;
298f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    }
299f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
300f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    element.position(element.position() + index);
301f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
302f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    RTTResponder = (element.get() & (0x1 << offset)) != 0;
303f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
304f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                default:
305f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    data.position(data.position() + elementLength);
306f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                    break;
307f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            }
308f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
309f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    }
310f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    catch (IllegalArgumentException iae) {
311f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        Log.d("HS2J", "Caught " + iae);
312f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        if (ssidOctets == null) {
313f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            throw iae;
314f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
315f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        exception = iae;
316f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    }
317f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
318f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    if (ssidOctets != null) {
319f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        Charset encoding;
320f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        if (extendedCapabilities != null && (extendedCapabilities & SSID_UTF8_BIT) != 0) {
321f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            encoding = StandardCharsets.UTF_8;
322f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
323f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        else {
324f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            encoding = StandardCharsets.ISO_8859_1;
325f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
326f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
327f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        if (exception == null) {
328f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            ssid = new String(ssidOctets, encoding);
329f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
330f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        else {
331f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            // Apply strict checking if there were previous errors:
332f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            CharsetDecoder decoder = encoding.newDecoder();
333f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            try {
334f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                CharBuffer decoded = decoder.decode(ByteBuffer.wrap(ssidOctets));
335f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                ssid = decoded.toString();
336f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            }
337f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            catch (CharacterCodingException cce) {
338f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                throw exception;
339f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            }
340f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
341f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    }
342f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
343f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mSSID = ssid;
344f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mHESSID = hessid;
345f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mStationCount = stationCount;
346f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mChannelUtilization = channelUtilization;
347f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mCapacity = capacity;
348f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mAnt = ant;
349f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mInternet = internet;
350f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mVenueGroup = venueGroup;
351f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mVenueType = venueType;
352f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mHSRelease = hsRelease;
353f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mAnqpDomainID = anqpDomainID;
354f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mAnqpOICount = anqpOICount;
355f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mRoamingConsortiums = roamingConsortiums;
356f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mExtendedCapabilities = extendedCapabilities;
357f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mANQPElements = SupplicantBridge.parseANQPLines(anqpLines);
358f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    //set up channel info
359f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    mPrimaryFreq = freq;
360f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham
361f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    if (channelMode != 0) {
362f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        // 80 or 160 MHz
363f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        mChannelWidth = channelMode + 1;
364f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        mCenterfreq0 = (centerFreqIndex1 - 36) * 5 + 5180;
365f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        if(channelMode > 1) { //160MHz
366f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            mCenterfreq1 = (centerFreqIndex2 - 36) * 5 + 5180;
367f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        } else {
368f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            mCenterfreq1 = 0;
369f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
370f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    } else {
371f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        //20 or 40 MHz
372f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        if (secondChanelOffset != 0) {//40MHz
373f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            mChannelWidth = 1;
374f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            if (secondChanelOffset == 1) {
375f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                mCenterfreq0 = mPrimaryFreq + 20;
376f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            } else if (secondChanelOffset == 3) {
377f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                mCenterfreq0 = mPrimaryFreq - 20;
378f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            } else {
379f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                mCenterfreq0 = 0;
380f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                Log.e(TAG,"Error on secondChanelOffset");
381f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            }
382f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        } else {
383f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            mCenterfreq0 = 0;
384f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	            mChannelWidth = 0;
385f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        }
386f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        mCenterfreq1 = 0;
387f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    }
388f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    m80211McRTTResponder = RTTResponder;
389f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    if (VDBG) {
390f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	        Log.d(TAG, mSSID + "ChannelWidth is: " + mChannelWidth + " PrimaryFreq: " + mPrimaryFreq +
391f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                " mCenterfreq0: " + mCenterfreq0 + " mCenterfreq1: " + mCenterfreq1 +
392f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	                (m80211McRTTResponder ? "Support RTT reponder" : "Do not support RTT responder"));
393f9f7c4ceed78d380a78c2d79a2af3d0cf473e065Prerepa Viswanadham	    }
39477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
39577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
396fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist    private static ByteBuffer getAndAdvancePayload(ByteBuffer data, int plLength) {
397398823d45a240ff90ff2ffab3ff4a8b8646f24c9Jan Nordqvist        ByteBuffer payload = data.duplicate().order(data.order());
398fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist        payload.limit(payload.position() + plLength);
399fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist        data.position(data.position() + plLength);
400fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist        return payload;
401fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist    }
402fea443b1b8807443544dfdb29a9c237b3ccf964aJan Nordqvist
40377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private NetworkDetail(NetworkDetail base, Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
40477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mSSID = base.mSSID;
40577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mBSSID = base.mBSSID;
40677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mHESSID = base.mHESSID;
40777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mStationCount = base.mStationCount;
40877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mChannelUtilization = base.mChannelUtilization;
40977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mCapacity = base.mCapacity;
41077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mAnt = base.mAnt;
41177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mInternet = base.mInternet;
41277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mVenueGroup = base.mVenueGroup;
41377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mVenueType = base.mVenueType;
41477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mHSRelease = base.mHSRelease;
41577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mAnqpDomainID = base.mAnqpDomainID;
41677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mAnqpOICount = base.mAnqpOICount;
41777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mRoamingConsortiums = base.mRoamingConsortiums;
41877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mExtendedCapabilities = base.mExtendedCapabilities;
41977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        mANQPElements = anqpElements;
420243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        mChannelWidth = base.mChannelWidth;
421243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        mPrimaryFreq = base.mPrimaryFreq;
422243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        mCenterfreq0 = base.mCenterfreq0;
423243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        mCenterfreq1 = base.mCenterfreq1;
424243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        m80211McRTTResponder = base.m80211McRTTResponder;
42577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
42677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
42777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public NetworkDetail complete(Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
42877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return new NetworkDetail(this, anqpElements);
42977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
43077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
43177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static long parseMac(String s) {
43277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
43377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        long mac = 0;
43477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        int count = 0;
43577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        for (int n = 0; n < s.length(); n++) {
43677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            int nibble = Utils.fromHex(s.charAt(n), true);
43777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            if (nibble >= 0) {
43877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                mac = (mac << 4) | nibble;
43977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                count++;
44077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            }
44177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
44277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (count < 12 || (count&1) == 1) {
44377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            throw new IllegalArgumentException("Bad MAC address: '" + s + "'");
44477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
44577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mac;
44677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
44777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
44877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean has80211uInfo() {
44977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnt != null || mRoamingConsortiums != null || mHSRelease != null;
45077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
45177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
45277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean hasInterworking() {
45377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnt != null;
45477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
45577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
45677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String getSSID() {
45777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mSSID;
45877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
45977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
46077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public long getHESSID() {
46177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mHESSID;
46277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
46377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
46477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public long getBSSID() {
46577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mBSSID;
46677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
46777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
46877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int getStationCount() {
46977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mStationCount;
47077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
47177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
47277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int getChannelUtilization() {
47377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mChannelUtilization;
47477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
47577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
47677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int getCapacity() {
47777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mCapacity;
47877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
47977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
48077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean isInterworking() {
48177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnt != null;
48277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
48377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
48477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public Ant getAnt() {
48577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnt;
48677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
48777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
48877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean isInternet() {
48977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mInternet;
49077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
49177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
49277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public VenueNameElement.VenueGroup getVenueGroup() {
49377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mVenueGroup;
49477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
49577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
49677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public VenueNameElement.VenueType getVenueType() {
49777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mVenueType;
49877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
49977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
50077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public HSRelease getHSRelease() {
50177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mHSRelease;
50277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
50377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
50477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int getAnqpDomainID() {
50577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnqpDomainID;
50677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
50777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
50877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int getAnqpOICount() {
50977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mAnqpOICount;
51077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
51177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
51277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public long[] getRoamingConsortiums() {
51377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mRoamingConsortiums;
51477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
51577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
51677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public Long getExtendedCapabilities() {
51777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mExtendedCapabilities;
51877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
51977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
52077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public Map<Constants.ANQPElementType, ANQPElement> getANQPElements() {
52177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mANQPElements;
52277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
52377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
524243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    public int getChannelWidth() {
525243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        return mChannelWidth;
526243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    }
527243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe
528243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    public int getCenterfreq0() {
529243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        return mCenterfreq0;
530243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    }
531243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe
532243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    public int getCenterfreq1() {
533243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        return mCenterfreq1;
534243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    }
535243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe
536243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    public boolean is80211McResponderSupport() {
537243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        return m80211McRTTResponder;
538243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe    }
539243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe
54077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean isSSID_UTF8() {
54177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mExtendedCapabilities != null && (mExtendedCapabilities & SSID_UTF8_BIT) != 0;
54277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
54377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
54477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    @Override
54577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public boolean equals(Object thatObject) {
54677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (this == thatObject) {
54777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            return true;
54877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
54977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        if (thatObject == null || getClass() != thatObject.getClass()) {
55077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            return false;
55177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
55277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
55377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        NetworkDetail that = (NetworkDetail)thatObject;
55477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
55577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return getSSID().equals(that.getSSID()) && getBSSID() == that.getBSSID();
55677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
55777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
55877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    @Override
55977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public int hashCode() {
56077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return ((mSSID.hashCode() * 31) + (int)(mBSSID >>> 32)) * 31 + (int)mBSSID;
56177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
56277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
56377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    @Override
56477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String toString() {
56577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return String.format("NetworkInfo{mSSID='%s', mHESSID=%x, mBSSID=%x, mStationCount=%d, " +
56677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                "mChannelUtilization=%d, mCapacity=%d, mAnt=%s, mInternet=%s, " +
56777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                "mVenueGroup=%s, mVenueType=%s, mHSRelease=%s, mAnqpDomainID=%d, " +
56877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                "mAnqpOICount=%d, mRoamingConsortiums=%s}",
56977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                mSSID, mHESSID, mBSSID, mStationCount,
57077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                mChannelUtilization, mCapacity, mAnt, mInternet,
57177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                mVenueGroup, mVenueType, mHSRelease, mAnqpDomainID,
57277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                mAnqpOICount, Utils.roamingConsortiumsToString(mRoamingConsortiums));
57377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
57477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
57577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String toKeyString() {
57677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return String.format("'%s':%s", mSSID, getBSSIDString());
57777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
57877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
57977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String getBSSIDString() {
58077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return toMACString(mBSSID);
58177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
58277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
583ef1567e413c9ed5f5c4fdb9e354861632f7b2f87Jan Nordqvist    public static String toMACString(long mac) {
58477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        StringBuilder sb = new StringBuilder();
58577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        boolean first = true;
58677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        for (int n = BYTES_IN_EUI48 - 1; n >= 0; n--) {
58777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            if (first) {
58877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                first = false;
58977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            } else {
59077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist                sb.append(':');
59177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            }
59277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            sb.append(String.format("%02x", (mac >>> (n * Byte.SIZE)) & BYTE_MASK));
59377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        }
59477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return sb.toString();
59577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
59677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
59777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final String IE = "ie=" +
59877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            "000477696e67" +                // SSID wing
59977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            "0b052a00cf611e" +              // BSS Load 42:207:7777
60077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            "6b091e0a01610408621205" +      // internet:Experimental:Vehicular:Auto:hessid
60177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            "6f0a0e530111112222222229" +    // 14:111111:2222222229
60277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist            "dd07506f9a10143a01";           // r2:314
60377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
60477f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    private static final String IE2 = "ie=000f4578616d706c65204e6574776f726b010882848b960c1218240301012a010432043048606c30140100000fac040100000fac040100000fac0100007f04000000806b091e07010203040506076c027f006f1001531122331020304050010203040506dd05506f9a1000";
60577f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
60677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public static void main(String[] args) {
60777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        ScanResult scanResult = new ScanResult();
60877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        scanResult.SSID = "wing";
60977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        scanResult.BSSID = "610408";
610243931f3474f6235cfcf5c1a55fa2f192ee264aexinhe        NetworkDetail nwkDetail = new NetworkDetail(scanResult.BSSID, IE2, null, 0);
61177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        System.out.println(nwkDetail);
61277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
61377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist}
614