sai_status_t get_port_attribute_fn()

in fboss/agent/hw/sai/fake/FakeSaiPort.cpp [378:546]


sai_status_t get_port_attribute_fn(
    sai_object_id_t port_id,
    uint32_t attr_count,
    sai_attribute_t* attr) {
  auto fs = FakeSai::getInstance();
  const auto& port = fs->portManager.get(port_id);
  for (int i = 0; i < attr_count; ++i) {
    switch (attr[i].id) {
      case SAI_PORT_ATTR_ADMIN_STATE:
        attr[i].value.booldata = port.adminState;
        break;
      case SAI_PORT_ATTR_HW_LANE_LIST:
        if (port.lanes.size() > attr[i].value.u32list.count) {
          attr[i].value.u32list.count = port.lanes.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.lanes.size(); ++j) {
          attr[i].value.u32list.list[j] = port.lanes[j];
        }
        attr[i].value.u32list.count = port.lanes.size();
        break;
      case SAI_PORT_ATTR_SPEED:
        attr[i].value.u32 = port.speed;
        break;
      case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES:
        attr[i].value.u32 = 8;
        break;
      case SAI_PORT_ATTR_QOS_QUEUE_LIST:
        if (port.queueIdList.size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = port.queueIdList.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.queueIdList.size(); ++j) {
          attr[i].value.objlist.list[j] = port.queueIdList[j];
        }
        break;
      case SAI_PORT_ATTR_FEC_MODE:
        attr[i].value.s32 = static_cast<int32_t>(port.fecMode);
        break;
      case SAI_PORT_ATTR_INTERNAL_LOOPBACK_MODE:
        attr[i].value.s32 = static_cast<int32_t>(port.internalLoopbackMode);
        break;
      case SAI_PORT_ATTR_MEDIA_TYPE:
        attr[i].value.s32 = static_cast<int32_t>(port.mediaType);
        break;
      case SAI_PORT_ATTR_GLOBAL_FLOW_CONTROL_MODE:
        attr[i].value.s32 = static_cast<int32_t>(port.globalFlowControlMode);
        break;
      case SAI_PORT_ATTR_PORT_VLAN_ID:
        attr[i].value.u16 = port.vlanId;
        break;
      case SAI_PORT_ATTR_SERDES_PREEMPHASIS:
        if (port.preemphasis.size() > attr[i].value.u32list.count) {
          attr[i].value.u32list.count = port.preemphasis.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.preemphasis.size(); ++j) {
          attr[i].value.u32list.list[j] = port.preemphasis[j];
        }
        attr[i].value.u32list.count = port.preemphasis.size();
        break;
      case SAI_PORT_ATTR_MTU:
        attr->value.u32 = port.mtu;
        break;
      case SAI_PORT_ATTR_OPER_STATUS:
        attr->value.s32 = SAI_PORT_OPER_STATUS_UP;
        break;
      case SAI_PORT_ATTR_QOS_DSCP_TO_TC_MAP:
        attr->value.oid = port.qosDscpToTcMap;
        break;
      case SAI_PORT_ATTR_QOS_TC_TO_QUEUE_MAP:
        attr->value.oid = port.qosTcToQueueMap;
        break;
      case SAI_PORT_ATTR_DISABLE_DECREMENT_TTL:
        attr->value.booldata = port.disableTtlDecrement;
        break;
      case SAI_PORT_ATTR_INTERFACE_TYPE:
        attr->value.s32 = port.interface_type;
        break;
      case SAI_PORT_ATTR_PKT_TX_ENABLE:
        attr->value.booldata = port.txEnable;
        break;
      case SAI_PORT_ATTR_INGRESS_MIRROR_SESSION:
        if (port.ingressMirrorList.size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = port.ingressMirrorList.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.ingressMirrorList.size(); ++j) {
          attr[i].value.objlist.list[j] = port.ingressMirrorList[j];
        }
        attr[i].value.objlist.count = port.ingressMirrorList.size();
        break;
      case SAI_PORT_ATTR_EGRESS_MIRROR_SESSION:
        if (port.egressMirrorList.size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = port.egressMirrorList.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.egressMirrorList.size(); ++j) {
          attr[i].value.objlist.list[j] = port.egressMirrorList[j];
        }
        attr[i].value.objlist.count = port.egressMirrorList.size();
        break;
      case SAI_PORT_ATTR_INGRESS_SAMPLEPACKET_ENABLE:
        attr->value.oid = port.ingressSamplePacket;
        break;
      case SAI_PORT_ATTR_EGRESS_SAMPLEPACKET_ENABLE:
        attr->value.oid = port.egressSamplePacket;
        break;
      case SAI_PORT_ATTR_PORT_SERDES_ID:
        attr[i].value.oid = SAI_NULL_OBJECT_ID;
        break;
#if SAI_API_VERSION >= SAI_VERSION(1, 7, 0)
      case SAI_PORT_ATTR_INGRESS_SAMPLE_MIRROR_SESSION:
        if (port.ingressSampleMirrorList.size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = port.ingressSampleMirrorList.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.ingressSampleMirrorList.size(); ++j) {
          attr[i].value.objlist.list[j] = port.ingressSampleMirrorList[j];
        }
        attr[i].value.objlist.count = port.ingressSampleMirrorList.size();
        break;
      case SAI_PORT_ATTR_EGRESS_SAMPLE_MIRROR_SESSION:
        if (port.egressSampleMirrorList.size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = port.egressSampleMirrorList.size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        for (int j = 0; j < port.egressSampleMirrorList.size(); ++j) {
          attr[i].value.objlist.list[j] = port.egressSampleMirrorList[j];
        }
        attr[i].value.objlist.count = port.egressSampleMirrorList.size();
        break;
#endif
      case SAI_PORT_ATTR_PRBS_POLYNOMIAL:
        attr[i].value.u32 = port.prbsPolynomial;
        break;
      case SAI_PORT_ATTR_PRBS_CONFIG:
        attr[i].value.s32 = port.prbsConfig;
        break;
#if SAI_API_VERSION >= SAI_VERSION(1, 8, 1)
      case SAI_PORT_ATTR_PRBS_RX_STATE:
        attr[i].value.rx_state.rx_status = port.prbsRxState.rx_status;
        attr[i].value.rx_state.error_count = port.prbsRxState.error_count;
        break;
#endif
      case SAI_PORT_ATTR_INGRESS_MACSEC_ACL:
        attr[i].value.oid = port.ingressMacsecAcl;
        break;
      case SAI_PORT_ATTR_EGRESS_MACSEC_ACL:
        attr[i].value.oid = port.egressMacsecAcl;
        break;
      case SAI_PORT_ATTR_EXT_FAKE_SYSTEM_PORT_ID:
        attr[i].value.u16 = port.systemPortId;
        break;
      case SAI_PORT_ATTR_PTP_MODE:
        attr[i].value.s32 = static_cast<int32_t>(port.ptpMode);
        break;
      case SAI_PORT_ATTR_EYE_VALUES:
        attr[i].value.porteyevalues.count = port.portEyeValues.count;
        for (int j = 0; j < port.portEyeValues.count; j++) {
          attr[i].value.porteyevalues.list[j] = port.portEyeValues.list[j];
        }
        break;
      default:
        return SAI_STATUS_INVALID_PARAMETER;
    }
  }
  return SAI_STATUS_SUCCESS;
}