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