mibII_ifstack.c revision 310901
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/snmp_mibII/mibII_ifstack.c,v 1.7 2004/08/06 08:47:00 brandt Exp $
30 *
31 * ifStackTable. Read-only.
32 */
33#include "mibII.h"
34
35int
36mib_ifstack_create(const struct mibif *lower, const struct mibif *upper)
37{
38	struct mibifstack *stack;
39
40	if ((stack = malloc(sizeof(*stack))) == NULL)
41		return (-1);
42
43	stack->index.len = 2;
44	stack->index.subs[0] = upper ? upper->index : 0;
45	stack->index.subs[1] = lower ? lower->index : 0;
46
47	INSERT_OBJECT_OID(stack, &mibifstack_list);
48
49	mib_ifstack_last_change = get_ticks();
50
51	return (0);
52}
53
54void
55mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper)
56{
57	struct mibifstack *stack;
58
59	TAILQ_FOREACH(stack, &mibifstack_list, link)
60		if (stack->index.subs[0] == (upper ? upper->index : 0) &&
61		    stack->index.subs[1] == (lower ? lower->index : 0)) {
62			TAILQ_REMOVE(&mibifstack_list, stack, link);
63			free(stack);
64			mib_ifstack_last_change = get_ticks();
65			return;
66		}
67}
68
69int
70op_ifstack(struct snmp_context *ctx __unused, struct snmp_value *value,
71    u_int sub, u_int iidx __unused, enum snmp_op op)
72{
73	struct mibifstack *stack;
74
75	switch (op) {
76
77	  case SNMP_OP_GETNEXT:
78		if ((stack = NEXT_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
79			return (SNMP_ERR_NOSUCHNAME);
80		index_append(&value->var, sub, &stack->index);
81		break;
82
83	  case SNMP_OP_GET:
84		if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
85			return (SNMP_ERR_NOSUCHNAME);
86		break;
87
88	  case SNMP_OP_SET:
89		if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
90			return (SNMP_ERR_NO_CREATION);
91		return (SNMP_ERR_NOT_WRITEABLE);
92
93	  case SNMP_OP_ROLLBACK:
94	  case SNMP_OP_COMMIT:
95		abort();
96	}
97
98	switch (value->var.subs[sub - 1]) {
99
100	  case LEAF_ifStackStatus:
101		value->v.integer = 1;
102		break;
103	}
104	return (SNMP_ERR_NOERROR);
105}
106