in fboss/agent/hw/sai/fake/FakeSaiAcl.cpp [273:438]
sai_status_t get_acl_table_attribute_fn(
sai_object_id_t acl_table_id,
uint32_t attr_count,
sai_attribute_t* attr) {
auto fs = FakeSai::getInstance();
for (int i = 0; i < attr_count; ++i) {
switch (attr[i].id) {
case SAI_ACL_TABLE_ATTR_ACL_STAGE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.s32 = aclTable.stage;
} break;
case SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
if (aclTable.bindPointTypeList.size() > attr[i].value.s32list.count) {
attr[i].value.s32list.count = aclTable.bindPointTypeList.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
attr[i].value.s32list.count = aclTable.bindPointTypeList.size();
int j = 0;
for (const auto& bindPointType : aclTable.bindPointTypeList) {
attr[i].value.s32list.list[j++] = bindPointType;
}
} break;
case SAI_ACL_TABLE_ATTR_ACL_ACTION_TYPE_LIST: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
if (aclTable.actionTypeList.size() > attr[i].value.s32list.count) {
attr[i].value.s32list.count = aclTable.actionTypeList.size();
return SAI_STATUS_BUFFER_OVERFLOW;
}
attr[i].value.s32list.count = aclTable.actionTypeList.size();
int j = 0;
for (const auto& actionType : aclTable.actionTypeList) {
attr[i].value.s32list.list[j++] = actionType;
}
} break;
case SAI_ACL_TABLE_ATTR_ENTRY_LIST: {
int cnt = 0;
for (const auto& [oid, aclEntry] : fs->aclEntryManager.map()) {
std::ignore = oid;
if (aclEntry.tableId == acl_table_id) {
cnt++;
}
}
if (cnt > attr[i].value.objlist.count) {
attr[i].value.objlist.count = cnt;
return SAI_STATUS_BUFFER_OVERFLOW;
}
int j = 0;
for (const auto& [oid, aclEntry] : fs->aclEntryManager.map()) {
if (aclEntry.tableId == acl_table_id) {
attr[i].value.objlist.list[j++] = oid;
}
}
attr[i].value.objlist.count = j;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldSrcIpV6;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldDstIpV6;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_SRC_IP: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldSrcIpV4;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_IP: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldDstIpV4;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldL4SrcPort;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldL4DstPort;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_IP_PROTOCOL: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIpProtocol;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldTcpFlags;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_IN_PORT:
case SAI_ACL_TABLE_ATTR_FIELD_SRC_PORT: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldSrcPort;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_OUT_PORT: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldOutPort;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_FRAG: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIpFrag;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMP_TYPE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIcmpV4Type;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMP_CODE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIcmpV4Code;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_TYPE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIcmpV6Type;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_CODE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIcmpV6Code;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_DSCP: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldDscp;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_MAC: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldDstMac;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldIpType;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_TTL: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldTtl;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_FDB_DST_USER_META: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldFdbDstUserMeta;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldRouteDstUserMeta;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_NEIGHBOR_DST_USER_META: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldNeighborDstUserMeta;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldEthertype;
} break;
case SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID: {
const auto& aclTable = fs->aclTableManager.get(acl_table_id);
attr[i].value.booldata = aclTable.fieldOuterVlanId;
} break;
case SAI_ACL_TABLE_ATTR_AVAILABLE_ACL_ENTRY:
case SAI_ACL_TABLE_ATTR_AVAILABLE_ACL_COUNTER:
attr[i].value.u32 = 1000;
break;
default:
return SAI_STATUS_NOT_SUPPORTED;
}
}
return SAI_STATUS_SUCCESS;
}