Skip to content

Commit 9aed2ff

Browse files
authored
[sairedis] Add support for client server architecture (#838)
With this feature libsairedis will have ability to act as a client and server, for example as client (pbhorch) can connect to existing server (OA) and call SAI api in server scope. Client connects over zmq channel and can be running in separate docker, connecting over ipc pipe or tcp.
1 parent 0e2105a commit 9aed2ff

24 files changed

+4575
-23
lines changed

lib/inc/ClientSai.h

+394
Large diffs are not rendered by default.

lib/inc/ClientServerSai.h

+259
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
#pragma once
2+
3+
#include "SaiInterface.h"
4+
5+
#include <memory>
6+
#include <mutex>
7+
8+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(ot) \
9+
virtual sai_status_t remove( \
10+
_In_ const sai_ ## ot ## _t* ot) override;
11+
12+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(ot) \
13+
virtual sai_status_t create( \
14+
_In_ const sai_ ## ot ## _t* ot, \
15+
_In_ uint32_t attr_count, \
16+
_In_ const sai_attribute_t *attr_list) override;
17+
18+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(ot) \
19+
virtual sai_status_t set( \
20+
_In_ const sai_ ## ot ## _t* ot, \
21+
_In_ const sai_attribute_t *attr) override;
22+
23+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(ot) \
24+
virtual sai_status_t get( \
25+
_In_ const sai_ ## ot ## _t* ot, \
26+
_In_ uint32_t attr_count, \
27+
_Out_ sai_attribute_t *attr_list) override;
28+
29+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_CREATE_ENTRY(ot) \
30+
virtual sai_status_t bulkCreate( \
31+
_In_ uint32_t object_count, \
32+
_In_ const sai_ ## ot ## _t *ot, \
33+
_In_ const uint32_t *attr_count, \
34+
_In_ const sai_attribute_t **attr_list, \
35+
_In_ sai_bulk_op_error_mode_t mode, \
36+
_Out_ sai_status_t *object_statuses) override;
37+
38+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_REMOVE_ENTRY(ot) \
39+
virtual sai_status_t bulkRemove( \
40+
_In_ uint32_t object_count, \
41+
_In_ const sai_ ## ot ## _t *ot, \
42+
_In_ sai_bulk_op_error_mode_t mode, \
43+
_Out_ sai_status_t *object_statuses) override;
44+
45+
#define SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_SET_ENTRY(ot) \
46+
virtual sai_status_t bulkSet( \
47+
_In_ uint32_t object_count, \
48+
_In_ const sai_ ## ot ## _t *ot, \
49+
_In_ const sai_attribute_t *attr_list, \
50+
_In_ sai_bulk_op_error_mode_t mode, \
51+
_Out_ sai_status_t *object_statuses) override;
52+
53+
namespace sairedis
54+
{
55+
class ClientServerSai:
56+
public sairedis::SaiInterface
57+
{
58+
public:
59+
60+
ClientServerSai();
61+
62+
virtual ~ClientServerSai();
63+
64+
public:
65+
66+
sai_status_t initialize(
67+
_In_ uint64_t flags,
68+
_In_ const sai_service_method_table_t *service_method_table) override;
69+
70+
sai_status_t uninitialize(void) override;
71+
72+
public: // SAI interface overrides
73+
74+
virtual sai_status_t create(
75+
_In_ sai_object_type_t objectType,
76+
_Out_ sai_object_id_t* objectId,
77+
_In_ sai_object_id_t switchId,
78+
_In_ uint32_t attr_count,
79+
_In_ const sai_attribute_t *attr_list) override;
80+
81+
virtual sai_status_t remove(
82+
_In_ sai_object_type_t objectType,
83+
_In_ sai_object_id_t objectId) override;
84+
85+
virtual sai_status_t set(
86+
_In_ sai_object_type_t objectType,
87+
_In_ sai_object_id_t objectId,
88+
_In_ const sai_attribute_t *attr) override;
89+
90+
virtual sai_status_t get(
91+
_In_ sai_object_type_t objectType,
92+
_In_ sai_object_id_t objectId,
93+
_In_ uint32_t attr_count,
94+
_Inout_ sai_attribute_t *attr_list) override;
95+
96+
public: // create ENTRY
97+
98+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(fdb_entry);
99+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(inseg_entry);
100+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(ipmc_entry);
101+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(l2mc_entry);
102+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(mcast_fdb_entry);
103+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(neighbor_entry);
104+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(route_entry);
105+
SAIREDIS_CLIENTSERVERSAI_DECLARE_CREATE_ENTRY(nat_entry);
106+
107+
public: // remove ENTRY
108+
109+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(fdb_entry);
110+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(inseg_entry);
111+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(ipmc_entry);
112+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(l2mc_entry);
113+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(mcast_fdb_entry);
114+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(neighbor_entry);
115+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(route_entry);
116+
SAIREDIS_CLIENTSERVERSAI_DECLARE_REMOVE_ENTRY(nat_entry);
117+
118+
public: // set ENTRY
119+
120+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(fdb_entry);
121+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(inseg_entry);
122+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(ipmc_entry);
123+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(l2mc_entry);
124+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(mcast_fdb_entry);
125+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(neighbor_entry);
126+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(route_entry);
127+
SAIREDIS_CLIENTSERVERSAI_DECLARE_SET_ENTRY(nat_entry);
128+
129+
public: // get ENTRY
130+
131+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(fdb_entry);
132+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(inseg_entry);
133+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(ipmc_entry);
134+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(l2mc_entry);
135+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(mcast_fdb_entry);
136+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(neighbor_entry);
137+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(route_entry);
138+
SAIREDIS_CLIENTSERVERSAI_DECLARE_GET_ENTRY(nat_entry);
139+
140+
public: // bulk QUAD oid
141+
142+
virtual sai_status_t bulkCreate(
143+
_In_ sai_object_type_t object_type,
144+
_In_ sai_object_id_t switch_id,
145+
_In_ uint32_t object_count,
146+
_In_ const uint32_t *attr_count,
147+
_In_ const sai_attribute_t **attr_list,
148+
_In_ sai_bulk_op_error_mode_t mode,
149+
_Out_ sai_object_id_t *object_id,
150+
_Out_ sai_status_t *object_statuses) override;
151+
152+
virtual sai_status_t bulkRemove(
153+
_In_ sai_object_type_t object_type,
154+
_In_ uint32_t object_count,
155+
_In_ const sai_object_id_t *object_id,
156+
_In_ sai_bulk_op_error_mode_t mode,
157+
_Out_ sai_status_t *object_statuses) override;
158+
159+
virtual sai_status_t bulkSet(
160+
_In_ sai_object_type_t object_type,
161+
_In_ uint32_t object_count,
162+
_In_ const sai_object_id_t *object_id,
163+
_In_ const sai_attribute_t *attr_list,
164+
_In_ sai_bulk_op_error_mode_t mode,
165+
_Out_ sai_status_t *object_statuses) override;
166+
167+
public: // bulk create ENTRY
168+
169+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_CREATE_ENTRY(fdb_entry);
170+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_CREATE_ENTRY(inseg_entry);
171+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_CREATE_ENTRY(nat_entry);
172+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_CREATE_ENTRY(route_entry);
173+
174+
public: // bulk remove ENTRY
175+
176+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_REMOVE_ENTRY(fdb_entry);
177+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_REMOVE_ENTRY(inseg_entry);
178+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_REMOVE_ENTRY(nat_entry);
179+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_REMOVE_ENTRY(route_entry);
180+
181+
public: // bulk set ENTRY
182+
183+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_SET_ENTRY(fdb_entry);
184+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_SET_ENTRY(inseg_entry);
185+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_SET_ENTRY(nat_entry);
186+
SAIREDIS_CLIENTSERVERSAI_DECLARE_BULK_SET_ENTRY(route_entry);
187+
188+
public: // stats API
189+
190+
virtual sai_status_t getStats(
191+
_In_ sai_object_type_t object_type,
192+
_In_ sai_object_id_t object_id,
193+
_In_ uint32_t number_of_counters,
194+
_In_ const sai_stat_id_t *counter_ids,
195+
_Out_ uint64_t *counters) override;
196+
197+
virtual sai_status_t getStatsExt(
198+
_In_ sai_object_type_t object_type,
199+
_In_ sai_object_id_t object_id,
200+
_In_ uint32_t number_of_counters,
201+
_In_ const sai_stat_id_t *counter_ids,
202+
_In_ sai_stats_mode_t mode,
203+
_Out_ uint64_t *counters) override;
204+
205+
virtual sai_status_t clearStats(
206+
_In_ sai_object_type_t object_type,
207+
_In_ sai_object_id_t object_id,
208+
_In_ uint32_t number_of_counters,
209+
_In_ const sai_stat_id_t *counter_ids) override;
210+
211+
public: // non QUAD API
212+
213+
virtual sai_status_t flushFdbEntries(
214+
_In_ sai_object_id_t switchId,
215+
_In_ uint32_t attrCount,
216+
_In_ const sai_attribute_t *attrList) override;
217+
218+
public: // SAI API
219+
220+
virtual sai_status_t objectTypeGetAvailability(
221+
_In_ sai_object_id_t switchId,
222+
_In_ sai_object_type_t objectType,
223+
_In_ uint32_t attrCount,
224+
_In_ const sai_attribute_t *attrList,
225+
_Out_ uint64_t *count) override;
226+
227+
virtual sai_status_t queryAttributeCapability(
228+
_In_ sai_object_id_t switch_id,
229+
_In_ sai_object_type_t object_type,
230+
_In_ sai_attr_id_t attr_id,
231+
_Out_ sai_attr_capability_t *capability) override;
232+
233+
virtual sai_status_t queryAattributeEnumValuesCapability(
234+
_In_ sai_object_id_t switch_id,
235+
_In_ sai_object_type_t object_type,
236+
_In_ sai_attr_id_t attr_id,
237+
_Inout_ sai_s32_list_t *enum_values_capability) override;
238+
239+
virtual sai_object_type_t objectTypeQuery(
240+
_In_ sai_object_id_t objectId) override;
241+
242+
virtual sai_object_id_t switchIdQuery(
243+
_In_ sai_object_id_t objectId) override;
244+
245+
virtual sai_status_t logSet(
246+
_In_ sai_api_t api,
247+
_In_ sai_log_level_t log_level) override;
248+
249+
private:
250+
251+
bool m_apiInitialized;
252+
253+
std::recursive_mutex m_apimutex;
254+
255+
sai_service_method_table_t m_service_method_table;
256+
257+
std::shared_ptr<SaiInterface> m_sai;
258+
};
259+
}

lib/inc/RedisRemoteSaiInterface.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,14 @@ namespace sairedis
432432
sai_switch_notifications_t processNotification(
433433
_In_ std::shared_ptr<Notification> notification);
434434

435-
std::string getHardwareInfo(
436-
_In_ uint32_t attrCount,
437-
_In_ const sai_attribute_t *attrList) const;
438-
439435
void refreshTableDump();
440436

437+
public:
438+
439+
static std::string getHardwareInfo(
440+
_In_ uint32_t attrCount,
441+
_In_ const sai_attribute_t *attrList);
442+
441443
private:
442444

443445
std::shared_ptr<ContextConfig> m_contextConfig;

lib/inc/Sai.h

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

3-
#include "RedisRemoteSaiInterface.h"
43
#include "Notification.h"
54
#include "Recorder.h"
65
#include "Context.h"

0 commit comments

Comments
 (0)