Deleted Added
full compact
bridge_port.c (165046) bridge_port.c (165253)
1/*-
2 * Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * Bridge MIB implementation for SNMPd.
27 * Bridge ports.
28 *
1/*-
2 * Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * Bridge MIB implementation for SNMPd.
27 * Bridge ports.
28 *
29 * $FreeBSD: head/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c 165046 2006-12-09 20:58:26Z syrinx $
29 * $FreeBSD: head/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c 165253 2006-12-15 20:01:57Z syrinx $
30 */
31
32#include <sys/queue.h>
33#include <sys/socket.h>
34#include <sys/types.h>
35
36#include <net/ethernet.h>
37#include <net/if.h>
38#include <net/if_mib.h>
39
40#include <assert.h>
41#include <errno.h>
42#include <stdarg.h>
43#include <string.h>
44#include <stdlib.h>
45#include <syslog.h>
46
47#include <bsnmp/snmpmod.h>
48#include <bsnmp/snmp_mibII.h>
49
50#include "bridge_tree.h"
51#include "bridge_snmp.h"
52
53TAILQ_HEAD(bridge_ports, bridge_port);
54
55/*
56 * Free the bridge base ports list.
57 */
58static void
59bridge_ports_free(struct bridge_ports *headp)
60{
61 struct bridge_port *bp;
62
63 while ((bp = TAILQ_FIRST(headp)) != NULL) {
64 TAILQ_REMOVE(headp, bp, b_p);
65 free(bp);
66 }
67}
68
69/*
70 * Free the bridge base ports from the base ports list,
71 * members of a specified bridge interface only.
72 */
73static void
74bridge_port_memif_free(struct bridge_ports *headp,
75 struct bridge_if *bif)
76{
77 struct bridge_port *bp;
78
79 while (bif->f_bp != NULL && bif->sysindex == bif->f_bp->sysindex) {
80 bp = TAILQ_NEXT(bif->f_bp, b_p);
81 TAILQ_REMOVE(headp, bif->f_bp, b_p);
82 free(bif->f_bp);
83 bif->f_bp = bp;
84 }
85}
86
87/*
88 * Insert a port entry in the base port TAILQ starting to search
89 * for its place from the position of the first bridge port for the bridge
90 * interface. Update the first bridge port if neccessary.
91 */
92static void
93bridge_port_insert_at(struct bridge_ports *headp,
94 struct bridge_port *bp, struct bridge_port **f_bp)
95{
96 struct bridge_port *t1;
97
98 assert(f_bp != NULL);
99
100 for (t1 = *f_bp;
101 t1 != NULL && bp->sysindex == t1->sysindex;
102 t1 = TAILQ_NEXT(t1, b_p)) {
103 if (bp->if_idx < t1->if_idx) {
104 TAILQ_INSERT_BEFORE(t1, bp, b_p);
105 if (*f_bp == t1)
106 *f_bp = bp;
107 return;
108 }
109 }
110
111 /*
112 * Handle the case when our first port was actually the
113 * last element of the TAILQ.
114 */
115 if (t1 == NULL)
116 TAILQ_INSERT_TAIL(headp, bp, b_p);
117 else
118 TAILQ_INSERT_BEFORE(t1, bp, b_p);
119}
120
121/*
122 * Find a port entry's possition in the ports list according
123 * to it's parent bridge interface name. Returns a NULL if
124 * we should be at the TAILQ head, otherwise the entry after
125 * which we should be inserted.
126 */
127static struct bridge_port *
128bridge_port_find_pos(struct bridge_ports *headp, uint32_t b_idx)
129{
130 uint32_t t_idx;
131 struct bridge_port *t1;
132
133 if ((t1 = TAILQ_FIRST(headp)) == NULL ||
134 bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
135 return (NULL);
136
137 t_idx = t1->sysindex;
138
139 for (t1 = TAILQ_NEXT(t1, b_p); t1 != NULL; t1 = TAILQ_NEXT(t1, b_p)) {
140 if (t1->sysindex != t_idx) {
141 if (bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
142 return (TAILQ_PREV(t1, bridge_ports, b_p));
143 else
144 t_idx = t1->sysindex;
145 }
146 }
147
148 if (t1 == NULL)
149 t1 = TAILQ_LAST(headp, bridge_ports);
150
151 return (t1);
152}
153
154/*
155 * Insert a bridge member interface in the ports TAILQ.
156 */
157static void
158bridge_port_memif_insert(struct bridge_ports *headp,
159 struct bridge_port *bp, struct bridge_port **f_bp)
160{
161 struct bridge_port *temp;
162
163 if (*f_bp != NULL)
164 bridge_port_insert_at(headp, bp, f_bp);
165 else {
166 temp = bridge_port_find_pos(headp, bp->sysindex);
167
168 if (temp == NULL)
169 TAILQ_INSERT_HEAD(headp, bp, b_p);
170 else
171 TAILQ_INSERT_AFTER(headp, temp, bp, b_p);
172 *f_bp = bp;
173 }
174}
175
176/* The global ports list. */
177static struct bridge_ports bridge_ports = TAILQ_HEAD_INITIALIZER(bridge_ports);
178static time_t ports_list_age;
179
180void
181bridge_ports_update_listage(void)
182{
183 ports_list_age = time(NULL);
184}
185
186void
187bridge_ports_fini(void)
188{
189 bridge_ports_free(&bridge_ports);
190}
191
192void
193bridge_members_free(struct bridge_if *bif)
194{
195 bridge_port_memif_free(&bridge_ports, bif);
196}
197
198/*
199 * Find the first port in the ports list.
200 */
201static struct bridge_port *
202bridge_port_first(void)
203{
204 return (TAILQ_FIRST(&bridge_ports));
205}
206
207/*
208 * Find the next port in the ports list.
209 */
210static struct bridge_port *
211bridge_port_next(struct bridge_port *bp)
212{
213 return (TAILQ_NEXT(bp, b_p));
214}
215
216/*
217 * Find the first member of the specified bridge interface.
218 */
219struct bridge_port *
220bridge_port_bif_first(struct bridge_if *bif)
221{
222 return (bif->f_bp);
223}
224
225/*
226 * Find the next member of the specified bridge interface.
227 */
228struct bridge_port *
229bridge_port_bif_next(struct bridge_port *bp)
230{
231 struct bridge_port *bp_next;
232
233 if ((bp_next = TAILQ_NEXT(bp, b_p)) == NULL ||
234 bp_next->sysindex != bp->sysindex)
235 return (NULL);
236
237 return (bp_next);
238}
239
240/*
241 * Remove a bridge port from the ports list.
242 */
243void
244bridge_port_remove(struct bridge_port *bp, struct bridge_if *bif)
245{
246 if (bif->f_bp == bp)
247 bif->f_bp = bridge_port_bif_next(bp);
248
249 TAILQ_REMOVE(&bridge_ports, bp, b_p);
250 free(bp);
251}
252
253/*
254 * Allocate memory for a new bridge port and insert it
255 * in the base ports list. Return a pointer to the port's
256 * structure in case we want to do anything else with it.
257 */
258struct bridge_port *
259bridge_new_port(struct mibif *mif, struct bridge_if *bif)
260{
261 struct bridge_port *bp;
262
263 if ((bp = (struct bridge_port *) malloc(sizeof(*bp))) == NULL) {
264 syslog(LOG_ERR, "bridge new member: failed: %s",
265 strerror(errno));
266 return (NULL);
267 }
268
269 bzero(bp, sizeof(*bp));
270
271 bp->sysindex = bif->sysindex;
272 bp->if_idx = mif->index;
273 bp->port_no = mif->sysindex;
274 strlcpy(bp->p_name, mif->name, IFNAMSIZ);
275 bp->circuit = oid_zeroDotZero;
276
277 /*
278 * Initialize all rstpMib specific values to false/default.
279 * These will be set to their true values later if the bridge
280 * supports RSTP.
281 */
282 bp->proto_migr = TruthValue_false;
283 bp->admin_edge = TruthValue_false;
284 bp->oper_edge = TruthValue_false;
285 bp->oper_p2p = TruthValue_false;
286 bp->admin_p2p = StpPortAdminPointToPointType_auto;
287
288 bridge_port_memif_insert(&bridge_ports, bp, &(bif->f_bp));
289
290 return (bp);
291}
292
293/*
294 * Update our info from the corresponding mibII interface info.
295 */
296void
297bridge_port_getinfo_mibif(struct mibif *m_if, struct bridge_port *bp)
298{
299 bp->max_info = m_if->mib.ifmd_data.ifi_mtu;
300 bp->in_frames = m_if->mib.ifmd_data.ifi_ipackets;
301 bp->out_frames = m_if->mib.ifmd_data.ifi_opackets;
302 bp->in_drops = m_if->mib.ifmd_data.ifi_iqdrops;
303}
304
305/*
306 * Find a port, whose SNMP's mibII ifIndex matches one of the ports,
307 * members of the specified bridge interface.
308 */
309struct bridge_port *
310bridge_port_find(int32_t if_idx, struct bridge_if *bif)
311{
312 struct bridge_port *bp;
313
314 for (bp = bif->f_bp; bp != NULL; bp = TAILQ_NEXT(bp, b_p)) {
315 if (bp->sysindex != bif->sysindex) {
316 bp = NULL;
317 break;
318 }
319
320 if (bp->if_idx == if_idx)
321 break;
322 }
323
324 return (bp);
325}
326
327void
328bridge_ports_dump(struct bridge_if *bif)
329{
330 struct bridge_port *bp;
331
332 for (bp = bridge_port_bif_first(bif); bp != NULL;
333 bp = bridge_port_bif_next(bp)) {
334 syslog(LOG_ERR, "memif - %s, index - %d",
335 bp->p_name, bp->port_no);
336 }
337}
338
339/*
340 * RFC4188 specifics.
341 */
342int
343op_dot1d_base_port(struct snmp_context *c __unused, struct snmp_value *val,
344 uint sub, uint iidx __unused, enum snmp_op op)
345{
346 struct bridge_if *bif;
347 struct bridge_port *bp;
348
349 if ((bif = bridge_get_default()) == NULL)
350 return (SNMP_ERR_NOSUCHNAME);
351
352 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
353 bridge_update_memif(bif) <= 0)
354 return (SNMP_ERR_NOSUCHNAME);
355
356 switch (op) {
357 case SNMP_OP_GET:
358 if (val->var.len - sub != 1)
359 return (SNMP_ERR_NOSUCHNAME);
360 if ((bp = bridge_port_find(val->var.subs[sub],
361 bif)) == NULL)
362 return (SNMP_ERR_NOSUCHNAME);
30 */
31
32#include <sys/queue.h>
33#include <sys/socket.h>
34#include <sys/types.h>
35
36#include <net/ethernet.h>
37#include <net/if.h>
38#include <net/if_mib.h>
39
40#include <assert.h>
41#include <errno.h>
42#include <stdarg.h>
43#include <string.h>
44#include <stdlib.h>
45#include <syslog.h>
46
47#include <bsnmp/snmpmod.h>
48#include <bsnmp/snmp_mibII.h>
49
50#include "bridge_tree.h"
51#include "bridge_snmp.h"
52
53TAILQ_HEAD(bridge_ports, bridge_port);
54
55/*
56 * Free the bridge base ports list.
57 */
58static void
59bridge_ports_free(struct bridge_ports *headp)
60{
61 struct bridge_port *bp;
62
63 while ((bp = TAILQ_FIRST(headp)) != NULL) {
64 TAILQ_REMOVE(headp, bp, b_p);
65 free(bp);
66 }
67}
68
69/*
70 * Free the bridge base ports from the base ports list,
71 * members of a specified bridge interface only.
72 */
73static void
74bridge_port_memif_free(struct bridge_ports *headp,
75 struct bridge_if *bif)
76{
77 struct bridge_port *bp;
78
79 while (bif->f_bp != NULL && bif->sysindex == bif->f_bp->sysindex) {
80 bp = TAILQ_NEXT(bif->f_bp, b_p);
81 TAILQ_REMOVE(headp, bif->f_bp, b_p);
82 free(bif->f_bp);
83 bif->f_bp = bp;
84 }
85}
86
87/*
88 * Insert a port entry in the base port TAILQ starting to search
89 * for its place from the position of the first bridge port for the bridge
90 * interface. Update the first bridge port if neccessary.
91 */
92static void
93bridge_port_insert_at(struct bridge_ports *headp,
94 struct bridge_port *bp, struct bridge_port **f_bp)
95{
96 struct bridge_port *t1;
97
98 assert(f_bp != NULL);
99
100 for (t1 = *f_bp;
101 t1 != NULL && bp->sysindex == t1->sysindex;
102 t1 = TAILQ_NEXT(t1, b_p)) {
103 if (bp->if_idx < t1->if_idx) {
104 TAILQ_INSERT_BEFORE(t1, bp, b_p);
105 if (*f_bp == t1)
106 *f_bp = bp;
107 return;
108 }
109 }
110
111 /*
112 * Handle the case when our first port was actually the
113 * last element of the TAILQ.
114 */
115 if (t1 == NULL)
116 TAILQ_INSERT_TAIL(headp, bp, b_p);
117 else
118 TAILQ_INSERT_BEFORE(t1, bp, b_p);
119}
120
121/*
122 * Find a port entry's possition in the ports list according
123 * to it's parent bridge interface name. Returns a NULL if
124 * we should be at the TAILQ head, otherwise the entry after
125 * which we should be inserted.
126 */
127static struct bridge_port *
128bridge_port_find_pos(struct bridge_ports *headp, uint32_t b_idx)
129{
130 uint32_t t_idx;
131 struct bridge_port *t1;
132
133 if ((t1 = TAILQ_FIRST(headp)) == NULL ||
134 bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
135 return (NULL);
136
137 t_idx = t1->sysindex;
138
139 for (t1 = TAILQ_NEXT(t1, b_p); t1 != NULL; t1 = TAILQ_NEXT(t1, b_p)) {
140 if (t1->sysindex != t_idx) {
141 if (bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
142 return (TAILQ_PREV(t1, bridge_ports, b_p));
143 else
144 t_idx = t1->sysindex;
145 }
146 }
147
148 if (t1 == NULL)
149 t1 = TAILQ_LAST(headp, bridge_ports);
150
151 return (t1);
152}
153
154/*
155 * Insert a bridge member interface in the ports TAILQ.
156 */
157static void
158bridge_port_memif_insert(struct bridge_ports *headp,
159 struct bridge_port *bp, struct bridge_port **f_bp)
160{
161 struct bridge_port *temp;
162
163 if (*f_bp != NULL)
164 bridge_port_insert_at(headp, bp, f_bp);
165 else {
166 temp = bridge_port_find_pos(headp, bp->sysindex);
167
168 if (temp == NULL)
169 TAILQ_INSERT_HEAD(headp, bp, b_p);
170 else
171 TAILQ_INSERT_AFTER(headp, temp, bp, b_p);
172 *f_bp = bp;
173 }
174}
175
176/* The global ports list. */
177static struct bridge_ports bridge_ports = TAILQ_HEAD_INITIALIZER(bridge_ports);
178static time_t ports_list_age;
179
180void
181bridge_ports_update_listage(void)
182{
183 ports_list_age = time(NULL);
184}
185
186void
187bridge_ports_fini(void)
188{
189 bridge_ports_free(&bridge_ports);
190}
191
192void
193bridge_members_free(struct bridge_if *bif)
194{
195 bridge_port_memif_free(&bridge_ports, bif);
196}
197
198/*
199 * Find the first port in the ports list.
200 */
201static struct bridge_port *
202bridge_port_first(void)
203{
204 return (TAILQ_FIRST(&bridge_ports));
205}
206
207/*
208 * Find the next port in the ports list.
209 */
210static struct bridge_port *
211bridge_port_next(struct bridge_port *bp)
212{
213 return (TAILQ_NEXT(bp, b_p));
214}
215
216/*
217 * Find the first member of the specified bridge interface.
218 */
219struct bridge_port *
220bridge_port_bif_first(struct bridge_if *bif)
221{
222 return (bif->f_bp);
223}
224
225/*
226 * Find the next member of the specified bridge interface.
227 */
228struct bridge_port *
229bridge_port_bif_next(struct bridge_port *bp)
230{
231 struct bridge_port *bp_next;
232
233 if ((bp_next = TAILQ_NEXT(bp, b_p)) == NULL ||
234 bp_next->sysindex != bp->sysindex)
235 return (NULL);
236
237 return (bp_next);
238}
239
240/*
241 * Remove a bridge port from the ports list.
242 */
243void
244bridge_port_remove(struct bridge_port *bp, struct bridge_if *bif)
245{
246 if (bif->f_bp == bp)
247 bif->f_bp = bridge_port_bif_next(bp);
248
249 TAILQ_REMOVE(&bridge_ports, bp, b_p);
250 free(bp);
251}
252
253/*
254 * Allocate memory for a new bridge port and insert it
255 * in the base ports list. Return a pointer to the port's
256 * structure in case we want to do anything else with it.
257 */
258struct bridge_port *
259bridge_new_port(struct mibif *mif, struct bridge_if *bif)
260{
261 struct bridge_port *bp;
262
263 if ((bp = (struct bridge_port *) malloc(sizeof(*bp))) == NULL) {
264 syslog(LOG_ERR, "bridge new member: failed: %s",
265 strerror(errno));
266 return (NULL);
267 }
268
269 bzero(bp, sizeof(*bp));
270
271 bp->sysindex = bif->sysindex;
272 bp->if_idx = mif->index;
273 bp->port_no = mif->sysindex;
274 strlcpy(bp->p_name, mif->name, IFNAMSIZ);
275 bp->circuit = oid_zeroDotZero;
276
277 /*
278 * Initialize all rstpMib specific values to false/default.
279 * These will be set to their true values later if the bridge
280 * supports RSTP.
281 */
282 bp->proto_migr = TruthValue_false;
283 bp->admin_edge = TruthValue_false;
284 bp->oper_edge = TruthValue_false;
285 bp->oper_p2p = TruthValue_false;
286 bp->admin_p2p = StpPortAdminPointToPointType_auto;
287
288 bridge_port_memif_insert(&bridge_ports, bp, &(bif->f_bp));
289
290 return (bp);
291}
292
293/*
294 * Update our info from the corresponding mibII interface info.
295 */
296void
297bridge_port_getinfo_mibif(struct mibif *m_if, struct bridge_port *bp)
298{
299 bp->max_info = m_if->mib.ifmd_data.ifi_mtu;
300 bp->in_frames = m_if->mib.ifmd_data.ifi_ipackets;
301 bp->out_frames = m_if->mib.ifmd_data.ifi_opackets;
302 bp->in_drops = m_if->mib.ifmd_data.ifi_iqdrops;
303}
304
305/*
306 * Find a port, whose SNMP's mibII ifIndex matches one of the ports,
307 * members of the specified bridge interface.
308 */
309struct bridge_port *
310bridge_port_find(int32_t if_idx, struct bridge_if *bif)
311{
312 struct bridge_port *bp;
313
314 for (bp = bif->f_bp; bp != NULL; bp = TAILQ_NEXT(bp, b_p)) {
315 if (bp->sysindex != bif->sysindex) {
316 bp = NULL;
317 break;
318 }
319
320 if (bp->if_idx == if_idx)
321 break;
322 }
323
324 return (bp);
325}
326
327void
328bridge_ports_dump(struct bridge_if *bif)
329{
330 struct bridge_port *bp;
331
332 for (bp = bridge_port_bif_first(bif); bp != NULL;
333 bp = bridge_port_bif_next(bp)) {
334 syslog(LOG_ERR, "memif - %s, index - %d",
335 bp->p_name, bp->port_no);
336 }
337}
338
339/*
340 * RFC4188 specifics.
341 */
342int
343op_dot1d_base_port(struct snmp_context *c __unused, struct snmp_value *val,
344 uint sub, uint iidx __unused, enum snmp_op op)
345{
346 struct bridge_if *bif;
347 struct bridge_port *bp;
348
349 if ((bif = bridge_get_default()) == NULL)
350 return (SNMP_ERR_NOSUCHNAME);
351
352 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
353 bridge_update_memif(bif) <= 0)
354 return (SNMP_ERR_NOSUCHNAME);
355
356 switch (op) {
357 case SNMP_OP_GET:
358 if (val->var.len - sub != 1)
359 return (SNMP_ERR_NOSUCHNAME);
360 if ((bp = bridge_port_find(val->var.subs[sub],
361 bif)) == NULL)
362 return (SNMP_ERR_NOSUCHNAME);
363 break;
363 goto get;
364
365 case SNMP_OP_GETNEXT:
366 if (val->var.len - sub == 0) {
367 if ((bp = bridge_port_bif_first(bif)) == NULL)
368 return (SNMP_ERR_NOSUCHNAME);
369 } else {
370 if ((bp = bridge_port_find(val->var.subs[sub],
371 bif)) == NULL ||
372 (bp = bridge_port_bif_next(bp)) == NULL)
373 return (SNMP_ERR_NOSUCHNAME);
374 }
375 val->var.len = sub + 1;
376 val->var.subs[sub] = bp->port_no;
364
365 case SNMP_OP_GETNEXT:
366 if (val->var.len - sub == 0) {
367 if ((bp = bridge_port_bif_first(bif)) == NULL)
368 return (SNMP_ERR_NOSUCHNAME);
369 } else {
370 if ((bp = bridge_port_find(val->var.subs[sub],
371 bif)) == NULL ||
372 (bp = bridge_port_bif_next(bp)) == NULL)
373 return (SNMP_ERR_NOSUCHNAME);
374 }
375 val->var.len = sub + 1;
376 val->var.subs[sub] = bp->port_no;
377 break;
377 goto get;
378
379 case SNMP_OP_SET:
380 return (SNMP_ERR_NOT_WRITEABLE);
381
382 case SNMP_OP_ROLLBACK:
383 case SNMP_OP_COMMIT:
378
379 case SNMP_OP_SET:
380 return (SNMP_ERR_NOT_WRITEABLE);
381
382 case SNMP_OP_ROLLBACK:
383 case SNMP_OP_COMMIT:
384 default:
385 abort();
384 break;
386 }
385 }
386 abort();
387
387
388get:
388 switch (val->var.subs[sub - 1]) {
389 case LEAF_dot1dBasePort:
390 val->v.integer = bp->port_no;
389 switch (val->var.subs[sub - 1]) {
390 case LEAF_dot1dBasePort:
391 val->v.integer = bp->port_no;
391 break;
392 return (SNMP_ERR_NOERROR);
393
392 case LEAF_dot1dBasePortIfIndex:
393 val->v.integer = bp->if_idx;
394 case LEAF_dot1dBasePortIfIndex:
395 val->v.integer = bp->if_idx;
394 break;
396 return (SNMP_ERR_NOERROR);
397
395 case LEAF_dot1dBasePortCircuit:
396 val->v.oid = bp->circuit;
398 case LEAF_dot1dBasePortCircuit:
399 val->v.oid = bp->circuit;
397 break;
400 return (SNMP_ERR_NOERROR);
401
398 case LEAF_dot1dBasePortDelayExceededDiscards:
399 val->v.uint32 = bp->dly_ex_drops;
402 case LEAF_dot1dBasePortDelayExceededDiscards:
403 val->v.uint32 = bp->dly_ex_drops;
400 break;
404 return (SNMP_ERR_NOERROR);
405
401 case LEAF_dot1dBasePortMtuExceededDiscards:
402 val->v.uint32 = bp->dly_mtu_drops;
406 case LEAF_dot1dBasePortMtuExceededDiscards:
407 val->v.uint32 = bp->dly_mtu_drops;
403 break;
408 return (SNMP_ERR_NOERROR);
404 }
405
409 }
410
406 return (SNMP_ERR_NOERROR);
411 abort();
407}
408
409int
410op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
411 uint sub, uint iidx __unused, enum snmp_op op)
412{
412}
413
414int
415op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
416 uint sub, uint iidx __unused, enum snmp_op op)
417{
413 int ret;
414 struct bridge_if *bif;
415 struct bridge_port *bp;
416
417 if ((bif = bridge_get_default()) == NULL)
418 return (SNMP_ERR_NOSUCHNAME);
419
420 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
421 bridge_update_memif(bif) <= 0)
422 return (SNMP_ERR_NOSUCHNAME);
423
424 switch (op) {
425 case SNMP_OP_GET:
426 if (val->var.len - sub != 1)
427 return (SNMP_ERR_NOSUCHNAME);
428 if ((bp = bridge_port_find(val->var.subs[sub],
429 bif)) == NULL)
430 return (SNMP_ERR_NOSUCHNAME);
418 struct bridge_if *bif;
419 struct bridge_port *bp;
420
421 if ((bif = bridge_get_default()) == NULL)
422 return (SNMP_ERR_NOSUCHNAME);
423
424 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
425 bridge_update_memif(bif) <= 0)
426 return (SNMP_ERR_NOSUCHNAME);
427
428 switch (op) {
429 case SNMP_OP_GET:
430 if (val->var.len - sub != 1)
431 return (SNMP_ERR_NOSUCHNAME);
432 if ((bp = bridge_port_find(val->var.subs[sub],
433 bif)) == NULL)
434 return (SNMP_ERR_NOSUCHNAME);
431 break;
435 goto get;
432
433 case SNMP_OP_GETNEXT:
434 if (val->var.len - sub == 0) {
435 if ((bp = bridge_port_bif_first(bif)) == NULL)
436 return (SNMP_ERR_NOSUCHNAME);
437 } else {
438 if ((bp = bridge_port_find(val->var.subs[sub],
439 bif)) == NULL ||
440 (bp = bridge_port_bif_next(bp)) == NULL)
441 return (SNMP_ERR_NOSUCHNAME);
442 }
443 val->var.len = sub + 1;
444 val->var.subs[sub] = bp->port_no;
436
437 case SNMP_OP_GETNEXT:
438 if (val->var.len - sub == 0) {
439 if ((bp = bridge_port_bif_first(bif)) == NULL)
440 return (SNMP_ERR_NOSUCHNAME);
441 } else {
442 if ((bp = bridge_port_find(val->var.subs[sub],
443 bif)) == NULL ||
444 (bp = bridge_port_bif_next(bp)) == NULL)
445 return (SNMP_ERR_NOSUCHNAME);
446 }
447 val->var.len = sub + 1;
448 val->var.subs[sub] = bp->port_no;
445 break;
449 goto get;
446
447 case SNMP_OP_SET:
448 if (val->var.len - sub != 1)
449 return (SNMP_ERR_NOSUCHNAME);
450 if ((bp = bridge_port_find(val->var.subs[sub],
451 bif)) == NULL)
452 return (SNMP_ERR_NOSUCHNAME);
453
454 switch (val->var.subs[sub - 1]) {
455 case LEAF_dot1dStpPortPriority:
450
451 case SNMP_OP_SET:
452 if (val->var.len - sub != 1)
453 return (SNMP_ERR_NOSUCHNAME);
454 if ((bp = bridge_port_find(val->var.subs[sub],
455 bif)) == NULL)
456 return (SNMP_ERR_NOSUCHNAME);
457
458 switch (val->var.subs[sub - 1]) {
459 case LEAF_dot1dStpPortPriority:
460 if (val->v.integer < 0 || val->v.integer > 255)
461 return (SNMP_ERR_WRONG_VALUE);
462
456 ctx->scratch->int1 = bp->priority;
463 ctx->scratch->int1 = bp->priority;
457 ret = bridge_port_set_priority(bif->bif_name, bp,
458 val->v.integer);
459 break;
464 if (bridge_port_set_priority(bif->bif_name, bp,
465 val->v.integer) < 0)
466 return (SNMP_ERR_GENERR);
467 return (SNMP_ERR_NOERROR);
468
460 case LEAF_dot1dStpPortEnable:
469 case LEAF_dot1dStpPortEnable:
470 if (val->v.integer != dot1dStpPortEnable_enabled &&
471 val->v.integer != dot1dStpPortEnable_disabled)
472 return (SNMP_ERR_WRONG_VALUE);
473
461 ctx->scratch->int1 = bp->enable;
474 ctx->scratch->int1 = bp->enable;
462 ret = bridge_port_set_stp_enable(bif->bif_name,
463 bp, val->v.integer);
464 break;
475 if (bridge_port_set_stp_enable(bif->bif_name,
476 bp, val->v.integer) < 0)
477 return (SNMP_ERR_GENERR);
478 return (SNMP_ERR_NOERROR);
479
465 case LEAF_dot1dStpPortPathCost:
480 case LEAF_dot1dStpPortPathCost:
481 if (val->v.integer < SNMP_PORT_MIN_PATHCOST ||
482 val->v.integer > SNMP_PORT_MAX_PATHCOST)
483 return (SNMP_ERR_WRONG_VALUE);
484
466 ctx->scratch->int1 = bp->path_cost;
485 ctx->scratch->int1 = bp->path_cost;
467 ret = bridge_port_set_path_cost(bif->bif_name, bp,
468 val->v.integer);
469 break;
486 if (bridge_port_set_path_cost(bif->bif_name, bp,
487 val->v.integer) < 0)
488 return (SNMP_ERR_GENERR);
489 return (SNMP_ERR_NOERROR);
490
470 case LEAF_dot1dStpPort:
471 case LEAF_dot1dStpPortState:
472 case LEAF_dot1dStpPortDesignatedRoot:
473 case LEAF_dot1dStpPortDesignatedCost:
474 case LEAF_dot1dStpPortDesignatedBridge:
475 case LEAF_dot1dStpPortDesignatedPort:
476 case LEAF_dot1dStpPortForwardTransitions:
477 return (SNMP_ERR_NOT_WRITEABLE);
491 case LEAF_dot1dStpPort:
492 case LEAF_dot1dStpPortState:
493 case LEAF_dot1dStpPortDesignatedRoot:
494 case LEAF_dot1dStpPortDesignatedCost:
495 case LEAF_dot1dStpPortDesignatedBridge:
496 case LEAF_dot1dStpPortDesignatedPort:
497 case LEAF_dot1dStpPortForwardTransitions:
498 return (SNMP_ERR_NOT_WRITEABLE);
478 default:
479 return (SNMP_ERR_NOSUCHNAME);
480 }
499 }
481 if (ret == 0)
482 return (SNMP_ERR_NOERROR);
483 else if (ret == -2)
484 return (SNMP_ERR_WRONG_VALUE);
485 return (SNMP_ERR_GENERR);
500 abort();
486
487 case SNMP_OP_ROLLBACK:
488 if ((bp = bridge_port_find(val->var.subs[sub],
489 bif)) == NULL)
490 return (SNMP_ERR_GENERR);
491 switch (val->var.subs[sub - 1]) {
492 case LEAF_dot1dStpPortPriority:
493 bridge_port_set_priority(bif->bif_name, bp,
494 ctx->scratch->int1);
495 break;
496 case LEAF_dot1dStpPortEnable:
497 bridge_port_set_stp_enable(bif->bif_name, bp,
498 ctx->scratch->int1);
499 break;
500 case LEAF_dot1dStpPortPathCost:
501 bridge_port_set_path_cost(bif->bif_name, bp,
502 ctx->scratch->int1);
503 break;
504 }
505 return (SNMP_ERR_NOERROR);
506
507 case SNMP_OP_COMMIT:
508 return (SNMP_ERR_NOERROR);
501
502 case SNMP_OP_ROLLBACK:
503 if ((bp = bridge_port_find(val->var.subs[sub],
504 bif)) == NULL)
505 return (SNMP_ERR_GENERR);
506 switch (val->var.subs[sub - 1]) {
507 case LEAF_dot1dStpPortPriority:
508 bridge_port_set_priority(bif->bif_name, bp,
509 ctx->scratch->int1);
510 break;
511 case LEAF_dot1dStpPortEnable:
512 bridge_port_set_stp_enable(bif->bif_name, bp,
513 ctx->scratch->int1);
514 break;
515 case LEAF_dot1dStpPortPathCost:
516 bridge_port_set_path_cost(bif->bif_name, bp,
517 ctx->scratch->int1);
518 break;
519 }
520 return (SNMP_ERR_NOERROR);
521
522 case SNMP_OP_COMMIT:
523 return (SNMP_ERR_NOERROR);
509
510 default:
511 abort();
512 }
524 }
525 abort();
513
526
514 ret = SNMP_ERR_NOERROR;
527get:
515 switch (val->var.subs[sub - 1]) {
516 case LEAF_dot1dStpPort:
517 val->v.integer = bp->port_no;
528 switch (val->var.subs[sub - 1]) {
529 case LEAF_dot1dStpPort:
530 val->v.integer = bp->port_no;
518 break;
531 return (SNMP_ERR_NOERROR);
532
519 case LEAF_dot1dStpPortPriority:
520 val->v.integer = bp->priority;
533 case LEAF_dot1dStpPortPriority:
534 val->v.integer = bp->priority;
521 break;
535 return (SNMP_ERR_NOERROR);
536
522 case LEAF_dot1dStpPortState:
523 val->v.integer = bp->state;
537 case LEAF_dot1dStpPortState:
538 val->v.integer = bp->state;
524 break;
539 return (SNMP_ERR_NOERROR);
540
525 case LEAF_dot1dStpPortEnable:
526 val->v.integer = bp->enable;
541 case LEAF_dot1dStpPortEnable:
542 val->v.integer = bp->enable;
527 break;
543 return (SNMP_ERR_NOERROR);
544
528 case LEAF_dot1dStpPortPathCost:
529 val->v.integer = bp->path_cost;
545 case LEAF_dot1dStpPortPathCost:
546 val->v.integer = bp->path_cost;
530 break;
547 return (SNMP_ERR_NOERROR);
548
531 case LEAF_dot1dStpPortDesignatedRoot:
549 case LEAF_dot1dStpPortDesignatedRoot:
532 ret = string_get(val, bp->design_root,
533 SNMP_BRIDGE_ID_LEN);
534 break;
550 return (string_get(val, bp->design_root,
551 SNMP_BRIDGE_ID_LEN));
552
535 case LEAF_dot1dStpPortDesignatedCost:
536 val->v.integer = bp->design_cost;
553 case LEAF_dot1dStpPortDesignatedCost:
554 val->v.integer = bp->design_cost;
537 break;
555 return (SNMP_ERR_NOERROR);
556
538 case LEAF_dot1dStpPortDesignatedBridge:
557 case LEAF_dot1dStpPortDesignatedBridge:
539 ret = string_get(val, bp->design_bridge,
540 SNMP_BRIDGE_ID_LEN);
541 break;
558 return (string_get(val, bp->design_bridge,
559 SNMP_BRIDGE_ID_LEN));
560
542 case LEAF_dot1dStpPortDesignatedPort:
561 case LEAF_dot1dStpPortDesignatedPort:
543 ret = string_get(val, bp->design_port, 2);
544 break;
562 return (string_get(val, bp->design_port, 2));
563
545 case LEAF_dot1dStpPortForwardTransitions:
546 val->v.uint32 = bp->fwd_trans;
564 case LEAF_dot1dStpPortForwardTransitions:
565 val->v.uint32 = bp->fwd_trans;
547 break;
566 return (SNMP_ERR_NOERROR);
548 }
549
567 }
568
550 return (ret);
569 abort();
551}
552
553int
554op_dot1d_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
555 uint sub, uint iidx __unused, enum snmp_op op)
556{
570}
571
572int
573op_dot1d_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
574 uint sub, uint iidx __unused, enum snmp_op op)
575{
557 int ret;
558 struct bridge_if *bif;
559 struct bridge_port *bp;
560
561 if ((bif = bridge_get_default()) == NULL)
562 return (SNMP_ERR_NOSUCHNAME);
563
564 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
565 bridge_update_memif(bif) <= 0)
566 return (SNMP_ERR_NOSUCHNAME);
567
568 switch (op) {
569 case SNMP_OP_GET:
570 if (val->var.len - sub != 1)
571 return (SNMP_ERR_NOSUCHNAME);
572 if ((bp = bridge_port_find(val->var.subs[sub],
573 bif)) == NULL)
574 return (SNMP_ERR_NOSUCHNAME);
576 struct bridge_if *bif;
577 struct bridge_port *bp;
578
579 if ((bif = bridge_get_default()) == NULL)
580 return (SNMP_ERR_NOSUCHNAME);
581
582 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
583 bridge_update_memif(bif) <= 0)
584 return (SNMP_ERR_NOSUCHNAME);
585
586 switch (op) {
587 case SNMP_OP_GET:
588 if (val->var.len - sub != 1)
589 return (SNMP_ERR_NOSUCHNAME);
590 if ((bp = bridge_port_find(val->var.subs[sub],
591 bif)) == NULL)
592 return (SNMP_ERR_NOSUCHNAME);
575 break;
593 goto get;
576
577 case SNMP_OP_GETNEXT:
578 if (val->var.len - sub == 0) {
579 if ((bp = bridge_port_bif_first(bif)) == NULL)
580 return (SNMP_ERR_NOSUCHNAME);
581 } else {
582 if ((bp = bridge_port_find(val->var.subs[sub],
583 bif)) == NULL ||
584 (bp = bridge_port_bif_next(bp)) == NULL)
585 return (SNMP_ERR_NOSUCHNAME);
586 }
587 val->var.len = sub + 1;
588 val->var.subs[sub] = bp->port_no;
594
595 case SNMP_OP_GETNEXT:
596 if (val->var.len - sub == 0) {
597 if ((bp = bridge_port_bif_first(bif)) == NULL)
598 return (SNMP_ERR_NOSUCHNAME);
599 } else {
600 if ((bp = bridge_port_find(val->var.subs[sub],
601 bif)) == NULL ||
602 (bp = bridge_port_bif_next(bp)) == NULL)
603 return (SNMP_ERR_NOSUCHNAME);
604 }
605 val->var.len = sub + 1;
606 val->var.subs[sub] = bp->port_no;
589 break;
607 goto get;
590
591 case SNMP_OP_SET:
592 if (val->var.len - sub != 1)
593 return (SNMP_ERR_NOSUCHNAME);
594 if ((bp = bridge_port_find(val->var.subs[sub],
595 bif)) == NULL)
596 return (SNMP_ERR_NOSUCHNAME);
597
598 switch (val->var.subs[sub - 1]) {
599 case LEAF_dot1dStpPortAdminEdgePort:
608
609 case SNMP_OP_SET:
610 if (val->var.len - sub != 1)
611 return (SNMP_ERR_NOSUCHNAME);
612 if ((bp = bridge_port_find(val->var.subs[sub],
613 bif)) == NULL)
614 return (SNMP_ERR_NOSUCHNAME);
615
616 switch (val->var.subs[sub - 1]) {
617 case LEAF_dot1dStpPortAdminEdgePort:
618 if (val->v.integer != TruthValue_true &&
619 val->v.integer != TruthValue_false)
620 return (SNMP_ERR_WRONG_VALUE);
621
600 ctx->scratch->int1 = bp->admin_edge;
622 ctx->scratch->int1 = bp->admin_edge;
601 ret = bridge_port_set_admin_edge(bif->bif_name, bp,
602 val->v.integer);
603 break;
623 if (bridge_port_set_admin_edge(bif->bif_name, bp,
624 val->v.integer) < 0)
625 return (SNMP_ERR_GENERR);
626 return (SNMP_ERR_NOERROR);
627
604 case LEAF_dot1dStpPortAdminPointToPoint:
628 case LEAF_dot1dStpPortAdminPointToPoint:
629 if (val->v.integer < 0 || val->v.integer >
630 StpPortAdminPointToPointType_auto)
631 return (SNMP_ERR_WRONG_VALUE);
632
605 ctx->scratch->int1 = bp->admin_p2p;
633 ctx->scratch->int1 = bp->admin_p2p;
606 ret = bridge_port_set_admin_p2p(bif->bif_name, bp,
607 val->v.integer);
608 break;
634 if (bridge_port_set_admin_p2p(bif->bif_name, bp,
635 val->v.integer) < 0)
636 return (SNMP_ERR_GENERR);
637 return (SNMP_ERR_NOERROR);
638
609 case LEAF_dot1dStpPortAdminPathCost:
639 case LEAF_dot1dStpPortAdminPathCost:
640 if (val->v.integer < SNMP_PORT_MIN_PATHCOST ||
641 val->v.integer > SNMP_PORT_MAX_PATHCOST)
642 return (SNMP_ERR_WRONG_VALUE);
643
610 ctx->scratch->int1 = bp->admin_path_cost;
644 ctx->scratch->int1 = bp->admin_path_cost;
611 ret = bridge_port_set_path_cost(bif->bif_name, bp,
612 val->v.integer);
613 break;
645 if (bridge_port_set_path_cost(bif->bif_name, bp,
646 val->v.integer) < 0)
647 return (SNMP_ERR_GENERR);
648 return (SNMP_ERR_NOERROR);
649
614 case LEAF_dot1dStpPortProtocolMigration:
615 case LEAF_dot1dStpPortOperEdgePort:
616 case LEAF_dot1dStpPortOperPointToPoint:
617 return (SNMP_ERR_NOT_WRITEABLE);
650 case LEAF_dot1dStpPortProtocolMigration:
651 case LEAF_dot1dStpPortOperEdgePort:
652 case LEAF_dot1dStpPortOperPointToPoint:
653 return (SNMP_ERR_NOT_WRITEABLE);
618 default:
619 return (SNMP_ERR_NOSUCHNAME);
620 }
654 }
655 abort();
621
656
622 if (ret == 0)
623 return (SNMP_ERR_NOERROR);
624 else if (ret == -2)
625 return (SNMP_ERR_WRONG_VALUE);
626 return (SNMP_ERR_GENERR);
627
628 case SNMP_OP_ROLLBACK:
629 if ((bp = bridge_port_find(val->var.subs[sub],
630 bif)) == NULL)
631 return (SNMP_ERR_GENERR);
632
633 switch (val->var.subs[sub - 1]) {
634 case LEAF_dot1dStpPortAdminEdgePort:
635 bridge_port_set_admin_edge(bif->bif_name, bp,
636 ctx->scratch->int1);
637 break;
638 case LEAF_dot1dStpPortAdminPointToPoint:
639 bridge_port_set_admin_p2p(bif->bif_name, bp,
640 ctx->scratch->int1);
641 break;
642 case LEAF_dot1dStpPortAdminPathCost:
643 bridge_port_set_path_cost(bif->bif_name, bp,
644 ctx->scratch->int1);
645 break;
646 }
647 return (SNMP_ERR_NOERROR);
648
649 case SNMP_OP_COMMIT:
650 return (SNMP_ERR_NOERROR);
657 case SNMP_OP_ROLLBACK:
658 if ((bp = bridge_port_find(val->var.subs[sub],
659 bif)) == NULL)
660 return (SNMP_ERR_GENERR);
661
662 switch (val->var.subs[sub - 1]) {
663 case LEAF_dot1dStpPortAdminEdgePort:
664 bridge_port_set_admin_edge(bif->bif_name, bp,
665 ctx->scratch->int1);
666 break;
667 case LEAF_dot1dStpPortAdminPointToPoint:
668 bridge_port_set_admin_p2p(bif->bif_name, bp,
669 ctx->scratch->int1);
670 break;
671 case LEAF_dot1dStpPortAdminPathCost:
672 bridge_port_set_path_cost(bif->bif_name, bp,
673 ctx->scratch->int1);
674 break;
675 }
676 return (SNMP_ERR_NOERROR);
677
678 case SNMP_OP_COMMIT:
679 return (SNMP_ERR_NOERROR);
651
652 default:
653 abort();
654 }
680 }
681 abort();
655
682
683get:
656 switch (val->var.subs[sub - 1]) {
657 case LEAF_dot1dStpPortProtocolMigration:
658 val->v.integer = bp->proto_migr;
684 switch (val->var.subs[sub - 1]) {
685 case LEAF_dot1dStpPortProtocolMigration:
686 val->v.integer = bp->proto_migr;
659 break;
687 return (SNMP_ERR_NOERROR);
688
660 case LEAF_dot1dStpPortAdminEdgePort:
661 val->v.integer = bp->admin_edge;
689 case LEAF_dot1dStpPortAdminEdgePort:
690 val->v.integer = bp->admin_edge;
662 break;
691 return (SNMP_ERR_NOERROR);
692
663 case LEAF_dot1dStpPortOperEdgePort:
664 val->v.integer = bp->oper_edge;
693 case LEAF_dot1dStpPortOperEdgePort:
694 val->v.integer = bp->oper_edge;
665 break;
695 return (SNMP_ERR_NOERROR);
696
666 case LEAF_dot1dStpPortAdminPointToPoint:
667 val->v.integer = bp->admin_p2p;
697 case LEAF_dot1dStpPortAdminPointToPoint:
698 val->v.integer = bp->admin_p2p;
668 break;
699 return (SNMP_ERR_NOERROR);
700
669 case LEAF_dot1dStpPortOperPointToPoint:
670 val->v.integer = bp->oper_p2p;
701 case LEAF_dot1dStpPortOperPointToPoint:
702 val->v.integer = bp->oper_p2p;
671 break;
703 return (SNMP_ERR_NOERROR);
704
672 case LEAF_dot1dStpPortAdminPathCost:
673 val->v.integer = bp->admin_path_cost;
705 case LEAF_dot1dStpPortAdminPathCost:
706 val->v.integer = bp->admin_path_cost;
674 break;
707 return (SNMP_ERR_NOERROR);
675 }
676
708 }
709
677 return (SNMP_ERR_NOERROR);
710 abort();
678}
679
680int
681op_dot1d_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
682 uint sub, uint iidx __unused, enum snmp_op op)
683{
684 struct bridge_if *bif;
685 struct bridge_port *bp;
686
687 if ((bif = bridge_get_default()) == NULL)
688 return (SNMP_ERR_NOSUCHNAME);
689
690 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
691 bridge_update_memif(bif) <= 0)
692 return (SNMP_ERR_NOSUCHNAME);
693
694 switch (op) {
695 case SNMP_OP_GET:
696 if (val->var.len - sub != 1)
697 return (SNMP_ERR_NOSUCHNAME);
698 if ((bp = bridge_port_find(val->var.subs[sub],
699 bif)) == NULL)
700 return (SNMP_ERR_NOSUCHNAME);
711}
712
713int
714op_dot1d_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
715 uint sub, uint iidx __unused, enum snmp_op op)
716{
717 struct bridge_if *bif;
718 struct bridge_port *bp;
719
720 if ((bif = bridge_get_default()) == NULL)
721 return (SNMP_ERR_NOSUCHNAME);
722
723 if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
724 bridge_update_memif(bif) <= 0)
725 return (SNMP_ERR_NOSUCHNAME);
726
727 switch (op) {
728 case SNMP_OP_GET:
729 if (val->var.len - sub != 1)
730 return (SNMP_ERR_NOSUCHNAME);
731 if ((bp = bridge_port_find(val->var.subs[sub],
732 bif)) == NULL)
733 return (SNMP_ERR_NOSUCHNAME);
701 break;
734 goto get;
702
703 case SNMP_OP_GETNEXT:
704 if (val->var.len - sub == 0) {
705 if ((bp = bridge_port_bif_first(bif)) == NULL)
706 return (SNMP_ERR_NOSUCHNAME);
707 } else {
708 if ((bp = bridge_port_find(val->var.subs[sub],
709 bif)) == NULL ||
710 (bp = bridge_port_bif_next(bp)) == NULL)
711 return (SNMP_ERR_NOSUCHNAME);
712 }
713 val->var.len = sub + 1;
714 val->var.subs[sub] = bp->port_no;
735
736 case SNMP_OP_GETNEXT:
737 if (val->var.len - sub == 0) {
738 if ((bp = bridge_port_bif_first(bif)) == NULL)
739 return (SNMP_ERR_NOSUCHNAME);
740 } else {
741 if ((bp = bridge_port_find(val->var.subs[sub],
742 bif)) == NULL ||
743 (bp = bridge_port_bif_next(bp)) == NULL)
744 return (SNMP_ERR_NOSUCHNAME);
745 }
746 val->var.len = sub + 1;
747 val->var.subs[sub] = bp->port_no;
715 break;
748 goto get;
716
717 case SNMP_OP_SET:
718 return (SNMP_ERR_NOT_WRITEABLE);
719
720 case SNMP_OP_ROLLBACK:
721 case SNMP_OP_COMMIT:
749
750 case SNMP_OP_SET:
751 return (SNMP_ERR_NOT_WRITEABLE);
752
753 case SNMP_OP_ROLLBACK:
754 case SNMP_OP_COMMIT:
722 default:
723 abort();
755 break;
724 }
756 }
757 abort();
725
758
759get:
726 switch (val->var.subs[sub - 1]) {
727 case LEAF_dot1dTpPort:
728 val->v.integer = bp->port_no;
760 switch (val->var.subs[sub - 1]) {
761 case LEAF_dot1dTpPort:
762 val->v.integer = bp->port_no;
729 break;
763 return (SNMP_ERR_NOERROR);
764
730 case LEAF_dot1dTpPortMaxInfo:
731 val->v.integer = bp->max_info;
765 case LEAF_dot1dTpPortMaxInfo:
766 val->v.integer = bp->max_info;
732 break;
767 return (SNMP_ERR_NOERROR);
768
733 case LEAF_dot1dTpPortInFrames:
734 val->v.uint32 = bp->in_frames;
769 case LEAF_dot1dTpPortInFrames:
770 val->v.uint32 = bp->in_frames;
735 break;
771 return (SNMP_ERR_NOERROR);
772
736 case LEAF_dot1dTpPortOutFrames:
737 val->v.uint32 = bp->out_frames;
773 case LEAF_dot1dTpPortOutFrames:
774 val->v.uint32 = bp->out_frames;
738 break;
775 return (SNMP_ERR_NOERROR);
776
739 case LEAF_dot1dTpPortInDiscards:
740 val->v.uint32 = bp->in_drops;
777 case LEAF_dot1dTpPortInDiscards:
778 val->v.uint32 = bp->in_drops;
741 break;
779 return (SNMP_ERR_NOERROR);
742 }
743
780 }
781
744 return (SNMP_ERR_NOERROR);
782 abort();
745}
746
747/*
748 * Private BEGEMOT-BRIDGE-MIB specifics.
749 */
750
751/*
752 * Construct a bridge port entry index.
753 */
754static int
755bridge_port_index_append(struct asn_oid *oid, uint sub,
756 const struct bridge_port *bp)
757{
758 uint i;
759 const char *b_name;
760
761 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
762 return (-1);
763
764 oid->len = sub + strlen(b_name) + 1 + 1;
765 oid->subs[sub] = strlen(b_name);
766
767 for (i = 1; i <= strlen(b_name); i++)
768 oid->subs[sub + i] = b_name[i - 1];
769
770 oid->subs[sub + i] = bp->port_no;
771
772 return (0);
773}
774
775/*
776 * Get the port entry from an entry's index.
777 */
778static struct bridge_port *
779bridge_port_index_get(const struct asn_oid *oid, uint sub, int8_t status)
780{
781 uint i;
782 int32_t port_no;
783 char bif_name[IFNAMSIZ];
784 struct bridge_if *bif;
785 struct bridge_port *bp;
786
787 if (oid->len - sub != oid->subs[sub] + 2 ||
788 oid->subs[sub] >= IFNAMSIZ)
789 return (NULL);
790
791 for (i = 0; i < oid->subs[sub]; i++)
792 bif_name[i] = oid->subs[sub + i + 1];
793 bif_name[i] = '\0';
794
795 port_no = oid->subs[sub + i + 1];
796
797 if ((bif = bridge_if_find_ifname(bif_name)) == NULL)
798 return (NULL);
799
800 if ((bp = bridge_port_find(port_no, bif)) == NULL ||
801 (status == 0 && bp->status != RowStatus_active))
802 return (NULL);
803
804 return (bp);
805}
806
807/*
808 * Get the next port entry from an entry's index.
809 */
810static struct bridge_port *
811bridge_port_index_getnext(const struct asn_oid *oid, uint sub, int8_t status)
812{
813 uint i;
814 int32_t port_no;
815 char bif_name[IFNAMSIZ];
816 struct bridge_if *bif;
817 struct bridge_port *bp;
818
819 if (oid->len - sub == 0)
820 bp = bridge_port_first();
821 else {
822 if (oid->len - sub != oid->subs[sub] + 2 ||
823 oid->subs[sub] >= IFNAMSIZ)
824 return (NULL);
825
826 for (i = 0; i < oid->subs[sub]; i++)
827 bif_name[i] = oid->subs[sub + i + 1];
828 bif_name[i] = '\0';
829
830 port_no = oid->subs[sub + i + 1];
831
832 if ((bif = bridge_if_find_ifname(bif_name)) == NULL ||
833 (bp = bridge_port_find(port_no, bif)) == NULL)
834 return (NULL);
835
836 bp = bridge_port_next(bp);
837 }
838
839 if (status == 1)
840 return (bp);
841
842 while (bp != NULL) {
843 if (bp->status == RowStatus_active)
844 break;
845 bp = bridge_port_next(bp);
846 }
847
848 return (bp);
849}
850
851/*
852 * Read the bridge name and port index from a ASN OID structure.
853 */
854static int
855bridge_port_index_decode(const struct asn_oid *oid, uint sub,
856 char *b_name, int32_t *idx)
857{
858 uint i;
859
860 if (oid->len - sub != oid->subs[sub] + 2 ||
861 oid->subs[sub] >= IFNAMSIZ)
862 return (-1);
863
864 for (i = 0; i < oid->subs[sub]; i++)
865 b_name[i] = oid->subs[sub + i + 1];
866 b_name[i] = '\0';
867
868 *idx = oid->subs[sub + i + 1];
869 return (0);
870}
871
872static int
873bridge_port_set_status(struct snmp_context *ctx,
874 struct snmp_value *val, uint sub)
875{
876 int32_t if_idx;
877 char b_name[IFNAMSIZ];
878 struct bridge_if *bif;
879 struct bridge_port *bp;
880 struct mibif *mif;
881
882 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
883 return (SNMP_ERR_INCONS_VALUE);
884
885 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
886 (mif = mib_find_if(if_idx)) == NULL)
887 return (SNMP_ERR_INCONS_VALUE);
888
889 bp = bridge_port_find(if_idx, bif);
890
891 switch (val->v.integer) {
892 case RowStatus_active:
893 if (bp == NULL)
894 return (SNMP_ERR_INCONS_VALUE);
895
896 if (bp->span_enable == 0)
897 return (SNMP_ERR_INCONS_VALUE);
898
899 ctx->scratch->int1 = bp->status;
900 bp->status = RowStatus_active;
901 break;
902
903 case RowStatus_notInService:
904 if (bp == NULL || bp->span_enable == 0 ||
905 bp->status == RowStatus_active)
906 return (SNMP_ERR_INCONS_VALUE);
907
908 ctx->scratch->int1 = bp->status;
909 bp->status = RowStatus_notInService;
910
911 case RowStatus_notReady:
912 /* FALLTHROUGH */
913 case RowStatus_createAndGo:
914 return (SNMP_ERR_INCONS_VALUE);
915
916 case RowStatus_createAndWait:
917 if (bp != NULL)
918 return (SNMP_ERR_INCONS_VALUE);
919
920 if ((bp = bridge_new_port(mif, bif)) == NULL)
921 return (SNMP_ERR_GENERR);
922
923 ctx->scratch->int1 = RowStatus_destroy;
924 bp->status = RowStatus_notReady;
925 break;
926
927 case RowStatus_destroy:
928 if (bp == NULL)
929 return (SNMP_ERR_INCONS_VALUE);
930
931 ctx->scratch->int1 = bp->status;
932 bp->status = RowStatus_destroy;
933 break;
934 }
935
936 return (SNMP_ERR_NOERROR);
937}
938
939static int
940bridge_port_rollback_status(struct snmp_context *ctx,
941 struct snmp_value *val, uint sub)
942{
943 int32_t if_idx;
944 char b_name[IFNAMSIZ];
945 struct bridge_if *bif;
946 struct bridge_port *bp;
947
948 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
949 return (SNMP_ERR_GENERR);
950
951 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
952 (bp = bridge_port_find(if_idx, bif)) == NULL)
953 return (SNMP_ERR_GENERR);
954
955 if (ctx->scratch->int1 == RowStatus_destroy)
956 bridge_port_remove(bp, bif);
957 else
958 bp->status = ctx->scratch->int1;
959
960 return (SNMP_ERR_NOERROR);
961}
962
963static int
964bridge_port_commit_status(struct snmp_value *val, uint sub)
965{
966 int32_t if_idx;
967 char b_name[IFNAMSIZ];
968 struct bridge_if *bif;
969 struct bridge_port *bp;
970
971 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
972 return (SNMP_ERR_GENERR);
973
974 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
975 (bp = bridge_port_find(if_idx, bif)) == NULL)
976 return (SNMP_ERR_GENERR);
977
978 switch (bp->status) {
979 case RowStatus_active:
980 if (bridge_port_addm(bp, b_name) < 0)
981 return (SNMP_ERR_COMMIT_FAILED);
982 break;
983
984 case RowStatus_destroy:
985 if (bridge_port_delm(bp, b_name) < 0)
986 return (SNMP_ERR_COMMIT_FAILED);
987 bridge_port_remove(bp, bif);
988 break;
989 }
990
991 return (SNMP_ERR_NOERROR);
992}
993
994static int
995bridge_port_set_span_enable(struct snmp_context *ctx,
996 struct snmp_value *val, uint sub)
997{
998 int32_t if_idx;
999 char b_name[IFNAMSIZ];
1000 struct bridge_if *bif;
1001 struct bridge_port *bp;
1002 struct mibif *mif;
1003
1004 if (val->v.integer != begemotBridgeBaseSpanEnabled_enabled &&
1005 val->v.integer != begemotBridgeBaseSpanEnabled_disabled)
1006 return (SNMP_ERR_BADVALUE);
1007
1008 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
1009 return (SNMP_ERR_INCONS_VALUE);
1010
1011 if ((bif = bridge_if_find_ifname(b_name)) == NULL)
1012 return (SNMP_ERR_INCONS_VALUE);
1013
1014 if ((bp = bridge_port_find(if_idx, bif)) == NULL) {
1015 if ((mif = mib_find_if(if_idx)) == NULL)
1016 return (SNMP_ERR_INCONS_VALUE);
1017
1018 if ((bp = bridge_new_port(mif, bif)) == NULL)
1019 return (SNMP_ERR_GENERR);
1020
1021 ctx->scratch->int1 = RowStatus_destroy;
1022 } else if (bp->status == RowStatus_active) {
1023 return (SNMP_ERR_INCONS_VALUE);
1024 } else {
1025 ctx->scratch->int1 = bp->status;
1026 }
1027
1028 bp->span_enable = val->v.integer;
1029 bp->status = RowStatus_notInService;
1030
1031 return (SNMP_ERR_NOERROR);
1032}
1033
1034int
1035op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val,
1036 uint sub, uint iidx __unused, enum snmp_op op)
1037{
1038 int8_t status, which;
783}
784
785/*
786 * Private BEGEMOT-BRIDGE-MIB specifics.
787 */
788
789/*
790 * Construct a bridge port entry index.
791 */
792static int
793bridge_port_index_append(struct asn_oid *oid, uint sub,
794 const struct bridge_port *bp)
795{
796 uint i;
797 const char *b_name;
798
799 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
800 return (-1);
801
802 oid->len = sub + strlen(b_name) + 1 + 1;
803 oid->subs[sub] = strlen(b_name);
804
805 for (i = 1; i <= strlen(b_name); i++)
806 oid->subs[sub + i] = b_name[i - 1];
807
808 oid->subs[sub + i] = bp->port_no;
809
810 return (0);
811}
812
813/*
814 * Get the port entry from an entry's index.
815 */
816static struct bridge_port *
817bridge_port_index_get(const struct asn_oid *oid, uint sub, int8_t status)
818{
819 uint i;
820 int32_t port_no;
821 char bif_name[IFNAMSIZ];
822 struct bridge_if *bif;
823 struct bridge_port *bp;
824
825 if (oid->len - sub != oid->subs[sub] + 2 ||
826 oid->subs[sub] >= IFNAMSIZ)
827 return (NULL);
828
829 for (i = 0; i < oid->subs[sub]; i++)
830 bif_name[i] = oid->subs[sub + i + 1];
831 bif_name[i] = '\0';
832
833 port_no = oid->subs[sub + i + 1];
834
835 if ((bif = bridge_if_find_ifname(bif_name)) == NULL)
836 return (NULL);
837
838 if ((bp = bridge_port_find(port_no, bif)) == NULL ||
839 (status == 0 && bp->status != RowStatus_active))
840 return (NULL);
841
842 return (bp);
843}
844
845/*
846 * Get the next port entry from an entry's index.
847 */
848static struct bridge_port *
849bridge_port_index_getnext(const struct asn_oid *oid, uint sub, int8_t status)
850{
851 uint i;
852 int32_t port_no;
853 char bif_name[IFNAMSIZ];
854 struct bridge_if *bif;
855 struct bridge_port *bp;
856
857 if (oid->len - sub == 0)
858 bp = bridge_port_first();
859 else {
860 if (oid->len - sub != oid->subs[sub] + 2 ||
861 oid->subs[sub] >= IFNAMSIZ)
862 return (NULL);
863
864 for (i = 0; i < oid->subs[sub]; i++)
865 bif_name[i] = oid->subs[sub + i + 1];
866 bif_name[i] = '\0';
867
868 port_no = oid->subs[sub + i + 1];
869
870 if ((bif = bridge_if_find_ifname(bif_name)) == NULL ||
871 (bp = bridge_port_find(port_no, bif)) == NULL)
872 return (NULL);
873
874 bp = bridge_port_next(bp);
875 }
876
877 if (status == 1)
878 return (bp);
879
880 while (bp != NULL) {
881 if (bp->status == RowStatus_active)
882 break;
883 bp = bridge_port_next(bp);
884 }
885
886 return (bp);
887}
888
889/*
890 * Read the bridge name and port index from a ASN OID structure.
891 */
892static int
893bridge_port_index_decode(const struct asn_oid *oid, uint sub,
894 char *b_name, int32_t *idx)
895{
896 uint i;
897
898 if (oid->len - sub != oid->subs[sub] + 2 ||
899 oid->subs[sub] >= IFNAMSIZ)
900 return (-1);
901
902 for (i = 0; i < oid->subs[sub]; i++)
903 b_name[i] = oid->subs[sub + i + 1];
904 b_name[i] = '\0';
905
906 *idx = oid->subs[sub + i + 1];
907 return (0);
908}
909
910static int
911bridge_port_set_status(struct snmp_context *ctx,
912 struct snmp_value *val, uint sub)
913{
914 int32_t if_idx;
915 char b_name[IFNAMSIZ];
916 struct bridge_if *bif;
917 struct bridge_port *bp;
918 struct mibif *mif;
919
920 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
921 return (SNMP_ERR_INCONS_VALUE);
922
923 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
924 (mif = mib_find_if(if_idx)) == NULL)
925 return (SNMP_ERR_INCONS_VALUE);
926
927 bp = bridge_port_find(if_idx, bif);
928
929 switch (val->v.integer) {
930 case RowStatus_active:
931 if (bp == NULL)
932 return (SNMP_ERR_INCONS_VALUE);
933
934 if (bp->span_enable == 0)
935 return (SNMP_ERR_INCONS_VALUE);
936
937 ctx->scratch->int1 = bp->status;
938 bp->status = RowStatus_active;
939 break;
940
941 case RowStatus_notInService:
942 if (bp == NULL || bp->span_enable == 0 ||
943 bp->status == RowStatus_active)
944 return (SNMP_ERR_INCONS_VALUE);
945
946 ctx->scratch->int1 = bp->status;
947 bp->status = RowStatus_notInService;
948
949 case RowStatus_notReady:
950 /* FALLTHROUGH */
951 case RowStatus_createAndGo:
952 return (SNMP_ERR_INCONS_VALUE);
953
954 case RowStatus_createAndWait:
955 if (bp != NULL)
956 return (SNMP_ERR_INCONS_VALUE);
957
958 if ((bp = bridge_new_port(mif, bif)) == NULL)
959 return (SNMP_ERR_GENERR);
960
961 ctx->scratch->int1 = RowStatus_destroy;
962 bp->status = RowStatus_notReady;
963 break;
964
965 case RowStatus_destroy:
966 if (bp == NULL)
967 return (SNMP_ERR_INCONS_VALUE);
968
969 ctx->scratch->int1 = bp->status;
970 bp->status = RowStatus_destroy;
971 break;
972 }
973
974 return (SNMP_ERR_NOERROR);
975}
976
977static int
978bridge_port_rollback_status(struct snmp_context *ctx,
979 struct snmp_value *val, uint sub)
980{
981 int32_t if_idx;
982 char b_name[IFNAMSIZ];
983 struct bridge_if *bif;
984 struct bridge_port *bp;
985
986 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
987 return (SNMP_ERR_GENERR);
988
989 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
990 (bp = bridge_port_find(if_idx, bif)) == NULL)
991 return (SNMP_ERR_GENERR);
992
993 if (ctx->scratch->int1 == RowStatus_destroy)
994 bridge_port_remove(bp, bif);
995 else
996 bp->status = ctx->scratch->int1;
997
998 return (SNMP_ERR_NOERROR);
999}
1000
1001static int
1002bridge_port_commit_status(struct snmp_value *val, uint sub)
1003{
1004 int32_t if_idx;
1005 char b_name[IFNAMSIZ];
1006 struct bridge_if *bif;
1007 struct bridge_port *bp;
1008
1009 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
1010 return (SNMP_ERR_GENERR);
1011
1012 if ((bif = bridge_if_find_ifname(b_name)) == NULL ||
1013 (bp = bridge_port_find(if_idx, bif)) == NULL)
1014 return (SNMP_ERR_GENERR);
1015
1016 switch (bp->status) {
1017 case RowStatus_active:
1018 if (bridge_port_addm(bp, b_name) < 0)
1019 return (SNMP_ERR_COMMIT_FAILED);
1020 break;
1021
1022 case RowStatus_destroy:
1023 if (bridge_port_delm(bp, b_name) < 0)
1024 return (SNMP_ERR_COMMIT_FAILED);
1025 bridge_port_remove(bp, bif);
1026 break;
1027 }
1028
1029 return (SNMP_ERR_NOERROR);
1030}
1031
1032static int
1033bridge_port_set_span_enable(struct snmp_context *ctx,
1034 struct snmp_value *val, uint sub)
1035{
1036 int32_t if_idx;
1037 char b_name[IFNAMSIZ];
1038 struct bridge_if *bif;
1039 struct bridge_port *bp;
1040 struct mibif *mif;
1041
1042 if (val->v.integer != begemotBridgeBaseSpanEnabled_enabled &&
1043 val->v.integer != begemotBridgeBaseSpanEnabled_disabled)
1044 return (SNMP_ERR_BADVALUE);
1045
1046 if (bridge_port_index_decode(&val->var, sub, b_name, &if_idx) < 0)
1047 return (SNMP_ERR_INCONS_VALUE);
1048
1049 if ((bif = bridge_if_find_ifname(b_name)) == NULL)
1050 return (SNMP_ERR_INCONS_VALUE);
1051
1052 if ((bp = bridge_port_find(if_idx, bif)) == NULL) {
1053 if ((mif = mib_find_if(if_idx)) == NULL)
1054 return (SNMP_ERR_INCONS_VALUE);
1055
1056 if ((bp = bridge_new_port(mif, bif)) == NULL)
1057 return (SNMP_ERR_GENERR);
1058
1059 ctx->scratch->int1 = RowStatus_destroy;
1060 } else if (bp->status == RowStatus_active) {
1061 return (SNMP_ERR_INCONS_VALUE);
1062 } else {
1063 ctx->scratch->int1 = bp->status;
1064 }
1065
1066 bp->span_enable = val->v.integer;
1067 bp->status = RowStatus_notInService;
1068
1069 return (SNMP_ERR_NOERROR);
1070}
1071
1072int
1073op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val,
1074 uint sub, uint iidx __unused, enum snmp_op op)
1075{
1076 int8_t status, which;
1039 struct bridge_port *bp = NULL;
1077 struct bridge_port *bp;
1040
1041 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1042 bridge_update_all_ports();
1043
1044 which = val->var.subs[sub - 1];
1045 status = 0;
1046
1047 switch (op) {
1048 case SNMP_OP_GET:
1049 if (which == LEAF_begemotBridgeBaseSpanEnabled ||
1050 which == LEAF_begemotBridgeBasePortStatus)
1051 status = 1;
1052 if ((bp = bridge_port_index_get(&val->var, sub,
1053 status)) == NULL)
1054 return (SNMP_ERR_NOSUCHNAME);
1078
1079 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1080 bridge_update_all_ports();
1081
1082 which = val->var.subs[sub - 1];
1083 status = 0;
1084
1085 switch (op) {
1086 case SNMP_OP_GET:
1087 if (which == LEAF_begemotBridgeBaseSpanEnabled ||
1088 which == LEAF_begemotBridgeBasePortStatus)
1089 status = 1;
1090 if ((bp = bridge_port_index_get(&val->var, sub,
1091 status)) == NULL)
1092 return (SNMP_ERR_NOSUCHNAME);
1055 break;
1093 goto get;
1056
1057 case SNMP_OP_GETNEXT:
1058 if (which == LEAF_begemotBridgeBaseSpanEnabled ||
1059 which == LEAF_begemotBridgeBasePortStatus)
1060 status = 1;
1061 if ((bp = bridge_port_index_getnext(&val->var, sub,
1062 status)) == NULL ||
1063 bridge_port_index_append(&val->var, sub, bp) < 0)
1064 return (SNMP_ERR_NOSUCHNAME);
1094
1095 case SNMP_OP_GETNEXT:
1096 if (which == LEAF_begemotBridgeBaseSpanEnabled ||
1097 which == LEAF_begemotBridgeBasePortStatus)
1098 status = 1;
1099 if ((bp = bridge_port_index_getnext(&val->var, sub,
1100 status)) == NULL ||
1101 bridge_port_index_append(&val->var, sub, bp) < 0)
1102 return (SNMP_ERR_NOSUCHNAME);
1065 break;
1103 goto get;
1066
1067 case SNMP_OP_SET:
1068 switch (which) {
1069 case LEAF_begemotBridgeBaseSpanEnabled:
1070 return (bridge_port_set_span_enable(ctx, val, sub));
1071
1072 case LEAF_begemotBridgeBasePortStatus:
1073 return (bridge_port_set_status(ctx, val, sub));
1074
1075 case LEAF_begemotBridgeBasePort:
1076 case LEAF_begemotBridgeBasePortIfIndex:
1077 case LEAF_begemotBridgeBasePortDelayExceededDiscards:
1078 case LEAF_begemotBridgeBasePortMtuExceededDiscards:
1079 return (SNMP_ERR_NOT_WRITEABLE);
1080 }
1081 abort();
1082
1083 case SNMP_OP_ROLLBACK:
1084 switch (which) {
1085 case LEAF_begemotBridgeBaseSpanEnabled:
1086 /* FALLTHROUGH */
1087 case LEAF_begemotBridgeBasePortStatus:
1088 return (bridge_port_rollback_status(ctx, val, sub));
1089 }
1090 return (SNMP_ERR_NOERROR);
1091
1092 case SNMP_OP_COMMIT:
1093 if (which == LEAF_begemotBridgeBasePortStatus)
1094 return (bridge_port_commit_status(val, sub));
1095
1096 return (SNMP_ERR_NOERROR);
1097 }
1104
1105 case SNMP_OP_SET:
1106 switch (which) {
1107 case LEAF_begemotBridgeBaseSpanEnabled:
1108 return (bridge_port_set_span_enable(ctx, val, sub));
1109
1110 case LEAF_begemotBridgeBasePortStatus:
1111 return (bridge_port_set_status(ctx, val, sub));
1112
1113 case LEAF_begemotBridgeBasePort:
1114 case LEAF_begemotBridgeBasePortIfIndex:
1115 case LEAF_begemotBridgeBasePortDelayExceededDiscards:
1116 case LEAF_begemotBridgeBasePortMtuExceededDiscards:
1117 return (SNMP_ERR_NOT_WRITEABLE);
1118 }
1119 abort();
1120
1121 case SNMP_OP_ROLLBACK:
1122 switch (which) {
1123 case LEAF_begemotBridgeBaseSpanEnabled:
1124 /* FALLTHROUGH */
1125 case LEAF_begemotBridgeBasePortStatus:
1126 return (bridge_port_rollback_status(ctx, val, sub));
1127 }
1128 return (SNMP_ERR_NOERROR);
1129
1130 case SNMP_OP_COMMIT:
1131 if (which == LEAF_begemotBridgeBasePortStatus)
1132 return (bridge_port_commit_status(val, sub));
1133
1134 return (SNMP_ERR_NOERROR);
1135 }
1136 abort();
1098
1137
1138get:
1099 switch (which) {
1100 case LEAF_begemotBridgeBasePort:
1101 val->v.integer = bp->port_no;
1139 switch (which) {
1140 case LEAF_begemotBridgeBasePort:
1141 val->v.integer = bp->port_no;
1102 break;
1142 return (SNMP_ERR_NOERROR);
1143
1103 case LEAF_begemotBridgeBasePortIfIndex:
1104 val->v.integer = bp->if_idx;
1144 case LEAF_begemotBridgeBasePortIfIndex:
1145 val->v.integer = bp->if_idx;
1105 break;
1146 return (SNMP_ERR_NOERROR);
1147
1106 case LEAF_begemotBridgeBaseSpanEnabled:
1107 val->v.integer = bp->span_enable;
1148 case LEAF_begemotBridgeBaseSpanEnabled:
1149 val->v.integer = bp->span_enable;
1108 break;
1150 return (SNMP_ERR_NOERROR);
1151
1109 case LEAF_begemotBridgeBasePortDelayExceededDiscards:
1110 val->v.uint32 = bp->dly_ex_drops;
1152 case LEAF_begemotBridgeBasePortDelayExceededDiscards:
1153 val->v.uint32 = bp->dly_ex_drops;
1111 break;
1154 return (SNMP_ERR_NOERROR);
1155
1112 case LEAF_begemotBridgeBasePortMtuExceededDiscards:
1113 val->v.uint32 = bp->dly_mtu_drops;
1156 case LEAF_begemotBridgeBasePortMtuExceededDiscards:
1157 val->v.uint32 = bp->dly_mtu_drops;
1114 break;
1158 return (SNMP_ERR_NOERROR);
1159
1115 case LEAF_begemotBridgeBasePortStatus:
1116 val->v.integer = bp->status;
1160 case LEAF_begemotBridgeBasePortStatus:
1161 val->v.integer = bp->status;
1117 break;
1162 return (SNMP_ERR_NOERROR);
1118 }
1119
1163 }
1164
1120 return (SNMP_ERR_NOERROR);
1165 abort();
1121}
1122
1123int
1124op_begemot_stp_port(struct snmp_context *ctx, struct snmp_value *val,
1125 uint sub, uint iidx __unused, enum snmp_op op)
1126{
1166}
1167
1168int
1169op_begemot_stp_port(struct snmp_context *ctx, struct snmp_value *val,
1170 uint sub, uint iidx __unused, enum snmp_op op)
1171{
1127 int ret;
1128 struct bridge_port *bp;
1129 const char *b_name;
1130
1131 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1132 bridge_update_all_ports();
1133
1134 switch (op) {
1135 case SNMP_OP_GET:
1136 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1137 return (SNMP_ERR_NOSUCHNAME);
1172 struct bridge_port *bp;
1173 const char *b_name;
1174
1175 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1176 bridge_update_all_ports();
1177
1178 switch (op) {
1179 case SNMP_OP_GET:
1180 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1181 return (SNMP_ERR_NOSUCHNAME);
1138 break;
1182 goto get;
1139
1140 case SNMP_OP_GETNEXT:
1141 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1142 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1143 return (SNMP_ERR_NOSUCHNAME);
1183
1184 case SNMP_OP_GETNEXT:
1185 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1186 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1187 return (SNMP_ERR_NOSUCHNAME);
1144 break;
1188 goto get;
1145
1146 case SNMP_OP_SET:
1147 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1148 return (SNMP_ERR_NOSUCHNAME);
1149 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1150 return (SNMP_ERR_GENERR);
1151
1189
1190 case SNMP_OP_SET:
1191 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1192 return (SNMP_ERR_NOSUCHNAME);
1193 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1194 return (SNMP_ERR_GENERR);
1195
1152 ret = SNMP_ERR_NOERROR;
1153 switch (val->var.subs[sub - 1]) {
1154 case LEAF_begemotBridgeStpPortPriority:
1196 switch (val->var.subs[sub - 1]) {
1197 case LEAF_begemotBridgeStpPortPriority:
1198 if (val->v.integer < 0 || val->v.integer > 255)
1199 return (SNMP_ERR_WRONG_VALUE);
1200
1155 ctx->scratch->int1 = bp->priority;
1201 ctx->scratch->int1 = bp->priority;
1156 ret = bridge_port_set_priority(b_name, bp,
1157 val->v.integer);
1158 break;
1202 if (bridge_port_set_priority(b_name, bp,
1203 val->v.integer) < 0)
1204 return (SNMP_ERR_GENERR);
1205 return (SNMP_ERR_NOERROR);
1206
1159 case LEAF_begemotBridgeStpPortEnable:
1207 case LEAF_begemotBridgeStpPortEnable:
1208 if (val->v.integer !=
1209 begemotBridgeStpPortEnable_enabled ||
1210 val->v.integer !=
1211 begemotBridgeStpPortEnable_disabled)
1212 return (SNMP_ERR_WRONG_VALUE);
1213
1160 ctx->scratch->int1 = bp->enable;
1214 ctx->scratch->int1 = bp->enable;
1161 ret = bridge_port_set_stp_enable(b_name, bp,
1162 val->v.integer);
1163 break;
1215 if (bridge_port_set_stp_enable(b_name, bp,
1216 val->v.integer) < 0)
1217 return (SNMP_ERR_GENERR);
1218 return (SNMP_ERR_NOERROR);
1219
1164 case LEAF_begemotBridgeStpPortPathCost:
1220 case LEAF_begemotBridgeStpPortPathCost:
1221 if (val->v.integer < SNMP_PORT_MIN_PATHCOST ||
1222 val->v.integer > SNMP_PORT_MAX_PATHCOST)
1223 return (SNMP_ERR_WRONG_VALUE);
1224
1165 ctx->scratch->int1 = bp->path_cost;
1225 ctx->scratch->int1 = bp->path_cost;
1166 ret = bridge_port_set_path_cost(b_name, bp,
1167 val->v.integer);
1168 break;
1226 if (bridge_port_set_path_cost(b_name, bp,
1227 val->v.integer) < 0)
1228 return (SNMP_ERR_GENERR);
1229 return (SNMP_ERR_NOERROR);
1230
1169 case LEAF_begemotBridgeStpPort:
1170 case LEAF_begemotBridgeStpPortState:
1171 case LEAF_begemotBridgeStpPortDesignatedRoot:
1172 case LEAF_begemotBridgeStpPortDesignatedCost:
1173 case LEAF_begemotBridgeStpPortDesignatedBridge:
1174 case LEAF_begemotBridgeStpPortDesignatedPort:
1175 case LEAF_begemotBridgeStpPortForwardTransitions:
1176 return (SNMP_ERR_NOT_WRITEABLE);
1177 }
1231 case LEAF_begemotBridgeStpPort:
1232 case LEAF_begemotBridgeStpPortState:
1233 case LEAF_begemotBridgeStpPortDesignatedRoot:
1234 case LEAF_begemotBridgeStpPortDesignatedCost:
1235 case LEAF_begemotBridgeStpPortDesignatedBridge:
1236 case LEAF_begemotBridgeStpPortDesignatedPort:
1237 case LEAF_begemotBridgeStpPortForwardTransitions:
1238 return (SNMP_ERR_NOT_WRITEABLE);
1239 }
1178 if (ret == 0)
1179 return (SNMP_ERR_NOERROR);
1180 else if (ret == -2)
1181 return (SNMP_ERR_WRONG_VALUE);
1182 return (SNMP_ERR_GENERR);
1240 abort();
1183
1184 case SNMP_OP_ROLLBACK:
1185 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL ||
1186 (b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1187 return (SNMP_ERR_GENERR);
1188
1189 switch (val->var.subs[sub - 1]) {
1190 case LEAF_begemotBridgeStpPortPriority:
1191 bridge_port_set_priority(b_name, bp,
1192 ctx->scratch->int1);
1193 break;
1194 case LEAF_begemotBridgeStpPortEnable:
1195 bridge_port_set_stp_enable(b_name, bp,
1196 ctx->scratch->int1);
1197 break;
1198 case LEAF_begemotBridgeStpPortPathCost:
1199 bridge_port_set_path_cost(b_name, bp,
1200 ctx->scratch->int1);
1201 break;
1202 }
1203 return (SNMP_ERR_NOERROR);
1204
1205 case SNMP_OP_COMMIT:
1206 return (SNMP_ERR_NOERROR);
1241
1242 case SNMP_OP_ROLLBACK:
1243 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL ||
1244 (b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1245 return (SNMP_ERR_GENERR);
1246
1247 switch (val->var.subs[sub - 1]) {
1248 case LEAF_begemotBridgeStpPortPriority:
1249 bridge_port_set_priority(b_name, bp,
1250 ctx->scratch->int1);
1251 break;
1252 case LEAF_begemotBridgeStpPortEnable:
1253 bridge_port_set_stp_enable(b_name, bp,
1254 ctx->scratch->int1);
1255 break;
1256 case LEAF_begemotBridgeStpPortPathCost:
1257 bridge_port_set_path_cost(b_name, bp,
1258 ctx->scratch->int1);
1259 break;
1260 }
1261 return (SNMP_ERR_NOERROR);
1262
1263 case SNMP_OP_COMMIT:
1264 return (SNMP_ERR_NOERROR);
1207
1208 default:
1209 abort();
1210 }
1265 }
1266 abort();
1211
1267
1212 ret = SNMP_ERR_NOERROR;
1268get:
1213 switch (val->var.subs[sub - 1]) {
1214 case LEAF_begemotBridgeStpPort:
1215 val->v.integer = bp->port_no;
1269 switch (val->var.subs[sub - 1]) {
1270 case LEAF_begemotBridgeStpPort:
1271 val->v.integer = bp->port_no;
1216 break;
1272 return (SNMP_ERR_NOERROR);
1273
1217 case LEAF_begemotBridgeStpPortPriority:
1218 val->v.integer = bp->priority;
1274 case LEAF_begemotBridgeStpPortPriority:
1275 val->v.integer = bp->priority;
1219 break;
1276 return (SNMP_ERR_NOERROR);
1277
1220 case LEAF_begemotBridgeStpPortState:
1221 val->v.integer = bp->state;
1278 case LEAF_begemotBridgeStpPortState:
1279 val->v.integer = bp->state;
1222 break;
1280 return (SNMP_ERR_NOERROR);
1281
1223 case LEAF_begemotBridgeStpPortEnable:
1224 val->v.integer = bp->enable;
1282 case LEAF_begemotBridgeStpPortEnable:
1283 val->v.integer = bp->enable;
1225 break;
1284 return (SNMP_ERR_NOERROR);
1285
1226 case LEAF_begemotBridgeStpPortPathCost:
1227 val->v.integer = bp->path_cost;
1286 case LEAF_begemotBridgeStpPortPathCost:
1287 val->v.integer = bp->path_cost;
1228 break;
1288 return (SNMP_ERR_NOERROR);
1289
1229 case LEAF_begemotBridgeStpPortDesignatedRoot:
1290 case LEAF_begemotBridgeStpPortDesignatedRoot:
1230 ret = string_get(val, bp->design_root, SNMP_BRIDGE_ID_LEN);
1231 break;
1291 return (string_get(val, bp->design_root, SNMP_BRIDGE_ID_LEN));
1292
1232 case LEAF_begemotBridgeStpPortDesignatedCost:
1233 val->v.integer = bp->design_cost;
1293 case LEAF_begemotBridgeStpPortDesignatedCost:
1294 val->v.integer = bp->design_cost;
1234 break;
1295 return (SNMP_ERR_NOERROR);
1296
1235 case LEAF_begemotBridgeStpPortDesignatedBridge:
1297 case LEAF_begemotBridgeStpPortDesignatedBridge:
1236 ret = string_get(val, bp->design_bridge, SNMP_BRIDGE_ID_LEN);
1237 break;
1298 return (string_get(val, bp->design_bridge, SNMP_BRIDGE_ID_LEN));
1299
1238 case LEAF_begemotBridgeStpPortDesignatedPort:
1300 case LEAF_begemotBridgeStpPortDesignatedPort:
1239 ret = string_get(val, bp->design_port, 2);
1240 break;
1301 return (string_get(val, bp->design_port, 2));
1302
1241 case LEAF_begemotBridgeStpPortForwardTransitions:
1242 val->v.uint32 = bp->fwd_trans;
1303 case LEAF_begemotBridgeStpPortForwardTransitions:
1304 val->v.uint32 = bp->fwd_trans;
1243 break;
1305 return (SNMP_ERR_NOERROR);
1244 }
1245
1306 }
1307
1246 return (ret);
1308 abort();
1247}
1248
1249int
1250op_begemot_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
1251 uint sub, uint iidx __unused, enum snmp_op op)
1252{
1309}
1310
1311int
1312op_begemot_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
1313 uint sub, uint iidx __unused, enum snmp_op op)
1314{
1253 int ret;
1254 struct bridge_port *bp;
1255 const char *b_name;
1256
1257 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1258 bridge_update_all_ports();
1259
1260 switch (op) {
1261 case SNMP_OP_GET:
1262 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1263 return (SNMP_ERR_NOSUCHNAME);
1315 struct bridge_port *bp;
1316 const char *b_name;
1317
1318 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1319 bridge_update_all_ports();
1320
1321 switch (op) {
1322 case SNMP_OP_GET:
1323 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1324 return (SNMP_ERR_NOSUCHNAME);
1264 break;
1325 goto get;
1265
1266 case SNMP_OP_GETNEXT:
1267 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1268 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1269 return (SNMP_ERR_NOSUCHNAME);
1326
1327 case SNMP_OP_GETNEXT:
1328 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1329 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1330 return (SNMP_ERR_NOSUCHNAME);
1270 break;
1331 goto get;
1271
1272 case SNMP_OP_SET:
1273 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1274 return (SNMP_ERR_NOSUCHNAME);
1275 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1276 return (SNMP_ERR_GENERR);
1277
1278 switch (val->var.subs[sub - 1]) {
1279 case LEAF_begemotBridgeStpPortAdminEdgePort:
1332
1333 case SNMP_OP_SET:
1334 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1335 return (SNMP_ERR_NOSUCHNAME);
1336 if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1337 return (SNMP_ERR_GENERR);
1338
1339 switch (val->var.subs[sub - 1]) {
1340 case LEAF_begemotBridgeStpPortAdminEdgePort:
1341 if (val->v.integer != TruthValue_true &&
1342 val->v.integer != TruthValue_false)
1343 return (SNMP_ERR_WRONG_VALUE);
1344
1280 ctx->scratch->int1 = bp->admin_edge;
1345 ctx->scratch->int1 = bp->admin_edge;
1281 ret = bridge_port_set_admin_edge(b_name, bp,
1282 val->v.integer);
1283 break;
1346 if (bridge_port_set_admin_edge(b_name, bp,
1347 val->v.integer) < 0)
1348 return (SNMP_ERR_GENERR);
1349 return (SNMP_ERR_NOERROR);
1350
1284 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1351 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1352 if (val->v.integer < 0 || val->v.integer >
1353 StpPortAdminPointToPointType_auto)
1354 return (SNMP_ERR_WRONG_VALUE);
1355
1285 ctx->scratch->int1 = bp->admin_p2p;
1356 ctx->scratch->int1 = bp->admin_p2p;
1286 ret = bridge_port_set_admin_p2p(b_name, bp,
1287 val->v.integer);
1288 break;
1357 if (bridge_port_set_admin_p2p(b_name, bp,
1358 val->v.integer) < 0)
1359 return (SNMP_ERR_GENERR);
1360 return (SNMP_ERR_NOERROR);
1361
1289 case LEAF_begemotBridgeStpPortAdminPathCost:
1362 case LEAF_begemotBridgeStpPortAdminPathCost:
1363 if (val->v.integer < SNMP_PORT_MIN_PATHCOST ||
1364 val->v.integer > SNMP_PORT_MAX_PATHCOST)
1365 return (SNMP_ERR_WRONG_VALUE);
1366
1290 ctx->scratch->int1 = bp->admin_path_cost;
1367 ctx->scratch->int1 = bp->admin_path_cost;
1291 ret = bridge_port_set_path_cost(b_name, bp,
1292 val->v.integer);
1293 break;
1368 if (bridge_port_set_path_cost(b_name, bp,
1369 val->v.integer) < 0)
1370 return (SNMP_ERR_GENERR);
1371 return (SNMP_ERR_NOERROR);
1372
1294 case LEAF_begemotBridgeStpPortProtocolMigration:
1295 case LEAF_begemotBridgeStpPortOperEdgePort:
1296 case LEAF_begemotBridgeStpPortOperPointToPoint:
1297 return (SNMP_ERR_NOT_WRITEABLE);
1373 case LEAF_begemotBridgeStpPortProtocolMigration:
1374 case LEAF_begemotBridgeStpPortOperEdgePort:
1375 case LEAF_begemotBridgeStpPortOperPointToPoint:
1376 return (SNMP_ERR_NOT_WRITEABLE);
1298 default:
1299 return (SNMP_ERR_NOSUCHNAME);
1300 }
1377 }
1378 abort();
1301
1379
1302 if (ret == 0)
1303 return (SNMP_ERR_NOERROR);
1304 else if (ret == -2)
1305 return (SNMP_ERR_WRONG_VALUE);
1306 return (SNMP_ERR_GENERR);
1307
1308 case SNMP_OP_ROLLBACK:
1309 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL ||
1310 (b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1311 return (SNMP_ERR_GENERR);
1312
1313 switch (val->var.subs[sub - 1]) {
1314 case LEAF_begemotBridgeStpPortAdminEdgePort:
1315 bridge_port_set_admin_edge(b_name, bp,
1316 ctx->scratch->int1);
1317 break;
1318 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1319 bridge_port_set_admin_p2p(b_name, bp,
1320 ctx->scratch->int1);
1321 break;
1322 case LEAF_begemotBridgeStpPortAdminPathCost:
1323 bridge_port_set_path_cost(b_name, bp,
1324 ctx->scratch->int1);
1325 break;
1326 }
1327 return (SNMP_ERR_NOERROR);
1328
1329 case SNMP_OP_COMMIT:
1330 return (SNMP_ERR_NOERROR);
1380 case SNMP_OP_ROLLBACK:
1381 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL ||
1382 (b_name = bridge_if_find_name(bp->sysindex)) == NULL)
1383 return (SNMP_ERR_GENERR);
1384
1385 switch (val->var.subs[sub - 1]) {
1386 case LEAF_begemotBridgeStpPortAdminEdgePort:
1387 bridge_port_set_admin_edge(b_name, bp,
1388 ctx->scratch->int1);
1389 break;
1390 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1391 bridge_port_set_admin_p2p(b_name, bp,
1392 ctx->scratch->int1);
1393 break;
1394 case LEAF_begemotBridgeStpPortAdminPathCost:
1395 bridge_port_set_path_cost(b_name, bp,
1396 ctx->scratch->int1);
1397 break;
1398 }
1399 return (SNMP_ERR_NOERROR);
1400
1401 case SNMP_OP_COMMIT:
1402 return (SNMP_ERR_NOERROR);
1331
1332 default:
1333 abort();
1334 }
1403 }
1404 abort();
1335
1405
1406get:
1336 switch (val->var.subs[sub - 1]) {
1337 case LEAF_begemotBridgeStpPortProtocolMigration:
1338 val->v.integer = bp->proto_migr;
1407 switch (val->var.subs[sub - 1]) {
1408 case LEAF_begemotBridgeStpPortProtocolMigration:
1409 val->v.integer = bp->proto_migr;
1339 break;
1410 return (SNMP_ERR_NOERROR);
1411
1340 case LEAF_begemotBridgeStpPortAdminEdgePort:
1341 val->v.integer = bp->admin_edge;
1412 case LEAF_begemotBridgeStpPortAdminEdgePort:
1413 val->v.integer = bp->admin_edge;
1342 break;
1414 return (SNMP_ERR_NOERROR);
1415
1343 case LEAF_begemotBridgeStpPortOperEdgePort:
1344 val->v.integer = bp->oper_edge;
1416 case LEAF_begemotBridgeStpPortOperEdgePort:
1417 val->v.integer = bp->oper_edge;
1345 break;
1418 return (SNMP_ERR_NOERROR);
1419
1346 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1347 val->v.integer = bp->admin_p2p;
1420 case LEAF_begemotBridgeStpPortAdminPointToPoint:
1421 val->v.integer = bp->admin_p2p;
1348 break;
1422 return (SNMP_ERR_NOERROR);
1423
1349 case LEAF_begemotBridgeStpPortOperPointToPoint:
1350 val->v.integer = bp->oper_p2p;
1424 case LEAF_begemotBridgeStpPortOperPointToPoint:
1425 val->v.integer = bp->oper_p2p;
1351 break;
1426 return (SNMP_ERR_NOERROR);
1427
1352 case LEAF_begemotBridgeStpPortAdminPathCost:
1353 val->v.integer = bp->admin_path_cost;
1428 case LEAF_begemotBridgeStpPortAdminPathCost:
1429 val->v.integer = bp->admin_path_cost;
1354 break;
1430 return (SNMP_ERR_NOERROR);
1355 }
1356
1431 }
1432
1357 return (SNMP_ERR_NOERROR);
1433 abort();
1358}
1359
1360int
1361op_begemot_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
1362 uint sub, uint iidx __unused, enum snmp_op op)
1363{
1364 struct bridge_port *bp;
1365
1366 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1367 bridge_update_all_ports();
1368
1369 switch (op) {
1370 case SNMP_OP_GET:
1371 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1372 return (SNMP_ERR_NOSUCHNAME);
1434}
1435
1436int
1437op_begemot_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
1438 uint sub, uint iidx __unused, enum snmp_op op)
1439{
1440 struct bridge_port *bp;
1441
1442 if (time(NULL) - ports_list_age > bridge_get_data_maxage())
1443 bridge_update_all_ports();
1444
1445 switch (op) {
1446 case SNMP_OP_GET:
1447 if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
1448 return (SNMP_ERR_NOSUCHNAME);
1373 break;
1449 goto get;
1374
1375 case SNMP_OP_GETNEXT:
1376 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1377 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1378 return (SNMP_ERR_NOSUCHNAME);
1450
1451 case SNMP_OP_GETNEXT:
1452 if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
1453 NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
1454 return (SNMP_ERR_NOSUCHNAME);
1379 break;
1455 goto get;
1380
1381 case SNMP_OP_SET:
1382 return (SNMP_ERR_NOT_WRITEABLE);
1383
1384 case SNMP_OP_ROLLBACK:
1385 case SNMP_OP_COMMIT:
1456
1457 case SNMP_OP_SET:
1458 return (SNMP_ERR_NOT_WRITEABLE);
1459
1460 case SNMP_OP_ROLLBACK:
1461 case SNMP_OP_COMMIT:
1386 default:
1387 abort();
1462 break;
1388 }
1463 }
1464 abort();
1389
1465
1466get:
1390 switch (val->var.subs[sub - 1]) {
1391 case LEAF_begemotBridgeTpPort:
1392 val->v.integer = bp->port_no;
1467 switch (val->var.subs[sub - 1]) {
1468 case LEAF_begemotBridgeTpPort:
1469 val->v.integer = bp->port_no;
1393 break;
1470 return (SNMP_ERR_NOERROR);
1471
1394 case LEAF_begemotBridgeTpPortMaxInfo:
1395 val->v.integer = bp->max_info;
1472 case LEAF_begemotBridgeTpPortMaxInfo:
1473 val->v.integer = bp->max_info;
1396 break;
1474 return (SNMP_ERR_NOERROR);
1475
1397 case LEAF_begemotBridgeTpPortInFrames:
1398 val->v.uint32 = bp->in_frames;
1476 case LEAF_begemotBridgeTpPortInFrames:
1477 val->v.uint32 = bp->in_frames;
1399 break;
1478 return (SNMP_ERR_NOERROR);
1479
1400 case LEAF_begemotBridgeTpPortOutFrames:
1401 val->v.uint32 = bp->out_frames;
1480 case LEAF_begemotBridgeTpPortOutFrames:
1481 val->v.uint32 = bp->out_frames;
1402 break;
1482 return (SNMP_ERR_NOERROR);
1483
1403 case LEAF_begemotBridgeTpPortInDiscards:
1404 val->v.uint32 = bp->in_drops;
1484 case LEAF_begemotBridgeTpPortInDiscards:
1485 val->v.uint32 = bp->in_drops;
1405 break;
1486 return (SNMP_ERR_NOERROR);
1406 }
1407
1487 }
1488
1408 return (SNMP_ERR_NOERROR);
1489 abort();
1409}
1490}