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