snmpagent.h revision 133212
1/*
2 * Copyright (c) 2001-2003
3 *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4 *	All rights reserved.
5 *
6 * Author: Harti Brandt <harti@freebsd.org>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Begemot: bsnmp/lib/snmpagent.h,v 1.13 2004/08/06 08:46:56 brandt Exp $
30 *
31 * Header file for SNMP functions. This requires snmp.h to be included.
32 */
33#ifndef snmp_agent_h_
34#define snmp_agent_h_
35
36struct snmp_dependency;
37
38enum snmp_ret {
39	/* OK, generate a response */
40	SNMP_RET_OK	= 0,
41	/* Error, ignore packet (no response) */
42	SNMP_RET_IGN	= 1,
43	/* Error, generate response from original packet */
44	SNMP_RET_ERR	= 2
45};
46
47/* Semi-Opaque object for SET operations */
48struct snmp_context {
49	u_int	var_index;
50	struct snmp_scratch *scratch;
51	struct snmp_dependency *dep;
52	void	*data;		/* user data */
53	enum snmp_ret code;	/* return code */
54};
55
56struct snmp_scratch {
57	void		*ptr1;
58	void		*ptr2;
59	uint32_t	int1;
60	uint32_t	int2;
61};
62
63enum snmp_depop {
64	SNMP_DEPOP_COMMIT,
65	SNMP_DEPOP_ROLLBACK,
66	SNMP_DEPOP_FINISH
67};
68
69typedef int (*snmp_depop_t)(struct snmp_context *, struct snmp_dependency *,
70    enum snmp_depop);
71
72struct snmp_dependency {
73	struct asn_oid	obj;
74	struct asn_oid	idx;
75};
76
77/*
78 * The TREE
79 */
80enum snmp_node_type {
81	SNMP_NODE_LEAF = 1,
82	SNMP_NODE_COLUMN
83};
84
85enum snmp_op {
86	SNMP_OP_GET 	= 1,
87	SNMP_OP_GETNEXT,
88	SNMP_OP_SET,
89	SNMP_OP_COMMIT,
90	SNMP_OP_ROLLBACK,
91};
92
93typedef int (*snmp_op_t)(struct snmp_context *, struct snmp_value *,
94    u_int, u_int, enum snmp_op);
95
96struct snmp_node {
97	struct asn_oid oid;
98	const char	*name;		/* name of the leaf */
99	enum snmp_node_type type;	/* type of this node */
100	enum snmp_syntax syntax;
101	snmp_op_t	op;
102	u_int		flags;
103	uint32_t	index;		/* index data */
104	void		*data;		/* application data */
105	void		*tree_data;	/* application data */
106};
107extern struct snmp_node *tree;
108extern u_int  tree_size;
109
110#define SNMP_NODE_CANSET	0x0001	/* SET allowed */
111
112#define SNMP_INDEXES_MAX	7
113#define SNMP_INDEX_SHIFT	4
114#define SNMP_INDEX_MASK	0xf
115#define SNMP_INDEX_COUNT(V)	((V) & SNMP_INDEX_MASK)
116#define SNMP_INDEX(V,I) \
117	(((V) >> (((I) + 1) * SNMP_INDEX_SHIFT)) & SNMP_INDEX_MASK)
118
119enum {
120	SNMP_TRACE_GET		= 0x00000001,
121	SNMP_TRACE_GETNEXT	= 0x00000002,
122	SNMP_TRACE_SET		= 0x00000004,
123	SNMP_TRACE_DEPEND	= 0x00000008,
124	SNMP_TRACE_FIND		= 0x00000010,
125};
126/* trace flag for the following functions */
127extern u_int snmp_trace;
128
129/* called to write the trace */
130extern void (*snmp_debug)(const char *fmt, ...);
131
132enum snmp_ret snmp_get(struct snmp_pdu *pdu, struct asn_buf *resp_b,
133    struct snmp_pdu *resp, void *);
134enum snmp_ret snmp_getnext(struct snmp_pdu *pdu, struct asn_buf *resp_b,
135    struct snmp_pdu *resp, void *);
136enum snmp_ret snmp_getbulk(struct snmp_pdu *pdu, struct asn_buf *resp_b,
137    struct snmp_pdu *resp, void *);
138enum snmp_ret snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
139    struct snmp_pdu *resp, void *);
140
141enum snmp_ret snmp_make_errresp(const struct snmp_pdu *, struct asn_buf *,
142    struct asn_buf *);
143
144struct snmp_dependency *snmp_dep_lookup(struct snmp_context *,
145    const struct asn_oid *, const struct asn_oid *, size_t, snmp_depop_t);
146
147struct snmp_context *snmp_init_context(void);
148int snmp_dep_commit(struct snmp_context *);
149int snmp_dep_rollback(struct snmp_context *);
150void snmp_dep_finish(struct snmp_context *);
151
152#endif
153