sai_status_t create_acl_table_fn()

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