common/saiaclschema.cpp (253 lines of code) (raw):

#include "saiaclschema.h" #include <stdexcept> namespace swss { namespace acl { // ENUM Stage strings static constexpr char kStageLookupName[] = "LOOKUP"; static constexpr char kStageIngressName[] = "INGRESS"; static constexpr char kStageEgressName[] = "EGRESS"; // ENUM Format strings static constexpr char kFormatNone[] = "NONE"; static constexpr char kFormatHexString[] = "HEX_STRING"; static constexpr char kFormatMac[] = "MAC"; static constexpr char kFormatIPv4[] = "IPV4"; static constexpr char kFormatIPv6[] = "IPV6"; static constexpr char kFormatString[] = "STRING"; Stage StageFromName(const std::string &name) { if (name == kStageLookupName) return Stage::kLookup; if (name == kStageIngressName) return Stage::kIngress; if (name == kStageEgressName) return Stage::kEgress; throw std::invalid_argument("Unknown stage enum: " + name); } const std::string &StageName(Stage stage) { static const auto *const kLookupString = new std::string(kStageLookupName); static const auto *const kIngressString = new std::string(kStageIngressName); static const auto *const kEgressString = new std::string(kStageEgressName); switch (stage) { case Stage::kLookup: return *kLookupString; case Stage::kIngress: return *kIngressString; case Stage::kEgress: return *kEgressString; default: break; } throw std::invalid_argument(std::string(__func__) + " called with an invalid enum value."); } Format FormatFromName(const std::string &name) { if (name == kFormatNone) return Format::kNone; if (name == kFormatHexString) return Format::kHexString; if (name == kFormatMac) return Format::kMac; if (name == kFormatIPv4) return Format::kIPv4; if (name == kFormatIPv6) return Format::kIPv6; if (name == kFormatString) return Format::kString; throw std::invalid_argument("Unknown format enum: " + name); } const std::string &FormatName(Format format) { static const auto *const kNoneString = new std::string(kFormatNone); static const auto *const kHexStringString = new std::string(kFormatHexString); static const auto *const kMacString = new std::string(kFormatMac); static const auto *const kIPv4String = new std::string(kFormatIPv4); static const auto *const kIPv6String = new std::string(kFormatIPv6); static const auto *const kStringString = new std::string(kFormatString); switch (format) { case Format::kNone: return *kNoneString; case Format::kHexString: return *kHexStringString; case Format::kMac: return *kMacString; case Format::kIPv4: return *kIPv4String; case Format::kIPv6: return *kIPv6String; case Format::kString: return *kStringString; default: break; } throw std::invalid_argument(std::string(__func__) + " called with an invalid enum value."); } const MatchFieldSchema &MatchFieldSchemaByName(const std::string &match_field_name) { static const auto *const kMatchFields = new std::unordered_map<std::string, MatchFieldSchema>({ {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 128}}, {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6_WORD3", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6_WORD2", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6_WORD1", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6_WORD0", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 128}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6_WORD3", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6_WORD2", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6_WORD1", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6_WORD0", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv6, .bitwidth = 32}}, // SAI_ACL_TABLE_ATTR_FIELD_INNER_SRC_IPV6 // SAI_ACL_TABLE_ATTR_FIELD_INNER_DST_IPV6 {"SAI_ACL_TABLE_ATTR_FIELD_SRC_MAC", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kMac, .bitwidth = 48}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_MAC", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kMac, .bitwidth = 48}}, {"SAI_ACL_TABLE_ATTR_FIELD_SRC_IP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv4, .bitwidth = 32}}, {"SAI_ACL_TABLE_ATTR_FIELD_DST_IP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kIPv4, .bitwidth = 32}}, // SAI_ACL_TABLE_ATTR_FIELD_INNER_SRC_IP // SAI_ACL_TABLE_ATTR_FIELD_INNER_DST_IP // SAI_ACL_TABLE_ATTR_FIELD_IN_PORTS // SAI_ACL_TABLE_ATTR_FIELD_OUT_PORTS {"SAI_ACL_TABLE_ATTR_FIELD_IN_PORT", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kString, .bitwidth = 0}}, {"SAI_ACL_TABLE_ATTR_FIELD_OUT_PORT", {.stages = {Stage::kIngress, Stage::kEgress}, .format = Format::kString, .bitwidth = 0}}, // SAI_ACL_TABLE_ATTR_FIELD_SRC_PORT {"SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 12}}, {"SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_PRI", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_CFI", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_INNER_VLAN_ID", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 12}}, {"SAI_ACL_TABLE_ATTR_FIELD_INNER_VLAN_PRI", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_TABLE_ATTR_FIELD_INNER_VLAN_CFI", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 16}}, {"SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 16}}, // SAI_ACL_TABLE_ATTR_FIELD_INNER_L4_SRC_PORT // SAI_ACL_TABLE_ATTR_FIELD_INNER_L4_DST_PORT {"SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 16}}, // SAI_ACL_TABLE_ATTR_FIELD_INNER_ETHER_TYPE {"SAI_ACL_TABLE_ATTR_FIELD_IP_PROTOCOL", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, // SAI_ACL_TABLE_ATTR_FIELD_INNER_IP_PROTOCOL // SAI_ACL_TABLE_ATTR_FIELD_IP_IDENTIFICATION {"SAI_ACL_TABLE_ATTR_FIELD_DSCP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 6}}, {"SAI_ACL_TABLE_ATTR_FIELD_ECN", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 2}}, {"SAI_ACL_TABLE_ATTR_FIELD_TTL", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_TOS", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_IP_FLAGS", {.stages = {Stage::kIngress}, .format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 6}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/ANY", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/IP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/NON_IP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/IPV4ANY", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/NON_IPV4", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/IPV6ANY", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/NON_IPV6", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/ARP", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/ARP_REQUEST", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/ARP_REPLY", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_FRAG", {.stages = {Stage::kIngress}, .format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_TABLE_ATTR_FIELD_IPV6_FLOW_LABEL", {.stages = {Stage::kIngress}, .format = Format::kHexString, .bitwidth = 20}}, {"SAI_ACL_TABLE_ATTR_FIELD_TC", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_ICMP_TYPE", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_ICMP_CODE", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_TYPE", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, {"SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_CODE", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, // SAI_ACL_TABLE_ATTR_FIELD_PACKET_VLAN // SAI_ACL_TABLE_ATTR_FIELD_TUNNEL_VNI // SAI_ACL_TABLE_ATTR_FIELD_HAS_VLAN_TAG // SAI_ACL_TABLE_ATTR_FIELD_MACSEC_SCI // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL0_LABEL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL0_TTL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL0_EXP // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL0_BOS // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL1_LABEL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL1_TTL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL1_EXP // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL1_BOS // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL2_LABEL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL2_TTL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL2_EXP // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL2_BOS // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL3_LABEL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL3_TTL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL3_EXP // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL3_BOS // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL4_LABEL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL4_TTL // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL4_EXP // SAI_ACL_TABLE_ATTR_FIELD_MPLS_LABEL4_BOS // SAI_ACL_TABLE_ATTR_FIELD_FDB_DST_USER_META // SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META // SAI_ACL_TABLE_ATTR_FIELD_NEIGHBOR_DST_USER_META // SAI_ACL_TABLE_ATTR_FIELD_PORT_USER_META // SAI_ACL_TABLE_ATTR_FIELD_VLAN_USER_META // SAI_ACL_TABLE_ATTR_FIELD_ACL_USER_META // SAI_ACL_TABLE_ATTR_FIELD_FDB_NPU_META_DST_HIT // SAI_ACL_TABLE_ATTR_FIELD_NEIGHBOR_NPU_META_DST_HIT // SAI_ACL_TABLE_ATTR_FIELD_ROUTE_NPU_META_DST_HIT // SAI_ACL_TABLE_ATTR_FIELD_BTH_OPCODE // SAI_ACL_TABLE_ATTR_FIELD_AETH_SYNDROME // SAI_ACL_TABLE_ATTR_FIELD_ACL_RANGE_TYPE {"SAI_ACL_TABLE_ATTR_FIELD_IPV6_NEXT_HEADER", {.stages = {Stage::kLookup, Stage::kIngress, Stage::kEgress}, .format = Format::kHexString, .bitwidth = 8}}, // SAI_ACL_TABLE_ATTR_FIELD_GRE_KEY // SAI_ACL_TABLE_ATTR_FIELD_TAM_INT_TYPE }); auto lookup = kMatchFields->find(match_field_name); if (lookup == kMatchFields->end()) { throw std::invalid_argument("Unknown match field: " + match_field_name); } return lookup->second; } const ActionSchema &ActionSchemaByName(const std::string &action_name) { static const auto *const kActions = new std::unordered_map<std::string, ActionSchema>({ {"SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT", {.format = Format::kString, .bitwidth = 0}}, {"SAI_ACL_ENTRY_ATTR_ACTION_ENDPOINT_IP", {.format = Format::kIPv4, .bitwidth = 32}}, // SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT_LIST // SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION {"SAI_ACL_ENTRY_ATTR_ACTION_FLOOD", {.format = Format::kNone, .bitwidth = 0}}, // SAI_ACL_ENTRY_ATTR_ACTION_COUNTER {"SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_INGRESS", {.format = Format::kString, .bitwidth = 0}}, {"SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_EGRESS", {.format = Format::kString, .bitwidth = 0}}, // SAI_ACL_ENTRY_ATTR_ACTION_SET_POLICER {"SAI_ACL_ENTRY_ATTR_ACTION_DECREMENT_TTL", {.format = Format::kHexString, .bitwidth = 1}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_TC", {.format = Format::kHexString, .bitwidth = 8}}, // SAI_ACL_ENTRY_ATTR_ACTION_SET_PACKET_COLOR {"SAI_ACL_ENTRY_ATTR_ACTION_SET_INNER_VLAN_ID", {.format = Format::kHexString, .bitwidth = 12}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_INNER_VLAN_PRI", {.format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_OUTER_VLAN_ID", {.format = Format::kHexString, .bitwidth = 12}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_OUTER_VLAN_PRI", {.format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_ENTRY_ATTR_ACTION_ADD_VLAN_ID", {.format = Format::kHexString, .bitwidth = 12}}, {"SAI_ACL_ENTRY_ATTR_ACTION_ADD_VLAN_PRI", {.format = Format::kHexString, .bitwidth = 3}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_SRC_MAC", {.format = Format::kMac, .bitwidth = 48}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_DST_MAC", {.format = Format::kMac, .bitwidth = 48}}, // SAI_ACL_ENTRY_ATTR_ACTION_SET_SRC_IP // SAI_ACL_ENTRY_ATTR_ACTION_SET_DST_IP // SAI_ACL_ENTRY_ATTR_ACTION_SET_SRC_IPV6 // SAI_ACL_ENTRY_ATTR_ACTION_SET_DST_IPV6 {"SAI_ACL_ENTRY_ATTR_ACTION_SET_DSCP", {.format = Format::kHexString, .bitwidth = 6}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_ECN", {.format = Format::kHexString, .bitwidth = 2}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_L4_SRC_PORT", {.format = Format::kHexString, .bitwidth = 16}}, {"SAI_ACL_ENTRY_ATTR_ACTION_SET_L4_DST_PORT", {.format = Format::kHexString, .bitwidth = 16}}, // SAI_ACL_ENTRY_ATTR_ACTION_INGRESS_SAMPLEPACKET_ENABLE // SAI_ACL_ENTRY_ATTR_ACTION_EGRESS_SAMPLEPACKET_ENABLE // SAI_ACL_ENTRY_ATTR_ACTION_SET_ACL_META_DATA // SAI_ACL_ENTRY_ATTR_ACTION_EGRESS_BLOCK_PORT_LIST // SAI_ACL_ENTRY_ATTR_ACTION_SET_USER_TRAP_ID {"SAI_ACL_ENTRY_ATTR_ACTION_SET_DO_NOT_LEARN", {.format = Format::kNone, .bitwidth = 0}}, // SAI_ACL_ENTRY_ATTR_ACTION_ACL_DTEL_FLOW_OP // SAI_ACL_ENTRY_ATTR_ACTION_DTEL_INT_SESSION // SAI_ACL_ENTRY_ATTR_ACTION_DTEL_DROP_REPORT_ENABLE // SAI_ACL_ENTRY_ATTR_ACTION_DTEL_TAIL_DROP_REPORT_ENABLE // SAI_ACL_ENTRY_ATTR_ACTION_DTEL_FLOW_SAMPLE_PERCENT // SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS // SAI_ACL_ENTRY_ATTR_ACTION_NO_NAT // SAI_ACL_ENTRY_ATTR_ACTION_INT_INSERT // SAI_ACL_ENTRY_ATTR_ACTION_INT_DELETE // SAI_ACL_ENTRY_ATTR_ACTION_INT_REPORT_FLOW // SAI_ACL_ENTRY_ATTR_ACTION_INT_REPORT_DROPS // SAI_ACL_ENTRY_ATTR_ACTION_INT_REPORT_TAIL_DROPS // SAI_ACL_ENTRY_ATTR_ACTION_TAM_INT_OBJECT // SAI_ACL_ENTRY_ATTR_ACTION_SET_ISOLATION_GROUP // SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW {"SAI_PACKET_ACTION_DROP", {.format = Format::kNone, .bitwidth = 0}}, {"SAI_PACKET_ACTION_FORWARD", {.format = Format::kNone, .bitwidth = 0}}, {"SAI_PACKET_ACTION_COPY", {.format = Format::kNone, .bitwidth = 0}}, // SAI_PACKET_ACTION_COPY_CANCEL {"SAI_PACKET_ACTION_TRAP", {.format = Format::kNone, .bitwidth = 0}}, {"SAI_PACKET_ACTION_LOG", {.format = Format::kNone, .bitwidth = 0}}, // SAI_PACKET_ACTION_DENY // SAI_PACKET_ACTION_TRANSIT {"QOS_QUEUE", {.format = Format::kString, .bitwidth = 0}}, }); auto lookup = kActions->find(action_name); if (lookup == kActions->end()) { throw std::invalid_argument("Unknown action: " + action_name); } return lookup->second; } const ActionSchema& ActionSchemaByNameAndObjectType( const std::string& action_name, const std::string& object_type) { static const auto* const kRedirectObjectTypes = new std::unordered_map<std::string, ActionSchema>({ {"SAI_OBJECT_TYPE_IPMC_GROUP", {.format = Format::kHexString, .bitwidth = 16}}, {"SAI_OBJECT_TYPE_L2MC_GROUP", {.format = Format::kHexString, .bitwidth = 16}}, // SAI_OBJECT_TYPE_BRIDGE_PORT // SAI_OBJECT_TYPE_LAG // SAI_OBJECT_TYPE_NEXT_HOP // SAI_OBJECT_TYPE_NEXT_HOP_GROUP // SAI_OBJECT_TYPE_PORT // SAI_OBJECT_TYPE_SYSTEM_PORT }); if (action_name == "SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT") { auto lookup = kRedirectObjectTypes->find(object_type); if (lookup != kRedirectObjectTypes->end()) { return lookup->second; } } // If we haven't defined the object type, fall through to the default // SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT format. return ActionSchemaByName(action_name); } } // namespace acl } // namespace swss