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