|
23 | 23 | #include "table.h" |
24 | 24 | #include "tokenize.h" |
25 | 25 | #include "vrforch.h" |
| 26 | +#include "logger.h" |
26 | 27 |
|
27 | 28 | using ::p4orch::kTableKeyDelimiter; |
28 | 29 |
|
@@ -716,9 +717,34 @@ P4AclTableDefinitionAppDbEntry getDefaultAclTableDefAppDbEntry() |
716 | 717 | app_db_entry.action_field_lookup["do_not_learn"].push_back( |
717 | 718 | {.sai_action = P4_ACTION_SET_DO_NOT_LEARN, .p4_param_name = EMPTY_STRING}); |
718 | 719 | app_db_entry.action_field_lookup["set_vrf"].push_back({.sai_action = P4_ACTION_SET_VRF, .p4_param_name = "vrf"}); |
| 720 | + app_db_entry.action_field_lookup["set_metadata"].push_back( |
| 721 | + {.sai_action = P4_ACTION_SET_ACL_META_DATA, |
| 722 | + .p4_param_name = "acl_metadata"}); |
719 | 723 | app_db_entry.action_field_lookup["qos_queue"].push_back( |
720 | 724 | {.sai_action = P4_ACTION_SET_QOS_QUEUE, .p4_param_name = "cpu_queue"}); |
721 | 725 |
|
| 726 | + |
| 727 | + // action/acl_rate_limit_copy = [ |
| 728 | + // {"action":"SAI_PACKET_ACTION_FORWARD","packet_color":"SAI_PACKET_COLOR_GREEN"}, |
| 729 | + // {"action":"SAI_PACKET_ACTION_COPY_CANCEL","packet_color":"SAI_PACKET_COLOR_YELLOW"}, |
| 730 | + // {"action":"SAI_PACKET_ACTION_COPY_CANCEL","packet_color":"SAI_PACKET_COLOR_RED"}, |
| 731 | + // {"action":"QOS_QUEUE","param":"qos_queue"} |
| 732 | + // ] |
| 733 | + |
| 734 | + app_db_entry.packet_action_color_lookup["acl_rate_limit_copy"].push_back( |
| 735 | + {.packet_action = P4_PACKET_ACTION_FORWARD, |
| 736 | + .packet_color = P4_PACKET_COLOR_GREEN}); |
| 737 | + app_db_entry.packet_action_color_lookup["acl_rate_limit_copy"].push_back( |
| 738 | + {.packet_action = P4_PACKET_ACTION_COPY_CANCEL, |
| 739 | + .packet_color = P4_PACKET_COLOR_YELLOW}); |
| 740 | + app_db_entry.packet_action_color_lookup["acl_rate_limit_copy"].push_back( |
| 741 | + {.packet_action = P4_PACKET_ACTION_COPY_CANCEL, |
| 742 | + .packet_color = P4_PACKET_COLOR_RED}); |
| 743 | + app_db_entry.action_field_lookup["acl_rate_limit_copy"].push_back( |
| 744 | + {.sai_action = P4_ACTION_SET_QOS_QUEUE, .p4_param_name = "qos_queue"}); |
| 745 | + |
| 746 | + |
| 747 | + |
722 | 748 | // "action/acl_trap" = [ |
723 | 749 | // {"action": "SAI_PACKET_ACTION_TRAP", "packet_color": |
724 | 750 | // "SAI_PACKET_COLOR_GREEN"}, |
@@ -2958,6 +2984,124 @@ TEST_F(AclManagerTest, AclRuleWithColorPacketActionsButNoRateLimit) |
2958 | 2984 | acl_rule->action_fvs[SAI_ACL_ENTRY_ATTR_ACTION_SET_USER_TRAP_ID].aclaction.parameter.oid); |
2959 | 2985 | } |
2960 | 2986 |
|
| 2987 | +TEST_F(AclManagerTest, AclRuleWithColorPacketActionsButWithRateLimit) { |
| 2988 | + ASSERT_NO_FATAL_FAILURE(AddDefaultIngressTable()); |
| 2989 | + |
| 2990 | + // Create app_db_entry with color packet action, but no rate limit attributes |
| 2991 | + P4AclRuleAppDbEntry app_db_entry; |
| 2992 | + app_db_entry.acl_table_name = kAclIngressTableName; |
| 2993 | + app_db_entry.priority = 100; |
| 2994 | + // ACL rule match fields |
| 2995 | + app_db_entry.match_fvs["ether_type"] = "0x0800"; |
| 2996 | + app_db_entry.match_fvs["ipv6_dst"] = "fdf8:f53b:82e4::53"; |
| 2997 | + app_db_entry.match_fvs["ether_dst"] = "AA:BB:CC:DD:EE:FF"; |
| 2998 | + app_db_entry.match_fvs["ether_src"] = "AA:BB:CC:DD:EE:FF"; |
| 2999 | + app_db_entry.match_fvs["ipv6_next_header"] = "1"; |
| 3000 | + app_db_entry.match_fvs["src_ipv6_64bit"] = "fdf8:f53b:82e4::"; |
| 3001 | + app_db_entry.match_fvs["arp_tpa"] = "0xff112231"; |
| 3002 | + app_db_entry.match_fvs["udf2"] = "0x9876 & 0xAAAA"; |
| 3003 | + app_db_entry.db_key = |
| 3004 | + "ACL_PUNT_TABLE:{\"match/ether_type\": \"0x0800\",\"match/ipv6_dst\": " |
| 3005 | + "\"fdf8:f53b:82e4::53\",\"match/ether_dst\": \"AA:BB:CC:DD:EE:FF\", " |
| 3006 | + "\"match/ether_src\": \"AA:BB:CC:DD:EE:FF\", \"match/ipv6_next_header\": " |
| 3007 | + "\"1\", \"match/src_ipv6_64bit\": " |
| 3008 | + "\"fdf8:f53b:82e4::\",\"match/arp_tpa\": \"0xff112231\",\"match/udf2\": " |
| 3009 | + "\"0x9876 & 0xAAAA\",\"priority\":100}"; |
| 3010 | + |
| 3011 | + const auto& acl_rule_key = |
| 3012 | + KeyGenerator::generateAclRuleKey(app_db_entry.match_fvs, "100"); |
| 3013 | + |
| 3014 | + // Set user defined trap for QOS_QUEUE, and color packet actions in meter |
| 3015 | + int queue_num = 8; |
| 3016 | + app_db_entry.action = "acl_rate_limit_copy"; |
| 3017 | + app_db_entry.action_param_fvs["qos_queue"] = std::to_string(queue_num); |
| 3018 | + // Install rule |
| 3019 | + EXPECT_CALL(mock_sai_acl_, create_acl_entry(_, _, _, _)) |
| 3020 | + .WillOnce(DoAll(SetArgPointee<0>(kAclIngressRuleOid1), |
| 3021 | + Return(SAI_STATUS_SUCCESS))); |
| 3022 | + |
| 3023 | + EXPECT_CALL(mock_sai_acl_, create_acl_counter(_, _, _, _)) |
| 3024 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3025 | + EXPECT_CALL( |
| 3026 | + mock_sai_policer_, |
| 3027 | + create_policer( |
| 3028 | + _, Eq(gSwitchId), Eq(9), |
| 3029 | + Truly(std::bind(MatchSaiPolicerAttribute, 9, SAI_METER_TYPE_PACKETS, |
| 3030 | + SAI_PACKET_ACTION_FORWARD, |
| 3031 | + SAI_PACKET_ACTION_COPY_CANCEL, |
| 3032 | + SAI_PACKET_ACTION_COPY_CANCEL, |
| 3033 | + 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, |
| 3034 | + std::placeholders::_1)))) |
| 3035 | + .WillOnce( |
| 3036 | + DoAll(SetArgPointee<0>(kAclMeterOid1), Return(SAI_STATUS_SUCCESS))); |
| 3037 | + EXPECT_EQ(StatusCode::SWSS_RC_SUCCESS, |
| 3038 | + ProcessAddRuleRequest(acl_rule_key, app_db_entry)); |
| 3039 | + auto acl_rule = GetAclRule(kAclIngressTableName, acl_rule_key); |
| 3040 | + ASSERT_NE(nullptr, acl_rule); |
| 3041 | + // Check action field value |
| 3042 | + EXPECT_EQ(gUserDefinedTrapStartOid + queue_num - P4_CPU_QUEUE_MIN_NUM + 1, |
| 3043 | + acl_rule->action_fvs[SAI_ACL_ENTRY_ATTR_ACTION_SET_USER_TRAP_ID] |
| 3044 | + .aclaction.parameter.oid); |
| 3045 | +} |
| 3046 | + |
| 3047 | +TEST_F(AclManagerTest, AclRuleWithMockedPacketAction) { |
| 3048 | + ASSERT_NO_FATAL_FAILURE(AddDefaultIngressTable()); |
| 3049 | + auto app_db_entry = getDefaultAclRuleAppDbEntryWithoutAction(); |
| 3050 | + const auto& acl_rule_key = |
| 3051 | + KeyGenerator::generateAclRuleKey(app_db_entry.match_fvs, "100"); |
| 3052 | + |
| 3053 | + // set packet action |
| 3054 | + app_db_entry.action = "set_packet_action"; |
| 3055 | + app_db_entry.action_param_fvs["packet_action"] = |
| 3056 | + "SAI_PACKET_ACTION_COPY_CANCEL"; |
| 3057 | + |
| 3058 | + // Install rule |
| 3059 | + EXPECT_CALL(mock_sai_acl_, create_acl_entry(_, _, _, _)) |
| 3060 | + .WillOnce(DoAll(SetArgPointee<0>(kAclIngressRuleOid1), |
| 3061 | + Return(SAI_STATUS_SUCCESS))); |
| 3062 | + EXPECT_CALL(mock_sai_acl_, create_acl_counter(_, _, _, _)) |
| 3063 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3064 | + EXPECT_CALL(mock_sai_policer_, create_policer(_, _, _, _)) |
| 3065 | + .WillOnce( |
| 3066 | + DoAll(SetArgPointee<0>(kAclMeterOid1), Return(SAI_STATUS_SUCCESS))); |
| 3067 | + EXPECT_EQ(StatusCode::SWSS_RC_SUCCESS, |
| 3068 | + ProcessAddRuleRequest(acl_rule_key, app_db_entry)); |
| 3069 | + auto* acl_rule = GetAclRule(kAclIngressTableName, acl_rule_key); |
| 3070 | + ASSERT_NE(nullptr, acl_rule); |
| 3071 | + |
| 3072 | + // Check action field value |
| 3073 | + EXPECT_EQ(SAI_PACKET_ACTION_COPY_CANCEL, |
| 3074 | + acl_rule->action_fvs[SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION] |
| 3075 | + .aclaction.parameter.s32); |
| 3076 | + |
| 3077 | + // update packet action |
| 3078 | + app_db_entry.action_param_fvs["packet_action"] = "SAI_PACKET_ACTION_DENY"; |
| 3079 | + EXPECT_CALL(mock_sai_acl_, |
| 3080 | + set_acl_entry_attribute(Eq(kAclIngressRuleOid1), _)) |
| 3081 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3082 | + EXPECT_EQ(StatusCode::SWSS_RC_SUCCESS, |
| 3083 | + ProcessUpdateRuleRequest(app_db_entry, *acl_rule)); |
| 3084 | + acl_rule = GetAclRule(kAclIngressTableName, acl_rule_key); |
| 3085 | + ASSERT_NE(nullptr, acl_rule); |
| 3086 | + |
| 3087 | + // Check action field value |
| 3088 | + EXPECT_EQ(SAI_PACKET_ACTION_DENY, |
| 3089 | + acl_rule->action_fvs[SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION] |
| 3090 | + .aclaction.parameter.s32); |
| 3091 | + |
| 3092 | + // Remove rule |
| 3093 | + EXPECT_CALL(mock_sai_acl_, remove_acl_entry(Eq(kAclIngressRuleOid1))) |
| 3094 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3095 | + EXPECT_CALL(mock_sai_acl_, remove_acl_counter(_)) |
| 3096 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3097 | + EXPECT_CALL(mock_sai_policer_, remove_policer(Eq(kAclMeterOid1))) |
| 3098 | + .WillOnce(Return(SAI_STATUS_SUCCESS)); |
| 3099 | + EXPECT_EQ(StatusCode::SWSS_RC_SUCCESS, |
| 3100 | + ProcessDeleteRuleRequest(kAclIngressTableName, acl_rule_key)); |
| 3101 | + EXPECT_EQ(nullptr, GetAclRule(kAclIngressTableName, acl_rule_key)); |
| 3102 | +} |
| 3103 | + |
| 3104 | + |
2961 | 3105 | #pragma GCC diagnostic warning "-Wdisabled-optimization" |
2962 | 3106 |
|
2963 | 3107 | TEST_F(AclManagerTest, AclRuleWithValidAction) |
@@ -4285,7 +4429,7 @@ TEST_F(AclManagerTest, CreateAclRuleWithInvalidActionFails) |
4285 | 4429 | app_db_entry.action_param_fvs.erase("target"); |
4286 | 4430 | // Invalid cpu queue number |
4287 | 4431 | app_db_entry.action = "qos_queue"; |
4288 | | - app_db_entry.action_param_fvs["cpu_queue"] = "10"; |
| 4432 | + app_db_entry.action_param_fvs["cpu_queue"] = "18"; |
4289 | 4433 | EXPECT_EQ(StatusCode::SWSS_RC_INVALID_PARAM, ProcessAddRuleRequest(acl_rule_key, app_db_entry)); |
4290 | 4434 | app_db_entry.action_param_fvs["cpu_queue"] = "invalid"; |
4291 | 4435 | EXPECT_EQ(StatusCode::SWSS_RC_INVALID_PARAM, ProcessAddRuleRequest(acl_rule_key, app_db_entry)); |
|
0 commit comments