in fboss/agent/hw/sai/fake/FakeSaiPort.cpp [772:897]
sai_status_t get_port_serdes_attribute_fn(
sai_object_id_t port_serdes_id,
uint32_t attr_count,
sai_attribute_t* attr_list) {
auto fs = FakeSai::getInstance();
auto& portSerdes = fs->portSerdesManager.get(port_serdes_id);
auto checkListSize = [](auto& list, auto& vec) {
if (list.count < vec.size()) {
return false;
}
return true;
};
auto copyVecToList = [](auto& vec, auto& list) {
for (auto i = 0; i < vec.size(); i++) {
list.list[i] = vec[i];
}
};
for (auto i = 0; i < attr_count; i++) {
switch (attr_list[i].id) {
case SAI_PORT_SERDES_ATTR_PORT_ID:
attr_list[i].value.oid = portSerdes.port;
break;
case SAI_PORT_SERDES_ATTR_PREEMPHASIS:
if (!checkListSize(
attr_list[i].value.u32list, portSerdes.preemphasis)) {
attr_list[i].value.u32list.count = portSerdes.preemphasis.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.preemphasis, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_IDRIVER:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.iDriver)) {
attr_list[i].value.u32list.count = portSerdes.iDriver.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.iDriver, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_PRE1:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirPre1)) {
attr_list[i].value.u32list.count = portSerdes.txFirPre1.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirPre1, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_PRE2:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirPre2)) {
attr_list[i].value.u32list.count = portSerdes.txFirPre2.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirPre2, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_MAIN:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirMain)) {
attr_list[i].value.u32list.count = portSerdes.txFirMain.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirMain, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST1:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirPost1)) {
attr_list[i].value.u32list.count = portSerdes.txFirPost1.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirPost1, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST2:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirPost2)) {
attr_list[i].value.u32list.count = portSerdes.txFirPost2.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirPost2, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST3:
if (!checkListSize(attr_list[i].value.u32list, portSerdes.txFirPost3)) {
attr_list[i].value.u32list.count = portSerdes.txFirPost3.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.txFirPost3, attr_list[i].value.u32list);
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_CTLE_CODE:
if (!checkListSize(attr_list[i].value.s32list, portSerdes.rxCtlCode)) {
attr_list[i].value.s32list.count = portSerdes.rxCtlCode.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.rxCtlCode, attr_list[i].value.s32list);
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_DSP_MODE:
if (!checkListSize(attr_list[i].value.s32list, portSerdes.rxDspMode)) {
attr_list[i].value.s32list.count = portSerdes.rxDspMode.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.rxDspMode, attr_list[i].value.s32list);
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AFE_TRIM:
if (!checkListSize(attr_list[i].value.s32list, portSerdes.rxAfeTrim)) {
attr_list[i].value.s32list.count = portSerdes.rxAfeTrim.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.rxAfeTrim, attr_list[i].value.s32list);
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AC_COUPLING_BYPASS:
if (!checkListSize(
attr_list[i].value.s32list, portSerdes.rxCouplingByPass)) {
attr_list[i].value.s32list.count = portSerdes.rxCouplingByPass.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(portSerdes.rxCouplingByPass, attr_list[i].value.s32list);
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AFE_ADAPTIVE_ENABLE:
if (!checkListSize(
attr_list[i].value.s32list,
portSerdes.rxAfeTrimAdaptiveEnable)) {
attr_list[i].value.s32list.count =
portSerdes.rxAfeTrimAdaptiveEnable.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
copyVecToList(
portSerdes.rxAfeTrimAdaptiveEnable, attr_list[i].value.s32list);
break;
default:
return SAI_STATUS_NOT_IMPLEMENTED;
}
}
return SAI_STATUS_SUCCESS;
}