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;
}