11dc52f076977039a6bf112885feca6638c05cd29Peter Qiu/* 21dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Copyright (C) 2016 The Android Open Source Project 31dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 41dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 51dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * you may not use this file except in compliance with the License. 61dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * You may obtain a copy of the License at 71dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 81dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * http://www.apache.org/licenses/LICENSE-2.0 91dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 101dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Unless required by applicable law or agreed to in writing, software 111dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 121dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * See the License for the specific language governing permissions and 141dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * limitations under the License. 151dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 161dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 171dc52f076977039a6bf112885feca6638c05cd29Peter Qiupackage com.android.server.wifi.hotspot2.anqp; 181dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 191dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport com.android.internal.annotations.VisibleForTesting; 201dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport com.android.server.wifi.ByteBufferReader; 211dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 221dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.BufferUnderflowException; 231dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.ByteBuffer; 241dc52f076977039a6bf112885feca6638c05cd29Peter Qiuimport java.nio.ByteOrder; 251dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 261dc52f076977039a6bf112885feca6638c05cd29Peter Qiu/** 271dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * The ProtoPort Tuple used by Connection Capability vendor specific ANQP Element, 281dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00, 291dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * section 4.5 301dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 311dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Format: 321dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * | IP Procotol | Port Number | Status | 331dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 1 2 1 341dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 351dc52f076977039a6bf112885feca6638c05cd29Peter Qiupublic class ProtocolPortTuple { 361dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 371dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Number of raw bytes needed for the tuple. 381dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 391dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @VisibleForTesting 401dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public static final int RAW_BYTE_SIZE = 4; 411dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 421dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public static final int PROTO_STATUS_CLOSED = 0; 431dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public static final int PROTO_STATUS_OPEN = 1; 441dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public static final int PROTO_STATUS_UNKNOWN = 2; 451dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 461dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private final int mProtocol; 471dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private final int mPort; 481dc52f076977039a6bf112885feca6638c05cd29Peter Qiu private final int mStatus; 491dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 501dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @VisibleForTesting 511dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public ProtocolPortTuple(int protocol, int port, int status) { 521dc52f076977039a6bf112885feca6638c05cd29Peter Qiu mProtocol = protocol; 531dc52f076977039a6bf112885feca6638c05cd29Peter Qiu mPort = port; 541dc52f076977039a6bf112885feca6638c05cd29Peter Qiu mStatus = status; 551dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 561dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 571dc52f076977039a6bf112885feca6638c05cd29Peter Qiu /** 581dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * Parse a ProtocolPortTuple from the given buffer. 591dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * 601dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @param payload The byte buffer to read from 611dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @return {@link ProtocolPortTuple} 621dc52f076977039a6bf112885feca6638c05cd29Peter Qiu * @throws BufferUnderflowException 631dc52f076977039a6bf112885feca6638c05cd29Peter Qiu */ 641dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public static ProtocolPortTuple parse(ByteBuffer payload) { 651dc52f076977039a6bf112885feca6638c05cd29Peter Qiu int protocol = payload.get(); 661dc52f076977039a6bf112885feca6638c05cd29Peter Qiu int port = (int) ByteBufferReader.readInteger(payload, ByteOrder.LITTLE_ENDIAN, 2) 671dc52f076977039a6bf112885feca6638c05cd29Peter Qiu & 0xFFFF; 681dc52f076977039a6bf112885feca6638c05cd29Peter Qiu int status = payload.get() & 0xFF; 691dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return new ProtocolPortTuple(protocol, port, status); 701dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 711dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 721dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public int getProtocol() { 731dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return mProtocol; 741dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 751dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 761dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public int getPort() { 771dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return mPort; 781dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 791dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 801dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public int getStatus() { 811dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return mStatus; 821dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 831dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 841dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Override 851dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public boolean equals(Object thatObject) { 861dc52f076977039a6bf112885feca6638c05cd29Peter Qiu if (this == thatObject) { 871dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return true; 881dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 891dc52f076977039a6bf112885feca6638c05cd29Peter Qiu if (!(thatObject instanceof ProtocolPortTuple)) { 901dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return false; 911dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 921dc52f076977039a6bf112885feca6638c05cd29Peter Qiu ProtocolPortTuple that = (ProtocolPortTuple) thatObject; 931dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return mProtocol == that.mProtocol 941dc52f076977039a6bf112885feca6638c05cd29Peter Qiu && mPort == that.mPort 951dc52f076977039a6bf112885feca6638c05cd29Peter Qiu && mStatus == that.mStatus; 961dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 971dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 981dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Override 991dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public int hashCode() { 1001dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return (mProtocol * 31 + mPort) * 31 + mStatus; 1011dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 1021dc52f076977039a6bf112885feca6638c05cd29Peter Qiu 1031dc52f076977039a6bf112885feca6638c05cd29Peter Qiu @Override 1041dc52f076977039a6bf112885feca6638c05cd29Peter Qiu public String toString() { 1051dc52f076977039a6bf112885feca6638c05cd29Peter Qiu return "ProtocolTuple{" + "mProtocol=" + mProtocol + ", mPort=" + mPort 1061dc52f076977039a6bf112885feca6638c05cd29Peter Qiu + ", mStatus=" + mStatus + '}'; 1071dc52f076977039a6bf112885feca6638c05cd29Peter Qiu } 1081dc52f076977039a6bf112885feca6638c05cd29Peter Qiu} 109