Skip to content

Commit 5fdb245

Browse files
Merge pull request sonic-net#4083 from divyagayathri-hcl/1_multicast
[P4Orch] Add support for SAI functions needed for swss multicast support.
2 parents f39134c + 8e72c3d commit 5fdb245

File tree

10 files changed

+358
-0
lines changed

10 files changed

+358
-0
lines changed

orchagent/p4orch/tests/Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,11 @@ p4orch_tests_SOURCES = $(ORCHAGENT_DIR)/orch.cpp \
7878
mock_sai_acl.cpp \
7979
mock_sai_bridge.cpp \
8080
mock_sai_hostif.cpp \
81+
mock_sai_ipmc.cpp \
82+
mock_sai_ipmc_group.cpp \
8183
mock_sai_serialize.cpp \
8284
mock_sai_router_interface.cpp \
85+
mock_sai_rpf_group.cpp \
8386
mock_sai_neighbor.cpp \
8487
mock_sai_next_hop.cpp \
8588
mock_sai_route.cpp \
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "mock_sai_ipmc.h"
2+
3+
MockSaiIpmc* mock_sai_ipmc;
4+
5+
sai_status_t mock_create_ipmc_entry(_In_ const sai_ipmc_entry_t* ipmc_entry,
6+
_In_ uint32_t attr_count,
7+
_In_ const sai_attribute_t* attr_list) {
8+
return mock_sai_ipmc->create_ipmc_entry(ipmc_entry, attr_count, attr_list);
9+
}
10+
11+
sai_status_t mock_remove_ipmc_entry(_In_ const sai_ipmc_entry_t* ipmc_entry) {
12+
return mock_sai_ipmc->remove_ipmc_entry(ipmc_entry);
13+
}
14+
15+
sai_status_t mock_set_ipmc_entry_attribute(
16+
_In_ const sai_ipmc_entry_t* ipmc_entry, _In_ const sai_attribute_t* attr) {
17+
return mock_sai_ipmc->set_ipmc_entry_attribute(ipmc_entry, attr);
18+
}
19+
20+
sai_status_t mock_get_ipmc_entry_attribute(
21+
_In_ const sai_ipmc_entry_t* ipmc_entry, _In_ uint32_t attr_count,
22+
_Inout_ sai_attribute_t* attr_list) {
23+
return mock_sai_ipmc->get_ipmc_entry_attribute(ipmc_entry, attr_count,
24+
attr_list);
25+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#pragma once
2+
3+
#include <gmock/gmock.h>
4+
5+
extern "C" {
6+
#include "sai.h"
7+
}
8+
9+
// Mock Class mapping methods to IPMC (multicast entry) SAI APIs.
10+
class MockSaiIpmc {
11+
public:
12+
MOCK_METHOD3(create_ipmc_entry,
13+
sai_status_t(_In_ const sai_ipmc_entry_t* ipmc_entry,
14+
_In_ uint32_t attr_count,
15+
_In_ const sai_attribute_t* attr_list));
16+
17+
MOCK_METHOD1(remove_ipmc_entry,
18+
sai_status_t(_In_ const sai_ipmc_entry_t* ipmc_entry));
19+
20+
MOCK_METHOD2(set_ipmc_entry_attribute,
21+
sai_status_t(_In_ const sai_ipmc_entry_t* ipmc_entry,
22+
_In_ const sai_attribute_t* attr));
23+
24+
MOCK_METHOD3(get_ipmc_entry_attribute,
25+
sai_status_t(_In_ const sai_ipmc_entry_t* ipmc_entry,
26+
_In_ uint32_t attr_count,
27+
_Inout_ sai_attribute_t* attr_list));
28+
};
29+
30+
extern MockSaiIpmc* mock_sai_ipmc;
31+
32+
sai_status_t mock_create_ipmc_entry(_In_ const sai_ipmc_entry_t* ipmc_entry,
33+
_In_ uint32_t attr_count,
34+
_In_ const sai_attribute_t* attr_list);
35+
36+
sai_status_t mock_remove_ipmc_entry(_In_ const sai_ipmc_entry_t* ipmc_entry);
37+
38+
sai_status_t mock_set_ipmc_entry_attribute(
39+
_In_ const sai_ipmc_entry_t* ipmc_entry, _In_ const sai_attribute_t* attr);
40+
41+
sai_status_t mock_get_ipmc_entry_attribute(
42+
_In_ const sai_ipmc_entry_t* ipmc_entry, _In_ uint32_t attr_count,
43+
_Inout_ sai_attribute_t* attr_list);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "mock_sai_ipmc_group.h"
2+
3+
MockSaiIpmcGroup* mock_sai_ipmc_group;
4+
5+
sai_status_t mock_create_ipmc_group(_Out_ sai_object_id_t* ipmc_group_id,
6+
_In_ sai_object_id_t switch_id,
7+
_In_ uint32_t attr_count,
8+
_In_ const sai_attribute_t* attr_list) {
9+
return mock_sai_ipmc_group->create_ipmc_group(ipmc_group_id, switch_id,
10+
attr_count, attr_list);
11+
}
12+
13+
sai_status_t mock_remove_ipmc_group(_In_ sai_object_id_t ipmc_group_id) {
14+
return mock_sai_ipmc_group->remove_ipmc_group(ipmc_group_id);
15+
}
16+
17+
sai_status_t mock_create_ipmc_group_member(
18+
_Out_ sai_object_id_t* ipmc_group_member_id, _In_ sai_object_id_t switch_id,
19+
_In_ uint32_t attr_count, _In_ const sai_attribute_t* attr_list) {
20+
return mock_sai_ipmc_group->create_ipmc_group_member(
21+
ipmc_group_member_id, switch_id, attr_count, attr_list);
22+
}
23+
24+
sai_status_t mock_remove_ipmc_group_member(
25+
_In_ sai_object_id_t ipmc_group_member_id) {
26+
return mock_sai_ipmc_group->remove_ipmc_group_member(ipmc_group_member_id);
27+
}
28+
29+
sai_status_t mock_set_ipmc_group_member_attribute(
30+
_In_ sai_object_id_t ipmc_group_member_id,
31+
_In_ const sai_attribute_t* attr) {
32+
return mock_sai_ipmc_group->set_ipmc_group_member_attribute(
33+
ipmc_group_member_id, attr);
34+
}
35+
36+
sai_status_t mock_get_ipmc_group_member_attribute(
37+
_In_ sai_object_id_t ipmc_group_member_id, _In_ uint32_t attr_count,
38+
_Inout_ sai_attribute_t* attr_list) {
39+
return mock_sai_ipmc_group->get_ipmc_group_member_attribute(
40+
ipmc_group_member_id, attr_count, attr_list);
41+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#pragma once
2+
3+
#include <gmock/gmock.h>
4+
5+
extern "C" {
6+
#include "sai.h"
7+
}
8+
9+
// Mock Class mapping methods to IPMC Group (multicast groups) SAI APIs.
10+
class MockSaiIpmcGroup {
11+
public:
12+
MOCK_METHOD4(create_ipmc_group,
13+
sai_status_t(_Out_ sai_object_id_t* ipmc_group_id,
14+
_In_ sai_object_id_t switch_id,
15+
_In_ uint32_t attr_count,
16+
_In_ const sai_attribute_t* attr_list));
17+
18+
MOCK_METHOD1(remove_ipmc_group,
19+
sai_status_t(_In_ sai_object_id_t ipmc_group_id));
20+
21+
MOCK_METHOD4(create_ipmc_group_member,
22+
sai_status_t(_Out_ sai_object_id_t* ipmc_group_member_id,
23+
_In_ sai_object_id_t switch_id,
24+
_In_ uint32_t attr_count,
25+
_In_ const sai_attribute_t* attr_list));
26+
27+
MOCK_METHOD1(remove_ipmc_group_member,
28+
sai_status_t(_In_ sai_object_id_t ipmc_group_member_id));
29+
30+
MOCK_METHOD2(set_ipmc_group_member_attribute,
31+
sai_status_t(_In_ sai_object_id_t ipmc_group_member_id,
32+
_In_ const sai_attribute_t* attr));
33+
34+
MOCK_METHOD3(get_ipmc_group_member_attribute,
35+
sai_status_t(_In_ sai_object_id_t ipmc_group_member_id,
36+
_In_ uint32_t attr_count,
37+
_Inout_ sai_attribute_t* attr_list));
38+
};
39+
40+
extern MockSaiIpmcGroup* mock_sai_ipmc_group;
41+
42+
sai_status_t mock_create_ipmc_group(_Out_ sai_object_id_t* ipmc_group_id,
43+
_In_ sai_object_id_t switch_id,
44+
_In_ uint32_t attr_count,
45+
_In_ const sai_attribute_t* attr_list);
46+
47+
sai_status_t mock_remove_ipmc_group(_In_ sai_object_id_t ipmc_group_id);
48+
49+
sai_status_t mock_create_ipmc_group_member(
50+
_Out_ sai_object_id_t* ipmc_group_member_id, _In_ sai_object_id_t switch_id,
51+
_In_ uint32_t attr_count, _In_ const sai_attribute_t* attr_list);
52+
53+
sai_status_t mock_remove_ipmc_group_member(
54+
_In_ sai_object_id_t ipmc_group_member_id);
55+
56+
sai_status_t mock_set_ipmc_group_member_attribute(
57+
_In_ sai_object_id_t ipmc_group_member_id,
58+
_In_ const sai_attribute_t* attr);
59+
60+
sai_status_t mock_get_ipmc_group_member_attribute(
61+
_In_ sai_object_id_t ipmc_group_member_id, _In_ uint32_t attr_count,
62+
_Inout_ sai_attribute_t* attr_list);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include "mock_sai_rpf_group.h"
2+
3+
MockSaiRpfGroup* mock_sai_rpf_group;
4+
5+
sai_status_t mock_create_rpf_group(_Out_ sai_object_id_t* rpf_group_id,
6+
_In_ sai_object_id_t switch_id,
7+
_In_ uint32_t attr_count,
8+
_In_ const sai_attribute_t* attr_list) {
9+
return mock_sai_rpf_group->create_rpf_group(rpf_group_id, switch_id,
10+
attr_count, attr_list);
11+
}
12+
13+
sai_status_t mock_remove_rpf_group(_In_ sai_object_id_t rpf_group_id) {
14+
return mock_sai_rpf_group->remove_rpf_group(rpf_group_id);
15+
}
16+
17+
sai_status_t mock_set_rpf_group_attribute(_In_ sai_object_id_t rpf_group_id,
18+
_In_ const sai_attribute_t* attr) {
19+
return mock_sai_rpf_group->set_rpf_group_attribute(rpf_group_id, attr);
20+
}
21+
22+
sai_status_t mock_get_rpf_group_attribute(_In_ sai_object_id_t rpf_group_id,
23+
_In_ uint32_t attr_count,
24+
_Inout_ sai_attribute_t* attr_list) {
25+
return mock_sai_rpf_group->get_rpf_group_attribute(rpf_group_id, attr_count,
26+
attr_list);
27+
}
28+
29+
sai_status_t mock_create_rpf_group_member(
30+
_Out_ sai_object_id_t* rpf_group_member_id, _In_ sai_object_id_t switch_id,
31+
_In_ uint32_t attr_count, _In_ const sai_attribute_t* attr_list) {
32+
return mock_sai_rpf_group->create_rpf_group_member(
33+
rpf_group_member_id, switch_id, attr_count, attr_list);
34+
}
35+
36+
sai_status_t mock_remove_rpf_group_member(
37+
_In_ sai_object_id_t rpf_group_member_id) {
38+
return mock_sai_rpf_group->remove_rpf_group_member(rpf_group_member_id);
39+
}
40+
41+
sai_status_t mock_set_rpf_group_member_attribute(
42+
_In_ sai_object_id_t rpf_group_member_id,
43+
_In_ const sai_attribute_t* attr) {
44+
return mock_sai_rpf_group->set_rpf_group_member_attribute(rpf_group_member_id,
45+
attr);
46+
}
47+
48+
sai_status_t mock_get_rpf_group_member_attribute(
49+
_In_ sai_object_id_t rpf_group_member_id, _In_ uint32_t attr_count,
50+
_Inout_ sai_attribute_t* attr_list) {
51+
return mock_sai_rpf_group->get_rpf_group_member_attribute(
52+
rpf_group_member_id, attr_count, attr_list);
53+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#pragma once
2+
3+
#include <gmock/gmock.h>
4+
5+
extern "C" {
6+
#include "sai.h"
7+
}
8+
9+
// Mock Class mapping methods to RPF group SAI APIs.
10+
class MockSaiRpfGroup {
11+
public:
12+
MOCK_METHOD4(create_rpf_group,
13+
sai_status_t(_Out_ sai_object_id_t* rpf_group_id,
14+
_In_ sai_object_id_t switch_id,
15+
_In_ uint32_t attr_count,
16+
_In_ const sai_attribute_t* attr_list));
17+
18+
MOCK_METHOD1(remove_rpf_group,
19+
sai_status_t(_In_ sai_object_id_t rpf_group_id));
20+
21+
MOCK_METHOD2(set_rpf_group_attribute,
22+
sai_status_t(_In_ sai_object_id_t rpf_group_id,
23+
_In_ const sai_attribute_t* attr));
24+
25+
MOCK_METHOD3(get_rpf_group_attribute,
26+
sai_status_t(_In_ sai_object_id_t rpf_group_id,
27+
_In_ uint32_t attr_count,
28+
_Inout_ sai_attribute_t* attr_list));
29+
30+
MOCK_METHOD4(create_rpf_group_member,
31+
sai_status_t(_Out_ sai_object_id_t* rpf_group_member_id,
32+
_In_ sai_object_id_t switch_id,
33+
_In_ uint32_t attr_count,
34+
_In_ const sai_attribute_t* attr_list));
35+
36+
MOCK_METHOD1(remove_rpf_group_member,
37+
sai_status_t(_In_ sai_object_id_t rpf_group_member_id));
38+
39+
MOCK_METHOD2(set_rpf_group_member_attribute,
40+
sai_status_t(_In_ sai_object_id_t rpf_group_member_id,
41+
_In_ const sai_attribute_t* attr));
42+
43+
MOCK_METHOD3(get_rpf_group_member_attribute,
44+
sai_status_t(_In_ sai_object_id_t rpf_group_member_id,
45+
_In_ uint32_t attr_count,
46+
_Inout_ sai_attribute_t* attr_list));
47+
};
48+
49+
extern MockSaiRpfGroup* mock_sai_rpf_group;
50+
51+
sai_status_t mock_create_rpf_group(_Out_ sai_object_id_t* rpf_group_id,
52+
_In_ sai_object_id_t switch_id,
53+
_In_ uint32_t attr_count,
54+
_In_ const sai_attribute_t* attr_list);
55+
56+
sai_status_t mock_remove_rpf_group(_In_ sai_object_id_t rpf_group_id);
57+
58+
sai_status_t mock_set_rpf_group_attribute(_In_ sai_object_id_t rpf_group_id,
59+
_In_ const sai_attribute_t* attr);
60+
61+
sai_status_t mock_get_rpf_group_attribute(_In_ sai_object_id_t rpf_group_id,
62+
_In_ uint32_t attr_count,
63+
_Inout_ sai_attribute_t* attr_list);
64+
65+
sai_status_t mock_create_rpf_group_member(
66+
_Out_ sai_object_id_t* rpf_group_member_id, _In_ sai_object_id_t switch_id,
67+
_In_ uint32_t attr_count, _In_ const sai_attribute_t* attr_list);
68+
69+
sai_status_t mock_remove_rpf_group_member(
70+
_In_ sai_object_id_t rpf_group_member_id);
71+
72+
sai_status_t mock_set_rpf_group_member_attribute(
73+
_In_ sai_object_id_t rpf_group_member_id, _In_ const sai_attribute_t* attr);
74+
75+
sai_status_t mock_get_rpf_group_member_attribute(
76+
_In_ sai_object_id_t rpf_group_member_id, _In_ uint32_t attr_count,
77+
_Inout_ sai_attribute_t* attr_list);

orchagent/p4orch/tests/p4orch_test.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88
#include "mock_response_publisher.h"
99
#include "mock_sai_bridge.h"
1010
#include "mock_sai_hostif.h"
11+
#include "mock_sai_ipmc.h"
12+
#include "mock_sai_ipmc_group.h"
1113
#include "mock_sai_neighbor.h"
1214
#include "mock_sai_next_hop.h"
1315
#include "mock_sai_route.h"
1416
#include "mock_sai_router_interface.h"
17+
#include "mock_sai_rpf_group.h"
1518
#include "mock_sai_switch.h"
1619

1720
using ::p4orch::kTableKeyDelimiter;
@@ -23,11 +26,14 @@ extern VRFOrch* gVrfOrch;
2326
extern swss::DBConnector* gAppDb;
2427
extern sai_hostif_api_t* sai_hostif_api;
2528
extern sai_switch_api_t* sai_switch_api;
29+
extern sai_ipmc_api_t* sai_ipmc_api;
30+
extern sai_ipmc_group_api_t* sai_ipmc_group_api;
2631
extern sai_bridge_api_t* sai_bridge_api;
2732
extern sai_router_interface_api_t* sai_router_intfs_api;
2833
extern sai_neighbor_api_t* sai_neighbor_api;
2934
extern sai_next_hop_api_t* sai_next_hop_api;
3035
extern sai_route_api_t* sai_route_api;
36+
extern sai_rpf_group_api_t* sai_rpf_group_api;
3137

3238
using ::testing::_;
3339
using ::testing::DoAll;
@@ -84,6 +90,33 @@ class P4OrchTest : public ::testing::Test {
8490
sai_route_api->remove_route_entries = remove_route_entries;
8591
sai_route_api->set_route_entries_attribute = set_route_entries_attribute;
8692
sai_route_api->get_route_entries_attribute = get_route_entries_attribute;
93+
mock_sai_ipmc_group = &mock_sai_ipmc_group_;
94+
sai_ipmc_group_api->create_ipmc_group = mock_create_ipmc_group;
95+
sai_ipmc_group_api->remove_ipmc_group = mock_remove_ipmc_group;
96+
sai_ipmc_group_api->create_ipmc_group_member =
97+
mock_create_ipmc_group_member;
98+
sai_ipmc_group_api->remove_ipmc_group_member =
99+
mock_remove_ipmc_group_member;
100+
sai_ipmc_group_api->set_ipmc_group_member_attribute =
101+
mock_set_ipmc_group_member_attribute;
102+
sai_ipmc_group_api->get_ipmc_group_member_attribute =
103+
mock_get_ipmc_group_member_attribute;
104+
mock_sai_ipmc = &mock_sai_ipmc_;
105+
sai_ipmc_api->create_ipmc_entry = mock_create_ipmc_entry;
106+
sai_ipmc_api->remove_ipmc_entry = mock_remove_ipmc_entry;
107+
sai_ipmc_api->set_ipmc_entry_attribute = mock_set_ipmc_entry_attribute;
108+
sai_ipmc_api->get_ipmc_entry_attribute = mock_get_ipmc_entry_attribute;
109+
mock_sai_rpf_group = &mock_sai_rpf_group_;
110+
sai_rpf_group_api->create_rpf_group = mock_create_rpf_group;
111+
sai_rpf_group_api->remove_rpf_group = mock_remove_rpf_group;
112+
sai_rpf_group_api->set_rpf_group_attribute = mock_set_rpf_group_attribute;
113+
sai_rpf_group_api->get_rpf_group_attribute = mock_get_rpf_group_attribute;
114+
sai_rpf_group_api->create_rpf_group_member = mock_create_rpf_group_member;
115+
sai_rpf_group_api->remove_rpf_group_member = mock_remove_rpf_group_member;
116+
sai_rpf_group_api->set_rpf_group_member_attribute =
117+
mock_set_rpf_group_member_attribute;
118+
sai_rpf_group_api->get_rpf_group_member_attribute =
119+
mock_get_rpf_group_member_attribute;
87120
mock_sai_bridge = &mock_sai_bridge_;
88121
sai_bridge_api->create_bridge = mock_create_bridge;
89122
sai_bridge_api->remove_bridge = mock_remove_bridge;
@@ -123,6 +156,9 @@ class P4OrchTest : public ::testing::Test {
123156
NiceMock<MockSaiNeighbor> mock_sai_neighbor_;
124157
NiceMock<MockSaiNextHop> mock_sai_next_hop_;
125158
NiceMock<MockSaiRoute> mock_sai_route_;
159+
NiceMock<MockSaiIpmcGroup> mock_sai_ipmc_group_;
160+
NiceMock<MockSaiIpmc> mock_sai_ipmc_;
161+
NiceMock<MockSaiRpfGroup> mock_sai_rpf_group_;
126162
NiceMock<MockSaiBridge> mock_sai_bridge_;
127163
CoppOrch* copp_orch_;
128164
};

0 commit comments

Comments
 (0)