annotate packages/net/snmp/agent/current/src/snmp_agent.c @ 3403:8c8767bb9a62 default tip

devs/nand/micron_mt29: Remove defunct references (in comments) to mt29f2g08_oob_ecc.
author Ross Younger <wry@ecoscentric.com>
date Sun, 18 Jan 2015 17:59:01 +1300
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
2 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
3 // ./agent/current/src/snmp_agent.c
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
4 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
5 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
6 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
7 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
8 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
9 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
10 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
11 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
12 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
13 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
14 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
15 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
16 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
18 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
20 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
21 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
22 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
23 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
24 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
25 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
26 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
27 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
28 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
29 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
30 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
31 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
32 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 103
diff changeset
33 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
34 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
35 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
36 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 293
diff changeset
37 // ####ECOSGPLCOPYRIGHTEND####
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
38 //####UCDSNMPCOPYRIGHTBEGIN####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
39 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
40 // -------------------------------------------
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
41 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
42 // Portions of this software may have been derived from the UCD-SNMP
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
43 // project, <http://ucd-snmp.ucdavis.edu/> from the University of
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
44 // California at Davis, which was originally based on the Carnegie Mellon
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
45 // University SNMP implementation. Portions of this software are therefore
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
46 // covered by the appropriate copyright disclaimers included herein.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
47 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
48 // The release used was version 4.1.2 of May 2000. "ucd-snmp-4.1.2"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
49 // -------------------------------------------
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
50 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
51 //####UCDSNMPCOPYRIGHTEND####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
52 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
53 //#####DESCRIPTIONBEGIN####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
54 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
55 // Author(s): hmt
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
56 // Contributors: hmt
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
57 // Date: 2000-05-30
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
58 // Purpose: Port of UCD-SNMP distribution to eCos.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
59 // Description:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
60 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
61 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
62 //####DESCRIPTIONEND####
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
63 //
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
64 //==========================================================================
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
65 /********************************************************************
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
66 Copyright 1989, 1991, 1992 by Carnegie Mellon University
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
67
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
68 Derivative Work -
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
69 Copyright 1996, 1998, 1999, 2000 The Regents of the University of California
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
70
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
71 All Rights Reserved
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
72
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
73 Permission to use, copy, modify and distribute this software and its
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
74 documentation for any purpose and without fee is hereby granted,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
75 provided that the above copyright notice appears in all copies and
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
76 that both that copyright notice and this permission notice appear in
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
77 supporting documentation, and that the name of CMU and The Regents of
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
78 the University of California not be used in advertising or publicity
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
79 pertaining to distribution of the software without specific written
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
80 permission.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
81
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
82 CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
83 WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
84 WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
85 THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
86 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
87 FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
88 CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
89 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
90 *********************************************************************/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
91 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
92 * snmp_agent.c
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
93 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
94 * Simple Network Management Protocol (RFC 1067).
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
95 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
96 /***********************************************************
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
97 Copyright 1988, 1989 by Carnegie Mellon University
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
98
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
99 All Rights Reserved
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
100
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
101 Permission to use, copy, modify, and distribute this software and its
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
102 documentation for any purpose and without fee is hereby granted,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
103 provided that the above copyright notice appear in all copies and that
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
104 both that copyright notice and this permission notice appear in
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
105 supporting documentation, and that the name of CMU not be
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
106 used in advertising or publicity pertaining to distribution of the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
107 software without specific, written prior permission.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
108
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
109 CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
110 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
111 CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
112 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
113 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
114 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
115 SOFTWARE.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
116 ******************************************************************/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
117
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
118 #include <config.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
119
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
120 #include <sys/types.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
121 #ifdef HAVE_STDLIB_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
122 #include <stdlib.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
123 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
124 #if HAVE_UNISTD_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
125 #include <unistd.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
126 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
127 #if HAVE_STRING_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
128 #include <string.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
129 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
130 #if TIME_WITH_SYS_TIME
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
131 # ifdef WIN32
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
132 # include <sys/timeb.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
133 # else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
134 # include <sys/time.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
135 # endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
136 # include <time.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
137 #else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
138 # if HAVE_SYS_TIME_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
139 # include <sys/time.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
140 # else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
141 # include <time.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
142 # endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
143 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
144 #if HAVE_SYS_SELECT_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
145 #include <sys/select.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
146 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
147 #if HAVE_NETINET_IN_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
148 #include <netinet/in.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
149 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
150 #include <errno.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
151 #if HAVE_WINSOCK_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
152 #include <winsock.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
153 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
154
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
155 #if HAVE_DMALLOC_H
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
156 #include <dmalloc.h>
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
157 #endif
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
158
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
159 #include "asn1.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
160 #define SNMP_NEED_REQUEST_LIST
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
161 #include "snmp_api.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
162 #include "snmp_impl.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
163 #include "snmp.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
164 #include "mib.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
165 #include "snmp_client.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
166
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
167 #include "snmp_vars.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
168 #include "snmpd.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
169 #include "mibgroup/struct.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
170 #include "mibgroup/util_funcs.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
171 #include "var_struct.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
172 #include "read_config.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
173 #include "snmp_logging.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
174 #include "snmp_debug.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
175 #include "mib_module_config.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
176
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
177 #include "default_store.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
178 #include "ds_agent.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
179 #include "snmp_agent.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
180 #include "agent_trap.h"
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
181
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
182 static int snmp_vars_inc;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
183
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
184 static struct agent_snmp_session *agent_session_list = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
185
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
186
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
187 static void dump_var(oid *, size_t, int, void *, size_t);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
188 static int goodValue(u_char, size_t, u_char, size_t);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
189 static void setVariable(u_char *, u_char, size_t, u_char *, size_t);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
190
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
191 static void dump_var (
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
192 oid *var_name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
193 size_t var_name_len,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
194 int statType,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
195 void *statP,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
196 size_t statLen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
197 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
198 char buf [SPRINT_MAX_LEN];
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
199 struct variable_list temp_var;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
200
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
201 temp_var.type = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
202 temp_var.val.string = (u_char *)statP;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
203 temp_var.val_len = statLen;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
204 sprint_variable (buf, var_name, var_name_len, &temp_var);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
205 snmp_log(LOG_INFO, " >> %s\n", buf);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
206 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
207
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
208
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
209 int getNextSessID()
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
210 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
211 static int SessionID = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
212
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
213 return ++SessionID;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
214 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
215
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
216 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
217 agent_check_and_process(int block) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
218 int numfds;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
219 fd_set fdset;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
220 struct timeval timeout, *tvp = &timeout;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
221 int count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
222 int fakeblock=0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
223
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
224 tvp = &timeout;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
225 tvp->tv_sec = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
226 tvp->tv_usec = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
227
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
228 numfds = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
229 FD_ZERO(&fdset);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
230 snmp_select_info(&numfds, &fdset, tvp, &fakeblock);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
231 if (block == 1 && fakeblock == 1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
232 tvp = NULL; /* block without timeout */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
233 else if (block == 0) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
234 tvp->tv_sec = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
235 tvp->tv_usec = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
236 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
237
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
238 count = select(numfds, &fdset, 0, 0, tvp);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
239
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
240 if (count > 0){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
241 /* packets found, process them */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
242 snmp_read(&fdset);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
243 } else switch(count){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
244 case 0:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
245 snmp_timeout();
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
246 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
247 case -1:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
248 if (errno == EINTR){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
249 return -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
250 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
251 snmp_log_perror("select");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
252 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
253 return -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
254 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
255 snmp_log(LOG_ERR, "select returned %d\n", count);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
256 return -1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
257 } /* endif -- count>0 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
258 return count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
259 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
260
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
261
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
262 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
263 * The session is created using the "traditional API" routine snmp_open()
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
264 * so is linked into the global library Sessions list. It also opens a
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
265 * socket that listens for incoming requests.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
266 *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
267 * The agent runs in an infinite loop (in the 'receive()' routine),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
268 * which calls snmp_read() when such a request is received on this socket.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
269 * This routine then traverses the library 'Sessions' list to identify the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
270 * relevant session and eventually invokes '_sess_read'.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
271 * This then processes the incoming packet, calling the pre_parse, parse,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
272 * post_parse and callback routines in turn.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
273 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
274
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
275 /* Global access to the primary session structure for this agent.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
276 for Index Allocation use initially. */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
277 struct snmp_session *main_session;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
278
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
279 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
280 init_master_agent(int dest_port,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
281 int (*pre_parse) (struct snmp_session *, snmp_ipaddr),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
282 int (*post_parse) (struct snmp_session *, struct snmp_pdu *,int))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
283 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
284 struct snmp_session sess, *session;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
285
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
286 if ( ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_ROLE) != MASTER_AGENT )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
287 return 0; /* no error if ! MASTER_AGENT */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
288
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
289 DEBUGMSGTL(("snmpd","installing master agent on port %d\n", dest_port));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
290
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
291 snmp_sess_init( &sess );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
292
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
293 sess.version = SNMP_DEFAULT_VERSION;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
294 sess.peername = SNMP_DEFAULT_PEERNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
295 sess.community_len = SNMP_DEFAULT_COMMUNITY_LEN;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
296
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
297 sess.local_port = dest_port;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
298 sess.callback = handle_snmp_packet;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
299 sess.authenticator = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
300 sess.flags = ds_get_int(DS_APPLICATION_ID, DS_AGENT_FLAGS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
301 session = snmp_open_ex( &sess, pre_parse, 0, post_parse, 0, 0 );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
302
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
303 if ( session == NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
304 /* diagnose snmp_open errors with the input struct snmp_session pointer */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
305 snmp_sess_perror("init_master_agent", &sess);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
306 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
307 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
308 main_session = session;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
309 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
310 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
311
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
312 struct agent_snmp_session *
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
313 init_agent_snmp_session( struct snmp_session *session, struct snmp_pdu *pdu )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
314 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
315 struct agent_snmp_session *asp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
316
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
317 asp = malloc( sizeof( struct agent_snmp_session ));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
318 if ( asp == NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
319 return NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
320 asp->start = pdu->variables;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
321 asp->end = pdu->variables;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
322 if ( asp->end != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
323 while ( asp->end->next_variable != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
324 asp->end = asp->end->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
325 asp->session = session;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
326 asp->pdu = pdu;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
327 asp->rw = READ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
328 asp->exact = TRUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
329 asp->outstanding_requests = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
330 asp->next = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
331 asp->mode = RESERVE1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
332 asp->status = SNMP_ERR_NOERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
333
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
334 return asp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
335 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
336
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
337 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
338 count_varbinds( struct snmp_pdu *pdu )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
339 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
340 int count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
341 struct variable_list *var_ptr;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
342
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
343 for ( var_ptr = pdu->variables ; var_ptr != NULL ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
344 var_ptr = var_ptr->next_variable )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
345 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
346
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
347 return count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
348 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
349
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
350 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
351 handle_snmp_packet(int operation, struct snmp_session *session, int reqid,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
352 struct snmp_pdu *pdu, void *magic)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
353 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
354 struct agent_snmp_session *asp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
355 int status, allDone, i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
356 struct variable_list *var_ptr, *var_ptr2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
357
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
358 if ( magic == NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
359 asp = init_agent_snmp_session( session, snmp_clone_pdu(pdu) );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
360 status = SNMP_ERR_NOERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
361 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
362 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
363 asp = (struct agent_snmp_session *)magic;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
364 status = asp->status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
365 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
366
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
367 if (asp->outstanding_requests != NULL)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
368 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
369
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
370 if ( check_access(pdu) != 0) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
371 /* access control setup is incorrect */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
372 send_easy_trap(SNMP_TRAP_AUTHFAIL, 0);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
373 if (asp->pdu->version != SNMP_VERSION_1 && asp->pdu->version != SNMP_VERSION_2c) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
374 asp->pdu->errstat = SNMP_ERR_AUTHORIZATIONERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
375 asp->pdu->command = SNMP_MSG_RESPONSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
376 snmp_increment_statistic(STAT_SNMPOUTPKTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
377 snmp_send( asp->session, asp->pdu );
214
7788cd39a178 Fix memory leaks
gthomas
parents: 210
diff changeset
378 free( asp );
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
379 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
380 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
381 /* drop the request */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
382 free( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
383 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
384 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
385 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
386
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
387 switch (pdu->command) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
388 case SNMP_MSG_GET:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
389 if ( asp->mode != RESERVE1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
390 break; /* Single pass */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
391 snmp_increment_statistic(STAT_SNMPINGETREQUESTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
392 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
393 asp->mode = RESERVE2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
394 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
395
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
396 case SNMP_MSG_GETNEXT:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
397 if ( asp->mode != RESERVE1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
398 break; /* Single pass */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
399 snmp_increment_statistic(STAT_SNMPINGETNEXTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
400 asp->exact = FALSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
401 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
402 asp->mode = RESERVE2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
403 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
404
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
405 case SNMP_MSG_GETBULK:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
406 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
407 * GETBULKS require multiple passes. The first pass handles the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
408 * explicitly requested varbinds, and subsequent passes append
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
409 * to the existing var_op_list. Each pass (after the first)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
410 * uses the results of the preceeding pass as the input list
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
411 * (delimited by the start & end pointers.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
412 * Processing is terminated if all entries in a pass are
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
413 * EndOfMib, or the maximum number of repetitions are made.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
414 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
415 if ( asp->mode == RESERVE1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
416 snmp_increment_statistic(STAT_SNMPINGETREQUESTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
417 asp->exact = FALSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
418 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
419 * Limit max repetitions to something reasonable
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
420 * XXX: We should figure out what will fit somehow...
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
421 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
422 if ( asp->pdu->errindex > 100 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
423 asp->pdu->errindex = 100;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
424
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
425 status = handle_next_pass( asp ); /* First pass */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
426 asp->mode = RESERVE2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
427 if ( status != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
428 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
429
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
430 while ( asp->pdu->errstat-- > 0 ) /* Skip non-repeaters */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
431 asp->start = asp->start->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
432 asp->pdu->errindex--; /* Handled first repetition */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
433
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
434 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
435 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
436 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
437
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
438 while ( asp->pdu->errindex-- > 0 ) { /* Process repeaters */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
439 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
440 * Add new variable structures for the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
441 * repeating elements, ready for the next pass.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
442 * Also check that these are not all EndOfMib
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
443 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
444 allDone = TRUE; /* Check for some content */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
445 for ( var_ptr = asp->start;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
446 var_ptr != asp->end->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
447 var_ptr = var_ptr->next_variable ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
448 /* XXX: we don't know the size of the next
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
449 OID, so assume the maximum length */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
450 if ( var_ptr->type != SNMP_ENDOFMIBVIEW )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
451 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
452 var_ptr2 = snmp_add_null_var(asp->pdu, var_ptr->name, MAX_OID_LEN);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
453 for ( i=var_ptr->name_length ; i<MAX_OID_LEN ; i++)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
454 var_ptr2->name[i] = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
455 var_ptr2->name_length = var_ptr->name_length;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
456
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
457 allDone = FALSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
458 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
459 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
460 if ( allDone )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
461 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
462
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
463 asp->start = asp->end->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
464 while ( asp->end->next_variable != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
465 asp->end = asp->end->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
466
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
467 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
468 if ( status != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
469 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
470 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
471 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
472 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
473 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
474
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
475 case SNMP_MSG_SET:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
476 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
477 * SETS require 3-4 passes through the var_op_list. The first two
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
478 * passes verify that all types, lengths, and values are valid
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
479 * and may reserve resources and the third does the set and a
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
480 * fourth executes any actions. Then the identical GET RESPONSE
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
481 * packet is returned.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
482 * If either of the first two passes returns an error, another
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
483 * pass is made so that any reserved resources can be freed.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
484 * If the third pass returns an error, another pass is made so that
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
485 * any changes can be reversed.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
486 * If the fourth pass (or any of the error handling passes)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
487 * return an error, we'd rather not know about it!
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
488 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
489 if ( asp->mode == RESERVE1 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
490 snmp_increment_statistic(STAT_SNMPINSETREQUESTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
491 asp->rw = WRITE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
492
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
493 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
494
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
495 if ( status != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
496 asp->mode = FREE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
497 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
498 asp->mode = RESERVE2;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
499
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
500 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
501 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
502 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
503
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
504 if ( asp->mode == RESERVE2 ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
505 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
506
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
507 if ( status != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
508 asp->mode = FREE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
509 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
510 asp->mode = ACTION;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
511
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
512 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
513 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
514 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
515
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
516 if ( asp->mode == ACTION ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
517 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
518
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
519 if ( status != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
520 asp->mode = UNDO;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
521 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
522 asp->mode = COMMIT;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
523
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
524 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
525 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
526 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
527
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
528 if ( asp->mode == COMMIT ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
529 status = handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
530
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
531 if ( status != SNMP_ERR_NOERROR ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
532 status = SNMP_ERR_COMMITFAILED;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
533 asp->mode = FINISHED_FAILURE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
534 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
535 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
536 asp->mode = FINISHED_SUCCESS;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
537
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
538 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
539 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
540 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
541
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
542 if ( asp->mode == UNDO ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
543 if (handle_next_pass( asp ) != SNMP_ERR_NOERROR )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
544 status = SNMP_ERR_UNDOFAILED;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
545
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
546 asp->mode = FINISHED_FAILURE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
547 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
548 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
549
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
550 if ( asp->mode == FREE ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
551 (void) handle_next_pass( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
552 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
553 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
554
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
555 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
556
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
557 case SNMP_MSG_RESPONSE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
558 snmp_increment_statistic(STAT_SNMPINGETRESPONSES);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
559 free( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
560 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
561 case SNMP_MSG_TRAP:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
562 case SNMP_MSG_TRAP2:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
563 snmp_increment_statistic(STAT_SNMPINTRAPS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
564 free( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
565 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
566 default:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
567 snmp_increment_statistic(STAT_SNMPINASNPARSEERRS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
568 free( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
569 return 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
570 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
571
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
572 if ( asp->outstanding_requests != NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
573 asp->status = status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
574 asp->next = agent_session_list;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
575 agent_session_list = asp;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
576 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
577 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
578 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
579 * May need to "dumb down" a SET error status for a
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
580 * v1 query. See RFC2576 - section 4.3
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
581 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
582 if (( asp->pdu->command == SNMP_MSG_SET ) &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
583 ( asp->pdu->version == SNMP_VERSION_1 )) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
584 switch ( status ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
585 case SNMP_ERR_WRONGVALUE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
586 case SNMP_ERR_WRONGENCODING:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
587 case SNMP_ERR_WRONGTYPE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
588 case SNMP_ERR_WRONGLENGTH:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
589 case SNMP_ERR_INCONSISTENTVALUE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
590 status = SNMP_ERR_BADVALUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
591 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
592 case SNMP_ERR_NOACCESS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
593 case SNMP_ERR_NOTWRITABLE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
594 case SNMP_ERR_NOCREATION:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
595 case SNMP_ERR_INCONSISTENTNAME:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
596 case SNMP_ERR_AUTHORIZATIONERROR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
597 status = SNMP_ERR_NOSUCHNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
598 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
599 case SNMP_ERR_RESOURCEUNAVAILABLE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
600 case SNMP_ERR_COMMITFAILED:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
601 case SNMP_ERR_UNDOFAILED:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
602 status = SNMP_ERR_GENERR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
603 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
604 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
605 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
606 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
607 * Similarly we may need to "dumb down" v2 exception
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
608 * types to throw an error for a v1 query.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
609 * See RFC2576 - section 4.1.2.3
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
610 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
611 if (( asp->pdu->command != SNMP_MSG_SET ) &&
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
612 ( asp->pdu->version == SNMP_VERSION_1 )) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
613 for ( var_ptr = asp->pdu->variables, i=0 ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
614 var_ptr != NULL ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
615 var_ptr = var_ptr->next_variable, i++ ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
616 switch ( var_ptr->type ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
617 case SNMP_NOSUCHOBJECT:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
618 case SNMP_NOSUCHINSTANCE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
619 case SNMP_ENDOFMIBVIEW:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
620 case ASN_COUNTER64:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
621 status = SNMP_ERR_NOSUCHNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
622 asp->pdu->errindex=i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
623 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
624 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
625 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
626 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
627 if ( status == SNMP_ERR_NOERROR ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
628 snmp_increment_statistic_by(
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
629 (asp->pdu->command == SNMP_MSG_SET ?
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
630 STAT_SNMPINTOTALSETVARS : STAT_SNMPINTOTALREQVARS ),
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
631 count_varbinds( asp->pdu ));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
632 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
633 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
634 /*
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
635 * Use a copy of the original request
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
636 * to report failures.
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
637 */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
638 i = asp->pdu->errindex;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
639 snmp_free_pdu( asp->pdu );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
640 asp->pdu = snmp_clone_pdu( pdu );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
641 asp->pdu->errindex = i;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
642 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
643 asp->pdu->command = SNMP_MSG_RESPONSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
644 asp->pdu->errstat = status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
645 snmp_send( asp->session, asp->pdu );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
646 snmp_increment_statistic(STAT_SNMPOUTPKTS);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
647 snmp_increment_statistic(STAT_SNMPOUTGETRESPONSES);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
648 free( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
649 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
650
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
651 return 1;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
652 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
653
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
654
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
655 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
656 handle_next_pass(struct agent_snmp_session *asp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
657 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
658 int status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
659 struct snmp_pdu *pdu = asp->pdu;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
660 struct request_list *req_p, *next_req;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
661
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
662
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
663 if ( asp->outstanding_requests != NULL )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
664 return SNMP_ERR_NOERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
665 status = handle_var_list( asp );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
666 if ( asp->outstanding_requests != NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
667 if ( status == SNMP_ERR_NOERROR ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
668 /* Send out any subagent requests */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
669 for ( req_p = asp->outstanding_requests ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
670 req_p != NULL ; req_p = req_p->next_request ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
671
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
672 snmp_async_send( req_p->session, req_p->pdu,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
673 req_p->callback, req_p->cb_data );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
674 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
675 asp->pdu = snmp_clone_pdu( pdu );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
676 asp->pdu->variables = pdu->variables;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
677 pdu->variables = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
678 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
679 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
680 /* discard outstanding requests */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
681 for ( req_p = asp->outstanding_requests ;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
682 req_p != NULL ; req_p = next_req ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
683
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
684 next_req = req_p->next_request;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
685 free( req_p );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
686 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
687 asp->outstanding_requests = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
688 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
689 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
690 return status;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
691 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
692
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
693
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
694 int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
695 handle_var_list(struct agent_snmp_session *asp)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
696 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
697 struct variable_list *varbind_ptr;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
698 u_char statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
699 u_char *statP;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
700 size_t statLen;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
701 u_short acl;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
702 WriteMethod *write_method;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
703 AddVarMethod *add_method;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
704 int noSuchObject = TRUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
705 int count, view;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
706
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
707 count = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
708 varbind_ptr = asp->start;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
709 if ( !varbind_ptr ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
710 return SNMP_ERR_NOERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
711 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
712
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
713 while (1) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
714
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
715 count++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
716 statp_loop:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
717 statP = getStatPtr( varbind_ptr->name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
718 &varbind_ptr->name_length,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
719 &statType, &statLen, &acl,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
720 asp->exact, &write_method, asp->pdu, &noSuchObject);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
721
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
722 if (statP == NULL && (asp->rw != WRITE || write_method == NULL)) {
293
838adaba1b2a Fix memory leak (from David Smith @ Red Hat)
gthomas
parents: 214
diff changeset
723 /* Careful -- if the varbind was lengthy, it will have
838adaba1b2a Fix memory leak (from David Smith @ Red Hat)
gthomas
parents: 214
diff changeset
724 allocated some memory. */
838adaba1b2a Fix memory leak (from David Smith @ Red Hat)
gthomas
parents: 214
diff changeset
725 snmp_set_var_value(varbind_ptr, NULL, 0);
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
726 varbind_ptr->val.integer = NULL;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
727 varbind_ptr->val_len = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
728 if ( asp->exact ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
729 if ( noSuchObject == TRUE ){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
730 statType = SNMP_NOSUCHOBJECT;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
731 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
732 statType = SNMP_NOSUCHINSTANCE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
733 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
734 } else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
735 statType = SNMP_ENDOFMIBVIEW;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
736 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
737 if (asp->pdu->version == SNMP_VERSION_1) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
738 asp->pdu->errstat = SNMP_ERR_NOSUCHNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
739 asp->pdu->errindex = count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
740 return SNMP_ERR_NOSUCHNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
741 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
742 else if (asp->rw == WRITE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
743 asp->pdu->errstat =
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
744 ( noSuchObject ? SNMP_ERR_NOTWRITABLE
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
745 : SNMP_ERR_NOCREATION );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
746 asp->pdu->errindex = count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
747 return asp->pdu->errstat;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
748 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
749 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
750 varbind_ptr->type = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
751 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
752 /* Delegated variables should be added to the
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
753 relevant outgoing request */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
754 else if ( IS_DELEGATED(statType)) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
755 add_method = (AddVarMethod*)statP;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
756 statType = (*add_method)( asp, varbind_ptr );
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
757 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
758 /* GETNEXT/GETBULK should just skip inaccessible entries */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
759 else if ((view = in_a_view(varbind_ptr->name, &varbind_ptr->name_length,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
760 asp->pdu, varbind_ptr->type))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
761 && !asp->exact) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
762 if (view != 5) send_easy_trap(SNMP_TRAP_AUTHFAIL, 0);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
763 goto statp_loop;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
764 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
765 /* Other access problems are permanent */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
766 else if (( asp->rw == WRITE && !(acl & 2)) || view) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
767 if (asp->pdu->version == SNMP_VERSION_1 || asp->rw != WRITE) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
768 if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_VERBOSE))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
769 DEBUGMSGTL(("snmp_agent", " >> noSuchName (read-only)\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
770 ERROR_MSG("read-only");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
771 statType = SNMP_ERR_NOSUCHNAME;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
772 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
773 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
774 if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_VERBOSE))
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
775 DEBUGMSGTL(("snmp_agent", " >> notWritable\n"));
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
776 ERROR_MSG("Not Writable");
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
777 statType = SNMP_ERR_NOTWRITABLE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
778 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
779 asp->pdu->errstat = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
780 asp->pdu->errindex = count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
781 send_easy_trap(SNMP_TRAP_AUTHFAIL, 0);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
782 return statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
783 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
784 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
785 /* dump verbose info */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
786 if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_VERBOSE) && statP)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
787 dump_var(varbind_ptr->name, varbind_ptr->name_length,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
788 statType, statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
789
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
790 /* FINALLY we can act on SET requests ....*/
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
791 if ( asp->rw == WRITE ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
792 if ( write_method != NULL ) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
793 statType = (*write_method)(asp->mode,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
794 varbind_ptr->val.string,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
795 varbind_ptr->type,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
796 varbind_ptr->val_len, statP,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
797 varbind_ptr->name,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
798 varbind_ptr->name_length);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
799 if (statType != SNMP_ERR_NOERROR) {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
800 asp->pdu->errstat = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
801 asp->pdu->errindex = count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
802 return statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
803 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
804 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
805 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
806 if (!goodValue(varbind_ptr->type, varbind_ptr->val_len,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
807 statType, statLen)){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
808 if (asp->pdu->version == SNMP_VERSION_1)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
809 statType = SNMP_ERR_BADVALUE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
810 else
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
811 statType = SNMP_ERR_WRONGTYPE; /* poor approximation */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
812 asp->pdu->errstat = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
813 asp->pdu->errindex = count;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
814 return statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
815 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
816 /* actually do the set if necessary */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
817 if (asp->mode == COMMIT)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
818 setVariable(varbind_ptr->val.string, varbind_ptr->type,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
819 varbind_ptr->val_len, statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
820 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
821 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
822 /* ... or save the results from assorted GETs */
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
823 else {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
824 snmp_set_var_value(varbind_ptr, statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
825 varbind_ptr->type = statType;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
826 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
827 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
828
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
829 if ( varbind_ptr == asp->end )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
830 return SNMP_ERR_NOERROR;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
831 varbind_ptr = varbind_ptr->next_variable;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
832 if ( asp->mode == RESERVE1 )
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
833 snmp_vars_inc++;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
834 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
835 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
836
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
837
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
838
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
839 static int
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
840 goodValue(u_char inType,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
841 size_t inLen,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
842 u_char actualType,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
843 size_t actualLen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
844 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
845 if (inLen > actualLen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
846 return FALSE;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
847 return (inType == actualType);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
848 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
849
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
850 static void
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
851 setVariable(u_char *var_val,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
852 u_char var_val_type,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
853 size_t var_val_len,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
854 u_char *statP,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
855 size_t statLen)
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
856 {
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
857 size_t buffersize = 1000;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
858
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
859 switch(var_val_type){
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
860 case ASN_INTEGER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
861 asn_parse_int(var_val, &buffersize, &var_val_type, (long *)statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
862 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
863 case ASN_COUNTER:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
864 case ASN_GAUGE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
865 case ASN_TIMETICKS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
866 asn_parse_unsigned_int(var_val, &buffersize, &var_val_type, (u_long *)statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
867 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
868 case ASN_COUNTER64:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
869 asn_parse_unsigned_int64(var_val, &buffersize, &var_val_type,
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
870 (struct counter64 *)statP, statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
871 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
872 case ASN_OCTET_STR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
873 case ASN_IPADDRESS:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
874 case ASN_OPAQUE:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
875 case ASN_NSAP:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
876 asn_parse_string(var_val, &buffersize, &var_val_type, statP, &statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
877 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
878 case ASN_OBJECT_ID:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
879 asn_parse_objid(var_val, &buffersize, &var_val_type, (oid *)statP, &statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
880 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
881 case ASN_BIT_STR:
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
882 asn_parse_bitstring(var_val, &buffersize, &var_val_type, statP, &statLen);
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
883 break;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
884 }
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
diff changeset
885 }