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