xref: /minix3/minix/lib/liblwip/dist/src/apps/snmp/snmp_table.c (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
1*5d5fbe79SDavid van Moolenbroek /**
2*5d5fbe79SDavid van Moolenbroek  * @file
3*5d5fbe79SDavid van Moolenbroek  * SNMP table support implementation.
4*5d5fbe79SDavid van Moolenbroek  */
5*5d5fbe79SDavid van Moolenbroek 
6*5d5fbe79SDavid van Moolenbroek /*
7*5d5fbe79SDavid van Moolenbroek  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
8*5d5fbe79SDavid van Moolenbroek  * All rights reserved.
9*5d5fbe79SDavid van Moolenbroek  *
10*5d5fbe79SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without modification,
11*5d5fbe79SDavid van Moolenbroek  * are permitted provided that the following conditions are met:
12*5d5fbe79SDavid van Moolenbroek  *
13*5d5fbe79SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright notice,
14*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer.
15*5d5fbe79SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer in the documentation
17*5d5fbe79SDavid van Moolenbroek  *    and/or other materials provided with the distribution.
18*5d5fbe79SDavid van Moolenbroek  * 3. The name of the author may not be used to endorse or promote products
19*5d5fbe79SDavid van Moolenbroek  *    derived from this software without specific prior written permission.
20*5d5fbe79SDavid van Moolenbroek  *
21*5d5fbe79SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22*5d5fbe79SDavid van Moolenbroek  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23*5d5fbe79SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24*5d5fbe79SDavid van Moolenbroek  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5d5fbe79SDavid van Moolenbroek  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26*5d5fbe79SDavid van Moolenbroek  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27*5d5fbe79SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*5d5fbe79SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29*5d5fbe79SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30*5d5fbe79SDavid van Moolenbroek  * OF SUCH DAMAGE.
31*5d5fbe79SDavid van Moolenbroek  *
32*5d5fbe79SDavid van Moolenbroek  * This file is part of the lwIP TCP/IP stack.
33*5d5fbe79SDavid van Moolenbroek  *
34*5d5fbe79SDavid van Moolenbroek  * Author: Martin Hentschel <info@cl-soft.de>
35*5d5fbe79SDavid van Moolenbroek  *
36*5d5fbe79SDavid van Moolenbroek  */
37*5d5fbe79SDavid van Moolenbroek 
38*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_opts.h"
39*5d5fbe79SDavid van Moolenbroek 
40*5d5fbe79SDavid van Moolenbroek #if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
41*5d5fbe79SDavid van Moolenbroek 
42*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_core.h"
43*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_table.h"
44*5d5fbe79SDavid van Moolenbroek #include <string.h>
45*5d5fbe79SDavid van Moolenbroek 
snmp_table_get_instance(const u32_t * root_oid,u8_t root_oid_len,struct snmp_node_instance * instance)46*5d5fbe79SDavid van Moolenbroek snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
47*5d5fbe79SDavid van Moolenbroek {
48*5d5fbe79SDavid van Moolenbroek   snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;
49*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;
50*5d5fbe79SDavid van Moolenbroek 
51*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid);
52*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid_len);
53*5d5fbe79SDavid van Moolenbroek 
54*5d5fbe79SDavid van Moolenbroek   /* check min. length (fixed row entry definition, column, row instance oid with at least one entry */
55*5d5fbe79SDavid van Moolenbroek   /* fixed row entry always has oid 1 */
56*5d5fbe79SDavid van Moolenbroek   if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {
57*5d5fbe79SDavid van Moolenbroek     /* search column */
58*5d5fbe79SDavid van Moolenbroek     const struct snmp_table_col_def* col_def = table_node->columns;
59*5d5fbe79SDavid van Moolenbroek     u16_t i = table_node->column_count;
60*5d5fbe79SDavid van Moolenbroek     while (i > 0) {
61*5d5fbe79SDavid van Moolenbroek       if (col_def->index == instance->instance_oid.id[1]) {
62*5d5fbe79SDavid van Moolenbroek         break;
63*5d5fbe79SDavid van Moolenbroek       }
64*5d5fbe79SDavid van Moolenbroek 
65*5d5fbe79SDavid van Moolenbroek       col_def++;
66*5d5fbe79SDavid van Moolenbroek       i--;
67*5d5fbe79SDavid van Moolenbroek     }
68*5d5fbe79SDavid van Moolenbroek 
69*5d5fbe79SDavid van Moolenbroek     if (i > 0) {
70*5d5fbe79SDavid van Moolenbroek       /* everything may be overwritten by get_cell_instance_method() in order to implement special handling for single columns/cells */
71*5d5fbe79SDavid van Moolenbroek       instance->asn1_type = col_def->asn1_type;
72*5d5fbe79SDavid van Moolenbroek       instance->access    = col_def->access;
73*5d5fbe79SDavid van Moolenbroek       instance->get_value = table_node->get_value;
74*5d5fbe79SDavid van Moolenbroek       instance->set_test  = table_node->set_test;
75*5d5fbe79SDavid van Moolenbroek       instance->set_value = table_node->set_value;
76*5d5fbe79SDavid van Moolenbroek 
77*5d5fbe79SDavid van Moolenbroek       ret = table_node->get_cell_instance(
78*5d5fbe79SDavid van Moolenbroek         &(instance->instance_oid.id[1]),
79*5d5fbe79SDavid van Moolenbroek         &(instance->instance_oid.id[2]),
80*5d5fbe79SDavid van Moolenbroek         instance->instance_oid.len-2,
81*5d5fbe79SDavid van Moolenbroek         instance);
82*5d5fbe79SDavid van Moolenbroek     }
83*5d5fbe79SDavid van Moolenbroek   }
84*5d5fbe79SDavid van Moolenbroek 
85*5d5fbe79SDavid van Moolenbroek   return ret;
86*5d5fbe79SDavid van Moolenbroek }
87*5d5fbe79SDavid van Moolenbroek 
snmp_table_get_next_instance(const u32_t * root_oid,u8_t root_oid_len,struct snmp_node_instance * instance)88*5d5fbe79SDavid van Moolenbroek snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
89*5d5fbe79SDavid van Moolenbroek {
90*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;
91*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_col_def* col_def;
92*5d5fbe79SDavid van Moolenbroek   struct snmp_obj_id row_oid;
93*5d5fbe79SDavid van Moolenbroek   u32_t column = 0;
94*5d5fbe79SDavid van Moolenbroek   snmp_err_t result;
95*5d5fbe79SDavid van Moolenbroek 
96*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid);
97*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid_len);
98*5d5fbe79SDavid van Moolenbroek 
99*5d5fbe79SDavid van Moolenbroek   /* check that first part of id is 0 or 1, referencing fixed row entry */
100*5d5fbe79SDavid van Moolenbroek   if ((instance->instance_oid.len > 0) && (instance->instance_oid.id[0] > 1)) {
101*5d5fbe79SDavid van Moolenbroek     return SNMP_ERR_NOSUCHINSTANCE;
102*5d5fbe79SDavid van Moolenbroek   }
103*5d5fbe79SDavid van Moolenbroek   if (instance->instance_oid.len > 1) {
104*5d5fbe79SDavid van Moolenbroek     column = instance->instance_oid.id[1];
105*5d5fbe79SDavid van Moolenbroek   }
106*5d5fbe79SDavid van Moolenbroek   if (instance->instance_oid.len > 2) {
107*5d5fbe79SDavid van Moolenbroek     snmp_oid_assign(&row_oid, &(instance->instance_oid.id[2]), instance->instance_oid.len - 2);
108*5d5fbe79SDavid van Moolenbroek   } else {
109*5d5fbe79SDavid van Moolenbroek     row_oid.len = 0;
110*5d5fbe79SDavid van Moolenbroek   }
111*5d5fbe79SDavid van Moolenbroek 
112*5d5fbe79SDavid van Moolenbroek   instance->get_value    = table_node->get_value;
113*5d5fbe79SDavid van Moolenbroek   instance->set_test     = table_node->set_test;
114*5d5fbe79SDavid van Moolenbroek   instance->set_value    = table_node->set_value;
115*5d5fbe79SDavid van Moolenbroek 
116*5d5fbe79SDavid van Moolenbroek   /* resolve column and value */
117*5d5fbe79SDavid van Moolenbroek   do {
118*5d5fbe79SDavid van Moolenbroek     u16_t i;
119*5d5fbe79SDavid van Moolenbroek     const struct snmp_table_col_def* next_col_def = NULL;
120*5d5fbe79SDavid van Moolenbroek     col_def = table_node->columns;
121*5d5fbe79SDavid van Moolenbroek 
122*5d5fbe79SDavid van Moolenbroek     for (i = 0; i < table_node->column_count; i++) {
123*5d5fbe79SDavid van Moolenbroek       if (col_def->index == column) {
124*5d5fbe79SDavid van Moolenbroek         next_col_def = col_def;
125*5d5fbe79SDavid van Moolenbroek         break;
126*5d5fbe79SDavid van Moolenbroek       } else if ((col_def->index > column) && ((next_col_def == NULL) || (col_def->index < next_col_def->index))) {
127*5d5fbe79SDavid van Moolenbroek         next_col_def = col_def;
128*5d5fbe79SDavid van Moolenbroek       }
129*5d5fbe79SDavid van Moolenbroek       col_def++;
130*5d5fbe79SDavid van Moolenbroek     }
131*5d5fbe79SDavid van Moolenbroek 
132*5d5fbe79SDavid van Moolenbroek     if (next_col_def == NULL) {
133*5d5fbe79SDavid van Moolenbroek       /* no further column found */
134*5d5fbe79SDavid van Moolenbroek       return SNMP_ERR_NOSUCHINSTANCE;
135*5d5fbe79SDavid van Moolenbroek     }
136*5d5fbe79SDavid van Moolenbroek 
137*5d5fbe79SDavid van Moolenbroek     instance->asn1_type          = next_col_def->asn1_type;
138*5d5fbe79SDavid van Moolenbroek     instance->access             = next_col_def->access;
139*5d5fbe79SDavid van Moolenbroek 
140*5d5fbe79SDavid van Moolenbroek     result = table_node->get_next_cell_instance(
141*5d5fbe79SDavid van Moolenbroek       &next_col_def->index,
142*5d5fbe79SDavid van Moolenbroek       &row_oid,
143*5d5fbe79SDavid van Moolenbroek       instance);
144*5d5fbe79SDavid van Moolenbroek 
145*5d5fbe79SDavid van Moolenbroek     if (result == SNMP_ERR_NOERROR) {
146*5d5fbe79SDavid van Moolenbroek       col_def = next_col_def;
147*5d5fbe79SDavid van Moolenbroek       break;
148*5d5fbe79SDavid van Moolenbroek     }
149*5d5fbe79SDavid van Moolenbroek 
150*5d5fbe79SDavid van Moolenbroek     row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */
151*5d5fbe79SDavid van Moolenbroek     column = next_col_def->index + 1;
152*5d5fbe79SDavid van Moolenbroek   } while (1);
153*5d5fbe79SDavid van Moolenbroek 
154*5d5fbe79SDavid van Moolenbroek   /* build resulting oid */
155*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.len   = 2;
156*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.id[0] = 1;
157*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.id[1] = col_def->index;
158*5d5fbe79SDavid van Moolenbroek   snmp_oid_append(&instance->instance_oid, row_oid.id, row_oid.len);
159*5d5fbe79SDavid van Moolenbroek 
160*5d5fbe79SDavid van Moolenbroek   return SNMP_ERR_NOERROR;
161*5d5fbe79SDavid van Moolenbroek }
162*5d5fbe79SDavid van Moolenbroek 
163*5d5fbe79SDavid van Moolenbroek 
snmp_table_simple_get_instance(const u32_t * root_oid,u8_t root_oid_len,struct snmp_node_instance * instance)164*5d5fbe79SDavid van Moolenbroek snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
165*5d5fbe79SDavid van Moolenbroek {
166*5d5fbe79SDavid van Moolenbroek   snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;
167*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;
168*5d5fbe79SDavid van Moolenbroek 
169*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid);
170*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid_len);
171*5d5fbe79SDavid van Moolenbroek 
172*5d5fbe79SDavid van Moolenbroek   /* check min. length (fixed row entry definition, column, row instance oid with at least one entry */
173*5d5fbe79SDavid van Moolenbroek   /* fixed row entry always has oid 1 */
174*5d5fbe79SDavid van Moolenbroek   if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {
175*5d5fbe79SDavid van Moolenbroek     ret = table_node->get_cell_value(
176*5d5fbe79SDavid van Moolenbroek       &(instance->instance_oid.id[1]),
177*5d5fbe79SDavid van Moolenbroek       &(instance->instance_oid.id[2]),
178*5d5fbe79SDavid van Moolenbroek       instance->instance_oid.len-2,
179*5d5fbe79SDavid van Moolenbroek       &instance->reference,
180*5d5fbe79SDavid van Moolenbroek       &instance->reference_len);
181*5d5fbe79SDavid van Moolenbroek 
182*5d5fbe79SDavid van Moolenbroek     if (ret == SNMP_ERR_NOERROR) {
183*5d5fbe79SDavid van Moolenbroek       /* search column */
184*5d5fbe79SDavid van Moolenbroek       const struct snmp_table_simple_col_def* col_def = table_node->columns;
185*5d5fbe79SDavid van Moolenbroek       u32_t i = table_node->column_count;
186*5d5fbe79SDavid van Moolenbroek       while (i > 0) {
187*5d5fbe79SDavid van Moolenbroek         if (col_def->index == instance->instance_oid.id[1]) {
188*5d5fbe79SDavid van Moolenbroek           break;
189*5d5fbe79SDavid van Moolenbroek         }
190*5d5fbe79SDavid van Moolenbroek 
191*5d5fbe79SDavid van Moolenbroek         col_def++;
192*5d5fbe79SDavid van Moolenbroek         i--;
193*5d5fbe79SDavid van Moolenbroek       }
194*5d5fbe79SDavid van Moolenbroek 
195*5d5fbe79SDavid van Moolenbroek       if (i > 0) {
196*5d5fbe79SDavid van Moolenbroek         instance->asn1_type = col_def->asn1_type;
197*5d5fbe79SDavid van Moolenbroek         instance->access    = SNMP_NODE_INSTANCE_READ_ONLY;
198*5d5fbe79SDavid van Moolenbroek         instance->set_test  = NULL;
199*5d5fbe79SDavid van Moolenbroek         instance->set_value = NULL;
200*5d5fbe79SDavid van Moolenbroek 
201*5d5fbe79SDavid van Moolenbroek         switch (col_def->data_type) {
202*5d5fbe79SDavid van Moolenbroek           case SNMP_VARIANT_VALUE_TYPE_U32:
203*5d5fbe79SDavid van Moolenbroek             instance->get_value = snmp_table_extract_value_from_u32ref;
204*5d5fbe79SDavid van Moolenbroek             break;
205*5d5fbe79SDavid van Moolenbroek           case SNMP_VARIANT_VALUE_TYPE_S32:
206*5d5fbe79SDavid van Moolenbroek             instance->get_value = snmp_table_extract_value_from_s32ref;
207*5d5fbe79SDavid van Moolenbroek             break;
208*5d5fbe79SDavid van Moolenbroek           case SNMP_VARIANT_VALUE_TYPE_PTR: /* fall through */
209*5d5fbe79SDavid van Moolenbroek           case SNMP_VARIANT_VALUE_TYPE_CONST_PTR:
210*5d5fbe79SDavid van Moolenbroek             instance->get_value = snmp_table_extract_value_from_refconstptr;
211*5d5fbe79SDavid van Moolenbroek             break;
212*5d5fbe79SDavid van Moolenbroek           default:
213*5d5fbe79SDavid van Moolenbroek             LWIP_DEBUGF(SNMP_DEBUG, ("snmp_table_simple_get_instance(): unknown column data_type: %d\n", col_def->data_type));
214*5d5fbe79SDavid van Moolenbroek             return SNMP_ERR_GENERROR;
215*5d5fbe79SDavid van Moolenbroek         }
216*5d5fbe79SDavid van Moolenbroek 
217*5d5fbe79SDavid van Moolenbroek         ret = SNMP_ERR_NOERROR;
218*5d5fbe79SDavid van Moolenbroek       } else {
219*5d5fbe79SDavid van Moolenbroek         ret = SNMP_ERR_NOSUCHINSTANCE;
220*5d5fbe79SDavid van Moolenbroek       }
221*5d5fbe79SDavid van Moolenbroek     }
222*5d5fbe79SDavid van Moolenbroek   }
223*5d5fbe79SDavid van Moolenbroek 
224*5d5fbe79SDavid van Moolenbroek   return ret;
225*5d5fbe79SDavid van Moolenbroek }
226*5d5fbe79SDavid van Moolenbroek 
snmp_table_simple_get_next_instance(const u32_t * root_oid,u8_t root_oid_len,struct snmp_node_instance * instance)227*5d5fbe79SDavid van Moolenbroek snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)
228*5d5fbe79SDavid van Moolenbroek {
229*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;
230*5d5fbe79SDavid van Moolenbroek   const struct snmp_table_simple_col_def* col_def;
231*5d5fbe79SDavid van Moolenbroek   struct snmp_obj_id row_oid;
232*5d5fbe79SDavid van Moolenbroek   u32_t column = 0;
233*5d5fbe79SDavid van Moolenbroek   snmp_err_t result;
234*5d5fbe79SDavid van Moolenbroek 
235*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid);
236*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(root_oid_len);
237*5d5fbe79SDavid van Moolenbroek 
238*5d5fbe79SDavid van Moolenbroek   /* check that first part of id is 0 or 1, referencing fixed row entry */
239*5d5fbe79SDavid van Moolenbroek   if ((instance->instance_oid.len > 0) && (instance->instance_oid.id[0] > 1)) {
240*5d5fbe79SDavid van Moolenbroek     return SNMP_ERR_NOSUCHINSTANCE;
241*5d5fbe79SDavid van Moolenbroek   }
242*5d5fbe79SDavid van Moolenbroek   if (instance->instance_oid.len > 1) {
243*5d5fbe79SDavid van Moolenbroek     column = instance->instance_oid.id[1];
244*5d5fbe79SDavid van Moolenbroek   }
245*5d5fbe79SDavid van Moolenbroek   if (instance->instance_oid.len > 2) {
246*5d5fbe79SDavid van Moolenbroek     snmp_oid_assign(&row_oid, &(instance->instance_oid.id[2]), instance->instance_oid.len - 2);
247*5d5fbe79SDavid van Moolenbroek   } else {
248*5d5fbe79SDavid van Moolenbroek     row_oid.len = 0;
249*5d5fbe79SDavid van Moolenbroek   }
250*5d5fbe79SDavid van Moolenbroek 
251*5d5fbe79SDavid van Moolenbroek   /* resolve column and value */
252*5d5fbe79SDavid van Moolenbroek   do {
253*5d5fbe79SDavid van Moolenbroek     u32_t i;
254*5d5fbe79SDavid van Moolenbroek     const struct snmp_table_simple_col_def* next_col_def = NULL;
255*5d5fbe79SDavid van Moolenbroek     col_def = table_node->columns;
256*5d5fbe79SDavid van Moolenbroek 
257*5d5fbe79SDavid van Moolenbroek     for (i = 0; i < table_node->column_count; i++) {
258*5d5fbe79SDavid van Moolenbroek       if (col_def->index == column) {
259*5d5fbe79SDavid van Moolenbroek         next_col_def = col_def;
260*5d5fbe79SDavid van Moolenbroek         break;
261*5d5fbe79SDavid van Moolenbroek       } else if ((col_def->index > column) && ((next_col_def == NULL) ||
262*5d5fbe79SDavid van Moolenbroek                  (col_def->index < next_col_def->index))) {
263*5d5fbe79SDavid van Moolenbroek         next_col_def = col_def;
264*5d5fbe79SDavid van Moolenbroek       }
265*5d5fbe79SDavid van Moolenbroek       col_def++;
266*5d5fbe79SDavid van Moolenbroek     }
267*5d5fbe79SDavid van Moolenbroek 
268*5d5fbe79SDavid van Moolenbroek     if (next_col_def == NULL) {
269*5d5fbe79SDavid van Moolenbroek       /* no further column found */
270*5d5fbe79SDavid van Moolenbroek       return SNMP_ERR_NOSUCHINSTANCE;
271*5d5fbe79SDavid van Moolenbroek     }
272*5d5fbe79SDavid van Moolenbroek 
273*5d5fbe79SDavid van Moolenbroek     result = table_node->get_next_cell_instance_and_value(
274*5d5fbe79SDavid van Moolenbroek       &next_col_def->index,
275*5d5fbe79SDavid van Moolenbroek       &row_oid,
276*5d5fbe79SDavid van Moolenbroek       &instance->reference,
277*5d5fbe79SDavid van Moolenbroek       &instance->reference_len);
278*5d5fbe79SDavid van Moolenbroek 
279*5d5fbe79SDavid van Moolenbroek     if (result == SNMP_ERR_NOERROR) {
280*5d5fbe79SDavid van Moolenbroek       col_def = next_col_def;
281*5d5fbe79SDavid van Moolenbroek       break;
282*5d5fbe79SDavid van Moolenbroek     }
283*5d5fbe79SDavid van Moolenbroek 
284*5d5fbe79SDavid van Moolenbroek     row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */
285*5d5fbe79SDavid van Moolenbroek     column = next_col_def->index + 1;
286*5d5fbe79SDavid van Moolenbroek   }
287*5d5fbe79SDavid van Moolenbroek   while (1);
288*5d5fbe79SDavid van Moolenbroek 
289*5d5fbe79SDavid van Moolenbroek   instance->asn1_type = col_def->asn1_type;
290*5d5fbe79SDavid van Moolenbroek   instance->access    = SNMP_NODE_INSTANCE_READ_ONLY;
291*5d5fbe79SDavid van Moolenbroek   instance->set_test  = NULL;
292*5d5fbe79SDavid van Moolenbroek   instance->set_value = NULL;
293*5d5fbe79SDavid van Moolenbroek 
294*5d5fbe79SDavid van Moolenbroek   switch (col_def->data_type) {
295*5d5fbe79SDavid van Moolenbroek     case SNMP_VARIANT_VALUE_TYPE_U32:
296*5d5fbe79SDavid van Moolenbroek       instance->get_value = snmp_table_extract_value_from_u32ref;
297*5d5fbe79SDavid van Moolenbroek       break;
298*5d5fbe79SDavid van Moolenbroek     case SNMP_VARIANT_VALUE_TYPE_S32:
299*5d5fbe79SDavid van Moolenbroek       instance->get_value = snmp_table_extract_value_from_s32ref;
300*5d5fbe79SDavid van Moolenbroek       break;
301*5d5fbe79SDavid van Moolenbroek     case SNMP_VARIANT_VALUE_TYPE_PTR: /* fall through */
302*5d5fbe79SDavid van Moolenbroek     case SNMP_VARIANT_VALUE_TYPE_CONST_PTR:
303*5d5fbe79SDavid van Moolenbroek       instance->get_value = snmp_table_extract_value_from_refconstptr;
304*5d5fbe79SDavid van Moolenbroek       break;
305*5d5fbe79SDavid van Moolenbroek     default:
306*5d5fbe79SDavid van Moolenbroek       LWIP_DEBUGF(SNMP_DEBUG, ("snmp_table_simple_get_instance(): unknown column data_type: %d\n", col_def->data_type));
307*5d5fbe79SDavid van Moolenbroek       return SNMP_ERR_GENERROR;
308*5d5fbe79SDavid van Moolenbroek   }
309*5d5fbe79SDavid van Moolenbroek 
310*5d5fbe79SDavid van Moolenbroek   /* build resulting oid */
311*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.len   = 2;
312*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.id[0] = 1;
313*5d5fbe79SDavid van Moolenbroek   instance->instance_oid.id[1] = col_def->index;
314*5d5fbe79SDavid van Moolenbroek   snmp_oid_append(&instance->instance_oid, row_oid.id, row_oid.len);
315*5d5fbe79SDavid van Moolenbroek 
316*5d5fbe79SDavid van Moolenbroek   return SNMP_ERR_NOERROR;
317*5d5fbe79SDavid van Moolenbroek }
318*5d5fbe79SDavid van Moolenbroek 
319*5d5fbe79SDavid van Moolenbroek 
320*5d5fbe79SDavid van Moolenbroek s16_t
snmp_table_extract_value_from_s32ref(struct snmp_node_instance * instance,void * value)321*5d5fbe79SDavid van Moolenbroek snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value)
322*5d5fbe79SDavid van Moolenbroek {
323*5d5fbe79SDavid van Moolenbroek   s32_t *dst = (s32_t*)value;
324*5d5fbe79SDavid van Moolenbroek   *dst = instance->reference.s32;
325*5d5fbe79SDavid van Moolenbroek   return sizeof(*dst);
326*5d5fbe79SDavid van Moolenbroek }
327*5d5fbe79SDavid van Moolenbroek 
328*5d5fbe79SDavid van Moolenbroek s16_t
snmp_table_extract_value_from_u32ref(struct snmp_node_instance * instance,void * value)329*5d5fbe79SDavid van Moolenbroek snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value)
330*5d5fbe79SDavid van Moolenbroek {
331*5d5fbe79SDavid van Moolenbroek   u32_t *dst = (u32_t*)value;
332*5d5fbe79SDavid van Moolenbroek   *dst = instance->reference.u32;
333*5d5fbe79SDavid van Moolenbroek   return sizeof(*dst);
334*5d5fbe79SDavid van Moolenbroek }
335*5d5fbe79SDavid van Moolenbroek 
336*5d5fbe79SDavid van Moolenbroek s16_t
snmp_table_extract_value_from_refconstptr(struct snmp_node_instance * instance,void * value)337*5d5fbe79SDavid van Moolenbroek snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value)
338*5d5fbe79SDavid van Moolenbroek {
339*5d5fbe79SDavid van Moolenbroek   MEMCPY(value, instance->reference.const_ptr, instance->reference_len);
340*5d5fbe79SDavid van Moolenbroek   return (u16_t)instance->reference_len;
341*5d5fbe79SDavid van Moolenbroek }
342*5d5fbe79SDavid van Moolenbroek 
343*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_SNMP */
344