in fboss/agent/hw/sai/fake/FakeSaiAcl.cpp [88:252]
sai_status_t create_acl_table_fn(
sai_object_id_t* acl_table_id,
sai_object_id_t /*switch_id */,
uint32_t attr_count,
const sai_attribute_t* attr_list) {
auto fs = FakeSai::getInstance();
std::optional<sai_int32_t> stage;
std::vector<int32_t> bindPointTypeList;
std::vector<int32_t> actionTypeList;
bool fieldSrcIpV6 = 0;
bool fieldDstIpV6 = 0;
bool fieldSrcIpV4 = 0;
bool fieldDstIpV4 = 0;
bool fieldL4SrcPort = 0;
bool fieldL4DstPort = 0;
bool fieldIpProtocol = 0;
bool fieldTcpFlags = 0;
bool fieldSrcPort = 0;
bool fieldOutPort = 0;
bool fieldIpFrag = 0;
bool fieldIcmpV4Type = 0;
bool fieldIcmpV4Code = 0;
bool fieldIcmpV6Type = 0;
bool fieldIcmpV6Code = 0;
bool fieldDscp = 0;
bool fieldDstMac = 0;
bool fieldIpType = 0;
bool fieldTtl = 0;
bool fieldFdbDstUserMeta = 0;
bool fieldRouteDstUserMeta = 0;
bool fieldNeighborDstUserMeta = 0;
bool fieldEthertype = 0;
bool fieldOuterVlanId = 0;
for (int i = 0; i < attr_count; ++i) {
switch (attr_list[i].id) {
case SAI_ACL_TABLE_ATTR_ACL_STAGE:
stage = attr_list[i].value.s32;
break;
case SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST:
for (int j = 0; j < attr_list[i].value.s32list.count; ++j) {
bindPointTypeList.push_back(attr_list[i].value.s32list.list[j]);
}
break;
case SAI_ACL_TABLE_ATTR_ACL_ACTION_TYPE_LIST:
for (int j = 0; j < attr_list[i].value.s32list.count; ++j) {
actionTypeList.push_back(attr_list[i].value.s32list.list[j]);
}
break;
case SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6:
fieldSrcIpV6 = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6:
fieldDstIpV6 = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_SRC_IP:
fieldSrcIpV4 = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_IP:
fieldDstIpV4 = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT:
fieldL4SrcPort = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT:
fieldL4DstPort = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_IP_PROTOCOL:
fieldIpProtocol = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS:
fieldTcpFlags = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_SRC_PORT:
case SAI_ACL_TABLE_ATTR_FIELD_IN_PORT:
fieldSrcPort = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_OUT_PORT:
fieldOutPort = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_FRAG:
fieldIpFrag = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMP_TYPE:
fieldIcmpV4Type = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMP_CODE:
fieldIcmpV4Code = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_TYPE:
fieldIcmpV6Type = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_CODE:
fieldIcmpV6Code = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_DSCP:
fieldDscp = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_DST_MAC:
fieldDstMac = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE:
fieldIpType = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_TTL:
fieldTtl = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_FDB_DST_USER_META:
fieldFdbDstUserMeta = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META:
fieldRouteDstUserMeta = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_NEIGHBOR_DST_USER_META:
fieldNeighborDstUserMeta = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE:
fieldEthertype = attr_list[i].value.booldata;
break;
case SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID:
fieldOuterVlanId = attr_list[i].value.booldata;
break;
default:
return SAI_STATUS_INVALID_PARAMETER;
break;
}
}
if (!stage) {
return SAI_STATUS_INVALID_PARAMETER;
}
*acl_table_id = fs->aclTableManager.create(
stage.value(),
bindPointTypeList,
actionTypeList,
fieldSrcIpV6,
fieldDstIpV6,
fieldSrcIpV4,
fieldDstIpV4,
fieldL4SrcPort,
fieldL4DstPort,
fieldIpProtocol,
fieldTcpFlags,
fieldSrcPort,
fieldOutPort,
fieldIpFrag,
fieldIcmpV4Type,
fieldIcmpV4Code,
fieldIcmpV6Type,
fieldIcmpV6Code,
fieldDscp,
fieldDstMac,
fieldIpType,
fieldTtl,
fieldFdbDstUserMeta,
fieldRouteDstUserMeta,
fieldNeighborDstUserMeta,
fieldEthertype,
fieldOuterVlanId);
return SAI_STATUS_SUCCESS;
}