bool SaiAclTableManager::isQualifierSupported()

in fboss/agent/hw/sai/switch/SaiAclTableManager.cpp [1171:1298]


bool SaiAclTableManager::isQualifierSupported(
    const std::string& aclTableName,
    cfg::AclTableQualifier qualifier) const {
  auto handle = getAclTableHandle(aclTableName);
  if (!handle) {
    throw FbossError("ACL table ", aclTableName, " not found.");
  }
  auto attributes = handle->aclTable->attributes();

  auto hasField = [attributes](auto field) {
    if (!field) {
      return false;
    }
    return field->value();
  };

  using cfg::AclTableQualifier;
  switch (qualifier) {
    case cfg::AclTableQualifier::SRC_IPV6:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldSrcIpV6>>(
              attributes));
    case cfg::AclTableQualifier::DST_IPV6:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldDstIpV6>>(
              attributes));
    case cfg::AclTableQualifier::SRC_IPV4:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldDstIpV4>>(
              attributes));
    case cfg::AclTableQualifier::DST_IPV4:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldSrcIpV4>>(
              attributes));
    case cfg::AclTableQualifier::L4_SRC_PORT:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldL4SrcPort>>(
              attributes));
    case cfg::AclTableQualifier::L4_DST_PORT:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldL4DstPort>>(
              attributes));
    case cfg::AclTableQualifier::IP_PROTOCOL:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldIpProtocol>>(
              attributes));
    case cfg::AclTableQualifier::TCP_FLAGS:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldTcpFlags>>(
              attributes));
    case cfg::AclTableQualifier::SRC_PORT:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldSrcPort>>(
              attributes));
    case cfg::AclTableQualifier::OUT_PORT:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldOutPort>>(
              attributes));
    case cfg::AclTableQualifier::IP_FRAG:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldIpFrag>>(
              attributes));
    case cfg::AclTableQualifier::ICMPV4_TYPE:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldIcmpV4Type>>(
              attributes));
    case cfg::AclTableQualifier::ICMPV4_CODE:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldIcmpV4Code>>(
              attributes));
    case cfg::AclTableQualifier::ICMPV6_TYPE:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldIcmpV6Type>>(
              attributes));
    case cfg::AclTableQualifier::ICMPV6_CODE:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldIcmpV6Code>>(
              attributes));
    case cfg::AclTableQualifier::DSCP:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldDscp>>(
              attributes));
    case cfg::AclTableQualifier::DST_MAC:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldDstMac>>(
              attributes));
    case cfg::AclTableQualifier::IP_TYPE:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldIpType>>(
              attributes));
    case cfg::AclTableQualifier::TTL:
      return hasField(
          std::get<std::optional<SaiAclTableTraits::Attributes::FieldTtl>>(
              attributes));
    case cfg::AclTableQualifier::LOOKUP_CLASS_L2:
      return hasField(
          std::get<std::optional<
              SaiAclTableTraits::Attributes::FieldFdbDstUserMeta>>(attributes));
    case cfg::AclTableQualifier::LOOKUP_CLASS_NEIGHBOR:
      return hasField(
          std::get<std::optional<
              SaiAclTableTraits::Attributes::FieldRouteDstUserMeta>>(
              attributes));
    case cfg::AclTableQualifier::LOOKUP_CLASS_ROUTE:
      return hasField(
          std::get<std::optional<
              SaiAclTableTraits::Attributes::FieldRouteDstUserMeta>>(
              attributes));
    case cfg::AclTableQualifier::ETHER_TYPE:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldEthertype>>(
              attributes));
    case cfg::AclTableQualifier::OUTER_VLAN:
      return hasField(
          std::get<
              std::optional<SaiAclTableTraits::Attributes::FieldOuterVlanId>>(
              attributes));
  }
  return false;
}