// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: grpc/channelz/channelz.proto

package io.grpc.channelz.v1;

/**
 * <pre>
 * Tcp info for SOL_TCP, TCP_INFO
 * </pre>
 *
 * Protobuf type {@code grpc.channelz.SocketOptionTcpInfo}
 */
public  final class SocketOptionTcpInfo extends
    com.google.protobuf.GeneratedMessageV3 implements
    // @@protoc_insertion_point(message_implements:grpc.channelz.SocketOptionTcpInfo)
    SocketOptionTcpInfoOrBuilder {
private static final long serialVersionUID = 0L;
  // Use SocketOptionTcpInfo.newBuilder() to construct.
  private SocketOptionTcpInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
    super(builder);
  }
  private SocketOptionTcpInfo() {
    tcpiState_ = 0;
    tcpiCaState_ = 0;
    tcpiRetransmits_ = 0;
    tcpiProbes_ = 0;
    tcpiBackoff_ = 0;
    tcpiOptions_ = 0;
    tcpiSndWscale_ = 0;
    tcpiRcvWscale_ = 0;
    tcpiRto_ = 0;
    tcpiAto_ = 0;
    tcpiSndMss_ = 0;
    tcpiRcvMss_ = 0;
    tcpiUnacked_ = 0;
    tcpiSacked_ = 0;
    tcpiLost_ = 0;
    tcpiRetrans_ = 0;
    tcpiFackets_ = 0;
    tcpiLastDataSent_ = 0;
    tcpiLastAckSent_ = 0;
    tcpiLastDataRecv_ = 0;
    tcpiLastAckRecv_ = 0;
    tcpiPmtu_ = 0;
    tcpiRcvSsthresh_ = 0;
    tcpiRtt_ = 0;
    tcpiRttvar_ = 0;
    tcpiSndSsthresh_ = 0;
    tcpiSndCwnd_ = 0;
    tcpiAdvmss_ = 0;
    tcpiReordering_ = 0;
  }

  @java.lang.Override
  public final com.google.protobuf.UnknownFieldSet
  getUnknownFields() {
    return this.unknownFields;
  }
  private SocketOptionTcpInfo(
      com.google.protobuf.CodedInputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    this();
    if (extensionRegistry == null) {
      throw new java.lang.NullPointerException();
    }
    int mutable_bitField0_ = 0;
    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
        com.google.protobuf.UnknownFieldSet.newBuilder();
    try {
      boolean done = false;
      while (!done) {
        int tag = input.readTag();
        switch (tag) {
          case 0:
            done = true;
            break;
          default: {
            if (!parseUnknownFieldProto3(
                input, unknownFields, extensionRegistry, tag)) {
              done = true;
            }
            break;
          }
          case 8: {

            tcpiState_ = input.readUInt32();
            break;
          }
          case 16: {

            tcpiCaState_ = input.readUInt32();
            break;
          }
          case 24: {

            tcpiRetransmits_ = input.readUInt32();
            break;
          }
          case 32: {

            tcpiProbes_ = input.readUInt32();
            break;
          }
          case 40: {

            tcpiBackoff_ = input.readUInt32();
            break;
          }
          case 48: {

            tcpiOptions_ = input.readUInt32();
            break;
          }
          case 56: {

            tcpiSndWscale_ = input.readUInt32();
            break;
          }
          case 64: {

            tcpiRcvWscale_ = input.readUInt32();
            break;
          }
          case 72: {

            tcpiRto_ = input.readUInt32();
            break;
          }
          case 80: {

            tcpiAto_ = input.readUInt32();
            break;
          }
          case 88: {

            tcpiSndMss_ = input.readUInt32();
            break;
          }
          case 96: {

            tcpiRcvMss_ = input.readUInt32();
            break;
          }
          case 104: {

            tcpiUnacked_ = input.readUInt32();
            break;
          }
          case 112: {

            tcpiSacked_ = input.readUInt32();
            break;
          }
          case 120: {

            tcpiLost_ = input.readUInt32();
            break;
          }
          case 128: {

            tcpiRetrans_ = input.readUInt32();
            break;
          }
          case 136: {

            tcpiFackets_ = input.readUInt32();
            break;
          }
          case 144: {

            tcpiLastDataSent_ = input.readUInt32();
            break;
          }
          case 152: {

            tcpiLastAckSent_ = input.readUInt32();
            break;
          }
          case 160: {

            tcpiLastDataRecv_ = input.readUInt32();
            break;
          }
          case 168: {

            tcpiLastAckRecv_ = input.readUInt32();
            break;
          }
          case 176: {

            tcpiPmtu_ = input.readUInt32();
            break;
          }
          case 184: {

            tcpiRcvSsthresh_ = input.readUInt32();
            break;
          }
          case 192: {

            tcpiRtt_ = input.readUInt32();
            break;
          }
          case 200: {

            tcpiRttvar_ = input.readUInt32();
            break;
          }
          case 208: {

            tcpiSndSsthresh_ = input.readUInt32();
            break;
          }
          case 216: {

            tcpiSndCwnd_ = input.readUInt32();
            break;
          }
          case 224: {

            tcpiAdvmss_ = input.readUInt32();
            break;
          }
          case 232: {

            tcpiReordering_ = input.readUInt32();
            break;
          }
        }
      }
    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
      throw e.setUnfinishedMessage(this);
    } catch (java.io.IOException e) {
      throw new com.google.protobuf.InvalidProtocolBufferException(
          e).setUnfinishedMessage(this);
    } finally {
      this.unknownFields = unknownFields.build();
      makeExtensionsImmutable();
    }
  }
  public static final com.google.protobuf.Descriptors.Descriptor
      getDescriptor() {
    return io.grpc.channelz.v1.ChannelzProto.internal_static_grpc_channelz_SocketOptionTcpInfo_descriptor;
  }

  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internalGetFieldAccessorTable() {
    return io.grpc.channelz.v1.ChannelzProto.internal_static_grpc_channelz_SocketOptionTcpInfo_fieldAccessorTable
        .ensureFieldAccessorsInitialized(
            io.grpc.channelz.v1.SocketOptionTcpInfo.class, io.grpc.channelz.v1.SocketOptionTcpInfo.Builder.class);
  }

  public static final int TCPI_STATE_FIELD_NUMBER = 1;
  private int tcpiState_;
  /**
   * <code>uint32 tcpi_state = 1;</code>
   */
  public int getTcpiState() {
    return tcpiState_;
  }

  public static final int TCPI_CA_STATE_FIELD_NUMBER = 2;
  private int tcpiCaState_;
  /**
   * <code>uint32 tcpi_ca_state = 2;</code>
   */
  public int getTcpiCaState() {
    return tcpiCaState_;
  }

  public static final int TCPI_RETRANSMITS_FIELD_NUMBER = 3;
  private int tcpiRetransmits_;
  /**
   * <code>uint32 tcpi_retransmits = 3;</code>
   */
  public int getTcpiRetransmits() {
    return tcpiRetransmits_;
  }

  public static final int TCPI_PROBES_FIELD_NUMBER = 4;
  private int tcpiProbes_;
  /**
   * <code>uint32 tcpi_probes = 4;</code>
   */
  public int getTcpiProbes() {
    return tcpiProbes_;
  }

  public static final int TCPI_BACKOFF_FIELD_NUMBER = 5;
  private int tcpiBackoff_;
  /**
   * <code>uint32 tcpi_backoff = 5;</code>
   */
  public int getTcpiBackoff() {
    return tcpiBackoff_;
  }

  public static final int TCPI_OPTIONS_FIELD_NUMBER = 6;
  private int tcpiOptions_;
  /**
   * <code>uint32 tcpi_options = 6;</code>
   */
  public int getTcpiOptions() {
    return tcpiOptions_;
  }

  public static final int TCPI_SND_WSCALE_FIELD_NUMBER = 7;
  private int tcpiSndWscale_;
  /**
   * <code>uint32 tcpi_snd_wscale = 7;</code>
   */
  public int getTcpiSndWscale() {
    return tcpiSndWscale_;
  }

  public static final int TCPI_RCV_WSCALE_FIELD_NUMBER = 8;
  private int tcpiRcvWscale_;
  /**
   * <code>uint32 tcpi_rcv_wscale = 8;</code>
   */
  public int getTcpiRcvWscale() {
    return tcpiRcvWscale_;
  }

  public static final int TCPI_RTO_FIELD_NUMBER = 9;
  private int tcpiRto_;
  /**
   * <code>uint32 tcpi_rto = 9;</code>
   */
  public int getTcpiRto() {
    return tcpiRto_;
  }

  public static final int TCPI_ATO_FIELD_NUMBER = 10;
  private int tcpiAto_;
  /**
   * <code>uint32 tcpi_ato = 10;</code>
   */
  public int getTcpiAto() {
    return tcpiAto_;
  }

  public static final int TCPI_SND_MSS_FIELD_NUMBER = 11;
  private int tcpiSndMss_;
  /**
   * <code>uint32 tcpi_snd_mss = 11;</code>
   */
  public int getTcpiSndMss() {
    return tcpiSndMss_;
  }

  public static final int TCPI_RCV_MSS_FIELD_NUMBER = 12;
  private int tcpiRcvMss_;
  /**
   * <code>uint32 tcpi_rcv_mss = 12;</code>
   */
  public int getTcpiRcvMss() {
    return tcpiRcvMss_;
  }

  public static final int TCPI_UNACKED_FIELD_NUMBER = 13;
  private int tcpiUnacked_;
  /**
   * <code>uint32 tcpi_unacked = 13;</code>
   */
  public int getTcpiUnacked() {
    return tcpiUnacked_;
  }

  public static final int TCPI_SACKED_FIELD_NUMBER = 14;
  private int tcpiSacked_;
  /**
   * <code>uint32 tcpi_sacked = 14;</code>
   */
  public int getTcpiSacked() {
    return tcpiSacked_;
  }

  public static final int TCPI_LOST_FIELD_NUMBER = 15;
  private int tcpiLost_;
  /**
   * <code>uint32 tcpi_lost = 15;</code>
   */
  public int getTcpiLost() {
    return tcpiLost_;
  }

  public static final int TCPI_RETRANS_FIELD_NUMBER = 16;
  private int tcpiRetrans_;
  /**
   * <code>uint32 tcpi_retrans = 16;</code>
   */
  public int getTcpiRetrans() {
    return tcpiRetrans_;
  }

  public static final int TCPI_FACKETS_FIELD_NUMBER = 17;
  private int tcpiFackets_;
  /**
   * <code>uint32 tcpi_fackets = 17;</code>
   */
  public int getTcpiFackets() {
    return tcpiFackets_;
  }

  public static final int TCPI_LAST_DATA_SENT_FIELD_NUMBER = 18;
  private int tcpiLastDataSent_;
  /**
   * <code>uint32 tcpi_last_data_sent = 18;</code>
   */
  public int getTcpiLastDataSent() {
    return tcpiLastDataSent_;
  }

  public static final int TCPI_LAST_ACK_SENT_FIELD_NUMBER = 19;
  private int tcpiLastAckSent_;
  /**
   * <code>uint32 tcpi_last_ack_sent = 19;</code>
   */
  public int getTcpiLastAckSent() {
    return tcpiLastAckSent_;
  }

  public static final int TCPI_LAST_DATA_RECV_FIELD_NUMBER = 20;
  private int tcpiLastDataRecv_;
  /**
   * <code>uint32 tcpi_last_data_recv = 20;</code>
   */
  public int getTcpiLastDataRecv() {
    return tcpiLastDataRecv_;
  }

  public static final int TCPI_LAST_ACK_RECV_FIELD_NUMBER = 21;
  private int tcpiLastAckRecv_;
  /**
   * <code>uint32 tcpi_last_ack_recv = 21;</code>
   */
  public int getTcpiLastAckRecv() {
    return tcpiLastAckRecv_;
  }

  public static final int TCPI_PMTU_FIELD_NUMBER = 22;
  private int tcpiPmtu_;
  /**
   * <code>uint32 tcpi_pmtu = 22;</code>
   */
  public int getTcpiPmtu() {
    return tcpiPmtu_;
  }

  public static final int TCPI_RCV_SSTHRESH_FIELD_NUMBER = 23;
  private int tcpiRcvSsthresh_;
  /**
   * <code>uint32 tcpi_rcv_ssthresh = 23;</code>
   */
  public int getTcpiRcvSsthresh() {
    return tcpiRcvSsthresh_;
  }

  public static final int TCPI_RTT_FIELD_NUMBER = 24;
  private int tcpiRtt_;
  /**
   * <code>uint32 tcpi_rtt = 24;</code>
   */
  public int getTcpiRtt() {
    return tcpiRtt_;
  }

  public static final int TCPI_RTTVAR_FIELD_NUMBER = 25;
  private int tcpiRttvar_;
  /**
   * <code>uint32 tcpi_rttvar = 25;</code>
   */
  public int getTcpiRttvar() {
    return tcpiRttvar_;
  }

  public static final int TCPI_SND_SSTHRESH_FIELD_NUMBER = 26;
  private int tcpiSndSsthresh_;
  /**
   * <code>uint32 tcpi_snd_ssthresh = 26;</code>
   */
  public int getTcpiSndSsthresh() {
    return tcpiSndSsthresh_;
  }

  public static final int TCPI_SND_CWND_FIELD_NUMBER = 27;
  private int tcpiSndCwnd_;
  /**
   * <code>uint32 tcpi_snd_cwnd = 27;</code>
   */
  public int getTcpiSndCwnd() {
    return tcpiSndCwnd_;
  }

  public static final int TCPI_ADVMSS_FIELD_NUMBER = 28;
  private int tcpiAdvmss_;
  /**
   * <code>uint32 tcpi_advmss = 28;</code>
   */
  public int getTcpiAdvmss() {
    return tcpiAdvmss_;
  }

  public static final int TCPI_REORDERING_FIELD_NUMBER = 29;
  private int tcpiReordering_;
  /**
   * <code>uint32 tcpi_reordering = 29;</code>
   */
  public int getTcpiReordering() {
    return tcpiReordering_;
  }

  private byte memoizedIsInitialized = -1;
  public final boolean isInitialized() {
    byte isInitialized = memoizedIsInitialized;
    if (isInitialized == 1) return true;
    if (isInitialized == 0) return false;

    memoizedIsInitialized = 1;
    return true;
  }

  public void writeTo(com.google.protobuf.CodedOutputStream output)
                      throws java.io.IOException {
    if (tcpiState_ != 0) {
      output.writeUInt32(1, tcpiState_);
    }
    if (tcpiCaState_ != 0) {
      output.writeUInt32(2, tcpiCaState_);
    }
    if (tcpiRetransmits_ != 0) {
      output.writeUInt32(3, tcpiRetransmits_);
    }
    if (tcpiProbes_ != 0) {
      output.writeUInt32(4, tcpiProbes_);
    }
    if (tcpiBackoff_ != 0) {
      output.writeUInt32(5, tcpiBackoff_);
    }
    if (tcpiOptions_ != 0) {
      output.writeUInt32(6, tcpiOptions_);
    }
    if (tcpiSndWscale_ != 0) {
      output.writeUInt32(7, tcpiSndWscale_);
    }
    if (tcpiRcvWscale_ != 0) {
      output.writeUInt32(8, tcpiRcvWscale_);
    }
    if (tcpiRto_ != 0) {
      output.writeUInt32(9, tcpiRto_);
    }
    if (tcpiAto_ != 0) {
      output.writeUInt32(10, tcpiAto_);
    }
    if (tcpiSndMss_ != 0) {
      output.writeUInt32(11, tcpiSndMss_);
    }
    if (tcpiRcvMss_ != 0) {
      output.writeUInt32(12, tcpiRcvMss_);
    }
    if (tcpiUnacked_ != 0) {
      output.writeUInt32(13, tcpiUnacked_);
    }
    if (tcpiSacked_ != 0) {
      output.writeUInt32(14, tcpiSacked_);
    }
    if (tcpiLost_ != 0) {
      output.writeUInt32(15, tcpiLost_);
    }
    if (tcpiRetrans_ != 0) {
      output.writeUInt32(16, tcpiRetrans_);
    }
    if (tcpiFackets_ != 0) {
      output.writeUInt32(17, tcpiFackets_);
    }
    if (tcpiLastDataSent_ != 0) {
      output.writeUInt32(18, tcpiLastDataSent_);
    }
    if (tcpiLastAckSent_ != 0) {
      output.writeUInt32(19, tcpiLastAckSent_);
    }
    if (tcpiLastDataRecv_ != 0) {
      output.writeUInt32(20, tcpiLastDataRecv_);
    }
    if (tcpiLastAckRecv_ != 0) {
      output.writeUInt32(21, tcpiLastAckRecv_);
    }
    if (tcpiPmtu_ != 0) {
      output.writeUInt32(22, tcpiPmtu_);
    }
    if (tcpiRcvSsthresh_ != 0) {
      output.writeUInt32(23, tcpiRcvSsthresh_);
    }
    if (tcpiRtt_ != 0) {
      output.writeUInt32(24, tcpiRtt_);
    }
    if (tcpiRttvar_ != 0) {
      output.writeUInt32(25, tcpiRttvar_);
    }
    if (tcpiSndSsthresh_ != 0) {
      output.writeUInt32(26, tcpiSndSsthresh_);
    }
    if (tcpiSndCwnd_ != 0) {
      output.writeUInt32(27, tcpiSndCwnd_);
    }
    if (tcpiAdvmss_ != 0) {
      output.writeUInt32(28, tcpiAdvmss_);
    }
    if (tcpiReordering_ != 0) {
      output.writeUInt32(29, tcpiReordering_);
    }
    unknownFields.writeTo(output);
  }

  public int getSerializedSize() {
    int size = memoizedSize;
    if (size != -1) return size;

    size = 0;
    if (tcpiState_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(1, tcpiState_);
    }
    if (tcpiCaState_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(2, tcpiCaState_);
    }
    if (tcpiRetransmits_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(3, tcpiRetransmits_);
    }
    if (tcpiProbes_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(4, tcpiProbes_);
    }
    if (tcpiBackoff_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(5, tcpiBackoff_);
    }
    if (tcpiOptions_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(6, tcpiOptions_);
    }
    if (tcpiSndWscale_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(7, tcpiSndWscale_);
    }
    if (tcpiRcvWscale_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(8, tcpiRcvWscale_);
    }
    if (tcpiRto_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(9, tcpiRto_);
    }
    if (tcpiAto_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(10, tcpiAto_);
    }
    if (tcpiSndMss_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(11, tcpiSndMss_);
    }
    if (tcpiRcvMss_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(12, tcpiRcvMss_);
    }
    if (tcpiUnacked_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(13, tcpiUnacked_);
    }
    if (tcpiSacked_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(14, tcpiSacked_);
    }
    if (tcpiLost_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(15, tcpiLost_);
    }
    if (tcpiRetrans_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(16, tcpiRetrans_);
    }
    if (tcpiFackets_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(17, tcpiFackets_);
    }
    if (tcpiLastDataSent_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(18, tcpiLastDataSent_);
    }
    if (tcpiLastAckSent_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(19, tcpiLastAckSent_);
    }
    if (tcpiLastDataRecv_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(20, tcpiLastDataRecv_);
    }
    if (tcpiLastAckRecv_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(21, tcpiLastAckRecv_);
    }
    if (tcpiPmtu_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(22, tcpiPmtu_);
    }
    if (tcpiRcvSsthresh_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(23, tcpiRcvSsthresh_);
    }
    if (tcpiRtt_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(24, tcpiRtt_);
    }
    if (tcpiRttvar_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(25, tcpiRttvar_);
    }
    if (tcpiSndSsthresh_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(26, tcpiSndSsthresh_);
    }
    if (tcpiSndCwnd_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(27, tcpiSndCwnd_);
    }
    if (tcpiAdvmss_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(28, tcpiAdvmss_);
    }
    if (tcpiReordering_ != 0) {
      size += com.google.protobuf.CodedOutputStream
        .computeUInt32Size(29, tcpiReordering_);
    }
    size += unknownFields.getSerializedSize();
    memoizedSize = size;
    return size;
  }

  @java.lang.Override
  public boolean equals(final java.lang.Object obj) {
    if (obj == this) {
     return true;
    }
    if (!(obj instanceof io.grpc.channelz.v1.SocketOptionTcpInfo)) {
      return super.equals(obj);
    }
    io.grpc.channelz.v1.SocketOptionTcpInfo other = (io.grpc.channelz.v1.SocketOptionTcpInfo) obj;

    boolean result = true;
    result = result && (getTcpiState()
        == other.getTcpiState());
    result = result && (getTcpiCaState()
        == other.getTcpiCaState());
    result = result && (getTcpiRetransmits()
        == other.getTcpiRetransmits());
    result = result && (getTcpiProbes()
        == other.getTcpiProbes());
    result = result && (getTcpiBackoff()
        == other.getTcpiBackoff());
    result = result && (getTcpiOptions()
        == other.getTcpiOptions());
    result = result && (getTcpiSndWscale()
        == other.getTcpiSndWscale());
    result = result && (getTcpiRcvWscale()
        == other.getTcpiRcvWscale());
    result = result && (getTcpiRto()
        == other.getTcpiRto());
    result = result && (getTcpiAto()
        == other.getTcpiAto());
    result = result && (getTcpiSndMss()
        == other.getTcpiSndMss());
    result = result && (getTcpiRcvMss()
        == other.getTcpiRcvMss());
    result = result && (getTcpiUnacked()
        == other.getTcpiUnacked());
    result = result && (getTcpiSacked()
        == other.getTcpiSacked());
    result = result && (getTcpiLost()
        == other.getTcpiLost());
    result = result && (getTcpiRetrans()
        == other.getTcpiRetrans());
    result = result && (getTcpiFackets()
        == other.getTcpiFackets());
    result = result && (getTcpiLastDataSent()
        == other.getTcpiLastDataSent());
    result = result && (getTcpiLastAckSent()
        == other.getTcpiLastAckSent());
    result = result && (getTcpiLastDataRecv()
        == other.getTcpiLastDataRecv());
    result = result && (getTcpiLastAckRecv()
        == other.getTcpiLastAckRecv());
    result = result && (getTcpiPmtu()
        == other.getTcpiPmtu());
    result = result && (getTcpiRcvSsthresh()
        == other.getTcpiRcvSsthresh());
    result = result && (getTcpiRtt()
        == other.getTcpiRtt());
    result = result && (getTcpiRttvar()
        == other.getTcpiRttvar());
    result = result && (getTcpiSndSsthresh()
        == other.getTcpiSndSsthresh());
    result = result && (getTcpiSndCwnd()
        == other.getTcpiSndCwnd());
    result = result && (getTcpiAdvmss()
        == other.getTcpiAdvmss());
    result = result && (getTcpiReordering()
        == other.getTcpiReordering());
    result = result && unknownFields.equals(other.unknownFields);
    return result;
  }

  @java.lang.Override
  public int hashCode() {
    if (memoizedHashCode != 0) {
      return memoizedHashCode;
    }
    int hash = 41;
    hash = (19 * hash) + getDescriptor().hashCode();
    hash = (37 * hash) + TCPI_STATE_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiState();
    hash = (37 * hash) + TCPI_CA_STATE_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiCaState();
    hash = (37 * hash) + TCPI_RETRANSMITS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRetransmits();
    hash = (37 * hash) + TCPI_PROBES_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiProbes();
    hash = (37 * hash) + TCPI_BACKOFF_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiBackoff();
    hash = (37 * hash) + TCPI_OPTIONS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiOptions();
    hash = (37 * hash) + TCPI_SND_WSCALE_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiSndWscale();
    hash = (37 * hash) + TCPI_RCV_WSCALE_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRcvWscale();
    hash = (37 * hash) + TCPI_RTO_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRto();
    hash = (37 * hash) + TCPI_ATO_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiAto();
    hash = (37 * hash) + TCPI_SND_MSS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiSndMss();
    hash = (37 * hash) + TCPI_RCV_MSS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRcvMss();
    hash = (37 * hash) + TCPI_UNACKED_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiUnacked();
    hash = (37 * hash) + TCPI_SACKED_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiSacked();
    hash = (37 * hash) + TCPI_LOST_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiLost();
    hash = (37 * hash) + TCPI_RETRANS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRetrans();
    hash = (37 * hash) + TCPI_FACKETS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiFackets();
    hash = (37 * hash) + TCPI_LAST_DATA_SENT_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiLastDataSent();
    hash = (37 * hash) + TCPI_LAST_ACK_SENT_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiLastAckSent();
    hash = (37 * hash) + TCPI_LAST_DATA_RECV_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiLastDataRecv();
    hash = (37 * hash) + TCPI_LAST_ACK_RECV_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiLastAckRecv();
    hash = (37 * hash) + TCPI_PMTU_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiPmtu();
    hash = (37 * hash) + TCPI_RCV_SSTHRESH_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRcvSsthresh();
    hash = (37 * hash) + TCPI_RTT_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRtt();
    hash = (37 * hash) + TCPI_RTTVAR_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiRttvar();
    hash = (37 * hash) + TCPI_SND_SSTHRESH_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiSndSsthresh();
    hash = (37 * hash) + TCPI_SND_CWND_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiSndCwnd();
    hash = (37 * hash) + TCPI_ADVMSS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiAdvmss();
    hash = (37 * hash) + TCPI_REORDERING_FIELD_NUMBER;
    hash = (53 * hash) + getTcpiReordering();
    hash = (29 * hash) + unknownFields.hashCode();
    memoizedHashCode = hash;
    return hash;
  }

  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      java.nio.ByteBuffer data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      java.nio.ByteBuffer data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      com.google.protobuf.ByteString data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      com.google.protobuf.ByteString data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(byte[] data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      byte[] data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(java.io.InputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      java.io.InputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input, extensionRegistry);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseDelimitedFrom(java.io.InputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseDelimitedWithIOException(PARSER, input);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseDelimitedFrom(
      java.io.InputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      com.google.protobuf.CodedInputStream input)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input);
  }
  public static io.grpc.channelz.v1.SocketOptionTcpInfo parseFrom(
      com.google.protobuf.CodedInputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3
        .parseWithIOException(PARSER, input, extensionRegistry);
  }

  public Builder newBuilderForType() { return newBuilder(); }
  public static Builder newBuilder() {
    return DEFAULT_INSTANCE.toBuilder();
  }
  public static Builder newBuilder(io.grpc.channelz.v1.SocketOptionTcpInfo prototype) {
    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
  }
  public Builder toBuilder() {
    return this == DEFAULT_INSTANCE
        ? new Builder() : new Builder().mergeFrom(this);
  }

  @java.lang.Override
  protected Builder newBuilderForType(
      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
    Builder builder = new Builder(parent);
    return builder;
  }
  /**
   * <pre>
   * Tcp info for SOL_TCP, TCP_INFO
   * </pre>
   *
   * Protobuf type {@code grpc.channelz.SocketOptionTcpInfo}
   */
  public static final class Builder extends
      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
      // @@protoc_insertion_point(builder_implements:grpc.channelz.SocketOptionTcpInfo)
      io.grpc.channelz.v1.SocketOptionTcpInfoOrBuilder {
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return io.grpc.channelz.v1.ChannelzProto.internal_static_grpc_channelz_SocketOptionTcpInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return io.grpc.channelz.v1.ChannelzProto.internal_static_grpc_channelz_SocketOptionTcpInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              io.grpc.channelz.v1.SocketOptionTcpInfo.class, io.grpc.channelz.v1.SocketOptionTcpInfo.Builder.class);
    }

    // Construct using io.grpc.channelz.v1.SocketOptionTcpInfo.newBuilder()
    private Builder() {
      maybeForceBuilderInitialization();
    }

    private Builder(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      super(parent);
      maybeForceBuilderInitialization();
    }
    private void maybeForceBuilderInitialization() {
      if (com.google.protobuf.GeneratedMessageV3
              .alwaysUseFieldBuilders) {
      }
    }
    public Builder clear() {
      super.clear();
      tcpiState_ = 0;

      tcpiCaState_ = 0;

      tcpiRetransmits_ = 0;

      tcpiProbes_ = 0;

      tcpiBackoff_ = 0;

      tcpiOptions_ = 0;

      tcpiSndWscale_ = 0;

      tcpiRcvWscale_ = 0;

      tcpiRto_ = 0;

      tcpiAto_ = 0;

      tcpiSndMss_ = 0;

      tcpiRcvMss_ = 0;

      tcpiUnacked_ = 0;

      tcpiSacked_ = 0;

      tcpiLost_ = 0;

      tcpiRetrans_ = 0;

      tcpiFackets_ = 0;

      tcpiLastDataSent_ = 0;

      tcpiLastAckSent_ = 0;

      tcpiLastDataRecv_ = 0;

      tcpiLastAckRecv_ = 0;

      tcpiPmtu_ = 0;

      tcpiRcvSsthresh_ = 0;

      tcpiRtt_ = 0;

      tcpiRttvar_ = 0;

      tcpiSndSsthresh_ = 0;

      tcpiSndCwnd_ = 0;

      tcpiAdvmss_ = 0;

      tcpiReordering_ = 0;

      return this;
    }

    public com.google.protobuf.Descriptors.Descriptor
        getDescriptorForType() {
      return io.grpc.channelz.v1.ChannelzProto.internal_static_grpc_channelz_SocketOptionTcpInfo_descriptor;
    }

    public io.grpc.channelz.v1.SocketOptionTcpInfo getDefaultInstanceForType() {
      return io.grpc.channelz.v1.SocketOptionTcpInfo.getDefaultInstance();
    }

    public io.grpc.channelz.v1.SocketOptionTcpInfo build() {
      io.grpc.channelz.v1.SocketOptionTcpInfo result = buildPartial();
      if (!result.isInitialized()) {
        throw newUninitializedMessageException(result);
      }
      return result;
    }

    public io.grpc.channelz.v1.SocketOptionTcpInfo buildPartial() {
      io.grpc.channelz.v1.SocketOptionTcpInfo result = new io.grpc.channelz.v1.SocketOptionTcpInfo(this);
      result.tcpiState_ = tcpiState_;
      result.tcpiCaState_ = tcpiCaState_;
      result.tcpiRetransmits_ = tcpiRetransmits_;
      result.tcpiProbes_ = tcpiProbes_;
      result.tcpiBackoff_ = tcpiBackoff_;
      result.tcpiOptions_ = tcpiOptions_;
      result.tcpiSndWscale_ = tcpiSndWscale_;
      result.tcpiRcvWscale_ = tcpiRcvWscale_;
      result.tcpiRto_ = tcpiRto_;
      result.tcpiAto_ = tcpiAto_;
      result.tcpiSndMss_ = tcpiSndMss_;
      result.tcpiRcvMss_ = tcpiRcvMss_;
      result.tcpiUnacked_ = tcpiUnacked_;
      result.tcpiSacked_ = tcpiSacked_;
      result.tcpiLost_ = tcpiLost_;
      result.tcpiRetrans_ = tcpiRetrans_;
      result.tcpiFackets_ = tcpiFackets_;
      result.tcpiLastDataSent_ = tcpiLastDataSent_;
      result.tcpiLastAckSent_ = tcpiLastAckSent_;
      result.tcpiLastDataRecv_ = tcpiLastDataRecv_;
      result.tcpiLastAckRecv_ = tcpiLastAckRecv_;
      result.tcpiPmtu_ = tcpiPmtu_;
      result.tcpiRcvSsthresh_ = tcpiRcvSsthresh_;
      result.tcpiRtt_ = tcpiRtt_;
      result.tcpiRttvar_ = tcpiRttvar_;
      result.tcpiSndSsthresh_ = tcpiSndSsthresh_;
      result.tcpiSndCwnd_ = tcpiSndCwnd_;
      result.tcpiAdvmss_ = tcpiAdvmss_;
      result.tcpiReordering_ = tcpiReordering_;
      onBuilt();
      return result;
    }

    public Builder clone() {
      return (Builder) super.clone();
    }
    public Builder setField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        java.lang.Object value) {
      return (Builder) super.setField(field, value);
    }
    public Builder clearField(
        com.google.protobuf.Descriptors.FieldDescriptor field) {
      return (Builder) super.clearField(field);
    }
    public Builder clearOneof(
        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
      return (Builder) super.clearOneof(oneof);
    }
    public Builder setRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        int index, java.lang.Object value) {
      return (Builder) super.setRepeatedField(field, index, value);
    }
    public Builder addRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field,
        java.lang.Object value) {
      return (Builder) super.addRepeatedField(field, value);
    }
    public Builder mergeFrom(com.google.protobuf.Message other) {
      if (other instanceof io.grpc.channelz.v1.SocketOptionTcpInfo) {
        return mergeFrom((io.grpc.channelz.v1.SocketOptionTcpInfo)other);
      } else {
        super.mergeFrom(other);
        return this;
      }
    }

    public Builder mergeFrom(io.grpc.channelz.v1.SocketOptionTcpInfo other) {
      if (other == io.grpc.channelz.v1.SocketOptionTcpInfo.getDefaultInstance()) return this;
      if (other.getTcpiState() != 0) {
        setTcpiState(other.getTcpiState());
      }
      if (other.getTcpiCaState() != 0) {
        setTcpiCaState(other.getTcpiCaState());
      }
      if (other.getTcpiRetransmits() != 0) {
        setTcpiRetransmits(other.getTcpiRetransmits());
      }
      if (other.getTcpiProbes() != 0) {
        setTcpiProbes(other.getTcpiProbes());
      }
      if (other.getTcpiBackoff() != 0) {
        setTcpiBackoff(other.getTcpiBackoff());
      }
      if (other.getTcpiOptions() != 0) {
        setTcpiOptions(other.getTcpiOptions());
      }
      if (other.getTcpiSndWscale() != 0) {
        setTcpiSndWscale(other.getTcpiSndWscale());
      }
      if (other.getTcpiRcvWscale() != 0) {
        setTcpiRcvWscale(other.getTcpiRcvWscale());
      }
      if (other.getTcpiRto() != 0) {
        setTcpiRto(other.getTcpiRto());
      }
      if (other.getTcpiAto() != 0) {
        setTcpiAto(other.getTcpiAto());
      }
      if (other.getTcpiSndMss() != 0) {
        setTcpiSndMss(other.getTcpiSndMss());
      }
      if (other.getTcpiRcvMss() != 0) {
        setTcpiRcvMss(other.getTcpiRcvMss());
      }
      if (other.getTcpiUnacked() != 0) {
        setTcpiUnacked(other.getTcpiUnacked());
      }
      if (other.getTcpiSacked() != 0) {
        setTcpiSacked(other.getTcpiSacked());
      }
      if (other.getTcpiLost() != 0) {
        setTcpiLost(other.getTcpiLost());
      }
      if (other.getTcpiRetrans() != 0) {
        setTcpiRetrans(other.getTcpiRetrans());
      }
      if (other.getTcpiFackets() != 0) {
        setTcpiFackets(other.getTcpiFackets());
      }
      if (other.getTcpiLastDataSent() != 0) {
        setTcpiLastDataSent(other.getTcpiLastDataSent());
      }
      if (other.getTcpiLastAckSent() != 0) {
        setTcpiLastAckSent(other.getTcpiLastAckSent());
      }
      if (other.getTcpiLastDataRecv() != 0) {
        setTcpiLastDataRecv(other.getTcpiLastDataRecv());
      }
      if (other.getTcpiLastAckRecv() != 0) {
        setTcpiLastAckRecv(other.getTcpiLastAckRecv());
      }
      if (other.getTcpiPmtu() != 0) {
        setTcpiPmtu(other.getTcpiPmtu());
      }
      if (other.getTcpiRcvSsthresh() != 0) {
        setTcpiRcvSsthresh(other.getTcpiRcvSsthresh());
      }
      if (other.getTcpiRtt() != 0) {
        setTcpiRtt(other.getTcpiRtt());
      }
      if (other.getTcpiRttvar() != 0) {
        setTcpiRttvar(other.getTcpiRttvar());
      }
      if (other.getTcpiSndSsthresh() != 0) {
        setTcpiSndSsthresh(other.getTcpiSndSsthresh());
      }
      if (other.getTcpiSndCwnd() != 0) {
        setTcpiSndCwnd(other.getTcpiSndCwnd());
      }
      if (other.getTcpiAdvmss() != 0) {
        setTcpiAdvmss(other.getTcpiAdvmss());
      }
      if (other.getTcpiReordering() != 0) {
        setTcpiReordering(other.getTcpiReordering());
      }
      this.mergeUnknownFields(other.unknownFields);
      onChanged();
      return this;
    }

    public final boolean isInitialized() {
      return true;
    }

    public Builder mergeFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      io.grpc.channelz.v1.SocketOptionTcpInfo parsedMessage = null;
      try {
        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        parsedMessage = (io.grpc.channelz.v1.SocketOptionTcpInfo) e.getUnfinishedMessage();
        throw e.unwrapIOException();
      } finally {
        if (parsedMessage != null) {
          mergeFrom(parsedMessage);
        }
      }
      return this;
    }

    private int tcpiState_ ;
    /**
     * <code>uint32 tcpi_state = 1;</code>
     */
    public int getTcpiState() {
      return tcpiState_;
    }
    /**
     * <code>uint32 tcpi_state = 1;</code>
     */
    public Builder setTcpiState(int value) {
      
      tcpiState_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_state = 1;</code>
     */
    public Builder clearTcpiState() {
      
      tcpiState_ = 0;
      onChanged();
      return this;
    }

    private int tcpiCaState_ ;
    /**
     * <code>uint32 tcpi_ca_state = 2;</code>
     */
    public int getTcpiCaState() {
      return tcpiCaState_;
    }
    /**
     * <code>uint32 tcpi_ca_state = 2;</code>
     */
    public Builder setTcpiCaState(int value) {
      
      tcpiCaState_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_ca_state = 2;</code>
     */
    public Builder clearTcpiCaState() {
      
      tcpiCaState_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRetransmits_ ;
    /**
     * <code>uint32 tcpi_retransmits = 3;</code>
     */
    public int getTcpiRetransmits() {
      return tcpiRetransmits_;
    }
    /**
     * <code>uint32 tcpi_retransmits = 3;</code>
     */
    public Builder setTcpiRetransmits(int value) {
      
      tcpiRetransmits_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_retransmits = 3;</code>
     */
    public Builder clearTcpiRetransmits() {
      
      tcpiRetransmits_ = 0;
      onChanged();
      return this;
    }

    private int tcpiProbes_ ;
    /**
     * <code>uint32 tcpi_probes = 4;</code>
     */
    public int getTcpiProbes() {
      return tcpiProbes_;
    }
    /**
     * <code>uint32 tcpi_probes = 4;</code>
     */
    public Builder setTcpiProbes(int value) {
      
      tcpiProbes_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_probes = 4;</code>
     */
    public Builder clearTcpiProbes() {
      
      tcpiProbes_ = 0;
      onChanged();
      return this;
    }

    private int tcpiBackoff_ ;
    /**
     * <code>uint32 tcpi_backoff = 5;</code>
     */
    public int getTcpiBackoff() {
      return tcpiBackoff_;
    }
    /**
     * <code>uint32 tcpi_backoff = 5;</code>
     */
    public Builder setTcpiBackoff(int value) {
      
      tcpiBackoff_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_backoff = 5;</code>
     */
    public Builder clearTcpiBackoff() {
      
      tcpiBackoff_ = 0;
      onChanged();
      return this;
    }

    private int tcpiOptions_ ;
    /**
     * <code>uint32 tcpi_options = 6;</code>
     */
    public int getTcpiOptions() {
      return tcpiOptions_;
    }
    /**
     * <code>uint32 tcpi_options = 6;</code>
     */
    public Builder setTcpiOptions(int value) {
      
      tcpiOptions_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_options = 6;</code>
     */
    public Builder clearTcpiOptions() {
      
      tcpiOptions_ = 0;
      onChanged();
      return this;
    }

    private int tcpiSndWscale_ ;
    /**
     * <code>uint32 tcpi_snd_wscale = 7;</code>
     */
    public int getTcpiSndWscale() {
      return tcpiSndWscale_;
    }
    /**
     * <code>uint32 tcpi_snd_wscale = 7;</code>
     */
    public Builder setTcpiSndWscale(int value) {
      
      tcpiSndWscale_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_snd_wscale = 7;</code>
     */
    public Builder clearTcpiSndWscale() {
      
      tcpiSndWscale_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRcvWscale_ ;
    /**
     * <code>uint32 tcpi_rcv_wscale = 8;</code>
     */
    public int getTcpiRcvWscale() {
      return tcpiRcvWscale_;
    }
    /**
     * <code>uint32 tcpi_rcv_wscale = 8;</code>
     */
    public Builder setTcpiRcvWscale(int value) {
      
      tcpiRcvWscale_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rcv_wscale = 8;</code>
     */
    public Builder clearTcpiRcvWscale() {
      
      tcpiRcvWscale_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRto_ ;
    /**
     * <code>uint32 tcpi_rto = 9;</code>
     */
    public int getTcpiRto() {
      return tcpiRto_;
    }
    /**
     * <code>uint32 tcpi_rto = 9;</code>
     */
    public Builder setTcpiRto(int value) {
      
      tcpiRto_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rto = 9;</code>
     */
    public Builder clearTcpiRto() {
      
      tcpiRto_ = 0;
      onChanged();
      return this;
    }

    private int tcpiAto_ ;
    /**
     * <code>uint32 tcpi_ato = 10;</code>
     */
    public int getTcpiAto() {
      return tcpiAto_;
    }
    /**
     * <code>uint32 tcpi_ato = 10;</code>
     */
    public Builder setTcpiAto(int value) {
      
      tcpiAto_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_ato = 10;</code>
     */
    public Builder clearTcpiAto() {
      
      tcpiAto_ = 0;
      onChanged();
      return this;
    }

    private int tcpiSndMss_ ;
    /**
     * <code>uint32 tcpi_snd_mss = 11;</code>
     */
    public int getTcpiSndMss() {
      return tcpiSndMss_;
    }
    /**
     * <code>uint32 tcpi_snd_mss = 11;</code>
     */
    public Builder setTcpiSndMss(int value) {
      
      tcpiSndMss_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_snd_mss = 11;</code>
     */
    public Builder clearTcpiSndMss() {
      
      tcpiSndMss_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRcvMss_ ;
    /**
     * <code>uint32 tcpi_rcv_mss = 12;</code>
     */
    public int getTcpiRcvMss() {
      return tcpiRcvMss_;
    }
    /**
     * <code>uint32 tcpi_rcv_mss = 12;</code>
     */
    public Builder setTcpiRcvMss(int value) {
      
      tcpiRcvMss_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rcv_mss = 12;</code>
     */
    public Builder clearTcpiRcvMss() {
      
      tcpiRcvMss_ = 0;
      onChanged();
      return this;
    }

    private int tcpiUnacked_ ;
    /**
     * <code>uint32 tcpi_unacked = 13;</code>
     */
    public int getTcpiUnacked() {
      return tcpiUnacked_;
    }
    /**
     * <code>uint32 tcpi_unacked = 13;</code>
     */
    public Builder setTcpiUnacked(int value) {
      
      tcpiUnacked_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_unacked = 13;</code>
     */
    public Builder clearTcpiUnacked() {
      
      tcpiUnacked_ = 0;
      onChanged();
      return this;
    }

    private int tcpiSacked_ ;
    /**
     * <code>uint32 tcpi_sacked = 14;</code>
     */
    public int getTcpiSacked() {
      return tcpiSacked_;
    }
    /**
     * <code>uint32 tcpi_sacked = 14;</code>
     */
    public Builder setTcpiSacked(int value) {
      
      tcpiSacked_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_sacked = 14;</code>
     */
    public Builder clearTcpiSacked() {
      
      tcpiSacked_ = 0;
      onChanged();
      return this;
    }

    private int tcpiLost_ ;
    /**
     * <code>uint32 tcpi_lost = 15;</code>
     */
    public int getTcpiLost() {
      return tcpiLost_;
    }
    /**
     * <code>uint32 tcpi_lost = 15;</code>
     */
    public Builder setTcpiLost(int value) {
      
      tcpiLost_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_lost = 15;</code>
     */
    public Builder clearTcpiLost() {
      
      tcpiLost_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRetrans_ ;
    /**
     * <code>uint32 tcpi_retrans = 16;</code>
     */
    public int getTcpiRetrans() {
      return tcpiRetrans_;
    }
    /**
     * <code>uint32 tcpi_retrans = 16;</code>
     */
    public Builder setTcpiRetrans(int value) {
      
      tcpiRetrans_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_retrans = 16;</code>
     */
    public Builder clearTcpiRetrans() {
      
      tcpiRetrans_ = 0;
      onChanged();
      return this;
    }

    private int tcpiFackets_ ;
    /**
     * <code>uint32 tcpi_fackets = 17;</code>
     */
    public int getTcpiFackets() {
      return tcpiFackets_;
    }
    /**
     * <code>uint32 tcpi_fackets = 17;</code>
     */
    public Builder setTcpiFackets(int value) {
      
      tcpiFackets_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_fackets = 17;</code>
     */
    public Builder clearTcpiFackets() {
      
      tcpiFackets_ = 0;
      onChanged();
      return this;
    }

    private int tcpiLastDataSent_ ;
    /**
     * <code>uint32 tcpi_last_data_sent = 18;</code>
     */
    public int getTcpiLastDataSent() {
      return tcpiLastDataSent_;
    }
    /**
     * <code>uint32 tcpi_last_data_sent = 18;</code>
     */
    public Builder setTcpiLastDataSent(int value) {
      
      tcpiLastDataSent_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_last_data_sent = 18;</code>
     */
    public Builder clearTcpiLastDataSent() {
      
      tcpiLastDataSent_ = 0;
      onChanged();
      return this;
    }

    private int tcpiLastAckSent_ ;
    /**
     * <code>uint32 tcpi_last_ack_sent = 19;</code>
     */
    public int getTcpiLastAckSent() {
      return tcpiLastAckSent_;
    }
    /**
     * <code>uint32 tcpi_last_ack_sent = 19;</code>
     */
    public Builder setTcpiLastAckSent(int value) {
      
      tcpiLastAckSent_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_last_ack_sent = 19;</code>
     */
    public Builder clearTcpiLastAckSent() {
      
      tcpiLastAckSent_ = 0;
      onChanged();
      return this;
    }

    private int tcpiLastDataRecv_ ;
    /**
     * <code>uint32 tcpi_last_data_recv = 20;</code>
     */
    public int getTcpiLastDataRecv() {
      return tcpiLastDataRecv_;
    }
    /**
     * <code>uint32 tcpi_last_data_recv = 20;</code>
     */
    public Builder setTcpiLastDataRecv(int value) {
      
      tcpiLastDataRecv_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_last_data_recv = 20;</code>
     */
    public Builder clearTcpiLastDataRecv() {
      
      tcpiLastDataRecv_ = 0;
      onChanged();
      return this;
    }

    private int tcpiLastAckRecv_ ;
    /**
     * <code>uint32 tcpi_last_ack_recv = 21;</code>
     */
    public int getTcpiLastAckRecv() {
      return tcpiLastAckRecv_;
    }
    /**
     * <code>uint32 tcpi_last_ack_recv = 21;</code>
     */
    public Builder setTcpiLastAckRecv(int value) {
      
      tcpiLastAckRecv_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_last_ack_recv = 21;</code>
     */
    public Builder clearTcpiLastAckRecv() {
      
      tcpiLastAckRecv_ = 0;
      onChanged();
      return this;
    }

    private int tcpiPmtu_ ;
    /**
     * <code>uint32 tcpi_pmtu = 22;</code>
     */
    public int getTcpiPmtu() {
      return tcpiPmtu_;
    }
    /**
     * <code>uint32 tcpi_pmtu = 22;</code>
     */
    public Builder setTcpiPmtu(int value) {
      
      tcpiPmtu_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_pmtu = 22;</code>
     */
    public Builder clearTcpiPmtu() {
      
      tcpiPmtu_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRcvSsthresh_ ;
    /**
     * <code>uint32 tcpi_rcv_ssthresh = 23;</code>
     */
    public int getTcpiRcvSsthresh() {
      return tcpiRcvSsthresh_;
    }
    /**
     * <code>uint32 tcpi_rcv_ssthresh = 23;</code>
     */
    public Builder setTcpiRcvSsthresh(int value) {
      
      tcpiRcvSsthresh_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rcv_ssthresh = 23;</code>
     */
    public Builder clearTcpiRcvSsthresh() {
      
      tcpiRcvSsthresh_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRtt_ ;
    /**
     * <code>uint32 tcpi_rtt = 24;</code>
     */
    public int getTcpiRtt() {
      return tcpiRtt_;
    }
    /**
     * <code>uint32 tcpi_rtt = 24;</code>
     */
    public Builder setTcpiRtt(int value) {
      
      tcpiRtt_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rtt = 24;</code>
     */
    public Builder clearTcpiRtt() {
      
      tcpiRtt_ = 0;
      onChanged();
      return this;
    }

    private int tcpiRttvar_ ;
    /**
     * <code>uint32 tcpi_rttvar = 25;</code>
     */
    public int getTcpiRttvar() {
      return tcpiRttvar_;
    }
    /**
     * <code>uint32 tcpi_rttvar = 25;</code>
     */
    public Builder setTcpiRttvar(int value) {
      
      tcpiRttvar_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_rttvar = 25;</code>
     */
    public Builder clearTcpiRttvar() {
      
      tcpiRttvar_ = 0;
      onChanged();
      return this;
    }

    private int tcpiSndSsthresh_ ;
    /**
     * <code>uint32 tcpi_snd_ssthresh = 26;</code>
     */
    public int getTcpiSndSsthresh() {
      return tcpiSndSsthresh_;
    }
    /**
     * <code>uint32 tcpi_snd_ssthresh = 26;</code>
     */
    public Builder setTcpiSndSsthresh(int value) {
      
      tcpiSndSsthresh_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_snd_ssthresh = 26;</code>
     */
    public Builder clearTcpiSndSsthresh() {
      
      tcpiSndSsthresh_ = 0;
      onChanged();
      return this;
    }

    private int tcpiSndCwnd_ ;
    /**
     * <code>uint32 tcpi_snd_cwnd = 27;</code>
     */
    public int getTcpiSndCwnd() {
      return tcpiSndCwnd_;
    }
    /**
     * <code>uint32 tcpi_snd_cwnd = 27;</code>
     */
    public Builder setTcpiSndCwnd(int value) {
      
      tcpiSndCwnd_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_snd_cwnd = 27;</code>
     */
    public Builder clearTcpiSndCwnd() {
      
      tcpiSndCwnd_ = 0;
      onChanged();
      return this;
    }

    private int tcpiAdvmss_ ;
    /**
     * <code>uint32 tcpi_advmss = 28;</code>
     */
    public int getTcpiAdvmss() {
      return tcpiAdvmss_;
    }
    /**
     * <code>uint32 tcpi_advmss = 28;</code>
     */
    public Builder setTcpiAdvmss(int value) {
      
      tcpiAdvmss_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_advmss = 28;</code>
     */
    public Builder clearTcpiAdvmss() {
      
      tcpiAdvmss_ = 0;
      onChanged();
      return this;
    }

    private int tcpiReordering_ ;
    /**
     * <code>uint32 tcpi_reordering = 29;</code>
     */
    public int getTcpiReordering() {
      return tcpiReordering_;
    }
    /**
     * <code>uint32 tcpi_reordering = 29;</code>
     */
    public Builder setTcpiReordering(int value) {
      
      tcpiReordering_ = value;
      onChanged();
      return this;
    }
    /**
     * <code>uint32 tcpi_reordering = 29;</code>
     */
    public Builder clearTcpiReordering() {
      
      tcpiReordering_ = 0;
      onChanged();
      return this;
    }
    public final Builder setUnknownFields(
        final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.setUnknownFieldsProto3(unknownFields);
    }

    public final Builder mergeUnknownFields(
        final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.mergeUnknownFields(unknownFields);
    }


    // @@protoc_insertion_point(builder_scope:grpc.channelz.SocketOptionTcpInfo)
  }

  // @@protoc_insertion_point(class_scope:grpc.channelz.SocketOptionTcpInfo)
  private static final io.grpc.channelz.v1.SocketOptionTcpInfo DEFAULT_INSTANCE;
  static {
    DEFAULT_INSTANCE = new io.grpc.channelz.v1.SocketOptionTcpInfo();
  }

  public static io.grpc.channelz.v1.SocketOptionTcpInfo getDefaultInstance() {
    return DEFAULT_INSTANCE;
  }

  private static final com.google.protobuf.Parser<SocketOptionTcpInfo>
      PARSER = new com.google.protobuf.AbstractParser<SocketOptionTcpInfo>() {
    public SocketOptionTcpInfo parsePartialFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return new SocketOptionTcpInfo(input, extensionRegistry);
    }
  };

  public static com.google.protobuf.Parser<SocketOptionTcpInfo> parser() {
    return PARSER;
  }

  @java.lang.Override
  public com.google.protobuf.Parser<SocketOptionTcpInfo> getParserForType() {
    return PARSER;
  }

  public io.grpc.channelz.v1.SocketOptionTcpInfo getDefaultInstanceForType() {
    return DEFAULT_INSTANCE;
  }

}

