summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c')
-rw-r--r--usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c255
1 files changed, 251 insertions, 4 deletions
diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c
index 35b2100..44ea959 100644
--- a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c
+++ b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c
@@ -274,6 +274,17 @@ bridge_new_port(struct mibif *mif, struct bridge_if *bif)
strlcpy(bp->p_name, mif->name, IFNAMSIZ);
bp->circuit = oid_zeroDotZero;
+ /*
+ * Initialize all rstpMib specific values to false/default.
+ * These will be set to their true values later if the bridge
+ * supports RSTP.
+ */
+ bp->proto_migr = TruthValue_false;
+ bp->admin_edge = TruthValue_false;
+ bp->oper_edge = TruthValue_false;
+ bp->oper_p2p = TruthValue_false;
+ bp->admin_p2p = StpPortAdminPointToPointType_auto;
+
bridge_port_memif_insert(&bridge_ports, bp, &(bif->f_bp));
return (bp);
@@ -411,7 +422,6 @@ op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
return (SNMP_ERR_NOSUCHNAME);
bp = NULL; /* Make the compiler happy. */
- ret = SNMP_ERR_NOERROR;
switch (op) {
case SNMP_OP_GET:
@@ -437,6 +447,8 @@ op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
break;
case SNMP_OP_SET:
+ if (val->var.len - sub != 1)
+ return (SNMP_ERR_NOSUCHNAME);
if ((bp = bridge_port_find(val->var.subs[sub],
bif)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
@@ -465,6 +477,8 @@ op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
case LEAF_dot1dStpPortDesignatedPort:
case LEAF_dot1dStpPortForwardTransitions:
return (SNMP_ERR_NOT_WRITEABLE);
+ default:
+ return (SNMP_ERR_NOSUCHNAME);
}
if (ret == 0)
return (SNMP_ERR_NOERROR);
@@ -495,7 +509,8 @@ op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
case SNMP_OP_COMMIT:
return (SNMP_ERR_NOERROR);
}
-
+
+ ret = SNMP_ERR_NOERROR;
switch (val->var.subs[sub - 1]) {
case LEAF_dot1dStpPort:
val->v.integer = bp->port_no;
@@ -535,8 +550,133 @@ op_dot1d_stp_port(struct snmp_context *ctx, struct snmp_value *val,
}
int
+op_dot1d_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
+ uint sub, uint iidx __unused, enum snmp_op op)
+{
+ int ret;
+ struct bridge_if *bif;
+ struct bridge_port *bp;
+
+ if ((bif = bridge_get_default()) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+
+ if (time(NULL) - bif->ports_age > bridge_get_data_maxage() &&
+ bridge_update_memif(bif) <= 0)
+ return (SNMP_ERR_NOSUCHNAME);
+
+ bp = NULL; /* Make the compiler happy. */
+ switch (op) {
+ case SNMP_OP_GET:
+ if (val->var.len - sub != 1)
+ return (SNMP_ERR_NOSUCHNAME);
+ if ((bp = bridge_port_find(val->var.subs[sub],
+ bif)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+ break;
+
+ case SNMP_OP_GETNEXT:
+ if (val->var.len - sub == 0) {
+ if ((bp = bridge_port_bif_first(bif)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+ } else {
+ if ((bp = bridge_port_find(val->var.subs[sub],
+ bif)) == NULL ||
+ (bp = bridge_port_bif_next(bp)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+ }
+ val->var.len = sub + 1;
+ val->var.subs[sub] = bp->port_no;
+ break;
+
+ case SNMP_OP_SET:
+ if (val->var.len - sub != 1)
+ return (SNMP_ERR_NOSUCHNAME);
+ if ((bp = bridge_port_find(val->var.subs[sub],
+ bif)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_dot1dStpPortAdminEdgePort:
+ ctx->scratch->int1 = bp->admin_edge;
+ ret = bridge_port_set_admin_edge(bif->bif_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_dot1dStpPortAdminPointToPoint:
+ ctx->scratch->int1 = bp->admin_p2p;
+ ret = bridge_port_set_admin_p2p(bif->bif_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_dot1dStpPortAdminPathCost:
+ ctx->scratch->int1 = bp->admin_path_cost;
+ ret = bridge_port_set_path_cost(bif->bif_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_dot1dStpPortProtocolMigration:
+ case LEAF_dot1dStpPortOperEdgePort:
+ case LEAF_dot1dStpPortOperPointToPoint:
+ return (SNMP_ERR_NOT_WRITEABLE);
+ default:
+ return (SNMP_ERR_NOSUCHNAME);
+ }
+
+ if (ret == 0)
+ return (SNMP_ERR_NOERROR);
+ else if (ret == -2)
+ return (SNMP_ERR_WRONG_VALUE);
+ return (SNMP_ERR_GENERR);
+
+ case SNMP_OP_ROLLBACK:
+ if ((bp = bridge_port_find(val->var.subs[sub],
+ bif)) == NULL)
+ return (SNMP_ERR_GENERR);
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_dot1dStpPortAdminEdgePort:
+ bridge_port_set_admin_edge(bif->bif_name, bp,
+ ctx->scratch->int1);
+ break;
+ case LEAF_dot1dStpPortAdminPointToPoint:
+ bridge_port_set_admin_p2p(bif->bif_name, bp,
+ ctx->scratch->int1);
+ break;
+ case LEAF_dot1dStpPortAdminPathCost:
+ bridge_port_set_path_cost(bif->bif_name, bp,
+ ctx->scratch->int1);
+ break;
+ }
+ return (SNMP_ERR_NOERROR);
+
+ case SNMP_OP_COMMIT:
+ return (SNMP_ERR_NOERROR);
+ }
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_dot1dStpPortProtocolMigration:
+ val->v.integer = bp->proto_migr;
+ break;
+ case LEAF_dot1dStpPortAdminEdgePort:
+ val->v.integer = bp->admin_edge;
+ break;
+ case LEAF_dot1dStpPortOperEdgePort:
+ val->v.integer = bp->oper_edge;
+ break;
+ case LEAF_dot1dStpPortAdminPointToPoint:
+ val->v.integer = bp->admin_p2p;
+ break;
+ case LEAF_dot1dStpPortOperPointToPoint:
+ val->v.integer = bp->oper_p2p;
+ break;
+ case LEAF_dot1dStpPortAdminPathCost:
+ val->v.integer = bp->admin_path_cost;
+ break;
+ }
+
+ return (SNMP_ERR_NOERROR);
+}
+
+int
op_dot1d_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
- uint sub, uint iidx __unused, enum snmp_op op)
+ uint sub, uint iidx __unused, enum snmp_op op)
{
struct bridge_if *bif;
struct bridge_port *bp;
@@ -1064,7 +1204,6 @@ op_begemot_stp_port(struct snmp_context *ctx, struct snmp_value *val,
}
ret = SNMP_ERR_NOERROR;
-
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeStpPort:
val->v.integer = bp->port_no;
@@ -1102,6 +1241,114 @@ op_begemot_stp_port(struct snmp_context *ctx, struct snmp_value *val,
}
int
+op_begemot_stp_ext_port(struct snmp_context *ctx, struct snmp_value *val,
+ uint sub, uint iidx __unused, enum snmp_op op)
+{
+ int ret;
+ struct bridge_port *bp = NULL;
+ const char *b_name;
+
+ if (time(NULL) - ports_list_age > bridge_get_data_maxage())
+ bridge_update_all_ports();
+
+ switch (op) {
+ case SNMP_OP_GET:
+ if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+ break;
+
+ case SNMP_OP_GETNEXT:
+ if ((bp = bridge_port_index_getnext(&val->var, sub, 0)) ==
+ NULL || bridge_port_index_append(&val->var, sub, bp) < 0)
+ return (SNMP_ERR_NOSUCHNAME);
+ break;
+
+ case SNMP_OP_SET:
+ if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL)
+ return (SNMP_ERR_NOSUCHNAME);
+ if ((b_name = bridge_if_find_name(bp->sysindex)) == NULL)
+ return (SNMP_ERR_GENERR);
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_begemotBridgeStpPortAdminEdgePort:
+ ctx->scratch->int1 = bp->admin_edge;
+ ret = bridge_port_set_admin_edge(b_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_begemotBridgeStpPortAdminPointToPoint:
+ ctx->scratch->int1 = bp->admin_p2p;
+ ret = bridge_port_set_admin_p2p(b_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_begemotBridgeStpPortAdminPathCost:
+ ctx->scratch->int1 = bp->admin_path_cost;
+ ret = bridge_port_set_path_cost(b_name, bp,
+ val->v.integer);
+ break;
+ case LEAF_begemotBridgeStpPortProtocolMigration:
+ case LEAF_begemotBridgeStpPortOperEdgePort:
+ case LEAF_begemotBridgeStpPortOperPointToPoint:
+ return (SNMP_ERR_NOT_WRITEABLE);
+ default:
+ return (SNMP_ERR_NOSUCHNAME);
+ }
+
+ if (ret == 0)
+ return (SNMP_ERR_NOERROR);
+ else if (ret == -2)
+ return (SNMP_ERR_WRONG_VALUE);
+ return (SNMP_ERR_GENERR);
+
+ case SNMP_OP_ROLLBACK:
+ if ((bp = bridge_port_index_get(&val->var, sub, 0)) == NULL ||
+ (b_name = bridge_if_find_name(bp->sysindex)) == NULL)
+ return (SNMP_ERR_GENERR);
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_begemotBridgeStpPortAdminEdgePort:
+ bridge_port_set_admin_edge(b_name, bp,
+ ctx->scratch->int1);
+ break;
+ case LEAF_begemotBridgeStpPortAdminPointToPoint:
+ bridge_port_set_admin_p2p(b_name, bp,
+ ctx->scratch->int1);
+ break;
+ case LEAF_begemotBridgeStpPortAdminPathCost:
+ bridge_port_set_path_cost(b_name, bp,
+ ctx->scratch->int1);
+ break;
+ }
+ return (SNMP_ERR_NOERROR);
+
+ case SNMP_OP_COMMIT:
+ return (SNMP_ERR_NOERROR);
+ }
+
+ switch (val->var.subs[sub - 1]) {
+ case LEAF_begemotBridgeStpPortProtocolMigration:
+ val->v.integer = bp->proto_migr;
+ break;
+ case LEAF_begemotBridgeStpPortAdminEdgePort:
+ val->v.integer = bp->admin_edge;
+ break;
+ case LEAF_begemotBridgeStpPortOperEdgePort:
+ val->v.integer = bp->oper_edge;
+ break;
+ case LEAF_begemotBridgeStpPortAdminPointToPoint:
+ val->v.integer = bp->admin_p2p;
+ break;
+ case LEAF_begemotBridgeStpPortOperPointToPoint:
+ val->v.integer = bp->oper_p2p;
+ break;
+ case LEAF_begemotBridgeStpPortAdminPathCost:
+ val->v.integer = bp->admin_path_cost;
+ break;
+ }
+
+ return (SNMP_ERR_NOERROR);
+}
+
+int
op_begemot_tp_port(struct snmp_context *c __unused, struct snmp_value *val,
uint sub, uint iidx __unused, enum snmp_op op)
{
OpenPOWER on IntegriCloud