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