Skip to content

Commit e90132b

Browse files
donNewtonAlphaPINS Working Group
authored andcommitted
P4Orch: inital add of source (sonic-net#1997)
Add P4orch code and subdir Co-authored-by: PINS Working Group <[email protected]>
1 parent fd887bf commit e90132b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+23116
-0
lines changed

orchagent/p4orch/acl_rule_manager.cpp

+2,009
Large diffs are not rendered by default.

orchagent/p4orch/acl_rule_manager.h

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
#pragma once
2+
3+
#include <map>
4+
#include <string>
5+
#include <vector>
6+
7+
#include "copporch.h"
8+
#include "orch.h"
9+
#include "p4orch/acl_util.h"
10+
#include "p4orch/object_manager_interface.h"
11+
#include "p4orch/p4oidmapper.h"
12+
#include "p4orch/p4orch_util.h"
13+
#include "response_publisher_interface.h"
14+
#include "return_code.h"
15+
#include "vrforch.h"
16+
17+
extern "C"
18+
{
19+
#include "sai.h"
20+
}
21+
22+
namespace p4orch
23+
{
24+
namespace test
25+
{
26+
class AclManagerTest;
27+
} // namespace test
28+
29+
class AclRuleManager : public ObjectManagerInterface
30+
{
31+
public:
32+
explicit AclRuleManager(P4OidMapper *p4oidMapper, VRFOrch *vrfOrch, CoppOrch *coppOrch,
33+
ResponsePublisherInterface *publisher)
34+
: m_p4OidMapper(p4oidMapper), m_vrfOrch(vrfOrch), m_publisher(publisher), m_coppOrch(coppOrch),
35+
m_countersDb(std::make_unique<swss::DBConnector>("COUNTERS_DB", 0)),
36+
m_countersTable(std::make_unique<swss::Table>(
37+
m_countersDb.get(), std::string(COUNTERS_TABLE) + DEFAULT_KEY_SEPARATOR + APP_P4RT_TABLE_NAME))
38+
{
39+
SWSS_LOG_ENTER();
40+
assert(m_p4OidMapper != nullptr);
41+
}
42+
virtual ~AclRuleManager() = default;
43+
44+
void enqueue(const swss::KeyOpFieldsValuesTuple &entry) override;
45+
void drain() override;
46+
47+
// Update counters stats for every rule in each ACL table in COUNTERS_DB, if
48+
// counters are enabled in rules.
49+
void doAclCounterStatsTask();
50+
51+
private:
52+
// Deserializes an entry in a dynamically created ACL table.
53+
ReturnCodeOr<P4AclRuleAppDbEntry> deserializeAclRuleAppDbEntry(
54+
const std::string &acl_table_name, const std::string &key,
55+
const std::vector<swss::FieldValueTuple> &attributes);
56+
57+
// Validate an ACL rule APP_DB entry.
58+
ReturnCode validateAclRuleAppDbEntry(const P4AclRuleAppDbEntry &app_db_entry);
59+
60+
// Get ACL rule by table name and rule key. Return nullptr if not found.
61+
P4AclRule *getAclRule(const std::string &acl_table_name, const std::string &acl_rule_key);
62+
63+
// Processes add operation for an ACL rule.
64+
ReturnCode processAddRuleRequest(const std::string &acl_rule_key, const P4AclRuleAppDbEntry &app_db_entry);
65+
66+
// Processes delete operation for an ACL rule.
67+
ReturnCode processDeleteRuleRequest(const std::string &acl_table_name, const std::string &acl_rule_key);
68+
69+
// Processes update operation for an ACL rule.
70+
ReturnCode processUpdateRuleRequest(const P4AclRuleAppDbEntry &app_db_entry, const P4AclRule &old_acl_rule);
71+
72+
// Set counters stats for an ACL rule in COUNTERS_DB.
73+
ReturnCode setAclRuleCounterStats(const P4AclRule &acl_rule);
74+
75+
// Create an ACL rule.
76+
ReturnCode createAclRule(P4AclRule &acl_rule);
77+
78+
// Create an ACL counter.
79+
ReturnCode createAclCounter(const std::string &acl_table_name, const std::string &counter_key,
80+
const P4AclCounter &p4_acl_counter, sai_object_id_t *counter_oid);
81+
82+
// Create an ACL meter.
83+
ReturnCode createAclMeter(const P4AclMeter &p4_acl_meter, const std::string &meter_key, sai_object_id_t *meter_oid);
84+
85+
// Remove an ACL counter.
86+
ReturnCode removeAclCounter(const std::string &acl_table_name, const std::string &counter_key);
87+
88+
// Update ACL meter.
89+
ReturnCode updateAclMeter(const P4AclMeter &new_acl_meter, const P4AclMeter &old_acl_meter);
90+
91+
// Update ACL rule.
92+
ReturnCode updateAclRule(const P4AclRule &new_acl_rule, const P4AclRule &old_acl_rule,
93+
std::vector<sai_attribute_t> &acl_entry_attrs,
94+
std::vector<sai_attribute_t> &rollback_attrs);
95+
96+
// Remove an ACL meter.
97+
ReturnCode removeAclMeter(const std::string &meter_key);
98+
99+
// Remove the ACL rule by key in the given ACL table.
100+
ReturnCode removeAclRule(const std::string &acl_table_name, const std::string &acl_rule_key);
101+
102+
// Set Meter value in ACL rule.
103+
ReturnCode setMeterValue(const P4AclTableDefinition *acl_table, const P4AclRuleAppDbEntry &app_db_entry,
104+
P4AclMeter &acl_meter);
105+
106+
// Validate and set all match attributes in an ACL rule.
107+
ReturnCode setAllMatchFieldValues(const P4AclRuleAppDbEntry &app_db_entry, const P4AclTableDefinition *acl_table,
108+
P4AclRule &acl_rules);
109+
110+
// Validate and set all action attributes in an ACL rule.
111+
ReturnCode setAllActionFieldValues(const P4AclRuleAppDbEntry &app_db_entry, const P4AclTableDefinition *acl_table,
112+
P4AclRule &acl_rule);
113+
114+
// Validate and set a match attribute in an ACL rule.
115+
ReturnCode setMatchValue(const acl_entry_attr_union_t attr_name, const std::string &attr_value,
116+
sai_attribute_value_t *value, P4AclRule *acl_rule,
117+
const std::string &ip_type_bit_type = EMPTY_STRING);
118+
119+
// Validate and set an action attribute in an ACL rule.
120+
ReturnCode setActionValue(const acl_entry_attr_union_t attr_name, const std::string &attr_value,
121+
sai_attribute_value_t *value, P4AclRule *acl_rule);
122+
123+
// Get port object id by name for redirect action.
124+
ReturnCode getRedirectActionPortOid(const std::string &target, sai_object_id_t *rediect_oid);
125+
126+
// Get next hop object id by name for redirect action.
127+
ReturnCode getRedirectActionNextHopOid(const std::string &target, sai_object_id_t *rediect_oid);
128+
129+
// Create user defined trap for each cpu queue/trap group and program user
130+
// defined traps in hostif. Save the user defined trap oids in m_p4OidMapper
131+
// and default ref count is 1.
132+
ReturnCode setUpUserDefinedTraps();
133+
134+
// Clean up user defined traps created for cpu queues. Callers need to make
135+
// sure ref count on user defined traps in m_userDefinedTraps are ones before
136+
// clean up.
137+
ReturnCode cleanUpUserDefinedTraps();
138+
139+
P4OidMapper *m_p4OidMapper;
140+
ResponsePublisherInterface *m_publisher;
141+
P4AclRuleTables m_aclRuleTables;
142+
VRFOrch *m_vrfOrch;
143+
CoppOrch *m_coppOrch;
144+
std::deque<swss::KeyOpFieldsValuesTuple> m_entries;
145+
std::unique_ptr<swss::DBConnector> m_countersDb;
146+
std::unique_ptr<swss::Table> m_countersTable;
147+
std::vector<P4UserDefinedTrapHostifTableEntry> m_userDefinedTraps;
148+
149+
friend class AclTableManager;
150+
friend class p4orch::test::AclManagerTest;
151+
};
152+
153+
} // namespace p4orch

0 commit comments

Comments
 (0)