1 /*
2 * table_generic.c
3 *
4 * Generic table API framework
5 */
6
7 /** @defgroup table_generic generic_table_API
8 * General requirements for a table helper.
9 * @ingroup table
10 *
11 * A given table helper need not implement the whole of this API,
12 * and may need to adjust the prototype of certain routines.
13 * But this description provides a suitable standard design framework.
14 *
15 * @{
16 */
17
18 /* =======================================================
19 *
20 * Table Maintenance:
21 * create/delete table
22 * create/copy/clone/delete row
23 * add/replace/remove row
24 *
25 * ======================================================= */
26
27 /** @defgroup table_maintenance table_maintenance
28 *
29 * Routines for maintaining the contents of a table.
30 * This would typically be part of implementing an SNMP MIB,
31 * but could potentially also be used for a standalone table.
32 *
33 * This section of the generic API is primarily relevant to
34 * table helpers where the representation of the table is
35 * constructed and maintained within the helper itself.
36 * "External" tables will typically look after such aspects
37 * directly, although this section of the abstract API
38 * framework could also help direct the design of such
39 * table-specific implementations.
40 *
41 * @{
42 */
43
44 /** Create a structure to represent the table.
45 *
46 * This could be as simple as the head of a linked
47 * list, or a more complex container structure.
48 * The 'name' field would typically be used to
49 * distinguish between several tables implemented
50 * using the same table helper. The 'flags' field
51 * would be used to control various (helper-specific)
52 * aspects of table behaviour.
53 *
54 * The table structure returned should typically be
55 * regarded as an opaque, private structure. All
56 * operations on the content of the table should
57 * ideally use the appropriate routines from this API.
58 */
59 void *
netsnmp_generic_create_table(const char * name,int flags)60 netsnmp_generic_create_table( const char *name, int flags ) {
61 }
62
63 /** Release the structure representing a table.
64 * Any rows still contained within the table
65 * should also be removed and deleted.
66 */
67 void
netsnmp_generic_delete_table(void * table)68 netsnmp_generic_delete_table( void *table ) {
69 }
70
71 /** Create a new row structure suitable for this style of table.
72 * Note that this would typically be a 'standalone' row, and
73 * would not automatically be inserted into an actual table.
74 */
75 void *
netsnmp_generic_create_row(void)76 netsnmp_generic_create_row( void ) {
77 }
78
79 /** Create a new copy of the specified row.
80 */
81 void *
netsnmp_generic_clone_row(void * row)82 netsnmp_generic_clone_row( void *row ) {
83 }
84
85 /** Copy the contents of one row into another.
86 * The destination row structure should be
87 * created before this routine is called.
88 */
89 int
netsnmp_generic_copy_row(void * dst_row,void * src_row)90 netsnmp_generic_copy_row( void *dst_row, void *src_row ) {
91 }
92
93 /** Delete a row data structure.
94 * The row should be removed from any relevant
95 * table(s) before this routine is called.
96 */
97 void
netsnmp_generic_delete_row(void * row)98 netsnmp_generic_delete_row( void *row ) {
99 }
100
101 /** Add a row to the table.
102 */
103 int
netsnmp_generic_add_row(void * table,void * row)104 netsnmp_generic_add_row( void *table, void *row ) {
105 }
106
107 /** Replace one row with another in the table.
108 * This will typically (but not necessarily) involve
109 * two rows sharing the same index information (e.g.
110 * to implement update/restore-style SET behaviour).
111 */
112 int
netsnmp_generic_replace_row(void * table,void * old_row,void * new_row)113 netsnmp_generic_replace_row( void *table, void *old_row, void *new_row ) {
114 }
115
116 /** Remove a row from the table.
117 * The data structure for the row should not be released,
118 * and would be the return value of this routine.
119 */
120 void *
netsnmp_generic_remove_row(void * table,void * row)121 netsnmp_generic_remove_row( void *table, void *row ) {
122 }
123
124 /** Remove and delete a row from the table.
125 */
126 void
netsnmp_generic_remove_delete_row(void * table,void * row)127 netsnmp_generic_remove_delete_row( void *table, void *row ) {
128 }
129
130 /** @} end of table_maintenance */
131
132 /* =======================================================
133 *
134 * MIB Maintenance:
135 * create a handler registration
136 * register/unregister table
137 * extract table from request
138 * extract/insert row
139 *
140 * ======================================================= */
141
142 /** @defgroup mib_maintenance mib_maintenance
143 *
144 * Routines for maintaining a MIB table.
145 *
146 * @{
147 */
148
149 /** Create a MIB handler structure.
150 * This will typically be invoked within the corresponding
151 * 'netsnmp_generic_register' routine (or the registration
152 * code of a sub-helper based on this helper).
153 *
154 * Alternatively, it might be called from the initialisation
155 * code of a particular MIB table implementation.
156 */
157 netsnmp_mib_handler *
netsnmp_generic_get_handler(void)158 netsnmp_generic_get_handler(void /* table specific */ ) {
159
160 }
161
162 /** Free a MIB handler structure, releasing any related resources.
163 * Possibly called automatically by 'netsnmp_unregister_handler' ?
164 */
netsnmp_generic_free_handler(netsnmp_mib_handler * handler)165 netsnmp_generic_free_handler( netsnmp_mib_handler *handler ) {
166
167 }
168
169 /** Register a MIB table with the SNMP agent.
170 */
171 int
netsnmp_generic_register(netsnmp_handler_registration * reginfo,void * table,netsnmp_table_registration_info * table_info)172 netsnmp_generic_register(netsnmp_handler_registration *reginfo,
173 void *table,
174 netsnmp_table_registration_info *table_info) {
175 }
176
177 /** Unregister a MIB table from the SNMP agent.
178 * This should also release the internal representation of the table.
179 * ?? Is a table-specific version of this needed, or would
180 * 'netsnmp_unregister_handler' + 'netsnmp_generic_free_handler' do?
181 */
182 int
netsnmp_generic_unregister(netsnmp_handler_registration * reginfo)183 netsnmp_generic_unregister(netsnmp_handler_registration *reginfo) {
184 }
185
186 /** Extract the table relating to a requested varbind.
187 */
188 void
netsnmp_generic_extract_table(netsnmp_request_info * request)189 netsnmp_generic_extract_table( netsnmp_request_info *request ) {
190 }
191
192 /** Extract the row relating to a requested varbind.
193 */
194 void
netsnmp_generic_extract_row(netsnmp_request_info * request)195 netsnmp_generic_extract_row( netsnmp_request_info *request ) {
196 }
197
198 /** Associate a (new) row with the requested varbind.
199 * The row should also be associated with any other
200 * varbinds that refer to the same index values.
201 */
202 void
netsnmp_generic_insert_row(netsnmp_request_info * request,void * row)203 netsnmp_generic_insert_row( netsnmp_request_info *request, void *row ) {
204 }
205
206 /** @} end of mib_maintenance */
207
208 /* =======================================================
209 *
210 * Row Operations
211 * get first/this/next row
212 * get row/next row by index
213 * get row/next row by OID
214 * number of rows
215 *
216 * ======================================================= */
217
218 /** @defgroup table_rows table_rows
219 *
220 * Routines for working with the rows of a table.
221 *
222 * @{
223 */
224
225 /** Retrieve the first row of the table.
226 */
227 void *
netsnmp_generic_row_first(void * table)228 netsnmp_generic_row_first( void *table ) {
229 }
230
231 /** Retrieve the given row from the table.
232 * This could either be the same data pointer,
233 * passed in, or a separate row structure
234 * sharing the same index values (or NULL).
235 *
236 * This routine also provides a means to tell
237 * whether a given row is present in the table.
238 */
239 void *
netsnmp_generic_row_get(void * table,void * row)240 netsnmp_generic_row_get( void *table, void *row ) {
241 }
242
243 /** Retrieve the following row from the table.
244 * If the specified row is not present, this
245 * routine should return the entry next after
246 * the position this row would have occupied.
247 */
248 void *
netsnmp_generic_row_next(void * table,void * row)249 netsnmp_generic_row_next( void *table, void *row ) {
250 }
251
252 /** Retrieve the row with the specified index values.
253 */
254 void *
netsnmp_generic_row_get_byidx(void * table,netsnmp_variable_list * indexes)255 netsnmp_generic_row_get_byidx( void *table,
256 netsnmp_variable_list *indexes ) {
257 }
258
259 /** Retrieve the next row after the specified index values.
260 */
261 void *
netsnmp_generic_row_next_byidx(void * table,netsnmp_variable_list * indexes)262 netsnmp_generic_row_next_byidx( void *table,
263 netsnmp_variable_list *indexes ) {
264
265 }
266
267 /** Retrieve the row with the specified instance OIDs.
268 */
269 void *
netsnmp_generic_row_get_byoid(void * table,oid * instance,size_t len)270 netsnmp_generic_row_get_byoid( void *table, oid *instance, size_t len ) {
271 }
272
273 /** Retrieve the next row after the specified instance OIDs.
274 */
275 void *
netsnmp_generic_row_next_byoid(void * table,oid * instance,size_t len)276 netsnmp_generic_row_next_byoid( void *table, oid *instance, size_t len ) {
277 }
278
279 /** Report the number of rows in the table.
280 */
281 int
netsnmp_generic_row_count(void * table)282 netsnmp_generic_row_count( void *table ) {
283 }
284
285 /** @} end of table_rows */
286
287 /* =======================================================
288 *
289 * Index Operations
290 * get table index structure
291 * get row index values/OIDs
292 * compare row with index/OIDs
293 * subtree comparisons (index/OIDs)
294 *
295 * ======================================================= */
296
297 /** @defgroup table_indexes table_indexes
298 *
299 * Routines for working with row indexes.
300 *
301 * @{
302 */
303
304 /** Retrieve the indexing structure of the table.
305 */
306 netsnmp_variable_list *
netsnmp_generic_idx(void * table)307 netsnmp_generic_idx( void *table ) {
308 }
309
310 /** Report the index values for a row.
311 */
312 netsnmp_variable_list *
netsnmp_generic_row_idx(void * row)313 netsnmp_generic_row_idx( void *row ) {
314 }
315
316 /** Report the instance OIDs for a row.
317 */
318 size_t
netsnmp_generic_row_oid(void * row,oid * instances)319 netsnmp_generic_row_oid( void *row, oid *instances ) {
320 }
321
322 /** Compare a row against the specified index values.
323 */
324 int
netsnmp_generic_compare_idx(void * row,netsnmp_variable_list * index)325 netsnmp_generic_compare_idx( void *row, netsnmp_variable_list *index ) {
326 }
327
328 /** Compare a row against the specified instance OIDs.
329 */
330 int
netsnmp_generic_compare_oid(void * row,oid * instances,size_t len)331 netsnmp_generic_compare_oid( void *row, oid *instances, size_t len ) {
332 }
333
334 /** Check if a row lies within a subtree of index values.
335 */
336 int
netsnmp_generic_compare_subtree_idx(void * row,netsnmp_variable_list * index)337 netsnmp_generic_compare_subtree_idx( void *row, netsnmp_variable_list *index ) {
338 }
339
340 /** Check if a row lies within a subtree of instance OIDs.
341 */
342 int
netsnmp_generic_compare_subtree_oid(void * row,oid * instances,size_t len)343 netsnmp_generic_compare_subtree_oid( void *row, oid *instances, size_t len ) {
344 }
345
346 /** @} end of table_indexes */
347 /** @} end of table_generic */
348