std::optional CmisModule::getVdmDiagsStatsInfo()

in fboss/qsfp_service/module/cmis/CmisModule.cpp [1048:1214]


std::optional<VdmDiagsStats> CmisModule::getVdmDiagsStatsInfo() {
  VdmDiagsStats vdmStats;
  const uint8_t* data;
  int offset;
  int length;
  int dataAddress;

  if (!isVdmSupported() || !cacheIsValid()) {
    return std::nullopt;
  }

  vdmStats.statsCollectionTme() = WallClockUtil::NowInSecFast();

  // Fill in channel SNR Media In
  getQsfpFieldAddress(
      CmisField::VDM_CONF_SNR_MEDIA_IN, dataAddress, offset, length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  uint8_t vdmConfType = data[1];
  if (vdmConfType == SNR_MEDIA_IN) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_SNR_MEDIA_IN, dataAddress, offset, length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    for (auto lanes = 0; lanes < length / 2; lanes++) {
      double snr;
      snr = data[lanes * 2] + (data[lanes * 2 + 1] / 256.0);
      vdmStats.eSnrMediaChannel()[lanes] = snr;
    }
  }

  // Helper function to convert U16 format to double
  auto f16ToDouble = [](uint8_t byte0, uint8_t byte1) -> double {
    double ber;
    int expon = byte0 >> 3;
    expon -= 24;
    int mant = ((byte0 & 0x7) << 8) | byte1;
    ber = mant * exp10(expon);
    return ber;
  };

  // Fill in Media Pre FEC BER values
  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_MEDIA_IN_MIN,
      dataAddress,
      offset,
      length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_MEDIA_IN_MIN) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_MEDIA_IN_MIN,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerMediaMin() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_MEDIA_IN_MAX,
      dataAddress,
      offset,
      length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_MEDIA_IN_MAX) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_MEDIA_IN_MAX,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerMediaMax() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_MEDIA_IN_AVG,
      dataAddress,
      offset,
      length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_MEDIA_IN_AVG) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_MEDIA_IN_AVG,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerMediaAvg() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_MEDIA_IN_CUR,
      dataAddress,
      offset,
      length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_MEDIA_IN_CUR) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_MEDIA_IN_CUR,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerMediaCur() = f16ToDouble(data[0], data[1]);
  }

  // Fill in Host Pre FEC BER values
  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_HOST_IN_MIN, dataAddress, offset, length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_HOST_IN_MIN) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_HOST_IN_MIN,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerHostMin() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_HOST_IN_MAX, dataAddress, offset, length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_HOST_IN_MAX) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_HOST_IN_MAX,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerHostMax() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_HOST_IN_AVG, dataAddress, offset, length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_HOST_IN_AVG) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_HOST_IN_AVG,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerHostAvg() = f16ToDouble(data[0], data[1]);
  }

  getQsfpFieldAddress(
      CmisField::VDM_CONF_PRE_FEC_BER_HOST_IN_CUR, dataAddress, offset, length);
  data = getQsfpValuePtr(dataAddress, offset, length);
  vdmConfType = data[1];
  if (vdmConfType == PRE_FEC_BER_HOST_IN_CUR) {
    getQsfpFieldAddress(
        CmisField::VDM_VAL_PRE_FEC_BER_HOST_IN_CUR,
        dataAddress,
        offset,
        length);
    data = getQsfpValuePtr(dataAddress, offset, length);
    vdmStats.preFecBerHostCur() = f16ToDouble(data[0], data[1]);
  }

  return vdmStats;
}