-
Notifications
You must be signed in to change notification settings - Fork 475
/
saiobject.h
370 lines (328 loc) · 13.1 KB
/
saiobject.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
/**
* Copyright (c) 2014 Microsoft Open Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
* LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS
* FOR A PARTICULAR PURPOSE, MERCHANTABILITY OR NON-INFRINGEMENT.
*
* See the Apache Version 2.0 License for specific language governing
* permissions and limitations under the License.
*
* Microsoft would like to thank the following companies for their review and
* assistance with these files: Intel Corporation, Mellanox Technologies Ltd,
* Dell Products, L.P., Facebook, Inc., Marvell International Ltd.
*
* @file saiobject.h
*
* @brief This module defines SAI APIs for bulk retrieval for each object-type
*/
#if !defined (__SAIOBJECT_H_)
#define __SAIOBJECT_H_
#include <saitypes.h>
#include <saifdb.h>
#include <saimcastfdb.h>
#include <sail2mc.h>
#include <saiipmc.h>
#include <saineighbor.h>
#include <sairoute.h>
#include <saimpls.h>
#include <sainat.h>
#include <saisrv6.h>
/* new experimental object type includes */
#include <saiexperimentaldashappliance.h>
#include <saiexperimentaldashflow.h>
#include <saiexperimentaldashmeter.h>
#include <saiexperimentaldashvip.h>
#include <saiexperimentaldashpavalidation.h>
#include <saiexperimentaldashvnet.h>
#include <saiexperimentaldashoutboundrouting.h>
#include <saiexperimentaldashoutboundcatopa.h>
#include <saiexperimentaldashinboundrouting.h>
#include <saiexperimentaldasheni.h>
#include <saiexperimentaldashdirectionlookup.h>
#include <saiexperimentaldashacl.h>
#include <saiexperimentalbmtor.h>
/**
* @defgroup SAIOBJECT SAI - Object API definitions.
*
* @{
*/
/**
* @extraparam sai_object_type_t object_type
*/
typedef union _sai_object_key_entry_t
{
/**
* @brief Key is object ID.
*
* @validonly sai_metadata_is_object_type_oid(object_type) == true
*/
sai_object_id_t object_id;
/** @validonly object_type == SAI_OBJECT_TYPE_FDB_ENTRY */
sai_fdb_entry_t fdb_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_NEIGHBOR_ENTRY */
sai_neighbor_entry_t neighbor_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_ROUTE_ENTRY */
sai_route_entry_t route_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_MCAST_FDB_ENTRY */
sai_mcast_fdb_entry_t mcast_fdb_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_L2MC_ENTRY */
sai_l2mc_entry_t l2mc_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_IPMC_ENTRY */
sai_ipmc_entry_t ipmc_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_INSEG_ENTRY */
sai_inseg_entry_t inseg_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_NAT_ENTRY */
sai_nat_entry_t nat_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_MY_SID_ENTRY */
sai_my_sid_entry_t my_sid_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY */
sai_direction_lookup_entry_t direction_lookup_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY */
sai_eni_ether_address_map_entry_t eni_ether_address_map_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY */
sai_inbound_routing_entry_t inbound_routing_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY */
sai_outbound_ca_to_pa_entry_t outbound_ca_to_pa_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY */
sai_outbound_routing_entry_t outbound_routing_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY */
sai_pa_validation_entry_t pa_validation_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_VIP_ENTRY */
sai_vip_entry_t vip_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_METER_BUCKET_ENTRY */
sai_meter_bucket_entry_t meter_bucket_entry;
/** @validonly object_type == SAI_OBJECT_TYPE_FLOW_ENTRY */
sai_flow_entry_t flow_entry;
/* Add new experimental entries above this line */
} sai_object_key_entry_t;
/**
* @brief Structure for bulk retrieval of object ids, attribute and values for
* each object-type. Key will be used in case of object-types not having
* object-ids.
*
* @extraparam sai_object_type_t object_type
*/
typedef struct _sai_object_key_t
{
/** @passparam object_type */
sai_object_key_entry_t key;
} sai_object_key_t;
/**
* @brief Structure for attribute capabilities per operation
*/
typedef struct _sai_attr_capability_t
{
/**
* @brief Create is implemented
*/
bool create_implemented;
/**
* @brief Set is implemented
*/
bool set_implemented;
/**
* @brief Get is implemented
*/
bool get_implemented;
} sai_attr_capability_t;
/**
* @brief Get maximum number of attributes for an object type
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[out] count Maximum number of attribute for an object type
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_get_maximum_attribute_count(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Out_ uint32_t *count);
/**
* @brief Get the number of objects present in SAI. Deprecated for backward compatibility.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[out] count Number of objects in SAI
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_get_object_count(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Out_ uint32_t *count);
/**
* @brief Get the number of and list of object keys present in SAI if enough large
* list provided, otherwise get the number of object keys only.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[inout] object_count Number of objects in SAI
* @param[inout] object_list List of SAI objects or keys
*
* @return #SAI_STATUS_SUCCESS on success, #SAI_STATUS_BUFFER_OVERFLOW if list size insufficient, failure status code on error
*/
sai_status_t sai_get_object_key(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Inout_ uint32_t *object_count,
_Inout_ sai_object_key_t *object_list);
/**
* @brief Get the bulk list of valid attributes for a given list of
* object keys.
*
* Only valid attributes for an object are returned.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[in] object_count Number of objects
* @param[in] object_key List of object keys
* @param[inout] attr_count List of attr_count. Caller passes the number
* of attribute allocated in. Callee returns with the actual
* number of attributes filled in. If the count is less than
* needed, callee fills with the needed count and do not fill
* the attributes. Callee also set the corresponding status to
* #SAI_STATUS_BUFFER_OVERFLOW.
*
* @param[inout] attr_list List of attributes for every object. Caller is
* responsible for allocating and freeing buffer for the attributes.
* For list based attribute, e.g., s32list, objlist, callee should
* assume the caller has not allocated the memory for the list and
* should only to fill the count but not list. Then, caller
* can use corresponding get_attribute to get the list.
*
* @param[inout] object_statuses Status for each object. If the object does
* not exist, callee sets the corresponding status to #SAI_STATUS_INVALID_OBJECT_ID.
* If the allocated attribute count is not large enough,
* set the status to #SAI_STATUS_BUFFER_OVERFLOW.
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_bulk_get_attribute(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ uint32_t object_count,
_In_ const sai_object_key_t *object_key,
_Inout_ uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_Inout_ sai_status_t *object_statuses);
/**
* @brief Query attribute capability
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[in] attr_id SAI attribute ID
* @param[out] attr_capability Capability per operation
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_query_attribute_capability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *attr_capability);
/**
* @brief Query an enum attribute (enum or enum list) list of implemented enum values
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[in] attr_id SAI attribute ID
* @param[inout] enum_values_capability List of implemented enum values
*
* @return #SAI_STATUS_SUCCESS on success, #SAI_STATUS_BUFFER_OVERFLOW if list size insufficient, failure status code on error
*/
sai_status_t sai_query_attribute_enum_values_capability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Inout_ sai_s32_list_t *enum_values_capability);
/**
* @brief Query statistics capability for statistics bound at object level
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[inout] stats_capability List of implemented enum values, and the statistics modes (bit mask) supported per value
*
* @return #SAI_STATUS_SUCCESS on success, #SAI_STATUS_BUFFER_OVERFLOW if lists size insufficient, failure status code on error
*/
sai_status_t sai_query_stats_capability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Inout_ sai_stat_capability_list_t *stats_capability);
/**
* @brief Bulk objects get statistics.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type Object type
* @param[in] object_count Number of objects to get the stats
* @param[in] object_key List of object keys
* @param[in] number_of_counters Number of counters in the array
* @param[in] counter_ids Specifies the array of counter ids
* @param[in] mode Statistics mode
* @param[inout] object_statuses Array of status for each object. Length of the array should be object_count. Should be looked only if API return is not SAI_STATUS_SUCCESS.
* @param[out] counters Array of resulting counter values.
* Length of counters array should be object_count*number_of_counters.
* Counter value of I object and J counter_id = counter[I*number_of_counters + J]
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_bulk_object_get_stats(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ uint32_t object_count,
_In_ const sai_object_key_t *object_key,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t *counter_ids,
_In_ sai_stats_mode_t mode,
_Inout_ sai_status_t *object_statuses,
_Out_ uint64_t *counters);
/**
* @brief Bulk objects clear statistics.
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type Object type
* @param[in] object_count Number of objects to get the stats
* @param[in] object_key List of object keys
* @param[in] number_of_counters Number of counters in the array
* @param[in] counter_ids Specifies the array of counter ids
* @param[in] mode Statistics mode
* @param[inout] object_statuses Array of status for each object. Length of the array should be object_count. Should be looked only if API return is not SAI_STATUS_SUCCESS.
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_bulk_object_clear_stats(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ uint32_t object_count,
_In_ const sai_object_key_t *object_key,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t *counter_ids,
_In_ sai_stats_mode_t mode,
_Inout_ sai_status_t *object_statuses);
/**
* @brief Query the HW stage of an attribute for the specified object type
*
* @param[in] switch_id SAI Switch object id
* @param[in] object_type SAI object type
* @param[in] attr_count Count of attributes
* @param[in] attr_list List of attributes
* @param[out] stage HW stage of the attributes. Length of the array should be attr_count. Caller must allocate the buffer.
*
* @return #SAI_STATUS_SUCCESS on success, failure status code on error
*/
sai_status_t sai_query_object_stage(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list,
_Out_ sai_object_stage_t *stage);
/**
* @}
*/
#endif /** __SAIOBJECT_H_ */