Skip to content

Commit 24a64d6

Browse files
donNewtonAlphaPINS Working Group
and
PINS Working Group
authored
Orchagent: Integrate P4Orch (#2029)
* Orchagent: Integrate P4Orch * support pushing switch configurations. * support ACL table definitions. * support insert/delete/modify in APPL_DB. * support for L3 forwarding, WCMP, and ACL tables. * support for response path through APPL_STATE_DB. Co-authored-by: PINS Working Group <[email protected]>
1 parent 15a3b6c commit 24a64d6

15 files changed

+198
-11
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,5 @@ tests/mock_tests/tests.trs
8585
tests/test-suite.log
8686
tests/tests.log
8787
tests/tests.trs
88+
orchagent/p4orch/tests/**/*gcda
89+
orchagent/p4orch/tests/**/*gcno

configure.ac

+1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ AC_CONFIG_FILES([
138138
swssconfig/Makefile
139139
cfgmgr/Makefile
140140
tests/Makefile
141+
orchagent/p4orch/tests/Makefile
141142
])
142143

143144
# If no SAI library is installed, compile with SAIVS and run unit tests

orchagent/Makefile.am

+12
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ orchagent_SOURCES = \
9595

9696
orchagent_SOURCES += flex_counter/flex_counter_manager.cpp flex_counter/flex_counter_stat_manager.cpp flex_counter/flow_counter_handler.cpp
9797
orchagent_SOURCES += debug_counter/debug_counter.cpp debug_counter/drop_counter.cpp
98+
orchagent_SOURCES += p4orch/p4orch.cpp \
99+
p4orch/p4orch_util.cpp \
100+
p4orch/p4oidmapper.cpp \
101+
p4orch/router_interface_manager.cpp \
102+
p4orch/neighbor_manager.cpp \
103+
p4orch/next_hop_manager.cpp \
104+
p4orch/route_manager.cpp \
105+
p4orch/acl_util.cpp \
106+
p4orch/acl_table_manager.cpp \
107+
p4orch/acl_rule_manager.cpp \
108+
p4orch/wcmp_manager.cpp \
109+
p4orch/mirror_session_manager.cpp
98110

99111
orchagent_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
100112
orchagent_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)

orchagent/acltable.h

+28-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ extern "C" {
1919
#define ACL_TABLE_TYPE_BPOINT_TYPES "BIND_POINTS"
2020
#define ACL_TABLE_TYPE_ACTIONS "ACTIONS"
2121

22-
#define STAGE_INGRESS "INGRESS"
23-
#define STAGE_EGRESS "EGRESS"
22+
#define STAGE_INGRESS "INGRESS"
23+
#define STAGE_EGRESS "EGRESS"
24+
#define STAGE_PRE_INGRESS "PRE_INGRESS"
2425

2526
#define TABLE_TYPE_L3 "L3"
2627
#define TABLE_TYPE_L3V6 "L3V6"
@@ -39,7 +40,31 @@ typedef enum
3940
{
4041
ACL_STAGE_UNKNOWN,
4142
ACL_STAGE_INGRESS,
42-
ACL_STAGE_EGRESS
43+
ACL_STAGE_EGRESS,
44+
ACL_STAGE_PRE_INGRESS
4345
} acl_stage_type_t;
4446

4547
typedef std::unordered_map<std::string, acl_stage_type_t> acl_stage_type_lookup_t;
48+
typedef std::map<std::string, sai_acl_stage_t> acl_stage_lookup_t;
49+
typedef std::map<sai_acl_stage_t, sai_switch_attr_t> acl_stage_to_switch_attr_lookup_t;
50+
51+
struct AclTableGroupMember
52+
{
53+
sai_object_id_t m_group_oid;
54+
sai_object_id_t m_group_member_oid;
55+
uint32_t m_priority;
56+
AclTableGroupMember() : m_group_oid(SAI_NULL_OBJECT_ID), m_group_member_oid(SAI_NULL_OBJECT_ID), m_priority(0)
57+
{}
58+
};
59+
60+
static const acl_stage_lookup_t aclStageLookup = {
61+
{STAGE_INGRESS, SAI_ACL_STAGE_INGRESS},
62+
{STAGE_EGRESS, SAI_ACL_STAGE_EGRESS},
63+
{STAGE_PRE_INGRESS, SAI_ACL_STAGE_PRE_INGRESS},
64+
};
65+
66+
static const acl_stage_to_switch_attr_lookup_t aclStageToSwitchAttrLookup = {
67+
{SAI_ACL_STAGE_INGRESS, SAI_SWITCH_ATTR_INGRESS_ACL},
68+
{SAI_ACL_STAGE_EGRESS, SAI_SWITCH_ATTR_EGRESS_ACL},
69+
{SAI_ACL_STAGE_PRE_INGRESS, SAI_SWITCH_ATTR_PRE_INGRESS_ACL},
70+
};

orchagent/copporch.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -1079,16 +1079,20 @@ bool CoppOrch::getAttribsFromTrapGroup (vector<FieldValueTuple> &fv_tuple,
10791079
genetlink_attribs.push_back(attr);
10801080

10811081
attr.id = SAI_HOSTIF_ATTR_NAME;
1082+
auto size = sizeof(attr.value.chardata);
10821083
strncpy(attr.value.chardata, fvValue(*i).c_str(),
1083-
sizeof(attr.value.chardata));
1084+
size - 1);
1085+
attr.value.chardata[size - 1] = '\0';
10841086
genetlink_attribs.push_back(attr);
10851087

10861088
}
10871089
else if (fvField(*i) == copp_genetlink_mcgrp_name)
10881090
{
10891091
attr.id = SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME;
1092+
auto size = sizeof(attr.value.chardata);
10901093
strncpy(attr.value.chardata, fvValue(*i).c_str(),
1091-
sizeof(attr.value.chardata));
1094+
size - 1);
1095+
attr.value.chardata[size - 1] = '\0';
10921096
genetlink_attribs.push_back(attr);
10931097
}
10941098
else

orchagent/copporch.h

+10
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ class CoppOrch : public Orch
6565
CoppOrch(swss::DBConnector* db, std::string tableName);
6666
void generateHostIfTrapCounterIdList();
6767
void clearHostIfTrapCounterIdList();
68+
69+
inline object_map getTrapGroupMap()
70+
{
71+
return m_trap_group_map;
72+
}
73+
74+
inline TrapGroupHostIfMap getTrapGroupHostIfMap()
75+
{
76+
return m_trap_group_hostif_map;
77+
}
6878
protected:
6979
object_map m_trap_group_map;
7080

orchagent/orchdaemon.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ MlagOrch *gMlagOrch;
4848
IsoGrpOrch *gIsoGrpOrch;
4949
MACsecOrch *gMacsecOrch;
5050
CoppOrch *gCoppOrch;
51+
P4Orch *gP4Orch;
5152
BfdOrch *gBfdOrch;
5253
Srv6Orch *gSrv6Orch;
5354

@@ -91,6 +92,9 @@ bool OrchDaemon::init()
9192
SWSS_LOG_ENTER();
9293

9394
string platform = getenv("platform") ? getenv("platform") : "";
95+
96+
gCrmOrch = new CrmOrch(m_configDb, CFG_CRM_TABLE_NAME);
97+
9498
TableConnector stateDbSwitchTable(m_stateDb, "SWITCH_CAPABILITY");
9599
TableConnector app_switch_table(m_applDb, APP_SWITCH_TABLE_NAME);
96100
TableConnector conf_asic_sensors(m_configDb, CFG_ASIC_SENSORS_TABLE_NAME);
@@ -118,7 +122,6 @@ bool OrchDaemon::init()
118122
{ APP_MCLAG_FDB_TABLE_NAME, FdbOrch::fdborch_pri}
119123
};
120124

121-
gCrmOrch = new CrmOrch(m_configDb, CFG_CRM_TABLE_NAME);
122125
gPortsOrch = new PortsOrch(m_applDb, m_stateDb, ports_tables, m_chassisAppDb);
123126
TableConnector stateDbFdb(m_stateDb, STATE_FDB_TABLE_NAME);
124127
TableConnector stateMclagDbFdb(m_stateDb, STATE_MCLAG_REMOTE_FDB_TABLE_NAME);
@@ -603,6 +606,10 @@ bool OrchDaemon::init()
603606

604607
m_orchList.push_back(&CounterCheckOrch::getInstance(m_configDb));
605608

609+
vector<string> p4rt_tables = {APP_P4RT_TABLE_NAME};
610+
gP4Orch = new P4Orch(m_applDb, p4rt_tables, vrf_orch, gCoppOrch);
611+
m_orchList.push_back(gP4Orch);
612+
606613
if (WarmStart::isWarmStart())
607614
{
608615
bool suc = warmRestoreAndSyncUp();

orchagent/orchdaemon.h

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "mlagorch.h"
4141
#include "muxorch.h"
4242
#include "macsecorch.h"
43+
#include "p4orch/p4orch.h"
4344
#include "bfdorch.h"
4445
#include "srv6orch.h"
4546

orchagent/portsorch.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ class PortsOrch : public Orch, public Subject
163163
bool getPortIPG(sai_object_id_t port_id, uint32_t &ipg);
164164
bool setPortIPG(sai_object_id_t port_id, uint32_t ipg);
165165

166+
bool getPortOperStatus(const Port& port, sai_port_oper_status_t& status) const;
167+
166168
private:
167169
unique_ptr<Table> m_counterTable;
168170
unique_ptr<Table> m_counterLagTable;
@@ -322,7 +324,6 @@ class PortsOrch : public Orch, public Subject
322324
task_process_status setPortInterfaceType(sai_object_id_t id, sai_port_interface_type_t interface_type);
323325
task_process_status setPortAdvInterfaceTypes(sai_object_id_t id, std::vector<uint32_t> &interface_types);
324326

325-
bool getPortOperStatus(const Port& port, sai_port_oper_status_t& status) const;
326327
void updatePortOperStatus(Port &port, sai_port_oper_status_t status);
327328

328329
bool getPortOperSpeed(const Port& port, sai_uint32_t& speed) const;
@@ -363,4 +364,3 @@ class PortsOrch : public Orch, public Subject
363364

364365
};
365366
#endif /* SWSS_PORTSORCH_H */
366-

orchagent/saihelper.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ sai_qos_map_api_t* sai_qos_map_api;
5757
sai_buffer_api_t* sai_buffer_api;
5858
sai_acl_api_t* sai_acl_api;
5959
sai_hash_api_t* sai_hash_api;
60+
sai_udf_api_t* sai_udf_api;
6061
sai_mirror_api_t* sai_mirror_api;
6162
sai_fdb_api_t* sai_fdb_api;
6263
sai_dtel_api_t* sai_dtel_api;
@@ -186,6 +187,7 @@ void initSaiApi()
186187
sai_api_query(SAI_API_SCHEDULER_GROUP, (void **)&sai_scheduler_group_api);
187188
sai_api_query(SAI_API_ACL, (void **)&sai_acl_api);
188189
sai_api_query(SAI_API_HASH, (void **)&sai_hash_api);
190+
sai_api_query(SAI_API_UDF, (void **)&sai_udf_api);
189191
sai_api_query(SAI_API_DTEL, (void **)&sai_dtel_api);
190192
sai_api_query(SAI_API_SAMPLEPACKET, (void **)&sai_samplepacket_api);
191193
sai_api_query(SAI_API_DEBUG_COUNTER, (void **)&sai_debug_counter_api);
@@ -223,6 +225,7 @@ void initSaiApi()
223225
sai_log_set(SAI_API_SCHEDULER_GROUP, SAI_LOG_LEVEL_NOTICE);
224226
sai_log_set(SAI_API_ACL, SAI_LOG_LEVEL_NOTICE);
225227
sai_log_set(SAI_API_HASH, SAI_LOG_LEVEL_NOTICE);
228+
sai_log_set(SAI_API_UDF, SAI_LOG_LEVEL_NOTICE);
226229
sai_log_set(SAI_API_DTEL, SAI_LOG_LEVEL_NOTICE);
227230
sai_log_set(SAI_API_SAMPLEPACKET, SAI_LOG_LEVEL_NOTICE);
228231
sai_log_set(SAI_API_DEBUG_COUNTER, SAI_LOG_LEVEL_NOTICE);

orchagent/switchorch.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,21 @@
22
#include <inttypes.h>
33

44
#include "switchorch.h"
5+
#include "crmorch.h"
56
#include "converter.h"
67
#include "notifier.h"
78
#include "notificationproducer.h"
89
#include "macaddress.h"
10+
#include "return_code.h"
911

1012
using namespace std;
1113
using namespace swss;
1214

1315
extern sai_object_id_t gSwitchId;
1416
extern sai_switch_api_t *sai_switch_api;
17+
extern sai_acl_api_t *sai_acl_api;
1518
extern MacAddress gVxlanMacAddress;
19+
extern CrmOrch *gCrmOrch;
1620

1721
const map<string, sai_switch_attr_t> switch_attribute_map =
1822
{
@@ -57,6 +61,92 @@ SwitchOrch::SwitchOrch(DBConnector *db, vector<TableConnector>& connectors, Tabl
5761
Orch::addExecutor(executorT);
5862
}
5963

64+
void SwitchOrch::initAclGroupsBindToSwitch()
65+
{
66+
// Create an ACL group per stage, INGRESS, EGRESS and PRE_INGRESS
67+
for (auto stage_it : aclStageLookup)
68+
{
69+
sai_object_id_t group_oid;
70+
auto status = createAclGroup(fvValue(stage_it), &group_oid);
71+
if (!status.ok())
72+
{
73+
status.prepend("Failed to create ACL group for stage " + fvField(stage_it) + ": ");
74+
SWSS_LOG_THROW("%s", status.message().c_str());
75+
}
76+
SWSS_LOG_NOTICE("Created ACL group for stage %s", fvField(stage_it).c_str());
77+
m_aclGroups[fvValue(stage_it)] = group_oid;
78+
status = bindAclGroupToSwitch(fvValue(stage_it), group_oid);
79+
if (!status.ok())
80+
{
81+
status.prepend("Failed to bind ACL group to stage " + fvField(stage_it) + ": ");
82+
SWSS_LOG_THROW("%s", status.message().c_str());
83+
}
84+
}
85+
}
86+
87+
const std::map<sai_acl_stage_t, sai_object_id_t> &SwitchOrch::getAclGroupOidsBindingToSwitch()
88+
{
89+
return m_aclGroups;
90+
}
91+
92+
ReturnCode SwitchOrch::createAclGroup(const sai_acl_stage_t &group_stage, sai_object_id_t *acl_grp_oid)
93+
{
94+
SWSS_LOG_ENTER();
95+
96+
std::vector<sai_attribute_t> acl_grp_attrs;
97+
sai_attribute_t acl_grp_attr;
98+
acl_grp_attr.id = SAI_ACL_TABLE_GROUP_ATTR_ACL_STAGE;
99+
acl_grp_attr.value.s32 = group_stage;
100+
acl_grp_attrs.push_back(acl_grp_attr);
101+
102+
acl_grp_attr.id = SAI_ACL_TABLE_GROUP_ATTR_TYPE;
103+
acl_grp_attr.value.s32 = SAI_ACL_TABLE_GROUP_TYPE_PARALLEL;
104+
acl_grp_attrs.push_back(acl_grp_attr);
105+
106+
acl_grp_attr.id = SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST;
107+
std::vector<int32_t> bpoint_list;
108+
bpoint_list.push_back(SAI_ACL_BIND_POINT_TYPE_SWITCH);
109+
acl_grp_attr.value.s32list.count = (uint32_t)bpoint_list.size();
110+
acl_grp_attr.value.s32list.list = bpoint_list.data();
111+
acl_grp_attrs.push_back(acl_grp_attr);
112+
113+
CHECK_ERROR_AND_LOG_AND_RETURN(sai_acl_api->create_acl_table_group(
114+
acl_grp_oid, gSwitchId, (uint32_t)acl_grp_attrs.size(), acl_grp_attrs.data()),
115+
"Failed to create ACL group for stage " << group_stage);
116+
if (group_stage == SAI_ACL_STAGE_INGRESS || group_stage == SAI_ACL_STAGE_PRE_INGRESS ||
117+
group_stage == SAI_ACL_STAGE_EGRESS)
118+
{
119+
gCrmOrch->incCrmAclUsedCounter(CrmResourceType::CRM_ACL_GROUP, (sai_acl_stage_t)group_stage,
120+
SAI_ACL_BIND_POINT_TYPE_SWITCH);
121+
}
122+
SWSS_LOG_INFO("Suceeded to create ACL group %s in stage %d ", sai_serialize_object_id(*acl_grp_oid).c_str(),
123+
group_stage);
124+
return ReturnCode();
125+
}
126+
127+
ReturnCode SwitchOrch::bindAclGroupToSwitch(const sai_acl_stage_t &group_stage, const sai_object_id_t &acl_grp_oid)
128+
{
129+
SWSS_LOG_ENTER();
130+
131+
auto switch_attr_it = aclStageToSwitchAttrLookup.find(group_stage);
132+
if (switch_attr_it == aclStageToSwitchAttrLookup.end())
133+
{
134+
LOG_ERROR_AND_RETURN(ReturnCode(StatusCode::SWSS_RC_INVALID_PARAM)
135+
<< "Failed to set ACL group(" << acl_grp_oid << ") to the SWITCH bind point at stage "
136+
<< group_stage);
137+
}
138+
sai_attribute_t attr;
139+
attr.id = switch_attr_it->second;
140+
attr.value.oid = acl_grp_oid;
141+
auto sai_status = sai_switch_api->set_switch_attribute(gSwitchId, &attr);
142+
if (sai_status != SAI_STATUS_SUCCESS)
143+
{
144+
LOG_ERROR_AND_RETURN(ReturnCode(sai_status) << "[SAI] Failed to set_switch_attribute with attribute.id="
145+
<< attr.id << " and acl group oid=" << acl_grp_oid);
146+
}
147+
return ReturnCode();
148+
}
149+
60150
void SwitchOrch::doCfgSensorsTableTask(Consumer &consumer)
61151
{
62152
SWSS_LOG_ENTER();

orchagent/switchorch.h

+18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "acltable.h"
34
#include "orch.h"
45
#include "timer.h"
56

@@ -29,6 +30,13 @@ class SwitchOrch : public Orch
2930
bool setAgingFDB(uint32_t sec);
3031
void set_switch_capability(const std::vector<swss::FieldValueTuple>& values);
3132
bool querySwitchDscpToTcCapability(sai_object_type_t sai_object, sai_attr_id_t attr_id);
33+
34+
// Return reference to ACL group created for each stage and the bind point is
35+
// the switch
36+
const std::map<sai_acl_stage_t, sai_object_id_t> &getAclGroupOidsBindingToSwitch();
37+
// Initialize the ACL groups bind to Switch
38+
void initAclGroupsBindToSwitch();
39+
3240
private:
3341
void doTask(Consumer &consumer);
3442
void doTask(swss::SelectableTimer &timer);
@@ -38,10 +46,20 @@ class SwitchOrch : public Orch
3846
void querySwitchTpidCapability();
3947
sai_status_t setSwitchTunnelVxlanParams(swss::FieldValueTuple &val);
4048

49+
// Create the default ACL group for the given stage, bind point is
50+
// SAI_ACL_BIND_POINT_TYPE_SWITCH and group type is
51+
// SAI_ACL_TABLE_GROUP_TYPE_PARALLEL.
52+
ReturnCode createAclGroup(const sai_acl_stage_t &group_stage, sai_object_id_t *acl_grp_oid);
53+
54+
// Bind the ACL group to switch for the given stage.
55+
// Set the SAI_SWITCH_ATTR_{STAGE}_ACL with the group oid.
56+
ReturnCode bindAclGroupToSwitch(const sai_acl_stage_t &group_stage, const sai_object_id_t &acl_grp_oid);
57+
4158
swss::NotificationConsumer* m_restartCheckNotificationConsumer;
4259
void doTask(swss::NotificationConsumer& consumer);
4360
swss::DBConnector *m_db;
4461
swss::Table m_switchTable;
62+
std::map<sai_acl_stage_t, sai_object_id_t> m_aclGroups;
4563
sai_object_id_t m_switchTunnelId;
4664

4765
// ASIC temperature sensors

tests/mock_tests/Makefile.am

+13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
FLEX_CTR_DIR = $(top_srcdir)/orchagent/flex_counter
22
DEBUG_CTR_DIR = $(top_srcdir)/orchagent/debug_counter
3+
P4_ORCH_DIR = $(top_srcdir)/orchagent/p4orch
34

45
INCLUDES = -I $(FLEX_CTR_DIR) -I $(DEBUG_CTR_DIR) -I $(top_srcdir)/lib
56

@@ -89,6 +90,18 @@ tests_SOURCES = aclorch_ut.cpp \
8990

9091
tests_SOURCES += $(FLEX_CTR_DIR)/flex_counter_manager.cpp $(FLEX_CTR_DIR)/flex_counter_stat_manager.cpp $(FLEX_CTR_DIR)/flow_counter_handler.cpp
9192
tests_SOURCES += $(DEBUG_CTR_DIR)/debug_counter.cpp $(DEBUG_CTR_DIR)/drop_counter.cpp
93+
tests_SOURCES += $(P4_ORCH_DIR)/p4orch.cpp \
94+
$(P4_ORCH_DIR)/p4orch_util.cpp \
95+
$(P4_ORCH_DIR)/p4oidmapper.cpp \
96+
$(P4_ORCH_DIR)/router_interface_manager.cpp \
97+
$(P4_ORCH_DIR)/neighbor_manager.cpp \
98+
$(P4_ORCH_DIR)/next_hop_manager.cpp \
99+
$(P4_ORCH_DIR)/route_manager.cpp \
100+
$(P4_ORCH_DIR)/acl_util.cpp \
101+
$(P4_ORCH_DIR)/acl_table_manager.cpp \
102+
$(P4_ORCH_DIR)/acl_rule_manager.cpp \
103+
$(P4_ORCH_DIR)/wcmp_manager.cpp \
104+
$(P4_ORCH_DIR)/mirror_session_manager.cpp
92105

93106
tests_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_GTEST) $(CFLAGS_SAI)
94107
tests_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_GTEST) $(CFLAGS_SAI) -I$(top_srcdir)/orchagent

0 commit comments

Comments
 (0)