1122394Sharti/*
2122394Sharti * Copyright (c) 2001-2003
3122394Sharti *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4122394Sharti *	All rights reserved.
5122394Sharti *
6122394Sharti * Author: Harti Brandt <harti@freebsd.org>
7310901Sngie *
8133211Sharti * Redistribution and use in source and binary forms, with or without
9133211Sharti * modification, are permitted provided that the following conditions
10133211Sharti * are met:
11133211Sharti * 1. Redistributions of source code must retain the above copyright
12133211Sharti *    notice, this list of conditions and the following disclaimer.
13122394Sharti * 2. Redistributions in binary form must reproduce the above copyright
14122394Sharti *    notice, this list of conditions and the following disclaimer in the
15122394Sharti *    documentation and/or other materials provided with the distribution.
16310901Sngie *
17133211Sharti * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18133211Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20133211Sharti * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27133211Sharti * SUCH DAMAGE.
28122394Sharti *
29133211Sharti * $Begemot: bsnmp/snmp_mibII/mibII_ifstack.c,v 1.7 2004/08/06 08:47:00 brandt Exp $
30122394Sharti *
31122394Sharti * ifStackTable. Read-only.
32122394Sharti */
33122394Sharti#include "mibII.h"
34122394Sharti
35122394Shartiint
36122394Shartimib_ifstack_create(const struct mibif *lower, const struct mibif *upper)
37122394Sharti{
38122394Sharti	struct mibifstack *stack;
39122394Sharti
40122394Sharti	if ((stack = malloc(sizeof(*stack))) == NULL)
41122394Sharti		return (-1);
42122394Sharti
43122394Sharti	stack->index.len = 2;
44122394Sharti	stack->index.subs[0] = upper ? upper->index : 0;
45122394Sharti	stack->index.subs[1] = lower ? lower->index : 0;
46122394Sharti
47122394Sharti	INSERT_OBJECT_OID(stack, &mibifstack_list);
48122394Sharti
49122394Sharti	mib_ifstack_last_change = get_ticks();
50122394Sharti
51122394Sharti	return (0);
52122394Sharti}
53122394Sharti
54122394Shartivoid
55122394Shartimib_ifstack_delete(const struct mibif *lower, const struct mibif *upper)
56122394Sharti{
57122394Sharti	struct mibifstack *stack;
58122394Sharti
59122394Sharti	TAILQ_FOREACH(stack, &mibifstack_list, link)
60122394Sharti		if (stack->index.subs[0] == (upper ? upper->index : 0) &&
61122394Sharti		    stack->index.subs[1] == (lower ? lower->index : 0)) {
62122394Sharti			TAILQ_REMOVE(&mibifstack_list, stack, link);
63122394Sharti			free(stack);
64122394Sharti			mib_ifstack_last_change = get_ticks();
65122394Sharti			return;
66122394Sharti		}
67122394Sharti}
68122394Sharti
69122394Shartiint
70122394Shartiop_ifstack(struct snmp_context *ctx __unused, struct snmp_value *value,
71122394Sharti    u_int sub, u_int iidx __unused, enum snmp_op op)
72122394Sharti{
73122394Sharti	struct mibifstack *stack;
74122394Sharti
75122394Sharti	switch (op) {
76122394Sharti
77122394Sharti	  case SNMP_OP_GETNEXT:
78122394Sharti		if ((stack = NEXT_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
79122394Sharti			return (SNMP_ERR_NOSUCHNAME);
80122394Sharti		index_append(&value->var, sub, &stack->index);
81122394Sharti		break;
82122394Sharti
83122394Sharti	  case SNMP_OP_GET:
84122394Sharti		if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
85122394Sharti			return (SNMP_ERR_NOSUCHNAME);
86122394Sharti		break;
87122394Sharti
88122394Sharti	  case SNMP_OP_SET:
89122394Sharti		if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL)
90122394Sharti			return (SNMP_ERR_NO_CREATION);
91122394Sharti		return (SNMP_ERR_NOT_WRITEABLE);
92122394Sharti
93122394Sharti	  case SNMP_OP_ROLLBACK:
94122394Sharti	  case SNMP_OP_COMMIT:
95122394Sharti		abort();
96122394Sharti	}
97122394Sharti
98122394Sharti	switch (value->var.subs[sub - 1]) {
99122394Sharti
100122394Sharti	  case LEAF_ifStackStatus:
101122394Sharti		value->v.integer = 1;
102122394Sharti		break;
103122394Sharti	}
104122394Sharti	return (SNMP_ERR_NOERROR);
105122394Sharti}
106