All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pcap4j.packet.RadiotapDataVht Maven / Gradle / Ivy

/*_##########################################################################
  _##
  _##  Copyright (C) 2016  Pcap4J.org
  _##
  _##########################################################################
*/

package org.pcap4j.packet;

import java.nio.ByteOrder;
import java.util.Arrays;
import org.pcap4j.packet.RadiotapPacket.RadiotapData;
import org.pcap4j.packet.namednumber.RadiotapVhtBandwidth;
import org.pcap4j.util.ByteArrays;

/**
 * Radiotap VHT field.
 *
 * @see Radiotap
 * @author Kaito Yamada
 * @since pcap4j 1.6.5
 */
public final class RadiotapDataVht implements RadiotapData {

  /** */
  private static final long serialVersionUID = -7423738690741454273L;

  private static final int LENGTH = 12;

  private final boolean stbcKnown;
  private final boolean txopPsNotAllowedKnown;
  private final boolean guardIntervalKnown;
  private final boolean shortGiNsymDisambiguationKnown;
  private final boolean ldpcExtraOfdmSymbolKnown;
  private final boolean beamformedKnown;
  private final boolean bandwidthKnown;
  private final boolean groupIdKnown;
  private final boolean partialAidKnown;
  private final boolean seventhMsbOfKnown;
  private final boolean sixthMsbOfKnown;
  private final boolean fifthMsbOfKnown;
  private final boolean fourthMsbOfKnown;
  private final boolean thirdMsbOfKnown;
  private final boolean secondMsbOfKnown;
  private final boolean msbOfKnown;
  private final boolean stbc;
  private final boolean txopPsNotAllowed;
  private final boolean shortGuardInterval;
  private final boolean shortGiNsymDisambiguation;
  private final boolean ldpcExtraOfdmSymbol;
  private final boolean beamformed;
  private final boolean secondMsbOfFlags;
  private final boolean msbOfFlags;
  private final RadiotapVhtBandwidth bandwidth;
  private final byte[] mcses;
  private final byte[] nsses;
  private final RadiotapFecType[] fecTypes;
  private final byte unusedInCoding;
  private final byte groupId;
  private final short partialAid;

  /**
   * A static factory method. This method validates the arguments by {@link
   * ByteArrays#validateBounds(byte[], int, int)}, which may throw exceptions undocumented here.
   *
   * @param rawData rawData
   * @param offset offset
   * @param length length
   * @return a new RadiotapVht object.
   * @throws IllegalRawDataException if parsing the raw data fails.
   */
  public static RadiotapDataVht newInstance(byte[] rawData, int offset, int length)
      throws IllegalRawDataException {
    ByteArrays.validateBounds(rawData, offset, length);
    return new RadiotapDataVht(rawData, offset, length);
  }

  private RadiotapDataVht(byte[] rawData, int offset, int length) throws IllegalRawDataException {
    if (length < LENGTH) {
      StringBuilder sb = new StringBuilder(200);
      sb.append("The data is too short to build a RadiotapVht (")
          .append(LENGTH)
          .append(" bytes). data: ")
          .append(ByteArrays.toHexString(rawData, " "))
          .append(", offset: ")
          .append(offset)
          .append(", length: ")
          .append(length);
      throw new IllegalRawDataException(sb.toString());
    }

    this.stbcKnown = (rawData[offset] & 0x01) != 0;
    this.txopPsNotAllowedKnown = (rawData[offset] & 0x02) != 0;
    this.guardIntervalKnown = (rawData[offset] & 0x04) != 0;
    this.shortGiNsymDisambiguationKnown = (rawData[offset] & 0x08) != 0;
    this.ldpcExtraOfdmSymbolKnown = (rawData[offset] & 0x10) != 0;
    this.beamformedKnown = (rawData[offset] & 0x20) != 0;
    this.bandwidthKnown = (rawData[offset] & 0x40) != 0;
    this.groupIdKnown = (rawData[offset] & 0x80) != 0;
    this.partialAidKnown = (rawData[offset + 1] & 0x01) != 0;
    this.seventhMsbOfKnown = (rawData[offset + 1] & 0x02) != 0;
    this.sixthMsbOfKnown = (rawData[offset + 1] & 0x04) != 0;
    this.fifthMsbOfKnown = (rawData[offset + 1] & 0x08) != 0;
    this.fourthMsbOfKnown = (rawData[offset + 1] & 0x10) != 0;
    this.thirdMsbOfKnown = (rawData[offset + 1] & 0x20) != 0;
    this.secondMsbOfKnown = (rawData[offset + 1] & 0x40) != 0;
    this.msbOfKnown = (rawData[offset + 1] & 0x80) != 0;
    this.stbc = (rawData[offset + 2] & 0x01) != 0;
    this.txopPsNotAllowed = (rawData[offset + 2] & 0x02) != 0;
    this.shortGuardInterval = (rawData[offset + 2] & 0x04) != 0;
    this.shortGiNsymDisambiguation = (rawData[offset + 2] & 0x08) != 0;
    this.ldpcExtraOfdmSymbol = (rawData[offset + 2] & 0x10) != 0;
    this.beamformed = (rawData[offset + 2] & 0x20) != 0;
    this.secondMsbOfFlags = (rawData[offset + 2] & 0x40) != 0;
    this.msbOfFlags = (rawData[offset + 2] & 0x80) != 0;
    this.bandwidth = RadiotapVhtBandwidth.getInstance(rawData[offset + 3]);
    this.mcses = new byte[4];
    this.nsses = new byte[4];
    for (int i = 0; i < 4; i++) {
      byte mcsNss = rawData[offset + 4 + i];
      mcses[i] = (byte) ((mcsNss >> 4) & 0x0F);
      nsses[i] = (byte) (mcsNss & 0x0F);
    }
    this.fecTypes = new RadiotapFecType[4];
    for (int i = 0; i < 4; i++) {
      switch ((rawData[offset + 8] >> i) & 0x01) {
        case 0:
          fecTypes[i] = RadiotapFecType.BCC;
          break;
        default:
          fecTypes[i] = RadiotapFecType.LDPC;
      }
    }
    this.unusedInCoding = (byte) ((rawData[offset + 8] >> 4) & 0x0F);
    this.groupId = rawData[offset + 9];
    this.partialAid = ByteArrays.getShort(rawData, offset + 10, ByteOrder.LITTLE_ENDIAN);
  }

  private RadiotapDataVht(Builder builder) {
    if (builder == null
        || builder.bandwidth == null
        || builder.mcses == null
        || builder.nsses == null
        || builder.fecTypes == null) {
      StringBuilder sb = new StringBuilder();
      sb.append("builder: ")
          .append(builder)
          .append(" builder.bandwidth: ")
          .append(builder.bandwidth)
          .append(" builder.mcses: ")
          .append(builder.mcses)
          .append(" builder.nsses: ")
          .append(builder.nsses)
          .append(" builder.fecTypes: ")
          .append(builder.fecTypes);
      throw new NullPointerException(sb.toString());
    }
    if ((builder.unusedInCoding & 0xF0) != 0) {
      throw new IllegalArgumentException(
          "builder.unusedInCoding & 0xF0 must be 0. builder.unusedInCoding: "
              + builder.unusedInCoding);
    }
    if (builder.mcses.length != 4) {
      throw new IllegalArgumentException(
          "builder.mcses.length must be 4. builder.mcses: " + Arrays.toString(builder.mcses));
    }
    if (builder.nsses.length != 4) {
      throw new IllegalArgumentException(
          "builder.nsses.length must be 4. builder.nsses: " + Arrays.toString(builder.nsses));
    }
    if (builder.fecTypes.length != 4) {
      throw new IllegalArgumentException(
          "builder.fecTypes.length must be 4. builder.fecTypes: "
              + Arrays.toString(builder.fecTypes));
    }
    for (byte mcs : builder.mcses) {
      if ((mcs & 0xF0) != 0) {
        throw new IllegalArgumentException(
            "(mcs & 0xF0) must be zero. builder.mcses: " + Arrays.toString(builder.mcses));
      }
    }
    for (byte nss : builder.nsses) {
      if ((nss & 0xF0) != 0) {
        throw new IllegalArgumentException(
            "(nss & 0xF0) must be zero. builder.nsses: " + Arrays.toString(builder.nsses));
      }
    }

    this.stbcKnown = builder.stbcKnown;
    this.txopPsNotAllowedKnown = builder.txopPsNotAllowedKnown;
    this.guardIntervalKnown = builder.guardIntervalKnown;
    this.shortGiNsymDisambiguationKnown = builder.shortGiNsymDisambiguationKnown;
    this.ldpcExtraOfdmSymbolKnown = builder.ldpcExtraOfdmSymbolKnown;
    this.beamformedKnown = builder.beamformedKnown;
    this.bandwidthKnown = builder.bandwidthKnown;
    this.groupIdKnown = builder.groupIdKnown;
    this.partialAidKnown = builder.partialAidKnown;
    this.seventhMsbOfKnown = builder.seventhMsbOfKnown;
    this.sixthMsbOfKnown = builder.sixthMsbOfKnown;
    this.fifthMsbOfKnown = builder.fifthMsbOfKnown;
    this.fourthMsbOfKnown = builder.fourthMsbOfKnown;
    this.thirdMsbOfKnown = builder.thirdMsbOfKnown;
    this.secondMsbOfKnown = builder.secondMsbOfKnown;
    this.msbOfKnown = builder.msbOfKnown;
    this.stbc = builder.stbc;
    this.txopPsNotAllowed = builder.txopPsNotAllowed;
    this.shortGuardInterval = builder.shortGuardInterval;
    this.shortGiNsymDisambiguation = builder.shortGiNsymDisambiguation;
    this.ldpcExtraOfdmSymbol = builder.ldpcExtraOfdmSymbol;
    this.beamformed = builder.beamformed;
    this.secondMsbOfFlags = builder.secondMsbOfFlags;
    this.msbOfFlags = builder.msbOfFlags;
    this.bandwidth = builder.bandwidth;
    this.mcses = ByteArrays.clone(builder.mcses);
    this.nsses = ByteArrays.clone(builder.nsses);
    this.fecTypes = builder.fecTypes.clone();
    this.unusedInCoding = builder.unusedInCoding;
    this.groupId = builder.groupId;
    this.partialAid = builder.partialAid;
  }

  /** @return true if the STBC is known; false otherwise. */
  public boolean isStbcKnown() {
    return stbcKnown;
  }

  /** @return true if the TXOP_PS_NOT_ALLOWED is known; false otherwise. */
  public boolean isTxopPsNotAllowedKnown() {
    return txopPsNotAllowedKnown;
  }

  /** @return true if the Guard interval is known; false otherwise. */
  public boolean isGuardIntervalKnown() {
    return guardIntervalKnown;
  }

  /** @return true if the Short GI NSYM disambiguation is known; false otherwise. */
  public boolean isShortGiNsymDisambiguationKnown() {
    return shortGiNsymDisambiguationKnown;
  }

  /** @return true if the LDPC extra OFDM symbol is known; false otherwise. */
  public boolean isLdpcExtraOfdmSymbolKnown() {
    return ldpcExtraOfdmSymbolKnown;
  }

  /** @return true if the Beamformed is known; false otherwise. */
  public boolean isBeamformedKnown() {
    return beamformedKnown;
  }

  /** @return true if the Bandwidth is known; false otherwise. */
  public boolean isBandwidthKnown() {
    return bandwidthKnown;
  }

  /** @return true if the Group ID is known; false otherwise. */
  public boolean isGroupIdKnown() {
    return groupIdKnown;
  }

  /** @return true if the Partial AID is known; false otherwise. */
  public boolean isPartialAidKnown() {
    return partialAidKnown;
  }

  /** @return true if the seventh MSB of the known field is set to 1; false otherwise. */
  public boolean getSeventhMsbOfKnown() {
    return seventhMsbOfKnown;
  }

  /** @return true if the sixth MSB of the known field is set to 1; false otherwise. */
  public boolean getSixthMsbOfKnown() {
    return sixthMsbOfKnown;
  }

  /** @return true if the fifth MSB of the known field is set to 1; false otherwise. */
  public boolean getFifthMsbOfKnown() {
    return fifthMsbOfKnown;
  }

  /** @return true if the fourth MSB of the known field is set to 1; false otherwise. */
  public boolean getFourthMsbOfKnown() {
    return fourthMsbOfKnown;
  }

  /** @return true if the third MSB of the known field is set to 1; false otherwise. */
  public boolean getThirdMsbOfKnown() {
    return thirdMsbOfKnown;
  }

  /** @return true if the second MSB of the known field is set to 1; false otherwise. */
  public boolean getSecondMsbOfKnown() {
    return secondMsbOfKnown;
  }

  /** @return true if the MSB of the known field is set to 1; false otherwise. */
  public boolean getMsbOfKnown() {
    return msbOfKnown;
  }

  /** @return true if all spatial streams of all users have STBC; false otherwise. */
  public boolean isStbc() {
    return stbc;
  }

  /** @return true if STAs may not doze during TXOP or transmitter is non-AP; false otherwise. */
  public boolean isTxopPsNotAllowed() {
    return txopPsNotAllowed;
  }

  /** @return true if short GI; false otherwise. */
  public boolean isShortGuardInterval() {
    return shortGuardInterval;
  }

  /** @return true if NSYM mod 10 = 9; false otherwise. */
  public boolean isShortGiNsymDisambiguation() {
    return shortGiNsymDisambiguation;
  }

  /**
   * @return true if one or more users are using LDPC and the encoding process resulted in extra
   *     OFDM symbol(s); false otherwise.
   */
  public boolean isLdpcExtraOfdmSymbol() {
    return ldpcExtraOfdmSymbol;
  }

  /** @return true if Beamformed; false otherwise. */
  public boolean isBeamformed() {
    return beamformed;
  }

  /** @return true if the second MSB of the flags field is set to 1; false otherwise. */
  public boolean getSecondMsbOfFlags() {
    return secondMsbOfFlags;
  }

  /** @return true if the MSB of the flags field is set to 1; false otherwise. */
  public boolean getMsbOfFlags() {
    return msbOfFlags;
  }

  /** @return bandwidth */
  public RadiotapVhtBandwidth getBandwidth() {
    return bandwidth;
  }

  /** @return MCSes for four users. mcses[n] is for user n. */
  public byte[] getMcses() {
    return ByteArrays.clone(mcses);
  }

  /** @return NSSes for four users. nsses[n] is for user n. */
  public byte[] getNsses() {
    return ByteArrays.clone(nsses);
  }

  /** @return FEC types for four users. fecTypes[n] is for user n. */
  public RadiotapFecType[] getFecTypes() {
    return fecTypes.clone();
  }

  /** @return unusedInCoding */
  public byte getUnusedInCoding() {
    return unusedInCoding;
  }

  /** @return groupId */
  public byte getGroupId() {
    return groupId;
  }

  /** @return groupId */
  public int getGroupIdAsInt() {
    return groupId & 0xFF;
  }

  /** @return partialAid */
  public short getPartialAid() {
    return partialAid;
  }

  /** @return partialAid */
  public int getPartialAidAsInt() {
    return partialAid & 0xFFFF;
  }

  @Override
  public int length() {
    return LENGTH;
  }

  @Override
  public byte[] getRawData() {
    byte[] data = new byte[LENGTH];

    if (stbcKnown) {
      data[0] |= 0x01;
    }
    if (txopPsNotAllowedKnown) {
      data[0] |= 0x02;
    }
    if (guardIntervalKnown) {
      data[0] |= 0x04;
    }
    if (shortGiNsymDisambiguationKnown) {
      data[0] |= 0x08;
    }
    if (ldpcExtraOfdmSymbolKnown) {
      data[0] |= 0x10;
    }
    if (beamformedKnown) {
      data[0] |= 0x20;
    }
    if (bandwidthKnown) {
      data[0] |= 0x40;
    }
    if (groupIdKnown) {
      data[0] |= 0x80;
    }
    if (partialAidKnown) {
      data[1] |= 0x01;
    }
    if (seventhMsbOfKnown) {
      data[1] |= 0x02;
    }
    if (sixthMsbOfKnown) {
      data[1] |= 0x04;
    }
    if (fifthMsbOfKnown) {
      data[1] |= 0x08;
    }
    if (fourthMsbOfKnown) {
      data[1] |= 0x10;
    }
    if (thirdMsbOfKnown) {
      data[1] |= 0x20;
    }
    if (secondMsbOfKnown) {
      data[1] |= 0x40;
    }
    if (msbOfKnown) {
      data[1] |= 0x80;
    }
    if (stbc) {
      data[2] |= 0x01;
    }
    if (txopPsNotAllowed) {
      data[2] |= 0x02;
    }
    if (shortGuardInterval) {
      data[2] |= 0x04;
    }
    if (shortGiNsymDisambiguation) {
      data[2] |= 0x08;
    }
    if (ldpcExtraOfdmSymbol) {
      data[2] |= 0x10;
    }
    if (beamformed) {
      data[2] |= 0x20;
    }
    if (secondMsbOfFlags) {
      data[2] |= 0x40;
    }
    if (msbOfFlags) {
      data[2] |= 0x80;
    }
    data[3] = bandwidth.value();
    for (int i = 0; i < 4; i++) {
      data[4 + i] = (byte) (nsses[i] | (mcses[i] << 4));
    }
    data[8] = (byte) (unusedInCoding << 4);
    if (fecTypes[0] == RadiotapFecType.LDPC) {
      data[8] |= 0x01;
    }
    if (fecTypes[1] == RadiotapFecType.LDPC) {
      data[8] |= 0x02;
    }
    if (fecTypes[2] == RadiotapFecType.LDPC) {
      data[8] |= 0x04;
    }
    if (fecTypes[3] == RadiotapFecType.LDPC) {
      data[8] |= 0x08;
    }
    data[9] = groupId;
    System.arraycopy(ByteArrays.toByteArray(partialAid, ByteOrder.LITTLE_ENDIAN), 0, data, 10, 2);

    return data;
  }

  /** @return a new Builder object populated with this object's fields. */
  public Builder getBuilder() {
    return new Builder(this);
  }

  @Override
  public String toString() {
    return toString("");
  }

  @Override
  public String toString(String indent) {
    StringBuilder sb = new StringBuilder();
    String ls = System.getProperty("line.separator");

    sb.append(indent)
        .append("VHT: ")
        .append(ls)
        .append(indent)
        .append("  STBC known: ")
        .append(stbcKnown)
        .append(ls)
        .append(indent)
        .append("  TXOP_PS_NOT_ALLOWED known: ")
        .append(txopPsNotAllowedKnown)
        .append(ls)
        .append(indent)
        .append("  Guard interval known: ")
        .append(guardIntervalKnown)
        .append(ls)
        .append(indent)
        .append("  Short GI NSYM disambiguation known: ")
        .append(shortGiNsymDisambiguationKnown)
        .append(ls)
        .append(indent)
        .append("  LDPC extra OFDM symbol known: ")
        .append(ldpcExtraOfdmSymbolKnown)
        .append(ls)
        .append(indent)
        .append("  Beamformed known: ")
        .append(beamformedKnown)
        .append(ls)
        .append(indent)
        .append("  Bandwidth known: ")
        .append(bandwidthKnown)
        .append(ls)
        .append(indent)
        .append("  Group ID known: ")
        .append(groupIdKnown)
        .append(ls)
        .append(indent)
        .append("  Partial AID known: ")
        .append(partialAidKnown)
        .append(ls)
        .append(indent)
        .append("  7th MSB of known: ")
        .append(seventhMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  6th MSB of known: ")
        .append(sixthMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  5th MSB of known: ")
        .append(fifthMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  4th MSB of known: ")
        .append(fourthMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  3rd MSB of known: ")
        .append(thirdMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  2nd MSB of known: ")
        .append(secondMsbOfKnown)
        .append(ls)
        .append(indent)
        .append("  MSB of known: ")
        .append(msbOfKnown)
        .append(ls)
        .append(indent)
        .append("  STBC: ")
        .append(stbc)
        .append(ls)
        .append(indent)
        .append("  TXOP_PS_NOT_ALLOWED: ")
        .append(txopPsNotAllowed)
        .append(ls)
        .append(indent)
        .append("  Short Guard interval: ")
        .append(shortGuardInterval)
        .append(ls)
        .append(indent)
        .append("  Short GI NSYM disambiguation: ")
        .append(shortGiNsymDisambiguation)
        .append(ls)
        .append(indent)
        .append("  LDPC extra OFDM symbol: ")
        .append(ldpcExtraOfdmSymbol)
        .append(ls)
        .append(indent)
        .append("  Beamformed: ")
        .append(beamformed)
        .append(ls)
        .append(indent)
        .append("  2nd MSB of flags: ")
        .append(secondMsbOfFlags)
        .append(ls)
        .append(indent)
        .append("  MSB of flags: ")
        .append(msbOfFlags)
        .append(ls)
        .append(indent)
        .append("  Bandwidth: ")
        .append(bandwidth)
        .append(ls);
    for (int i = 0; i < 4; i++) {
      sb.append(indent).append("  NSS-").append(i).append(": ").append(nsses[i]).append(ls);
    }
    for (int i = 0; i < 4; i++) {
      sb.append(indent).append("  MCS-").append(i).append(": ").append(mcses[i]).append(ls);
    }
    for (int i = 0; i < 4; i++) {
      sb.append(indent).append("  FEC-").append(i).append(": ").append(fecTypes[i]).append(ls);
    }
    sb.append(indent)
        .append("  Group ID: ")
        .append(getGroupIdAsInt())
        .append(ls)
        .append(indent)
        .append("  Partial AID: ")
        .append(getPartialAidAsInt())
        .append(ls);

    return sb.toString();
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + bandwidth.hashCode();
    result = prime * result + (bandwidthKnown ? 1231 : 1237);
    result = prime * result + (beamformed ? 1231 : 1237);
    result = prime * result + (beamformedKnown ? 1231 : 1237);
    result = prime * result + Arrays.hashCode(fecTypes);
    result = prime * result + (fifthMsbOfKnown ? 1231 : 1237);
    result = prime * result + (fourthMsbOfKnown ? 1231 : 1237);
    result = prime * result + groupId;
    result = prime * result + (groupIdKnown ? 1231 : 1237);
    result = prime * result + (guardIntervalKnown ? 1231 : 1237);
    result = prime * result + (ldpcExtraOfdmSymbol ? 1231 : 1237);
    result = prime * result + (ldpcExtraOfdmSymbolKnown ? 1231 : 1237);
    result = prime * result + Arrays.hashCode(mcses);
    result = prime * result + (msbOfFlags ? 1231 : 1237);
    result = prime * result + (msbOfKnown ? 1231 : 1237);
    result = prime * result + Arrays.hashCode(nsses);
    result = prime * result + partialAid;
    result = prime * result + (partialAidKnown ? 1231 : 1237);
    result = prime * result + (secondMsbOfFlags ? 1231 : 1237);
    result = prime * result + (secondMsbOfKnown ? 1231 : 1237);
    result = prime * result + (seventhMsbOfKnown ? 1231 : 1237);
    result = prime * result + (shortGiNsymDisambiguation ? 1231 : 1237);
    result = prime * result + (shortGiNsymDisambiguationKnown ? 1231 : 1237);
    result = prime * result + (shortGuardInterval ? 1231 : 1237);
    result = prime * result + (sixthMsbOfKnown ? 1231 : 1237);
    result = prime * result + (stbc ? 1231 : 1237);
    result = prime * result + (stbcKnown ? 1231 : 1237);
    result = prime * result + (thirdMsbOfKnown ? 1231 : 1237);
    result = prime * result + (txopPsNotAllowed ? 1231 : 1237);
    result = prime * result + (txopPsNotAllowedKnown ? 1231 : 1237);
    result = prime * result + unusedInCoding;
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    RadiotapDataVht other = (RadiotapDataVht) obj;
    if (!bandwidth.equals(other.bandwidth)) return false;
    if (bandwidthKnown != other.bandwidthKnown) return false;
    if (beamformed != other.beamformed) return false;
    if (beamformedKnown != other.beamformedKnown) return false;
    if (!Arrays.equals(fecTypes, other.fecTypes)) return false;
    if (fifthMsbOfKnown != other.fifthMsbOfKnown) return false;
    if (fourthMsbOfKnown != other.fourthMsbOfKnown) return false;
    if (groupId != other.groupId) return false;
    if (groupIdKnown != other.groupIdKnown) return false;
    if (guardIntervalKnown != other.guardIntervalKnown) return false;
    if (ldpcExtraOfdmSymbol != other.ldpcExtraOfdmSymbol) return false;
    if (ldpcExtraOfdmSymbolKnown != other.ldpcExtraOfdmSymbolKnown) return false;
    if (!Arrays.equals(mcses, other.mcses)) return false;
    if (msbOfFlags != other.msbOfFlags) return false;
    if (msbOfKnown != other.msbOfKnown) return false;
    if (!Arrays.equals(nsses, other.nsses)) return false;
    if (partialAid != other.partialAid) return false;
    if (partialAidKnown != other.partialAidKnown) return false;
    if (secondMsbOfFlags != other.secondMsbOfFlags) return false;
    if (secondMsbOfKnown != other.secondMsbOfKnown) return false;
    if (seventhMsbOfKnown != other.seventhMsbOfKnown) return false;
    if (shortGiNsymDisambiguation != other.shortGiNsymDisambiguation) return false;
    if (shortGiNsymDisambiguationKnown != other.shortGiNsymDisambiguationKnown) return false;
    if (shortGuardInterval != other.shortGuardInterval) return false;
    if (sixthMsbOfKnown != other.sixthMsbOfKnown) return false;
    if (stbc != other.stbc) return false;
    if (stbcKnown != other.stbcKnown) return false;
    if (thirdMsbOfKnown != other.thirdMsbOfKnown) return false;
    if (txopPsNotAllowed != other.txopPsNotAllowed) return false;
    if (txopPsNotAllowedKnown != other.txopPsNotAllowedKnown) return false;
    if (unusedInCoding != other.unusedInCoding) return false;
    return true;
  }

  /**
   * @author Kaito Yamada
   * @since pcap4j 1.6.5
   */
  public static final class Builder {

    private boolean stbcKnown;
    private boolean txopPsNotAllowedKnown;
    private boolean guardIntervalKnown;
    private boolean shortGiNsymDisambiguationKnown;
    private boolean ldpcExtraOfdmSymbolKnown;
    private boolean beamformedKnown;
    private boolean bandwidthKnown;
    private boolean groupIdKnown;
    private boolean partialAidKnown;
    private boolean seventhMsbOfKnown;
    private boolean sixthMsbOfKnown;
    private boolean fifthMsbOfKnown;
    private boolean fourthMsbOfKnown;
    private boolean thirdMsbOfKnown;
    private boolean secondMsbOfKnown;
    private boolean msbOfKnown;
    private boolean stbc;
    private boolean txopPsNotAllowed;
    private boolean shortGuardInterval;
    private boolean shortGiNsymDisambiguation;
    private boolean ldpcExtraOfdmSymbol;
    private boolean beamformed;
    private boolean secondMsbOfFlags;
    private boolean msbOfFlags;
    private RadiotapVhtBandwidth bandwidth;
    private byte[] mcses;
    private byte[] nsses;
    private RadiotapFecType[] fecTypes;
    private byte unusedInCoding;
    private byte groupId;
    private short partialAid;

    /** */
    public Builder() {}

    private Builder(RadiotapDataVht obj) {
      this.stbcKnown = obj.stbcKnown;
      this.txopPsNotAllowedKnown = obj.txopPsNotAllowedKnown;
      this.guardIntervalKnown = obj.guardIntervalKnown;
      this.shortGiNsymDisambiguationKnown = obj.shortGiNsymDisambiguationKnown;
      this.ldpcExtraOfdmSymbolKnown = obj.ldpcExtraOfdmSymbolKnown;
      this.beamformedKnown = obj.beamformedKnown;
      this.bandwidthKnown = obj.bandwidthKnown;
      this.groupIdKnown = obj.groupIdKnown;
      this.partialAidKnown = obj.partialAidKnown;
      this.seventhMsbOfKnown = obj.seventhMsbOfKnown;
      this.sixthMsbOfKnown = obj.sixthMsbOfKnown;
      this.fifthMsbOfKnown = obj.fifthMsbOfKnown;
      this.fourthMsbOfKnown = obj.fourthMsbOfKnown;
      this.thirdMsbOfKnown = obj.thirdMsbOfKnown;
      this.secondMsbOfKnown = obj.secondMsbOfKnown;
      this.msbOfKnown = obj.msbOfKnown;
      this.stbc = obj.stbc;
      this.txopPsNotAllowed = obj.txopPsNotAllowed;
      this.shortGuardInterval = obj.shortGuardInterval;
      this.shortGiNsymDisambiguation = obj.shortGiNsymDisambiguation;
      this.ldpcExtraOfdmSymbol = obj.ldpcExtraOfdmSymbol;
      this.beamformed = obj.beamformed;
      this.secondMsbOfFlags = obj.secondMsbOfFlags;
      this.msbOfFlags = obj.msbOfFlags;
      this.bandwidth = obj.bandwidth;
      this.mcses = obj.mcses;
      this.nsses = obj.nsses;
      this.fecTypes = obj.fecTypes;
      this.unusedInCoding = obj.unusedInCoding;
      this.groupId = obj.groupId;
      this.partialAid = obj.partialAid;
    }

    /**
     * @param stbcKnown stbcKnown
     * @return this Builder object for method chaining.
     */
    public Builder stbcKnown(boolean stbcKnown) {
      this.stbcKnown = stbcKnown;
      return this;
    }

    /**
     * @param txopPsNotAllowedKnown txopPsNotAllowedKnown
     * @return this Builder object for method chaining.
     */
    public Builder txopPsNotAllowedKnown(boolean txopPsNotAllowedKnown) {
      this.txopPsNotAllowedKnown = txopPsNotAllowedKnown;
      return this;
    }

    /**
     * @param guardIntervalKnown guardIntervalKnown
     * @return this Builder object for method chaining.
     */
    public Builder guardIntervalKnown(boolean guardIntervalKnown) {
      this.guardIntervalKnown = guardIntervalKnown;
      return this;
    }

    /**
     * @param shortGiNsymDisambiguationKnown shortGiNsymDisambiguationKnown
     * @return this Builder object for method chaining.
     */
    public Builder shortGiNsymDisambiguationKnown(boolean shortGiNsymDisambiguationKnown) {
      this.shortGiNsymDisambiguationKnown = shortGiNsymDisambiguationKnown;
      return this;
    }

    /**
     * @param ldpcExtraOfdmSymbolKnown ldpcExtraOfdmSymbolKnown
     * @return this Builder object for method chaining.
     */
    public Builder ldpcExtraOfdmSymbolKnown(boolean ldpcExtraOfdmSymbolKnown) {
      this.ldpcExtraOfdmSymbolKnown = ldpcExtraOfdmSymbolKnown;
      return this;
    }

    /**
     * @param beamformedKnown beamformedKnown
     * @return this Builder object for method chaining.
     */
    public Builder beamformedKnown(boolean beamformedKnown) {
      this.beamformedKnown = beamformedKnown;
      return this;
    }

    /**
     * @param bandwidthKnown bandwidthKnown
     * @return this Builder object for method chaining.
     */
    public Builder bandwidthKnown(boolean bandwidthKnown) {
      this.bandwidthKnown = bandwidthKnown;
      return this;
    }

    /**
     * @param groupIdKnown groupIdKnown
     * @return this Builder object for method chaining.
     */
    public Builder groupIdKnown(boolean groupIdKnown) {
      this.groupIdKnown = groupIdKnown;
      return this;
    }

    /**
     * @param partialAidKnown partialAidKnown
     * @return this Builder object for method chaining.
     */
    public Builder partialAidKnown(boolean partialAidKnown) {
      this.partialAidKnown = partialAidKnown;
      return this;
    }

    /**
     * @param seventhMsbOfKnown seventhMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder seventhMsbOfKnown(boolean seventhMsbOfKnown) {
      this.seventhMsbOfKnown = seventhMsbOfKnown;
      return this;
    }

    /**
     * @param sixthMsbOfKnown sixthMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder sixthMsbOfKnown(boolean sixthMsbOfKnown) {
      this.sixthMsbOfKnown = sixthMsbOfKnown;
      return this;
    }

    /**
     * @param fifthMsbOfKnown fifthMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder fifthMsbOfKnown(boolean fifthMsbOfKnown) {
      this.fifthMsbOfKnown = fifthMsbOfKnown;
      return this;
    }

    /**
     * @param fourthMsbOfKnown fourthMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder fourthMsbOfKnown(boolean fourthMsbOfKnown) {
      this.fourthMsbOfKnown = fourthMsbOfKnown;
      return this;
    }

    /**
     * @param thirdMsbOfKnown thirdMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder thirdMsbOfKnown(boolean thirdMsbOfKnown) {
      this.thirdMsbOfKnown = thirdMsbOfKnown;
      return this;
    }

    /**
     * @param secondMsbOfKnown secondMsbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder secondMsbOfKnown(boolean secondMsbOfKnown) {
      this.secondMsbOfKnown = secondMsbOfKnown;
      return this;
    }

    /**
     * @param msbOfKnown msbOfKnown
     * @return this Builder object for method chaining.
     */
    public Builder msbOfKnown(boolean msbOfKnown) {
      this.msbOfKnown = msbOfKnown;
      return this;
    }

    /**
     * @param stbc stbc
     * @return this Builder object for method chaining.
     */
    public Builder stbc(boolean stbc) {
      this.stbc = stbc;
      return this;
    }

    /**
     * @param txopPsNotAllowed txopPsNotAllowed
     * @return this Builder object for method chaining.
     */
    public Builder txopPsNotAllowed(boolean txopPsNotAllowed) {
      this.txopPsNotAllowed = txopPsNotAllowed;
      return this;
    }

    /**
     * @param shortGuardInterval shortGuardInterval
     * @return this Builder object for method chaining.
     */
    public Builder shortGuardInterval(boolean shortGuardInterval) {
      this.shortGuardInterval = shortGuardInterval;
      return this;
    }

    /**
     * @param shortGiNsymDisambiguation shortGiNsymDisambiguation
     * @return this Builder object for method chaining.
     */
    public Builder shortGiNsymDisambiguation(boolean shortGiNsymDisambiguation) {
      this.shortGiNsymDisambiguation = shortGiNsymDisambiguation;
      return this;
    }

    /**
     * @param ldpcExtraOfdmSymbol ldpcExtraOfdmSymbol
     * @return this Builder object for method chaining.
     */
    public Builder ldpcExtraOfdmSymbol(boolean ldpcExtraOfdmSymbol) {
      this.ldpcExtraOfdmSymbol = ldpcExtraOfdmSymbol;
      return this;
    }

    /**
     * @param beamformed beamformed
     * @return this Builder object for method chaining.
     */
    public Builder beamformed(boolean beamformed) {
      this.beamformed = beamformed;
      return this;
    }

    /**
     * @param secondMsbOfFlags secondMsbOfFlags
     * @return this Builder object for method chaining.
     */
    public Builder secondMsbOfFlags(boolean secondMsbOfFlags) {
      this.secondMsbOfFlags = secondMsbOfFlags;
      return this;
    }

    /**
     * @param msbOfFlags msbOfFlags
     * @return this Builder object for method chaining.
     */
    public Builder msbOfFlags(boolean msbOfFlags) {
      this.msbOfFlags = msbOfFlags;
      return this;
    }

    /**
     * @param bandwidth bandwidth
     * @return this Builder object for method chaining.
     */
    public Builder bandwidth(RadiotapVhtBandwidth bandwidth) {
      this.bandwidth = bandwidth;
      return this;
    }

    /**
     * @param mcses mcses
     * @return this Builder object for method chaining.
     */
    public Builder mcses(byte[] mcses) {
      this.mcses = mcses;
      return this;
    }

    /**
     * @param nsses nsses
     * @return this Builder object for method chaining.
     */
    public Builder nsses(byte[] nsses) {
      this.nsses = nsses;
      return this;
    }

    /**
     * @param fecTypes fecTypes
     * @return this Builder object for method chaining.
     */
    public Builder fecTypes(RadiotapFecType[] fecTypes) {
      this.fecTypes = fecTypes;
      return this;
    }

    /**
     * @param unusedInCoding unusedInCoding
     * @return this Builder object for method chaining.
     */
    public Builder unusedInCoding(byte unusedInCoding) {
      this.unusedInCoding = unusedInCoding;
      return this;
    }

    /**
     * @param groupId groupId
     * @return this Builder object for method chaining.
     */
    public Builder groupId(byte groupId) {
      this.groupId = groupId;
      return this;
    }

    /**
     * @param partialAid partialAid
     * @return this Builder object for method chaining.
     */
    public Builder partialAid(short partialAid) {
      this.partialAid = partialAid;
      return this;
    }

    /** @return a new RadiotapVht object. */
    public RadiotapDataVht build() {
      return new RadiotapDataVht(this);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy