sai_status_t set_port_attribute_fn()

in fboss/agent/hw/sai/fake/FakeSaiPort.cpp [237:376]


sai_status_t set_port_attribute_fn(
    sai_object_id_t port_id,
    const sai_attribute_t* attr) {
  auto fs = FakeSai::getInstance();
  auto& port = fs->portManager.get(port_id);
  sai_status_t res = SAI_STATUS_SUCCESS;
  if (!attr) {
    return SAI_STATUS_INVALID_PARAMETER;
  }
  switch (attr->id) {
    case SAI_PORT_ATTR_ADMIN_STATE:
      port.adminState = attr->value.booldata;
      break;
    case SAI_PORT_ATTR_HW_LANE_LIST: {
      auto& lanes = port.lanes;
      lanes.clear();
      for (int j = 0; j < attr->value.u32list.count; ++j) {
        lanes.push_back(attr->value.u32list.list[j]);
      }
    } break;
    case SAI_PORT_ATTR_SPEED:
      port.speed = attr->value.u32;
      break;
    case SAI_PORT_ATTR_FEC_MODE:
      port.fecMode = static_cast<sai_port_fec_mode_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_INTERNAL_LOOPBACK_MODE:
      port.internalLoopbackMode =
          static_cast<sai_port_internal_loopback_mode_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_MEDIA_TYPE:
      port.mediaType = static_cast<sai_port_media_type_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_GLOBAL_FLOW_CONTROL_MODE:
      port.globalFlowControlMode =
          static_cast<sai_port_flow_control_mode_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_PORT_VLAN_ID:
      port.vlanId = static_cast<sai_vlan_id_t>(attr->value.u16);
      break;
    case SAI_PORT_ATTR_SERDES_PREEMPHASIS: {
      auto& preemphasis = port.preemphasis;
      preemphasis.clear();
      for (int j = 0; j < attr->value.u32list.count; ++j) {
        preemphasis.push_back(attr->value.u32list.list[j]);
      }
    } break;
    case SAI_PORT_ATTR_MTU:
      port.mtu = attr->value.u32;
      break;
    case SAI_PORT_ATTR_QOS_DSCP_TO_TC_MAP:
      port.qosDscpToTcMap = attr->value.oid;
      break;
    case SAI_PORT_ATTR_QOS_TC_TO_QUEUE_MAP:
      port.qosTcToQueueMap = attr->value.oid;
      break;
    case SAI_PORT_ATTR_DISABLE_DECREMENT_TTL:
      port.disableTtlDecrement = attr->value.booldata;
      break;
    case SAI_PORT_ATTR_INTERFACE_TYPE:
      port.interface_type =
          static_cast<sai_port_interface_type_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_PKT_TX_ENABLE:
      port.txEnable = attr->value.booldata;
      break;
    case SAI_PORT_ATTR_INGRESS_MIRROR_SESSION: {
      auto& ingressMirrorList = port.ingressMirrorList;
      ingressMirrorList.clear();
      for (int j = 0; j < attr->value.objlist.count; ++j) {
        ingressMirrorList.push_back(attr->value.objlist.list[j]);
      }
    } break;
    case SAI_PORT_ATTR_EGRESS_MIRROR_SESSION: {
      auto& egressMirrorList = port.egressMirrorList;
      egressMirrorList.clear();
      for (int j = 0; j < attr->value.objlist.count; ++j) {
        egressMirrorList.push_back(attr->value.objlist.list[j]);
      }
    } break;
    case SAI_PORT_ATTR_INGRESS_SAMPLEPACKET_ENABLE:
      port.ingressSamplePacket = attr->value.oid;
      break;
    case SAI_PORT_ATTR_EGRESS_SAMPLEPACKET_ENABLE:
      port.egressSamplePacket = attr->value.oid;
      break;
#if SAI_API_VERSION >= SAI_VERSION(1, 7, 0)
    case SAI_PORT_ATTR_INGRESS_SAMPLE_MIRROR_SESSION: {
      auto& ingressSampleMirrorList = port.ingressSampleMirrorList;
      ingressSampleMirrorList.clear();
      for (int j = 0; j < attr->value.objlist.count; ++j) {
        ingressSampleMirrorList.push_back(attr->value.objlist.list[j]);
      }
    } break;
    case SAI_PORT_ATTR_EGRESS_SAMPLE_MIRROR_SESSION: {
      auto& egressSampleMirrorList = port.egressSampleMirrorList;
      egressSampleMirrorList.clear();
      for (int j = 0; j < attr->value.objlist.count; ++j) {
        egressSampleMirrorList.push_back(attr->value.objlist.list[j]);
      }
    } break;
#endif
    case SAI_PORT_ATTR_PRBS_POLYNOMIAL:
      port.prbsPolynomial = attr->value.u32;
      break;
    case SAI_PORT_ATTR_PRBS_CONFIG:
      port.prbsConfig = attr->value.s32;
      break;
    case SAI_PORT_ATTR_INGRESS_MACSEC_ACL:
      port.ingressMacsecAcl = attr->value.oid;
      break;
    case SAI_PORT_ATTR_EGRESS_MACSEC_ACL:
      port.egressMacsecAcl = attr->value.oid;
      break;
    case SAI_PORT_ATTR_EXT_FAKE_SYSTEM_PORT_ID:
      port.systemPortId = attr->value.u16;
      break;
    case SAI_PORT_ATTR_PTP_MODE:
      port.ptpMode = static_cast<sai_port_ptp_mode_t>(attr->value.s32);
      break;
    case SAI_PORT_ATTR_EYE_VALUES: {
      port.portEyeValues.count =
          static_cast<sai_port_eye_values_list_t>(attr->value.porteyevalues)
              .count;
      auto& portEyeValList = port.portEyeValues.list;
      auto portEyeValVector = std::vector<sai_port_lane_eye_values_t>();
      portEyeValVector.resize(port.portEyeValues.count);
      portEyeValList = portEyeValVector.data();
      for (int j = 0; j < port.portEyeValues.count; j++) {
        portEyeValList[j] =
            static_cast<sai_port_eye_values_list_t>(attr->value.porteyevalues)
                .list[j];
      }
    } break;
    default:
      res = SAI_STATUS_INVALID_PARAMETER;
      break;
  }
  return res;
}