in fboss/agent/hw/sai/fake/FakeSaiSwitch.cpp [285:490]
sai_status_t get_switch_attribute_fn(
sai_object_id_t switch_id,
uint32_t attr_count,
sai_attribute_t* attr) {
auto fs = FakeSai::getInstance();
auto& sw = fs->switchManager.get(switch_id);
for (int i = 0; i < attr_count; ++i) {
switch (attr[i].id) {
case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID:
attr[i].value.oid = kDefault1QBridgeId;
break;
case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID:
attr[i].value.oid = kDefaultVirtualRouterId;
break;
case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID:
attr[i].value.oid = sw.getDefaultVlanId();
break;
case SAI_SWITCH_ATTR_CPU_PORT:
attr[i].value.oid = fs->getCpuPort();
break;
case SAI_SWITCH_ATTR_PORT_NUMBER:
attr[i].value.u32 = fs->portManager.map().size();
break;
case SAI_SWITCH_ATTR_PORT_CONNECTOR_LIST:
case SAI_SWITCH_ATTR_PORT_LIST: {
if (fs->portManager.map().size() > attr[i].value.objlist.count) {
attr[i].value.objlist.count = fs->portManager.map().size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
attr[i].value.objlist.count = fs->portManager.map().size();
int j = 0;
for (const auto& p : fs->portManager.map()) {
attr[i].value.objlist.list[j++] = p.first;
}
} break;
case SAI_SWITCH_ATTR_SRC_MAC_ADDRESS:
std::copy_n(sw.srcMac().bytes(), 6, std::begin(attr[i].value.mac));
break;
case SAI_SWITCH_ATTR_INIT_SWITCH:
attr[i].value.booldata = sw.isInitialized();
break;
case SAI_SWITCH_ATTR_SWITCH_HARDWARE_INFO:
attr[i].value.s8list.count = sw.hwInfo().size();
attr[i].value.s8list.list = sw.hwInfoData();
break;
case SAI_SWITCH_ATTR_SWITCH_SHELL_ENABLE:
attr[i].value.booldata = sw.isShellEnabled();
break;
case SAI_SWITCH_ATTR_NUMBER_OF_UNICAST_QUEUES:
attr[i].value.u32 = kMaxPortUnicastQueues;
break;
case SAI_SWITCH_ATTR_NUMBER_OF_MULTICAST_QUEUES:
attr[i].value.u32 = kMaxPortMulticastQueues;
break;
case SAI_SWITCH_ATTR_NUMBER_OF_QUEUES:
attr[i].value.u32 = kMaxPortQueues;
break;
case SAI_SWITCH_ATTR_NUMBER_OF_CPU_QUEUES:
attr[i].value.u32 = kMaxCpuQueues;
break;
case SAI_SWITCH_ATTR_ECMP_HASH:
attr[i].value.oid = kEcmpHashId;
break;
case SAI_SWITCH_ATTR_LAG_HASH:
attr[i].value.oid = kLagHashId;
break;
case SAI_SWITCH_ATTR_ECMP_HASH_IPV4:
attr[i].value.oid = sw.ecmpHashV4Id();
break;
case SAI_SWITCH_ATTR_ECMP_HASH_IPV6:
attr[i].value.oid = sw.ecmpHashV6Id();
break;
case SAI_SWITCH_ATTR_LAG_HASH_IPV4:
attr[i].value.oid = sw.lagHashV4Id();
break;
case SAI_SWITCH_ATTR_LAG_HASH_IPV6:
attr[i].value.oid = sw.lagHashV6Id();
break;
case SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_SEED:
attr[i].value.u32 = sw.ecmpSeed();
break;
case SAI_SWITCH_ATTR_LAG_DEFAULT_HASH_SEED:
attr[i].value.u32 = sw.lagSeed();
break;
case SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_ALGORITHM:
attr[i].value.s32 = sw.ecmpAlgorithm();
break;
case SAI_SWITCH_ATTR_LAG_DEFAULT_HASH_ALGORITHM:
attr[i].value.s32 = sw.lagAlgorithm();
break;
case SAI_SWITCH_ATTR_RESTART_WARM:
attr[i].value.booldata = sw.restartWarm();
break;
case SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP:
attr[i].value.oid = sw.dscpToTc();
break;
case SAI_SWITCH_ATTR_QOS_TC_TO_QUEUE_MAP:
attr[i].value.oid = sw.tcToQueue();
break;
case SAI_SWITCH_ATTR_QOS_MPLS_EXP_TO_TC_MAP:
attr[i].value.oid = sw.expToTc();
break;
case SAI_SWITCH_ATTR_QOS_TC_AND_COLOR_TO_MPLS_EXP_MAP:
attr[i].value.oid = sw.tcToExp();
break;
case SAI_SWITCH_ATTR_ACL_ENTRY_MINIMUM_PRIORITY:
attr[i].value.oid = kDefaultAclEntryMinimumPriority;
break;
case SAI_SWITCH_ATTR_ACL_ENTRY_MAXIMUM_PRIORITY:
attr[i].value.oid = kDefaultAclEntryMaximumPriority;
break;
case SAI_SWITCH_ATTR_FDB_AGING_TIME:
attr[i].value.u32 = sw.getMacAgingTime();
break;
case SAI_SWITCH_ATTR_FDB_DST_USER_META_DATA_RANGE:
attr[i].value.u32range.min = kDefaultFdbDstUserMetaDataRangeMin;
attr[i].value.u32range.max = kDefaultFdbDstUserMetaDataRangeMax;
break;
case SAI_SWITCH_ATTR_ROUTE_DST_USER_META_DATA_RANGE:
attr[i].value.u32range.min = kDefaultRouteDstUserMetaDataRangeMin;
attr[i].value.u32range.max = kDefaultRouteDstUserMetaDataRangeMax;
break;
case SAI_SWITCH_ATTR_NEIGHBOR_DST_USER_META_DATA_RANGE:
attr[i].value.u32range.min = kDefaultNeighborDstUserMetaDataRangeMin;
attr[i].value.u32range.max = kDefaultNeighborDstUserMetaDataRangeMax;
break;
case SAI_SWITCH_ATTR_ECN_ECT_THRESHOLD_ENABLE:
attr[i].value.booldata = sw.getUseEcnThresholds();
break;
case SAI_SWITCH_ATTR_EXT_FAKE_LED:
case SAI_SWITCH_ATTR_EXT_FAKE_LED_RESET:
return sw.getLed(attr);
case SAI_SWITCH_ATTR_DEFAULT_EGRESS_BUFFER_POOL_SHARED_SIZE:
attr[i].value.u32 = 1'000'000;
break;
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_ROUTE_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_ROUTE_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEXTHOP_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEXTHOP_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_MEMBER_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEIGHBOR_ENTRY:
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEIGHBOR_ENTRY:
// Why not
attr[i].value.u32 = 1'000'000;
break;
case SAI_SWITCH_ATTR_INGRESS_ACL:
attr[i].value.oid = sw.getIngressAcl();
break;
case SAI_SWITCH_ATTR_COUNTER_REFRESH_INTERVAL:
attr[i].value.u32 = sw.getCounterRefreshInterval();
break;
case SAI_SWITCH_ATTR_FIRMWARE_PATH_NAME:
attr[i].value.s8list.count = sw.firmwarePath().size();
attr[i].value.s8list.list = sw.firmwarePathData();
break;
case SAI_SWITCH_ATTR_FIRMWARE_LOAD_METHOD:
attr[i].value.s32 = sw.firmwareLoadMethod();
break;
case SAI_SWITCH_ATTR_FIRMWARE_LOAD_TYPE:
attr[i].value.s32 = sw.firmwareLoadType();
break;
case SAI_SWITCH_ATTR_HARDWARE_ACCESS_BUS:
attr[i].value.s32 = sw.hardwareAccessBus();
break;
case SAI_SWITCH_ATTR_PLATFROM_CONTEXT:
attr[i].value.u64 = sw.platformContext();
break;
case SAI_SWITCH_ATTR_SWITCH_PROFILE_ID:
attr[i].value.u32 = sw.profileId();
break;
case SAI_SWITCH_ATTR_FIRMWARE_STATUS:
attr[i].value.booldata = true;
break;
case SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION:
case SAI_SWITCH_ATTR_FIRMWARE_MINOR_VERSION:
attr[i].value.u32 = 0;
break;
case SAI_SWITCH_ATTR_SWITCH_ID:
attr[i].value.u32 = sw.switchId();
break;
case SAI_SWITCH_ATTR_MAX_SYSTEM_CORES:
attr[i].value.u32 = sw.maxSystemCores();
break;
case SAI_SWITCH_ATTR_SYSTEM_PORT_CONFIG_LIST:
attr[i].value.objlist.count = sw.sysPortConfigList().size();
attr[i].value.objlist.list = sw.sysPortConfigListData();
break;
case SAI_SWITCH_ATTR_TYPE:
attr[i].value.u32 = sw.switchType();
break;
case SAI_SWITCH_ATTR_REGISTER_READ:
attr[i].value.ptr = sw.readFn();
break;
case SAI_SWITCH_ATTR_REGISTER_WRITE:
attr[i].value.ptr = sw.writeFn();
break;
case SAI_SWITCH_ATTR_EXT_FAKE_HW_ECC_ERROR_INITIATE:
// noop;
break;
default:
return SAI_STATUS_INVALID_PARAMETER;
}
}
return SAI_STATUS_SUCCESS;
}