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