From 24988ed32dd8c4d1fea2762ad51ae5750a0c393f Mon Sep 17 00:00:00 2001 From: Shteryana Shopova Date: Wed, 8 Aug 2007 19:27:50 +0000 Subject: [PATCH] Keep the snmp_bridge(3) module up to date with if_bridge(4) and add an object to control the value of the new 'PRIVATE' bridge members' flag. While here, remove stale '__unused' compiler directives. Reviewed by: bz Approved by: re (bmah), bz (mentor) --- .../snmp_bridge/BEGEMOT-BRIDGE-MIB.txt | 20 +++++- .../bsnmpd/modules/snmp_bridge/bridge_port.c | 23 +++++++ .../bsnmpd/modules/snmp_bridge/bridge_snmp.h | 5 ++ .../bsnmpd/modules/snmp_bridge/bridge_sys.c | 65 ++++++++++++++++--- .../modules/snmp_bridge/bridge_tree.def | 1 + .../bsnmpd/modules/snmp_bridge/snmp_bridge.3 | 5 +- 6 files changed, 108 insertions(+), 11 deletions(-) diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/BEGEMOT-BRIDGE-MIB.txt b/usr.sbin/bsnmpd/modules/snmp_bridge/BEGEMOT-BRIDGE-MIB.txt index 4de407c58b64..d55ea3cf27d1 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/BEGEMOT-BRIDGE-MIB.txt +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/BEGEMOT-BRIDGE-MIB.txt @@ -41,7 +41,7 @@ IMPORTS FROM BEGEMOT-MIB; begemotBridge MODULE-IDENTITY - LAST-UPDATED "200611210000Z" + LAST-UPDATED "200708060000Z" ORGANIZATION "Sofia University St. Kliment Ohridski" CONTACT-INFO " Shteryana Shopova @@ -56,6 +56,10 @@ begemotBridge MODULE-IDENTITY E-Mail: syrinx@FreeBSD.org" DESCRIPTION "The Begemot MIB for managing bridge interfaces." + REVISION "200708060000Z" + DESCRIPTION + "Third revision adds begemotBridgeBasePortPrivate + object." REVISION "200611210000Z" DESCRIPTION "Second revision adds support for monitoring RSTP @@ -211,7 +215,8 @@ BegemotBridgeBasePortEntry ::= SEQUENCE { begemotBridgeBaseSpanEnabled INTEGER, begemotBridgeBasePortDelayExceededDiscards Counter32, begemotBridgeBasePortMtuExceededDiscards Counter32, - begemotBridgeBasePortStatus RowStatus + begemotBridgeBasePortStatus RowStatus, + begemotBridgeBasePortPrivate TruthValue } begemotBridgeBasePort OBJECT-TYPE @@ -272,6 +277,17 @@ begemotBridgeBasePortStatus OBJECT-TYPE removal of member ports from a specified bridge." ::= { begemotBridgeBasePortEntry 6 } +begemotBridgeBasePortPrivate OBJECT-TYPE + SYNTAX TruthValue + MAX-ACCESS read-write + STATUS current + DESCRIPTION + "The value of this objects reflects whether the port + has a PRIVATE flag set. A port with this flags set + can only communicate with ports not having the + PRIVATE flag set." + ::= { begemotBridgeBasePortEntry 7 } + -- ---------------------------------------------------------- -- -- the Bridge interface STP table -- ---------------------------------------------------------- -- diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c index dd07c406ac9b..fe2af043c112 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_port.c @@ -1074,6 +1074,7 @@ op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val, uint sub, uint iidx __unused, enum snmp_op op) { int8_t status, which; + const char *bname; struct bridge_port *bp; if (time(NULL) - ports_list_age > bridge_get_data_maxage()) @@ -1110,6 +1111,16 @@ op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val, case LEAF_begemotBridgeBasePortStatus: return (bridge_port_set_status(ctx, val, sub)); + case LEAF_begemotBridgeBasePortPrivate: + if ((bp = bridge_port_index_get(&val->var, sub, + status)) == NULL) + return (SNMP_ERR_NOSUCHNAME); + if ((bname = bridge_if_find_name(bp->sysindex)) == NULL) + return (SNMP_ERR_GENERR); + ctx->scratch->int1 = bp->priv_set; + return (bridge_port_set_private(bname, bp, + val->v.integer)); + case LEAF_begemotBridgeBasePort: case LEAF_begemotBridgeBasePortIfIndex: case LEAF_begemotBridgeBasePortDelayExceededDiscards: @@ -1124,6 +1135,14 @@ op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val, /* FALLTHROUGH */ case LEAF_begemotBridgeBasePortStatus: return (bridge_port_rollback_status(ctx, val, sub)); + case LEAF_begemotBridgeBasePortPrivate: + if ((bp = bridge_port_index_get(&val->var, sub, + status)) == NULL) + return (SNMP_ERR_GENERR); + if ((bname = bridge_if_find_name(bp->sysindex)) == NULL) + return (SNMP_ERR_GENERR); + return (bridge_port_set_private(bname, bp, + ctx->scratch->int1)); } return (SNMP_ERR_NOERROR); @@ -1160,6 +1179,10 @@ op_begemot_base_port(struct snmp_context *ctx, struct snmp_value *val, case LEAF_begemotBridgeBasePortStatus: val->v.integer = bp->status; return (SNMP_ERR_NOERROR); + + case LEAF_begemotBridgeBasePortPrivate: + val->v.integer = bp->priv_set; + return (SNMP_ERR_NOERROR); } abort(); diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_snmp.h b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_snmp.h index b6f213b63b3a..7f48950e4e87 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_snmp.h +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_snmp.h @@ -106,6 +106,7 @@ struct bridge_port { uint32_t dly_ex_drops; /* Drops on output. */ uint32_t dly_mtu_drops; /* MTU exceeded drops. */ int32_t status; /* The entry status. */ + enum TruthValue priv_set; /* The private flag. */ /* dot1dStp subtree objects. */ int32_t path_cost; @@ -337,6 +338,10 @@ int bridge_port_set_admin_ptp(const char *bif_name, struct bridge_port *bp, int bridge_port_set_admin_edge(const char *bif_name, struct bridge_port *bp, uint32_t enable); +/* Set 'private' flag. */ +int bridge_port_set_private(const char *bif_name, struct bridge_port *bp, + uint32_t priv_set); + /* Add a bridge member port. */ int bridge_port_addm(struct bridge_port *bp, const char *b_name); diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_sys.c b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_sys.c index 76de4cfed0df..9684d686feea 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_sys.c +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_sys.c @@ -429,8 +429,7 @@ bridge_set_max_cache(struct bridge_if *bif, int32_t max_cache) } int -bridge_set_tx_hold_count(struct bridge_if *bif __unused, - int32_t tx_hc __unused) +bridge_set_tx_hold_count(struct bridge_if *bif, int32_t tx_hc) { struct ifdrv ifd; struct ifbrparam b_param; @@ -455,8 +454,7 @@ bridge_set_tx_hold_count(struct bridge_if *bif __unused, } int -bridge_set_stp_version(struct bridge_if *bif __unused, - int32_t stp_proto __unused) +bridge_set_stp_version(struct bridge_if *bif, int32_t stp_proto) { struct ifdrv ifd; struct ifbrparam b_param; @@ -675,6 +673,11 @@ bridge_port_getinfo_conf(struct ifbreq *k_info, struct bridge_port *bp) else bp->span_enable = begemotBridgeBaseSpanEnabled_disabled; + if (k_info->ifbr_ifsflags & IFBIF_PRIVATE) + bp->priv_set = TruthValue_true; + else + bp->priv_set = TruthValue_false; + if (k_info->ifbr_ifsflags & IFBIF_BSTP_ADMEDGE) bp->admin_edge = TruthValue_true; else @@ -840,8 +843,8 @@ bridge_port_set_path_cost(const char *bif_name, struct bridge_port *bp, * Set the PonitToPoint status of the link administratively. */ int -bridge_port_set_admin_ptp(const char *bif_name __unused, - struct bridge_port *bp __unused, uint32_t admin_ptp __unused) +bridge_port_set_admin_ptp(const char *bif_name, struct bridge_port *bp, + uint32_t admin_ptp) { struct ifdrv ifd; struct ifbreq b_req; @@ -891,8 +894,8 @@ bridge_port_set_admin_ptp(const char *bif_name __unused, * Set admin edge. */ int -bridge_port_set_admin_edge(const char *bif_name __unused, - struct bridge_port *bp __unused, uint32_t enable __unused) +bridge_port_set_admin_edge(const char *bif_name, struct bridge_port *bp, + uint32_t enable) { struct ifdrv ifd; struct ifbreq b_req; @@ -931,6 +934,52 @@ bridge_port_set_admin_edge(const char *bif_name __unused, return (0); } +/* + * Set 'private' flag. + */ +int +bridge_port_set_private(const char *bif_name, struct bridge_port *bp, + uint32_t priv_set) +{ + struct ifdrv ifd; + struct ifbreq b_req; + + if (bp->priv_set == priv_set) + return (0); + + bzero(&b_req, sizeof(b_req)); + strlcpy(ifd.ifd_name, bif_name, sizeof(ifd.ifd_name)); + ifd.ifd_len = sizeof(b_req); + ifd.ifd_data = &b_req; + strlcpy(b_req.ifbr_ifsname, bp->p_name, sizeof(b_req.ifbr_ifsname)); + ifd.ifd_cmd = BRDGGIFFLGS; + + if (ioctl(sock, SIOCGDRVSPEC, &ifd) < 0) { + syslog(LOG_ERR, "get member %s param: ioctl(BRDGGIFFLGS) " + "failed: %s", bp->p_name, strerror(errno)); + return (-1); + } + + if (priv_set == TruthValue_true) + b_req.ifbr_ifsflags |= IFBIF_PRIVATE; + else if (priv_set == TruthValue_false) + b_req.ifbr_ifsflags &= ~IFBIF_PRIVATE; + else + return (SNMP_ERR_WRONG_VALUE); + + ifd.ifd_cmd = BRDGSIFFLGS; + if (ioctl(sock, SIOCSDRVSPEC, &ifd) < 0) { + syslog(LOG_ERR, "set member %s param: ioctl(BRDGSIFFLGS) " + "failed: %s", bp->p_name, strerror(errno)); + return (-1); + } + + bp->priv_set = priv_set; + + return (0); +} + + /* * Add a bridge member port. */ diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_tree.def b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_tree.def index 5a161afd8428..cbebda06e9ea 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_tree.def +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/bridge_tree.def @@ -200,6 +200,7 @@ typedef TpFdbStatus ENUM ( (4 begemotBridgeBasePortDelayExceededDiscards COUNTER GET) (5 begemotBridgeBasePortMtuExceededDiscards COUNTER GET) (6 begemotBridgeBasePortStatus RowStatus GET SET) + (7 begemotBridgeBasePortPrivate TruthValue GET SET) )) ) (2 begemotBridgeStp diff --git a/usr.sbin/bsnmpd/modules/snmp_bridge/snmp_bridge.3 b/usr.sbin/bsnmpd/modules/snmp_bridge/snmp_bridge.3 index c433dfa0a672..24c8969e8425 100644 --- a/usr.sbin/bsnmpd/modules/snmp_bridge/snmp_bridge.3 +++ b/usr.sbin/bsnmpd/modules/snmp_bridge/snmp_bridge.3 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 8, 2006 +.Dd August 6, 2007 .Dt snmp_bridge 3 .Os .Sh NAME @@ -83,6 +83,9 @@ has been SET already. .It Va destroy will attempt to remove the interface from the system bridge interface. .El +.It Va begemotBridgeBasePortPrivate +This object controls a bridge interface flag called PRIVATE where any private +port can not communicate with another private port. .El .Sh RESTRICTIONS Not all information in the MIBs is currently available in FreeBSD.