16a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpackage com.android.server.wifi.anqp;
26a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
36a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.net.ProtocolException;
46a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.nio.ByteBuffer;
56a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
66a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.BYTE_MASK;
76a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.INT_MASK;
86a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.SHORT_MASK;
96a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist/**
116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist * The WAN Metrics vendor specific ANQP Element,
126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist * Wi-Fi Alliance Hotspot 2.0 (Release 2) Technical Specification - Version 5.00,
136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist * section 4.4
146a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist */
156a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class HSWanMetricsElement extends ANQPElement {
166a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
176a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public enum LinkStatus {Reserved, Up, Down, Test}
186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
196a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final LinkStatus mStatus;
206a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final boolean mSymmetric;
216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final boolean mCapped;
226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final long mDlSpeed;
236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final long mUlSpeed;
246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final int mDlLoad;
256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final int mUlLoad;
266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    private final int mLMD;
276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
286a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public HSWanMetricsElement(Constants.ANQPElementType infoID, ByteBuffer payload)
296a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            throws ProtocolException {
306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        super(infoID);
316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
326a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (payload.remaining() != 13) {
336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            throw new ProtocolException("Bad WAN metrics length: " + payload.remaining());
346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        int status = payload.get() & BYTE_MASK;
376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mStatus = LinkStatus.values()[status & 0x03];
386a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mSymmetric = (status & 0x04) != 0;
396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mCapped = (status & 0x08) != 0;
406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mDlSpeed = payload.getInt() & INT_MASK;
416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mUlSpeed = payload.getInt() & INT_MASK;
426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mDlLoad = payload.get() & BYTE_MASK;
436a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mUlLoad = payload.get() & BYTE_MASK;
446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        mLMD = payload.getShort() & SHORT_MASK;
456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public LinkStatus getStatus() {
486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mStatus;
496a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
506a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
516a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public boolean isSymmetric() {
526a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mSymmetric;
536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
546a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
556a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public boolean isCapped() {
566a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mCapped;
576a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
586a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
596a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public long getDlSpeed() {
606a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mDlSpeed;
616a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
626a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
636a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public long getUlSpeed() {
646a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mUlSpeed;
656a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
666a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public int getDlLoad() {
686a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mDlLoad;
696a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
706a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
716a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public int getUlLoad() {
726a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mUlLoad;
736a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
746a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
756a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public int getLMD() {
766a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        return mLMD;
776a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
786a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
796a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    @Override
806a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public String toString() {
8177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return String.format("HSWanMetrics{mStatus=%s, mSymmetric=%s, mCapped=%s, " +
827b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                "mDlSpeed=%d, mUlSpeed=%d, mDlLoad=%f, mUlLoad=%f, mLMD=%d}",
837b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                mStatus, mSymmetric, mCapped,
847b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                mDlSpeed, mUlSpeed,
857b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                (double)mDlLoad * 100.0 / 256.0,
867b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                (double)mUlLoad * 100.0 / 256.0,
877b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist                mLMD);
886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist}
90