xref: /minix3/minix/lib/liblwip/dist/src/apps/snmp/snmp_mib2_system.c (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
1*5d5fbe79SDavid van Moolenbroek /**
2*5d5fbe79SDavid van Moolenbroek  * @file
3*5d5fbe79SDavid van Moolenbroek  * Management Information Base II (RFC1213) SYSTEM objects and functions.
4*5d5fbe79SDavid van Moolenbroek  */
5*5d5fbe79SDavid van Moolenbroek 
6*5d5fbe79SDavid van Moolenbroek /*
7*5d5fbe79SDavid van Moolenbroek  * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
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  * Author: Dirk Ziegelmeier <dziegel@gmx.de>
33*5d5fbe79SDavid van Moolenbroek  *         Christiaan Simons <christiaan.simons@axon.tv>
34*5d5fbe79SDavid van Moolenbroek  */
35*5d5fbe79SDavid van Moolenbroek 
36*5d5fbe79SDavid van Moolenbroek #include "lwip/snmp.h"
37*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp.h"
38*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_core.h"
39*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_mib2.h"
40*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_table.h"
41*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/snmp_scalar.h"
42*5d5fbe79SDavid van Moolenbroek #include "lwip/sys.h"
43*5d5fbe79SDavid van Moolenbroek 
44*5d5fbe79SDavid van Moolenbroek #include <string.h>
45*5d5fbe79SDavid van Moolenbroek 
46*5d5fbe79SDavid van Moolenbroek #if LWIP_SNMP && SNMP_LWIP_MIB2
47*5d5fbe79SDavid van Moolenbroek 
48*5d5fbe79SDavid van Moolenbroek #if SNMP_USE_NETCONN
49*5d5fbe79SDavid van Moolenbroek #define SYNC_NODE_NAME(node_name) node_name ## _synced
50*5d5fbe79SDavid van Moolenbroek #define CREATE_LWIP_SYNC_NODE(oid, node_name) \
51*5d5fbe79SDavid van Moolenbroek    static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);
52*5d5fbe79SDavid van Moolenbroek #else
53*5d5fbe79SDavid van Moolenbroek #define SYNC_NODE_NAME(node_name) node_name
54*5d5fbe79SDavid van Moolenbroek #define CREATE_LWIP_SYNC_NODE(oid, node_name)
55*5d5fbe79SDavid van Moolenbroek #endif
56*5d5fbe79SDavid van Moolenbroek 
57*5d5fbe79SDavid van Moolenbroek /* --- system .1.3.6.1.2.1.1 ----------------------------------------------------- */
58*5d5fbe79SDavid van Moolenbroek 
59*5d5fbe79SDavid van Moolenbroek /** mib-2.system.sysDescr */
60*5d5fbe79SDavid van Moolenbroek static const u8_t   sysdescr_default[] = SNMP_LWIP_MIB2_SYSDESC;
61*5d5fbe79SDavid van Moolenbroek static const u8_t*  sysdescr           = sysdescr_default;
62*5d5fbe79SDavid van Moolenbroek static const u16_t* sysdescr_len       = NULL; /* use strlen for determining len */
63*5d5fbe79SDavid van Moolenbroek 
64*5d5fbe79SDavid van Moolenbroek /** mib-2.system.sysContact */
65*5d5fbe79SDavid van Moolenbroek static const u8_t   syscontact_default[]     = SNMP_LWIP_MIB2_SYSCONTACT;
66*5d5fbe79SDavid van Moolenbroek static const u8_t*  syscontact               = syscontact_default;
67*5d5fbe79SDavid van Moolenbroek static const u16_t* syscontact_len           = NULL; /* use strlen for determining len */
68*5d5fbe79SDavid van Moolenbroek static u8_t*        syscontact_wr            = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */
69*5d5fbe79SDavid van Moolenbroek static u16_t*       syscontact_wr_len        = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */
70*5d5fbe79SDavid van Moolenbroek static u16_t        syscontact_bufsize       = 0;    /* 0=not writable */
71*5d5fbe79SDavid van Moolenbroek 
72*5d5fbe79SDavid van Moolenbroek /** mib-2.system.sysName */
73*5d5fbe79SDavid van Moolenbroek static const u8_t   sysname_default[]        = SNMP_LWIP_MIB2_SYSNAME;
74*5d5fbe79SDavid van Moolenbroek static const u8_t*  sysname                  = sysname_default;
75*5d5fbe79SDavid van Moolenbroek static const u16_t* sysname_len              = NULL; /* use strlen for determining len */
76*5d5fbe79SDavid van Moolenbroek static u8_t*        sysname_wr               = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */
77*5d5fbe79SDavid van Moolenbroek static u16_t*       sysname_wr_len           = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */
78*5d5fbe79SDavid van Moolenbroek static u16_t        sysname_bufsize          = 0;    /* 0=not writable */
79*5d5fbe79SDavid van Moolenbroek 
80*5d5fbe79SDavid van Moolenbroek /** mib-2.system.sysLocation */
81*5d5fbe79SDavid van Moolenbroek static const u8_t   syslocation_default[]    = SNMP_LWIP_MIB2_SYSLOCATION;
82*5d5fbe79SDavid van Moolenbroek static const u8_t*  syslocation              = syslocation_default;
83*5d5fbe79SDavid van Moolenbroek static const u16_t* syslocation_len           = NULL; /* use strlen for determining len */
84*5d5fbe79SDavid van Moolenbroek static u8_t*        syslocation_wr            = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */
85*5d5fbe79SDavid van Moolenbroek static u16_t*       syslocation_wr_len        = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */
86*5d5fbe79SDavid van Moolenbroek static u16_t        syslocation_bufsize       = 0;    /* 0=not writable */
87*5d5fbe79SDavid van Moolenbroek 
88*5d5fbe79SDavid van Moolenbroek /**
89*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
90*5d5fbe79SDavid van Moolenbroek  * Initializes sysDescr pointers.
91*5d5fbe79SDavid van Moolenbroek  *
92*5d5fbe79SDavid van Moolenbroek  * @param str if non-NULL then copy str pointer
93*5d5fbe79SDavid van Moolenbroek  * @param len points to string length, excluding zero terminator
94*5d5fbe79SDavid van Moolenbroek  */
95*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_sysdescr(const u8_t * str,const u16_t * len)96*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len)
97*5d5fbe79SDavid van Moolenbroek {
98*5d5fbe79SDavid van Moolenbroek   if (str != NULL) {
99*5d5fbe79SDavid van Moolenbroek     sysdescr     = str;
100*5d5fbe79SDavid van Moolenbroek     sysdescr_len = len;
101*5d5fbe79SDavid van Moolenbroek   }
102*5d5fbe79SDavid van Moolenbroek }
103*5d5fbe79SDavid van Moolenbroek 
104*5d5fbe79SDavid van Moolenbroek /**
105*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
106*5d5fbe79SDavid van Moolenbroek  * Initializes sysContact pointers
107*5d5fbe79SDavid van Moolenbroek  *
108*5d5fbe79SDavid van Moolenbroek  * @param ocstr if non-NULL then copy str pointer
109*5d5fbe79SDavid van Moolenbroek  * @param ocstrlen points to string length, excluding zero terminator.
110*5d5fbe79SDavid van Moolenbroek  *        if set to NULL it is assumed that ocstr is NULL-terminated.
111*5d5fbe79SDavid van Moolenbroek  * @param bufsize size of the buffer in bytes.
112*5d5fbe79SDavid van Moolenbroek  *        (this is required because the buffer can be overwritten by snmp-set)
113*5d5fbe79SDavid van Moolenbroek  *        if ocstrlen is NULL buffer needs space for terminating 0 byte.
114*5d5fbe79SDavid van Moolenbroek  *        otherwise complete buffer is used for string.
115*5d5fbe79SDavid van Moolenbroek  *        if bufsize is set to 0, the value is regarded as read-only.
116*5d5fbe79SDavid van Moolenbroek  */
117*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_syscontact(u8_t * ocstr,u16_t * ocstrlen,u16_t bufsize)118*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)
119*5d5fbe79SDavid van Moolenbroek {
120*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
121*5d5fbe79SDavid van Moolenbroek     syscontact         = ocstr;
122*5d5fbe79SDavid van Moolenbroek     syscontact_wr      = ocstr;
123*5d5fbe79SDavid van Moolenbroek     syscontact_len     = ocstrlen;
124*5d5fbe79SDavid van Moolenbroek     syscontact_wr_len  = ocstrlen;
125*5d5fbe79SDavid van Moolenbroek     syscontact_bufsize = bufsize;
126*5d5fbe79SDavid van Moolenbroek   }
127*5d5fbe79SDavid van Moolenbroek }
128*5d5fbe79SDavid van Moolenbroek 
129*5d5fbe79SDavid van Moolenbroek /**
130*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
131*5d5fbe79SDavid van Moolenbroek  * see \ref snmp_mib2_set_syscontact but set pointer to readonly memory
132*5d5fbe79SDavid van Moolenbroek  */
133*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_syscontact_readonly(const u8_t * ocstr,const u16_t * ocstrlen)134*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen)
135*5d5fbe79SDavid van Moolenbroek {
136*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
137*5d5fbe79SDavid van Moolenbroek     syscontact         = ocstr;
138*5d5fbe79SDavid van Moolenbroek     syscontact_len     = ocstrlen;
139*5d5fbe79SDavid van Moolenbroek     syscontact_wr      = NULL;
140*5d5fbe79SDavid van Moolenbroek     syscontact_wr_len  = NULL;
141*5d5fbe79SDavid van Moolenbroek     syscontact_bufsize = 0;
142*5d5fbe79SDavid van Moolenbroek   }
143*5d5fbe79SDavid van Moolenbroek }
144*5d5fbe79SDavid van Moolenbroek 
145*5d5fbe79SDavid van Moolenbroek 
146*5d5fbe79SDavid van Moolenbroek /**
147*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
148*5d5fbe79SDavid van Moolenbroek  * Initializes sysName pointers
149*5d5fbe79SDavid van Moolenbroek  *
150*5d5fbe79SDavid van Moolenbroek  * @param ocstr if non-NULL then copy str pointer
151*5d5fbe79SDavid van Moolenbroek  * @param ocstrlen points to string length, excluding zero terminator.
152*5d5fbe79SDavid van Moolenbroek  *        if set to NULL it is assumed that ocstr is NULL-terminated.
153*5d5fbe79SDavid van Moolenbroek  * @param bufsize size of the buffer in bytes.
154*5d5fbe79SDavid van Moolenbroek  *        (this is required because the buffer can be overwritten by snmp-set)
155*5d5fbe79SDavid van Moolenbroek  *        if ocstrlen is NULL buffer needs space for terminating 0 byte.
156*5d5fbe79SDavid van Moolenbroek  *        otherwise complete buffer is used for string.
157*5d5fbe79SDavid van Moolenbroek  *        if bufsize is set to 0, the value is regarded as read-only.
158*5d5fbe79SDavid van Moolenbroek  */
159*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_sysname(u8_t * ocstr,u16_t * ocstrlen,u16_t bufsize)160*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)
161*5d5fbe79SDavid van Moolenbroek {
162*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
163*5d5fbe79SDavid van Moolenbroek     sysname         = ocstr;
164*5d5fbe79SDavid van Moolenbroek     sysname_wr      = ocstr;
165*5d5fbe79SDavid van Moolenbroek     sysname_len     = ocstrlen;
166*5d5fbe79SDavid van Moolenbroek     sysname_wr_len  = ocstrlen;
167*5d5fbe79SDavid van Moolenbroek     sysname_bufsize = bufsize;
168*5d5fbe79SDavid van Moolenbroek   }
169*5d5fbe79SDavid van Moolenbroek }
170*5d5fbe79SDavid van Moolenbroek 
171*5d5fbe79SDavid van Moolenbroek /**
172*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
173*5d5fbe79SDavid van Moolenbroek  * see \ref snmp_mib2_set_sysname but set pointer to readonly memory
174*5d5fbe79SDavid van Moolenbroek  */
175*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_sysname_readonly(const u8_t * ocstr,const u16_t * ocstrlen)176*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen)
177*5d5fbe79SDavid van Moolenbroek {
178*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
179*5d5fbe79SDavid van Moolenbroek     sysname         = ocstr;
180*5d5fbe79SDavid van Moolenbroek     sysname_len     = ocstrlen;
181*5d5fbe79SDavid van Moolenbroek     sysname_wr      = NULL;
182*5d5fbe79SDavid van Moolenbroek     sysname_wr_len  = NULL;
183*5d5fbe79SDavid van Moolenbroek     sysname_bufsize = 0;
184*5d5fbe79SDavid van Moolenbroek   }
185*5d5fbe79SDavid van Moolenbroek }
186*5d5fbe79SDavid van Moolenbroek 
187*5d5fbe79SDavid van Moolenbroek /**
188*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
189*5d5fbe79SDavid van Moolenbroek  * Initializes sysLocation pointers
190*5d5fbe79SDavid van Moolenbroek  *
191*5d5fbe79SDavid van Moolenbroek  * @param ocstr if non-NULL then copy str pointer
192*5d5fbe79SDavid van Moolenbroek  * @param ocstrlen points to string length, excluding zero terminator.
193*5d5fbe79SDavid van Moolenbroek  *        if set to NULL it is assumed that ocstr is NULL-terminated.
194*5d5fbe79SDavid van Moolenbroek  * @param bufsize size of the buffer in bytes.
195*5d5fbe79SDavid van Moolenbroek  *        (this is required because the buffer can be overwritten by snmp-set)
196*5d5fbe79SDavid van Moolenbroek  *        if ocstrlen is NULL buffer needs space for terminating 0 byte.
197*5d5fbe79SDavid van Moolenbroek  *        otherwise complete buffer is used for string.
198*5d5fbe79SDavid van Moolenbroek  *        if bufsize is set to 0, the value is regarded as read-only.
199*5d5fbe79SDavid van Moolenbroek  */
200*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_syslocation(u8_t * ocstr,u16_t * ocstrlen,u16_t bufsize)201*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)
202*5d5fbe79SDavid van Moolenbroek {
203*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
204*5d5fbe79SDavid van Moolenbroek     syslocation         = ocstr;
205*5d5fbe79SDavid van Moolenbroek     syslocation_wr      = ocstr;
206*5d5fbe79SDavid van Moolenbroek     syslocation_len     = ocstrlen;
207*5d5fbe79SDavid van Moolenbroek     syslocation_wr_len  = ocstrlen;
208*5d5fbe79SDavid van Moolenbroek     syslocation_bufsize = bufsize;
209*5d5fbe79SDavid van Moolenbroek   }
210*5d5fbe79SDavid van Moolenbroek }
211*5d5fbe79SDavid van Moolenbroek 
212*5d5fbe79SDavid van Moolenbroek /**
213*5d5fbe79SDavid van Moolenbroek  * @ingroup snmp_mib2
214*5d5fbe79SDavid van Moolenbroek  * see \ref snmp_mib2_set_syslocation but set pointer to readonly memory
215*5d5fbe79SDavid van Moolenbroek  */
216*5d5fbe79SDavid van Moolenbroek void
snmp_mib2_set_syslocation_readonly(const u8_t * ocstr,const u16_t * ocstrlen)217*5d5fbe79SDavid van Moolenbroek snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen)
218*5d5fbe79SDavid van Moolenbroek {
219*5d5fbe79SDavid van Moolenbroek   if (ocstr != NULL) {
220*5d5fbe79SDavid van Moolenbroek     syslocation         = ocstr;
221*5d5fbe79SDavid van Moolenbroek     syslocation_len     = ocstrlen;
222*5d5fbe79SDavid van Moolenbroek     syslocation_wr      = NULL;
223*5d5fbe79SDavid van Moolenbroek     syslocation_wr_len  = NULL;
224*5d5fbe79SDavid van Moolenbroek     syslocation_bufsize = 0;
225*5d5fbe79SDavid van Moolenbroek   }
226*5d5fbe79SDavid van Moolenbroek }
227*5d5fbe79SDavid van Moolenbroek 
228*5d5fbe79SDavid van Moolenbroek 
229*5d5fbe79SDavid van Moolenbroek static s16_t
system_get_value(const struct snmp_scalar_array_node_def * node,void * value)230*5d5fbe79SDavid van Moolenbroek system_get_value(const struct snmp_scalar_array_node_def *node, void *value)
231*5d5fbe79SDavid van Moolenbroek {
232*5d5fbe79SDavid van Moolenbroek   const u8_t*  var = NULL;
233*5d5fbe79SDavid van Moolenbroek   const s16_t* var_len;
234*5d5fbe79SDavid van Moolenbroek   u16_t result;
235*5d5fbe79SDavid van Moolenbroek 
236*5d5fbe79SDavid van Moolenbroek   switch (node->oid) {
237*5d5fbe79SDavid van Moolenbroek   case 1: /* sysDescr */
238*5d5fbe79SDavid van Moolenbroek     var     = sysdescr;
239*5d5fbe79SDavid van Moolenbroek     var_len = (const s16_t*)sysdescr_len;
240*5d5fbe79SDavid van Moolenbroek     break;
241*5d5fbe79SDavid van Moolenbroek   case 2: /* sysObjectID */
242*5d5fbe79SDavid van Moolenbroek     {
243*5d5fbe79SDavid van Moolenbroek       const struct snmp_obj_id* dev_enterprise_oid = snmp_get_device_enterprise_oid();
244*5d5fbe79SDavid van Moolenbroek       MEMCPY(value, dev_enterprise_oid->id, dev_enterprise_oid->len * sizeof(u32_t));
245*5d5fbe79SDavid van Moolenbroek       return dev_enterprise_oid->len * sizeof(u32_t);
246*5d5fbe79SDavid van Moolenbroek     }
247*5d5fbe79SDavid van Moolenbroek   case 3: /* sysUpTime */
248*5d5fbe79SDavid van Moolenbroek     MIB2_COPY_SYSUPTIME_TO((u32_t*)value);
249*5d5fbe79SDavid van Moolenbroek     return sizeof(u32_t);
250*5d5fbe79SDavid van Moolenbroek   case 4: /* sysContact */
251*5d5fbe79SDavid van Moolenbroek     var     = syscontact;
252*5d5fbe79SDavid van Moolenbroek     var_len = (const s16_t*)syscontact_len;
253*5d5fbe79SDavid van Moolenbroek     break;
254*5d5fbe79SDavid van Moolenbroek   case 5: /* sysName */
255*5d5fbe79SDavid van Moolenbroek     var     = sysname;
256*5d5fbe79SDavid van Moolenbroek     var_len = (const s16_t*)sysname_len;
257*5d5fbe79SDavid van Moolenbroek     break;
258*5d5fbe79SDavid van Moolenbroek   case 6: /* sysLocation */
259*5d5fbe79SDavid van Moolenbroek     var     = syslocation;
260*5d5fbe79SDavid van Moolenbroek     var_len = (const s16_t*)syslocation_len;
261*5d5fbe79SDavid van Moolenbroek     break;
262*5d5fbe79SDavid van Moolenbroek   case 7: /* sysServices */
263*5d5fbe79SDavid van Moolenbroek     *(s32_t*)value = SNMP_SYSSERVICES;
264*5d5fbe79SDavid van Moolenbroek     return sizeof(s32_t);
265*5d5fbe79SDavid van Moolenbroek   default:
266*5d5fbe79SDavid van Moolenbroek     LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_value(): unknown id: %"S32_F"\n", node->oid));
267*5d5fbe79SDavid van Moolenbroek     return 0;
268*5d5fbe79SDavid van Moolenbroek   }
269*5d5fbe79SDavid van Moolenbroek 
270*5d5fbe79SDavid van Moolenbroek   /* handle string values (OID 1,4,5 and 6) */
271*5d5fbe79SDavid van Moolenbroek   LWIP_ASSERT("", (value != NULL));
272*5d5fbe79SDavid van Moolenbroek   if (var_len == NULL) {
273*5d5fbe79SDavid van Moolenbroek     result = (s16_t)strlen((const char*)var);
274*5d5fbe79SDavid van Moolenbroek   } else {
275*5d5fbe79SDavid van Moolenbroek     result = *var_len;
276*5d5fbe79SDavid van Moolenbroek   }
277*5d5fbe79SDavid van Moolenbroek   MEMCPY(value, var, result);
278*5d5fbe79SDavid van Moolenbroek   return result;
279*5d5fbe79SDavid van Moolenbroek }
280*5d5fbe79SDavid van Moolenbroek 
281*5d5fbe79SDavid van Moolenbroek static snmp_err_t
system_set_test(const struct snmp_scalar_array_node_def * node,u16_t len,void * value)282*5d5fbe79SDavid van Moolenbroek system_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)
283*5d5fbe79SDavid van Moolenbroek {
284*5d5fbe79SDavid van Moolenbroek   snmp_err_t ret = SNMP_ERR_WRONGVALUE;
285*5d5fbe79SDavid van Moolenbroek   const u16_t* var_bufsize  = NULL;
286*5d5fbe79SDavid van Moolenbroek   const u16_t* var_wr_len;
287*5d5fbe79SDavid van Moolenbroek 
288*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(value);
289*5d5fbe79SDavid van Moolenbroek 
290*5d5fbe79SDavid van Moolenbroek   switch (node->oid) {
291*5d5fbe79SDavid van Moolenbroek   case 4: /* sysContact */
292*5d5fbe79SDavid van Moolenbroek     var_bufsize  = &syscontact_bufsize;
293*5d5fbe79SDavid van Moolenbroek     var_wr_len   = syscontact_wr_len;
294*5d5fbe79SDavid van Moolenbroek     break;
295*5d5fbe79SDavid van Moolenbroek   case 5: /* sysName */
296*5d5fbe79SDavid van Moolenbroek     var_bufsize  = &sysname_bufsize;
297*5d5fbe79SDavid van Moolenbroek     var_wr_len   = sysname_wr_len;
298*5d5fbe79SDavid van Moolenbroek     break;
299*5d5fbe79SDavid van Moolenbroek   case 6: /* sysLocation */
300*5d5fbe79SDavid van Moolenbroek     var_bufsize  = &syslocation_bufsize;
301*5d5fbe79SDavid van Moolenbroek     var_wr_len   = syslocation_wr_len;
302*5d5fbe79SDavid van Moolenbroek     break;
303*5d5fbe79SDavid van Moolenbroek   default:
304*5d5fbe79SDavid van Moolenbroek     LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_test(): unknown id: %"S32_F"\n", node->oid));
305*5d5fbe79SDavid van Moolenbroek     return ret;
306*5d5fbe79SDavid van Moolenbroek   }
307*5d5fbe79SDavid van Moolenbroek 
308*5d5fbe79SDavid van Moolenbroek   /* check if value is writable at all */
309*5d5fbe79SDavid van Moolenbroek   if (*var_bufsize > 0) {
310*5d5fbe79SDavid van Moolenbroek     if (var_wr_len == NULL) {
311*5d5fbe79SDavid van Moolenbroek       /* we have to take the terminating 0 into account */
312*5d5fbe79SDavid van Moolenbroek       if (len < *var_bufsize) {
313*5d5fbe79SDavid van Moolenbroek         ret = SNMP_ERR_NOERROR;
314*5d5fbe79SDavid van Moolenbroek       }
315*5d5fbe79SDavid van Moolenbroek     } else {
316*5d5fbe79SDavid van Moolenbroek       if (len <= *var_bufsize) {
317*5d5fbe79SDavid van Moolenbroek         ret = SNMP_ERR_NOERROR;
318*5d5fbe79SDavid van Moolenbroek       }
319*5d5fbe79SDavid van Moolenbroek     }
320*5d5fbe79SDavid van Moolenbroek   } else {
321*5d5fbe79SDavid van Moolenbroek     ret = SNMP_ERR_NOTWRITABLE;
322*5d5fbe79SDavid van Moolenbroek   }
323*5d5fbe79SDavid van Moolenbroek 
324*5d5fbe79SDavid van Moolenbroek   return ret;
325*5d5fbe79SDavid van Moolenbroek }
326*5d5fbe79SDavid van Moolenbroek 
327*5d5fbe79SDavid van Moolenbroek static snmp_err_t
system_set_value(const struct snmp_scalar_array_node_def * node,u16_t len,void * value)328*5d5fbe79SDavid van Moolenbroek system_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)
329*5d5fbe79SDavid van Moolenbroek {
330*5d5fbe79SDavid van Moolenbroek   u8_t*  var_wr = NULL;
331*5d5fbe79SDavid van Moolenbroek   u16_t* var_wr_len;
332*5d5fbe79SDavid van Moolenbroek 
333*5d5fbe79SDavid van Moolenbroek   switch (node->oid) {
334*5d5fbe79SDavid van Moolenbroek   case 4: /* sysContact */
335*5d5fbe79SDavid van Moolenbroek     var_wr     = syscontact_wr;
336*5d5fbe79SDavid van Moolenbroek     var_wr_len = syscontact_wr_len;
337*5d5fbe79SDavid van Moolenbroek     break;
338*5d5fbe79SDavid van Moolenbroek   case 5: /* sysName */
339*5d5fbe79SDavid van Moolenbroek     var_wr     = sysname_wr;
340*5d5fbe79SDavid van Moolenbroek     var_wr_len = sysname_wr_len;
341*5d5fbe79SDavid van Moolenbroek     break;
342*5d5fbe79SDavid van Moolenbroek   case 6: /* sysLocation */
343*5d5fbe79SDavid van Moolenbroek     var_wr     = syslocation_wr;
344*5d5fbe79SDavid van Moolenbroek     var_wr_len = syslocation_wr_len;
345*5d5fbe79SDavid van Moolenbroek     break;
346*5d5fbe79SDavid van Moolenbroek   default:
347*5d5fbe79SDavid van Moolenbroek     LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_value(): unknown id: %"S32_F"\n", node->oid));
348*5d5fbe79SDavid van Moolenbroek     return SNMP_ERR_GENERROR;
349*5d5fbe79SDavid van Moolenbroek   }
350*5d5fbe79SDavid van Moolenbroek 
351*5d5fbe79SDavid van Moolenbroek   /* no need to check size of target buffer, this was already done in set_test method */
352*5d5fbe79SDavid van Moolenbroek   LWIP_ASSERT("", var_wr != NULL);
353*5d5fbe79SDavid van Moolenbroek   MEMCPY(var_wr, value, len);
354*5d5fbe79SDavid van Moolenbroek 
355*5d5fbe79SDavid van Moolenbroek   if (var_wr_len == NULL) {
356*5d5fbe79SDavid van Moolenbroek     /* add terminating 0 */
357*5d5fbe79SDavid van Moolenbroek     var_wr[len] = 0;
358*5d5fbe79SDavid van Moolenbroek   } else {
359*5d5fbe79SDavid van Moolenbroek     *var_wr_len = len;
360*5d5fbe79SDavid van Moolenbroek   }
361*5d5fbe79SDavid van Moolenbroek 
362*5d5fbe79SDavid van Moolenbroek   return SNMP_ERR_NOERROR;
363*5d5fbe79SDavid van Moolenbroek }
364*5d5fbe79SDavid van Moolenbroek 
365*5d5fbe79SDavid van Moolenbroek static const struct snmp_scalar_array_node_def system_nodes[] = {
366*5d5fbe79SDavid van Moolenbroek   {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},  /* sysDescr */
367*5d5fbe79SDavid van Moolenbroek   {2, SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY},  /* sysObjectID */
368*5d5fbe79SDavid van Moolenbroek   {3, SNMP_ASN1_TYPE_TIMETICKS,    SNMP_NODE_INSTANCE_READ_ONLY},  /* sysUpTime */
369*5d5fbe79SDavid van Moolenbroek   {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysContact */
370*5d5fbe79SDavid van Moolenbroek   {5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysName */
371*5d5fbe79SDavid van Moolenbroek   {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysLocation */
372*5d5fbe79SDavid van Moolenbroek   {7, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}   /* sysServices */
373*5d5fbe79SDavid van Moolenbroek };
374*5d5fbe79SDavid van Moolenbroek 
375*5d5fbe79SDavid van Moolenbroek const struct snmp_scalar_array_node snmp_mib2_system_node = SNMP_SCALAR_CREATE_ARRAY_NODE(1, system_nodes, system_get_value, system_set_test, system_set_value);
376*5d5fbe79SDavid van Moolenbroek 
377*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */
378