sai_status_t get_port_serdes_attribute_fn()

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