Bring in a SNMP module to support monitoring if_bridge(4) interfaces

via bsnmpd(1). The module implements IETF BRIDGE-MIB as defined in
RFC4188 and a private BEGEMOT-BRIDGE-MIB.

Sponsored by:  Google Summer of Code 2006
Reviewed by:   bz
Approved by:   bz (mentor)
This commit is contained in:
syrinx 2006-11-19 15:42:48 +00:00
parent a6852e6ab6
commit 2b14cadbaf
12 changed files with 7979 additions and 0 deletions

View File

@ -0,0 +1,965 @@
--
-- Copyright (C) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
-- 1. Redistributions of source code must retain the above copyright
-- notice, this list of conditions and the following disclaimer.
-- 2. Redistributions in binary form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-- ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- SUCH DAMAGE.
--
-- $FreeBSD$
--
BEGEMOT-BRIDGE-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
Counter32, Integer32, TimeTicks, mib-2
FROM SNMPv2-SMI
TEXTUAL-CONVENTION, MacAddress, TruthValue, RowStatus
FROM SNMPv2-TC
BridgeId, Timeout
FROM BRIDGE-MIB
InterfaceIndex FROM IF-MIB
begemot
FROM BEGEMOT-MIB;
begemotBridge MODULE-IDENTITY
LAST-UPDATED "200608100000Z"
ORGANIZATION "Sofia University St. Kliment Ohridski"
CONTACT-INFO
" Shteryana Shopova
Postal: Faculty of Mathematics and Informatics
5 James Bourchier Blvd.
1164 Sofia
Bulgaria
Fax: +359 2 687 180
E-Mail: syrinx@FreeBSD.org"
DESCRIPTION
"The Begemot MIB for managing bridge interfaces."
::= { begemot 205 }
-- ---------------------------------------------------------- --
BridgeIfName ::= TEXTUAL-CONVENTION
DISPLAY-HINT "16a"
STATUS current
DESCRIPTION
"Name of a bridge interface."
SYNTAX OCTET STRING (SIZE(1..16))
BridgeIfNameOrEmpty ::= TEXTUAL-CONVENTION
DISPLAY-HINT "16a"
STATUS current
DESCRIPTION
"Name of a bridge interface."
SYNTAX OCTET STRING (SIZE(0..16))
BridgePortId ::= TEXTUAL-CONVENTION
DISPLAY-HINT "1x.1x"
STATUS current
DESCRIPTION
"A port identifier that contains a bridge port's STP priority
in the first octet and the port number in the second octet."
SYNTAX OCTET STRING (SIZE(2))
-- ---------------------------------------------------------- --
-- subtrees in the Begemot Bridge MIB
-- ---------------------------------------------------------- --
begemotBridgeNotifications OBJECT IDENTIFIER ::= { begemotBridge 0 }
begemotBridgeBase OBJECT IDENTIFIER ::= { begemotBridge 1 }
begemotBridgeStp OBJECT IDENTIFIER ::= { begemotBridge 2 }
begemotBridgeTp OBJECT IDENTIFIER ::= { begemotBridge 3 }
begemotBridgePf OBJECT IDENTIFIER ::= { begemotBridge 4 }
begemotBridgeConfigObjects OBJECT IDENTIFIER ::= { begemotBridge 5 }
-- ---------------------------------------------------------- --
-- the base Bridge interface table
-- ---------------------------------------------------------- --
begemotBridgeBaseTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeBaseEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table that contains generic information for each
bridge interface on the managed device."
::= { begemotBridgeBase 1 }
begemotBridgeBaseEntry OBJECT-TYPE
SYNTAX BegemotBridgeBaseEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of information for the bridge interfaces on
the managed device."
INDEX { begemotBridgeBaseName }
::= { begemotBridgeBaseTable 1 }
BegemotBridgeBaseEntry ::= SEQUENCE {
begemotBridgeBaseName BridgeIfName,
begemotBridgeBaseAddress MacAddress,
begemotBridgeBaseNumPorts Integer32,
begemotBridgeBaseType INTEGER,
begemotBridgeBaseStatus RowStatus
}
begemotBridgeBaseName OBJECT-TYPE
SYNTAX BridgeIfName
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The name of the bridge interface for which this
entry contains management information."
::= { begemotBridgeBaseEntry 1 }
begemotBridgeBaseAddress OBJECT-TYPE
SYNTAX MacAddress
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The MAC address of the bridge interface."
::= { begemotBridgeBaseEntry 2 }
begemotBridgeBaseNumPorts OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of ports, members of this bridge."
::= { begemotBridgeBaseEntry 3 }
begemotBridgeBaseType OBJECT-TYPE
SYNTAX INTEGER {
unknown(1),
transparent-only(2),
sourceroute-only(3),
srt(4)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Indicates what type of bridging this bridge can
perform."
::= { begemotBridgeBaseEntry 4 }
begemotBridgeBaseStatus OBJECT-TYPE
SYNTAX RowStatus
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Used to create/destroy bridge interfaces on the
managed device."
::= { begemotBridgeBaseEntry 5 }
-- ---------------------------------------------------------- --
-- the base Bridge ports table
-- ---------------------------------------------------------- --
begemotBridgeBasePortTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeBasePortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table containing generic information about ports,
members of each bridge interface."
::= { begemotBridgeBase 2 }
begemotBridgeBasePortEntry OBJECT-TYPE
SYNTAX BegemotBridgeBasePortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of information about a specific port, member of
a bridge interface."
INDEX { begemotBridgeBaseName, begemotBridgeBasePortIfIndex }
::= { begemotBridgeBasePortTable 1 }
BegemotBridgeBasePortEntry ::= SEQUENCE {
begemotBridgeBasePort Integer32,
begemotBridgeBasePortIfIndex InterfaceIndex,
begemotBridgeBaseSpanEnabled INTEGER,
begemotBridgeBasePortDelayExceededDiscards Counter32,
begemotBridgeBasePortMtuExceededDiscards Counter32,
begemotBridgeBasePortStatus RowStatus
}
begemotBridgeBasePort OBJECT-TYPE
SYNTAX Integer32 (1..65535)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The system interface index of the interface corresponding
to this port."
::= { begemotBridgeBasePortEntry 1 }
begemotBridgeBasePortIfIndex OBJECT-TYPE
SYNTAX InterfaceIndex
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of the instance of the ifIndex object,
defined in IF-MIB, for the interface corresponding
to this port."
::= { begemotBridgeBasePortEntry 2 }
begemotBridgeBaseSpanEnabled OBJECT-TYPE
SYNTAX INTEGER {
enabled(1),
disabled(2)
}
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The value of this objects reflects whether the port
is a span port on the specified bridge interface."
::= { begemotBridgeBasePortEntry 3 }
begemotBridgeBasePortDelayExceededDiscards OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of frames discarded by this port due
to excessive transit delay through the bridge."
::= { begemotBridgeBasePortEntry 4 }
begemotBridgeBasePortMtuExceededDiscards OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of frames discarded by this port due
to an excessive size."
::= { begemotBridgeBasePortEntry 5 }
begemotBridgeBasePortStatus OBJECT-TYPE
SYNTAX RowStatus
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Used to control addition of member ports to or
removal of member ports from a specified bridge."
::= { begemotBridgeBasePortEntry 6 }
-- ---------------------------------------------------------- --
-- the Bridge interface STP table
-- ---------------------------------------------------------- --
begemotBridgeStpTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeStpEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table that contains Spanning Tree Protocol information
for each bridge interface on the managed device."
::= { begemotBridgeStp 1 }
begemotBridgeStpEntry OBJECT-TYPE
SYNTAX BegemotBridgeStpEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of information about the Spanning Tree Protocol
operation on a bridge interface."
AUGMENTS { begemotBridgeBaseEntry }
::= { begemotBridgeStpTable 1 }
BegemotBridgeStpEntry ::= SEQUENCE {
begemotBridgeStpProtocolSpecification INTEGER,
begemotBridgeStpPriority Integer32,
begemotBridgeStpTimeSinceTopologyChange TimeTicks,
begemotBridgeStpTopChanges Counter32,
begemotBridgeStpDesignatedRoot BridgeId,
begemotBridgeStpRootCost Integer32,
begemotBridgeStpRootPort Integer32,
begemotBridgeStpMaxAge Timeout,
begemotBridgeStpHelloTime Timeout,
begemotBridgeStpHoldTime Integer32,
begemotBridgeStpForwardDelay Timeout,
begemotBridgeStpBridgeMaxAge Timeout,
begemotBridgeStpBridgeHelloTime Timeout,
begemotBridgeStpBridgeForwardDelay Timeout
}
begemotBridgeStpProtocolSpecification OBJECT-TYPE
SYNTAX INTEGER {
unknown(1),
decLb100(2),
ieee8021d(3)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The Spanning Tree Protocol version being run on the
bridge interface. The value 'decLb100(2)' indicates the
DEC LANbridge 100 Spanning Tree protocol, 'ieee8021d(3)'
indicates the bridge is running IEEE 802.1D STP
implementation."
::= { begemotBridgeStpEntry 1 }
begemotBridgeStpPriority OBJECT-TYPE
SYNTAX Integer32 (0..65535)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The priority value of the bridge interface forming the
first two octets of the bridge identifier. Acceptable
values are 0-61440, in steps of 4096."
::= { begemotBridgeStpEntry 2 }
begemotBridgeStpTimeSinceTopologyChange OBJECT-TYPE
SYNTAX TimeTicks
UNITS "centi-seconds"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The time (in hundreds of a second) since a topology change
was last detected by this bridge."
::= { begemotBridgeStpEntry 3 }
begemotBridgeStpTopChanges OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of times a topology change was detected by the
bridge interface since the management entity was initialized
or reset."
::= { begemotBridgeStpEntry 4 }
begemotBridgeStpDesignatedRoot OBJECT-TYPE
SYNTAX BridgeId
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The bridge identifier of the root of the spanning tree as
calculated by the Spanning Tree Protocol."
::= { begemotBridgeStpEntry 5 }
begemotBridgeStpRootCost OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The cost of the path from this bridge to the root bridge."
::= { begemotBridgeStpEntry 6 }
begemotBridgeStpRootPort OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The port number of the port that offers the lowest
cost path from this bridge to the root bridge of
the spanning tree. If this bridge is the root bridge,
this object shall have a value of zero."
::= { begemotBridgeStpEntry 7 }
begemotBridgeStpMaxAge OBJECT-TYPE
SYNTAX Timeout
UNITS "centi-seconds"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The maximum age of Spanning Tree Protocol information
received from the network on any port, before that
information is discarded. This is the actual value that
the bridge is currently using."
::= { begemotBridgeStpEntry 8 }
begemotBridgeStpHelloTime OBJECT-TYPE
SYNTAX Timeout
UNITS "centi-seconds"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The amount of time between transmission of
Configuration BPDUs by this bridge on any port,
when it is the root of the spanning tree or is
trying to become so. This is the actual value that
this bridge is currently using."
::= { begemotBridgeStpEntry 9 }
begemotBridgeStpHoldTime OBJECT-TYPE
SYNTAX Integer32
UNITS "centi-seconds"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This time value determines the interval length
during which no more than two Configuration BPDUs
shall be transmitted by this node, in units of
hundredths of a second."
::= { begemotBridgeStpEntry 10 }
begemotBridgeStpForwardDelay OBJECT-TYPE
SYNTAX Timeout
UNITS "centi-seconds"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"This value, measured in units of hundredths of a second
determines how long a port will stay consecutively in the
Listening and Learning states before transitioning to
Forwarding state.
This is the actual value currently used by the bridge
as opposed to begemotBridgeStpBridgeForwardDelay, which
is the value this and all bridges participating in the
spanning tree were to use, if this was the root bridge."
::= { begemotBridgeStpEntry 11 }
begemotBridgeStpBridgeMaxAge OBJECT-TYPE
SYNTAX Timeout (600..4000)
UNITS "centi-seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The value that all bridges participating in the
spanning tree would use for MaxAge if this bridge
was the root of the spanning tree."
::= { begemotBridgeStpEntry 12 }
begemotBridgeStpBridgeHelloTime OBJECT-TYPE
SYNTAX Timeout (100..1000)
UNITS "centi-seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The value that all bridges participating in the
spanning tree would use for HelloTime if this
bridge was the root of the spanning tree."
::= { begemotBridgeStpEntry 13 }
begemotBridgeStpBridgeForwardDelay OBJECT-TYPE
SYNTAX Timeout (400..3000)
UNITS "centi-seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The value that all bridges participating in the
spanning tree would use for ForwardDelay if this
bridge was the root of the spanning tree."
::= { begemotBridgeStpEntry 14 }
-- ---------------------------------------------------------- --
-- the Bridge STP ports table
-- ---------------------------------------------------------- --
begemotBridgeStpPortTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeStpPortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table containing Spanning Tree Protocol information
about the members of each bridge interface."
::= { begemotBridgeStp 2 }
begemotBridgeStpPortEntry OBJECT-TYPE
SYNTAX BegemotBridgeStpPortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of Spanning Tree Protocol information about
a specific member of a bridge interface."
INDEX { begemotBridgeBaseName, begemotBridgeBasePortIfIndex }
::= { begemotBridgeStpPortTable 1 }
BegemotBridgeStpPortEntry ::= SEQUENCE {
begemotBridgeStpPort Integer32,
begemotBridgeStpPortPriority Integer32,
begemotBridgeStpPortState INTEGER,
begemotBridgeStpPortEnable INTEGER,
begemotBridgeStpPortPathCost Integer32,
begemotBridgeStpPortDesignatedRoot BridgeId,
begemotBridgeStpPortDesignatedCost Integer32,
begemotBridgeStpPortDesignatedBridge BridgeId,
begemotBridgeStpPortDesignatedPort BridgePortId,
begemotBridgeStpPortForwardTransitions Counter32
}
begemotBridgeStpPort OBJECT-TYPE
SYNTAX Integer32 (1..65535)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The system interface index of the interface corresponding
to this port, for which the management entity has Spanning
Tree Protocol information."
::= { begemotBridgeStpPortEntry 1 }
begemotBridgeStpPortPriority OBJECT-TYPE
SYNTAX Integer32 (0..255)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The STP priority of this port that is contained in the first
octet of its Port Identifier. The second octet contains the
value of begemotBridgeStpPort."
::= { begemotBridgeStpPortEntry 2 }
begemotBridgeStpPortState OBJECT-TYPE
SYNTAX INTEGER {
disabled(1),
blocking(2),
listening(3),
learning(4),
forwarding(5),
broken(6)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The current state of the port as defined by the operation
of the Spanning Tree Protocol. If the Spanning Tree Protocol
is administratively disabled on the port, this object shall
have value disabled(1). A value of broken(6) does not correspond
to any legal state of a port, and if present should indicate
error in the operation of either the Spanning Tree Protocol
implementation running on the device or the management entity."
::= { begemotBridgeStpPortEntry 3 }
begemotBridgeStpPortEnable OBJECT-TYPE
SYNTAX INTEGER {
enabled(1),
disabled(2)
}
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The administrative Spanning Tree Protocol state of the
port - value of enabled(1) indicates that the port is
participating in the Spanning Tree Protocol operation."
::= { begemotBridgeStpPortEntry 4 }
begemotBridgeStpPortPathCost OBJECT-TYPE
SYNTAX Integer32 (1..65535)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The contribution of the path through this port, when the port
is the Root Port, to the total cost of the path to the root
bridge for this bridge."
::= { begemotBridgeStpPortEntry 5 }
begemotBridgeStpPortDesignatedRoot OBJECT-TYPE
SYNTAX BridgeId
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The unique Bridge Identifier of the bridge recorded as the
root in the Root Identifier parameter of Configuration BPDUs
transmitted by the Designated Bridge for the LAN to which
the port is attached."
::= { begemotBridgeStpPortEntry 6 }
begemotBridgeStpPortDesignatedCost OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"For a Designated port, the path cost (equal to the Root
Path Cost of the bridge) offered to the LAN to which the
port is attached otherwise the cost of the path to the Root
offered by the Designated Port on the LAN to which this
Port is attached."
::= { begemotBridgeStpPortEntry 7 }
begemotBridgeStpPortDesignatedBridge OBJECT-TYPE
SYNTAX BridgeId
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The unique Bridge Identifier of the bridge to which the
port belongs, in the case when the port is a designated
port, otherwise the bridge believed to be the Designated
Bridge for the LAN to which this port is attached."
::= { begemotBridgeStpPortEntry 8 }
begemotBridgeStpPortDesignatedPort OBJECT-TYPE
SYNTAX BridgePortId
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The Port Identifier of the Bridge port, on the Designated
Bridge, through which the Designated Bridge transmits the
Configuration Message information stored by this port."
::= { begemotBridgeStpPortEntry 9 }
begemotBridgeStpPortForwardTransitions OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of times this port has transitioned
from the Learning state to the Forwarding state."
::= { begemotBridgeStpPortEntry 10 }
-- ---------------------------------------------------------- --
-- the Bridge interface Transparent bridging table
-- ---------------------------------------------------------- --
begemotBridgeTpTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeTpEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table that contains information regarding transparent
bridging for each bridge interface on the managed device."
::= { begemotBridgeTp 1 }
begemotBridgeTpEntry OBJECT-TYPE
SYNTAX BegemotBridgeTpEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of information regarding transparent bridging
on a bridge interface."
AUGMENTS { begemotBridgeBaseEntry }
::= { begemotBridgeTpTable 1 }
BegemotBridgeTpEntry ::= SEQUENCE {
begemotBridgeTpLearnedEntryDiscards Counter32,
begemotBridgeTpAgingTime Integer32,
begemotBridgeTpMaxAddresses Integer32
}
begemotBridgeTpLearnedEntryDiscards OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The total number of Forwarding Database entries that would
have been learnt, but have been discarded due to Forwarding
Address Table having reached it's maximum entries limit."
::= { begemotBridgeTpEntry 1 }
begemotBridgeTpAgingTime OBJECT-TYPE
SYNTAX Integer32 (10..1000000)
UNITS "seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The timeout period in seconds before aging out
dynamically learnt forwarding entries."
::= { begemotBridgeTpEntry 2 }
begemotBridgeTpMaxAddresses OBJECT-TYPE
SYNTAX Integer32 (1..10000)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The maximum number of entires that this bridge can
learn in it's Forwarding Address Table and use for
making forwarding decisions."
::= { begemotBridgeTpEntry 3 }
-- ---------------------------------------------------------- --
-- The Forwarding Database for Transparent Bridging interfaces
-- ---------------------------------------------------------- --
begemotBridgeTpFdbTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeTpFdbEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table that contains information about unicast entries
for which the bridge interfaces have forwarding and/or
filtering information. This information is used by the
bridge interfaces to make forwarding decisions."
::= { begemotBridgeTp 2 }
begemotBridgeTpFdbEntry OBJECT-TYPE
SYNTAX BegemotBridgeTpFdbEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Information about a specific unicast MAC address
for which the bridge interface has some forwarding
and/or filtering information."
INDEX { begemotBridgeBaseName, begemotBridgeTpFdbAddress }
::= { begemotBridgeTpFdbTable 1 }
BegemotBridgeTpFdbEntry ::= SEQUENCE {
begemotBridgeTpFdbAddress MacAddress,
begemotBridgeTpFdbPort Integer32,
begemotBridgeTpFdbStatus INTEGER
}
begemotBridgeTpFdbAddress OBJECT-TYPE
SYNTAX MacAddress
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A unicast MAC address for which the bridge has which the
bridge interface has some forwarding and/or filtering
information."
::= { begemotBridgeTpFdbEntry 1 }
begemotBridgeTpFdbPort OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The port number of the bridge port on which a frame having
a source address equal to the value of the corresponding
instance of begemotBridgeTpFdbAddress has been seen."
::= { begemotBridgeTpFdbEntry 2 }
begemotBridgeTpFdbStatus OBJECT-TYPE
SYNTAX INTEGER {
other(1),
invalid(2),
learned(3),
self(4),
mgmt(5)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The status of this entry. The meanings of the
values are:
other(1) - none of the following.
invalid(2) - this entry is no longer valid (e.g.,
it was learned but has since aged out), but has
not yet been flushed from the table.
learned(3) - the value of the corresponding instance
of begemotBridgeTpFdbPort was learned, and is being
used.
self(4) - the value of the corresponding instance of
begemotBridgeTpFdbAddress represents one of the
bridge's addresses. The corresponding instance of
begemotBridgeTpFdbPort indicates which of the bridge's
ports has this address.
mgmt(5) - the value of the corresponding instance of
begemotBridgeTpFdbAddress has been added to the
bridge's Forwarding Database by some management
means."
::= { begemotBridgeTpFdbEntry 3 }
-- ---------------------------------------------------------- --
-- Ports table for Transparent Bridging interfaces
-- ---------------------------------------------------------- --
begemotBridgeTpPortTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotBridgeTpPortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table that contains information about every bridge port,
member of a bridge interface, associated with the transparent
bridging function of the bridge."
::= { begemotBridgeTp 3 }
begemotBridgeTpPortEntry OBJECT-TYPE
SYNTAX BegemotBridgeTpPortEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of information about every bridge port, member of a
bridge interface, associated with the bridge's transparent
bridging function."
INDEX { begemotBridgeBaseName, begemotBridgeBasePortIfIndex }
::= { begemotBridgeTpPortTable 1 }
BegemotBridgeTpPortEntry ::= SEQUENCE {
begemotBridgeTpPort Integer32,
begemotBridgeTpPortMaxInfo Integer32,
begemotBridgeTpPortInFrames Counter32,
begemotBridgeTpPortOutFrames Counter32,
begemotBridgeTpPortInDiscards Counter32
}
begemotBridgeTpPort OBJECT-TYPE
SYNTAX Integer32 (1..65535)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The system interface index of the port for which this entry
contains Transparent bridging management information."
::= { begemotBridgeTpPortEntry 1 }
begemotBridgeTpPortMaxInfo OBJECT-TYPE
SYNTAX Integer32
UNITS "bytes"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The maximum size of the INFO (non-MAC) field that this port
will receive or transmit."
::= { begemotBridgeTpPortEntry 2 }
begemotBridgeTpPortInFrames OBJECT-TYPE
SYNTAX Counter32
UNITS "frames"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of frames that have been received by this
port from its segment. Note that a frame received on the
interface corresponding to this port is only counted by
this object if and only if it is for a protocol being
processed by the local bridging function, including
bridge management frames."
::= { begemotBridgeTpPortEntry 3 }
begemotBridgeTpPortOutFrames OBJECT-TYPE
SYNTAX Counter32
UNITS "frames"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of frames that have been transmitted by this
port to its segment. Note that a frame transmitted on
the interface corresponding to this port is only counted
by this object if and only if it is for a protocol being
processed by the local bridging function, including
bridge management frames."
::= { begemotBridgeTpPortEntry 4 }
begemotBridgeTpPortInDiscards OBJECT-TYPE
SYNTAX Counter32
UNITS "frames"
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Count of received valid frames that were discarded
(i.e., filtered) by the Forwarding Process."
::= { begemotBridgeTpPortEntry 5 }
-- ---------------------------------------------------------- --
-- the begemotBridgePf objects
-- ---------------------------------------------------------- --
begemotBridgePfilStatus OBJECT-TYPE
SYNTAX TruthValue
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Indicates whether packet filtering by some firewall
package is enabled on the bridge interface."
::= { begemotBridgePf 1 }
begemotBridgePfilMembers OBJECT-TYPE
SYNTAX TruthValue
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"A value of true(1) indicates that packet filtering is
enabled on both incoming and outgoing bridge member
interfaces."
::= { begemotBridgePf 2 }
begemotBridgePfilIpOnly OBJECT-TYPE
SYNTAX TruthValue
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"This value controls the handling of non-IP packets which
are not passed on for further processing to a firewall
package. A value of false(0) indicates that all non-IP
Ethernet frames are passed unconditionally."
::= { begemotBridgePf 3 }
begemotBridgeLayer2PfStatus OBJECT-TYPE
SYNTAX INTEGER {
enabled(1),
disabled(2)
}
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"This value indicates whether layer2 filtering by a
firewall package is enabled for bridge interfaces."
::= { begemotBridgePf 4 }
-- ---------------------------------------------------------- --
-- the begemotBridgeConfigObjects objects
-- ---------------------------------------------------------- --
begemotBridgeDefaultBridgeIf OBJECT-TYPE
SYNTAX BridgeIfNameOrEmpty
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The name of the bridge interface that will be managed
via objects in IETF BRIDGE-MIB (RFC4188). If the
object's value is set to an empty string, bridge interfaces
will only be managed via objects in this MIB module."
DEFVAL { "bridge0" }
::= { begemotBridgeConfigObjects 1 }
begemotBridgeDataUpdate OBJECT-TYPE
SYNTAX Timeout (1..300)
UNITS "seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The maximum age in seconds of the cached data."
DEFVAL { 10 }
::= { begemotBridgeConfigObjects 2 }
begemotBridgeDataPoll OBJECT-TYPE
SYNTAX Timeout (1..3600)
UNITS "seconds"
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The polling rate of data when the module is idle."
DEFVAL { 300 }
::= { begemotBridgeConfigObjects 3 }
-- ---------------------------------------------------------- --
-- Notifications for the Spanning Tree Protocol
-- ---------------------------------------------------------- --
begemotBridgeNewRoot NOTIFICATION-TYPE
OBJECTS { begemotBridgeBaseName }
STATUS current
DESCRIPTION
"The begemotBridgeNewRoot trap indicates that one of the
bridge interfaces on the sending agent's device has
become the new root of the spanning tree topology it is
participating in."
::= { begemotBridgeNotifications 1 }
begemotBridgeTopologyChange NOTIFICATION-TYPE
OBJECTS { begemotBridgeBaseName }
STATUS current
DESCRIPTION
"A begemotBridgeTopologyChange trap is send when a member
port on one of the bridge interfaces, monitored by the agent,
transitions from the Learning state to the Forwarding state,
or from the Forwarding state to the Blocking state. The trap
is not sent if a begemotBridgeNewRoot trap is sent for the
same transition."
::= { begemotBridgeNotifications 2 }
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,19 @@
#
# $FreeBSD$
#
MOD= bridge
SRCS= bridge_snmp.c bridge_if.c bridge_port.c bridge_addrs.c \
bridge_pf.c bridge_sys.c
CFLAGS+= -DSNMPTREE_TYPES
XSYM= dot1dBridge newRoot topologyChange begemotBridgeNewRoot \
begemotBridgeTopologyChange begemotBridgeBaseName
MAN= snmp_bridge.3
BMIBS= BRIDGE-MIB.txt BEGEMOT-BRIDGE-MIB.txt
DEFS= ${MOD}_tree.def
INCS= ${MOD}_snmp.h
.include <bsd.snmpmod.mk>

View File

@ -0,0 +1,592 @@
/*-
* Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Bridge MIB implementation for SNMPd.
* Bridge addresses.
*
* $FreeBSD$
*/
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_mib.h>
#include <assert.h>
#include <errno.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>
#include <bsnmp/snmpmod.h>
#include <bsnmp/snmp_mibII.h>
#include "bridge_tree.h"
#include "bridge_snmp.h"
TAILQ_HEAD(tp_entries, tp_entry);
/*
* Free the bridge address list.
*/
static void
bridge_tpe_free(struct tp_entries *headp)
{
struct tp_entry *t;
while ((t = TAILQ_FIRST(headp)) != NULL) {
TAILQ_REMOVE(headp, t, tp_e);
free(t);
}
}
/*
* Free the bridge address entries from the address list,
* for the specified bridge interface only.
*/
static void
bridge_tpe_bif_free(struct tp_entries *headp,
struct bridge_if *bif)
{
struct tp_entry *tp;
while (bif->f_tpa != NULL && bif->sysindex == bif->f_tpa->sysindex) {
tp = TAILQ_NEXT(bif->f_tpa, tp_e);
TAILQ_REMOVE(headp, bif->f_tpa, tp_e);
free(bif->f_tpa);
bif->f_tpa = tp;
}
}
/*
* Compare two mac addresses.
* m1 < m2 : -1
* m1 > m2 : +1
* m1 = m2 : 0
*/
static int
bridge_compare_macs(const uint8_t *m1, const uint8_t *m2)
{
int i;
for (i = 0; i < ETHER_ADDR_LEN; i++) {
if (m1[i] < m2[i])
return (-1);
if (m1[i] > m2[i])
return (1);
}
return (0);
}
/*
* Insert an address entry in the bridge address TAILQ starting to search
* for its place from the position of the first bridge address for the bridge
* interface. Update the first bridge address if neccessary.
*/
static void
bridge_addrs_insert_at(struct tp_entries *headp,
struct tp_entry *ta, struct tp_entry **f_tpa)
{
struct tp_entry *t1;
assert(f_tpa != NULL);
for (t1 = *f_tpa;
t1 != NULL && ta->sysindex == t1->sysindex;
t1 = TAILQ_NEXT(t1, tp_e)) {
if (bridge_compare_macs(ta->tp_addr, t1->tp_addr) < 0) {
TAILQ_INSERT_BEFORE(t1, ta, tp_e);
if (*f_tpa == t1)
(*f_tpa) = ta;
return;
}
}
if (t1 == NULL)
TAILQ_INSERT_TAIL(headp, ta, tp_e);
else
TAILQ_INSERT_BEFORE(t1, ta, tp_e);
}
/*
* Find an address entry's possition in the address list
* according to bridge interface name.
*/
static struct tp_entry *
bridge_addrs_find_pos(struct tp_entries *headp, uint32_t b_idx)
{
uint32_t t_idx;
struct tp_entry *t1;
if ((t1 = TAILQ_FIRST(headp)) == NULL ||
bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
return (NULL);
t_idx = t1->sysindex;
for (t1 = TAILQ_NEXT(t1, tp_e); t1 != NULL; t1 = TAILQ_NEXT(t1, tp_e)) {
if (t1->sysindex != t_idx) {
if (bridge_compare_sysidx(b_idx, t1->sysindex) < 0)
return (TAILQ_PREV(t1, tp_entries, tp_e));
else
t_idx = t1->sysindex;
}
}
if (t1 == NULL)
t1 = TAILQ_LAST(headp, tp_entries);
return (t1);
}
/*
* Insert a bridge address in the bridge addresses list.
*/
static void
bridge_addrs_bif_insert(struct tp_entries *headp, struct tp_entry *te,
struct tp_entry **f_tpa)
{
struct tp_entry *temp;
if (*f_tpa != NULL)
bridge_addrs_insert_at(headp, te, f_tpa);
else {
temp = bridge_addrs_find_pos(headp, te->sysindex);
if (temp == NULL)
TAILQ_INSERT_HEAD(headp, te, tp_e);
else
TAILQ_INSERT_AFTER(headp, temp, te, tp_e);
*f_tpa = te;
}
}
static struct tp_entries tp_entries = TAILQ_HEAD_INITIALIZER(tp_entries);
static time_t address_list_age;
void
bridge_addrs_update_listage(void)
{
address_list_age = time(NULL);
}
void
bridge_addrs_fini(void)
{
bridge_tpe_free(&tp_entries);
}
void
bridge_addrs_free(struct bridge_if *bif)
{
bridge_tpe_bif_free(&tp_entries, bif);
}
/*
* Find the first address in the list.
*/
static struct tp_entry *
bridge_addrs_first(void)
{
return (TAILQ_FIRST(&tp_entries));
}
/*
* Find the next address in the list.
*/
static struct tp_entry *
bridge_addrs_next(struct tp_entry *te)
{
return (TAILQ_NEXT(te, tp_e));
}
/*
* Find the first address, learnt by the specified bridge interface.
*/
struct tp_entry *
bridge_addrs_bif_first(struct bridge_if *bif)
{
return (bif->f_tpa);
}
/*
* Find the next address, learnt by the specified bridge interface.
*/
struct tp_entry *
bridge_addrs_bif_next(struct tp_entry *te)
{
struct tp_entry *te_next;
if ((te_next = TAILQ_NEXT(te, tp_e)) == NULL ||
te_next->sysindex != te->sysindex)
return (NULL);
return (te_next);
}
/*
* Remove a bridge address from the list.
*/
void
bridge_addrs_remove(struct tp_entry *te, struct bridge_if *bif)
{
if (bif->f_tpa == te)
bif->f_tpa = bridge_addrs_bif_next(te);
TAILQ_REMOVE(&tp_entries, te, tp_e);
free(te);
}
/*
* Allocate memory for a new bridge address and insert it in the list.
*/
struct tp_entry *
bridge_new_addrs(uint8_t *mac, struct bridge_if *bif)
{
struct tp_entry *te;
if ((te = (struct tp_entry *) malloc(sizeof(*te))) == NULL) {
syslog(LOG_ERR, "bridge new address: failed: %s",
strerror(errno));
return (NULL);
}
bzero(te, sizeof(*te));
te->sysindex = bif->sysindex;
bcopy(mac, te->tp_addr, ETHER_ADDR_LEN);
bridge_addrs_bif_insert(&tp_entries, te, &(bif->f_tpa));
return (te);
}
/*
* Given a mac address, learnt on a bridge,
* find the corrsponding TP entry for it.
*/
struct tp_entry *
bridge_addrs_find(uint8_t *mac, struct bridge_if *bif)
{
struct tp_entry *te;
for (te = bif->f_tpa; te != NULL; te = TAILQ_NEXT(te, tp_e)) {
if (te->sysindex != bif->sysindex) {
te = NULL;
break;
}
if (bridge_compare_macs(te->tp_addr, mac) == 0)
break;
}
return (te);
}
void
bridge_addrs_dump(struct bridge_if *bif)
{
struct tp_entry *te;
syslog(LOG_ERR, "Addresses count - %d", bif->num_addrs);
for (te = bridge_addrs_bif_first(bif); te != NULL;
te = bridge_addrs_bif_next(te)) {
syslog(LOG_ERR, "address %x:%x:%x:%x:%x:%x on port %d.%d",
te->tp_addr[0], te->tp_addr[1], te->tp_addr[2],
te->tp_addr[3], te->tp_addr[4], te->tp_addr[5],
te->sysindex, te->port_no);
}
}
/*
* RFC4188 specifics.
*/
/*
* Construct the SNMP index from the address DST Mac.
*/
static void
bridge_addrs_index_append(struct asn_oid *oid, uint sub,
const struct tp_entry *te)
{
int i;
oid->len = sub + ETHER_ADDR_LEN + 1;
oid->subs[sub] = ETHER_ADDR_LEN;
for (i = 1; i <= ETHER_ADDR_LEN; i++)
oid->subs[sub + i] = te->tp_addr[i - 1];
}
/*
* Find the address entry for the SNMP index from the default bridge only.
*/
static struct tp_entry *
bridge_addrs_get(const struct asn_oid *oid, uint sub,
struct bridge_if *bif)
{
int i;
uint8_t tp_addr[ETHER_ADDR_LEN];
if (oid->len - sub != ETHER_ADDR_LEN + 1 ||
oid->subs[sub] != ETHER_ADDR_LEN)
return (NULL);
for (i = 0; i < ETHER_ADDR_LEN; i++)
tp_addr[i] = oid->subs[sub + i + 1];
return (bridge_addrs_find(tp_addr, bif));
}
/*
* Find the next address entry for the SNMP index
* from the default bridge only.
*/
static struct tp_entry *
bridge_addrs_getnext(const struct asn_oid *oid, uint sub,
struct bridge_if *bif)
{
int i;
uint8_t tp_addr[ETHER_ADDR_LEN];
static struct tp_entry *te;
if (oid->len - sub == 0)
return (bridge_addrs_bif_first(bif));
if (oid->len - sub != ETHER_ADDR_LEN + 1 ||
oid->subs[sub] != ETHER_ADDR_LEN)
return (NULL);
for (i = 0; i < ETHER_ADDR_LEN; i++)
tp_addr[i] = oid->subs[sub + i + 1];
if ((te = bridge_addrs_find(tp_addr, bif)) == NULL)
return (NULL);
return (bridge_addrs_bif_next(te));
}
int
op_dot1d_tp_fdb(struct snmp_context *c __unused, struct snmp_value *val,
uint sub, uint iidx __unused, enum snmp_op op)
{
int ret;
struct bridge_if *bif;
struct tp_entry *te;
if ((bif = bridge_get_default()) == NULL)
return (SNMP_ERR_NOSUCHNAME);
if (time(NULL) - bif->addrs_age > bridge_get_data_maxage() &&
bridge_update_addrs(bif) <= 0)
return (SNMP_ERR_NOSUCHNAME);
te = NULL; /* Make the compiler happy. */
switch (op) {
case SNMP_OP_GET:
if ((te = bridge_addrs_get(&val->var, sub, bif)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
break;
case SNMP_OP_GETNEXT:
if ((te = bridge_addrs_getnext(&val->var, sub, bif)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
bridge_addrs_index_append(&val->var, sub, te);
break;
case SNMP_OP_SET:
return (SNMP_ERR_NOT_WRITEABLE);
case SNMP_OP_ROLLBACK:
case SNMP_OP_COMMIT:
abort();
}
ret = SNMP_ERR_NOERROR;
switch (val->var.subs[sub - 1]) {
case LEAF_dot1dTpFdbAddress:
ret = string_get(val, te->tp_addr, ETHER_ADDR_LEN);
break;
case LEAF_dot1dTpFdbPort :
val->v.integer = te->port_no;
break;
case LEAF_dot1dTpFdbStatus:
val->v.integer = te->status;
break;
}
return (ret);
}
/*
* Private BEGEMOT-BRIDGE-MIB specifics.
*/
/*
* Construct the SNMP index from the bridge interface name
* and the address DST Mac.
*/
static int
bridge_addrs_begemot_index_append(struct asn_oid *oid, uint sub,
const struct tp_entry *te)
{
uint i, n_len;
const char *b_name;
if ((b_name = bridge_if_find_name(te->sysindex)) == NULL)
return (-1);
n_len = strlen(b_name);
oid->len = sub++;
oid->subs[oid->len++] = n_len;
for (i = 1; i <= n_len; i++)
oid->subs[oid->len++] = b_name[i - 1];
oid->subs[oid->len++] = ETHER_ADDR_LEN;
for (i = 1 ; i <= ETHER_ADDR_LEN; i++)
oid->subs[oid->len++] = te->tp_addr[i - 1];
return (0);
}
/*
* Find a bridge address entry by the bridge interface name
* and the address DST Mac.
*/
static struct tp_entry *
bridge_addrs_begemot_get(const struct asn_oid *oid, uint sub)
{
uint i, n_len;
uint8_t tp_addr[ETHER_ADDR_LEN];
char bif_name[IFNAMSIZ];
struct bridge_if *bif;
n_len = oid->subs[sub];
if (oid->len - sub != n_len + ETHER_ADDR_LEN + 3 ||
n_len >= IFNAMSIZ || oid->subs[sub + n_len + 1] != ETHER_ADDR_LEN)
return (NULL);
for (i = 0; i < n_len; i++)
bif_name[i] = oid->subs[n_len + i + 1];
bif_name[i] = '\0';
for (i = 1; i <= ETHER_ADDR_LEN; i++)
tp_addr[i - 1] = oid->subs[n_len + i + 1];
if ((bif = bridge_if_find_ifname(bif_name)) == NULL)
return (NULL);
return (bridge_addrs_find(tp_addr, bif));
}
/*
* Find the next bridge address entry by the bridge interface name
* and the address DST Mac.
*/
static struct tp_entry *
bridge_addrs_begemot_getnext(const struct asn_oid *oid, uint sub)
{
uint i, n_len;
uint8_t tp_addr[ETHER_ADDR_LEN];
char bif_name[IFNAMSIZ];
struct bridge_if *bif;
struct tp_entry *tp;
if (oid->len - sub == 0)
return (bridge_addrs_first());
n_len = oid->subs[sub];
if (oid->len - sub != n_len + ETHER_ADDR_LEN + 2 ||
n_len >= IFNAMSIZ || oid->subs[sub + n_len + 1] != ETHER_ADDR_LEN)
return (NULL);
for (i = 1; i <= n_len; i++)
bif_name[i - 1] = oid->subs[sub + i];
bif_name[i - 1] = '\0';
for (i = 1; i <= ETHER_ADDR_LEN; i++)
tp_addr[i - 1] = oid->subs[sub + n_len + i + 1];
if ((bif = bridge_if_find_ifname(bif_name)) == NULL ||
(tp = bridge_addrs_find(tp_addr, bif)) == NULL)
return (NULL);
return (bridge_addrs_next(tp));
}
int
op_begemot_tp_fdb(struct snmp_context *c __unused, struct snmp_value *val,
uint sub, uint iidx __unused, enum snmp_op op)
{
int ret;
struct tp_entry *te = NULL;
if (time(NULL) - address_list_age > bridge_get_data_maxage())
bridge_update_all_addrs();
switch (op) {
case SNMP_OP_GET:
if ((te = bridge_addrs_begemot_get(&val->var, sub)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
break;
case SNMP_OP_GETNEXT:
if ((te = bridge_addrs_begemot_getnext(&val->var,
sub)) == NULL ||
bridge_addrs_begemot_index_append(&val->var,
sub, te) < 0)
return (SNMP_ERR_NOSUCHNAME);
break;
case SNMP_OP_SET:
return (SNMP_ERR_NOT_WRITEABLE);
case SNMP_OP_ROLLBACK:
case SNMP_OP_COMMIT:
return (SNMP_ERR_NOERROR);
}
ret = SNMP_ERR_NOERROR;
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeTpFdbAddress:
ret = string_get(val, te->tp_addr, ETHER_ADDR_LEN);
break;
case LEAF_begemotBridgeTpFdbPort:
val->v.integer = te->port_no;
break;
case LEAF_begemotBridgeTpFdbStatus:
val->v.integer = te->status;
break;
}
return (ret);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,117 @@
/*-
* Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Bridge MIB implementation for SNMPd.
* Bridge pfil controls.
*
* $FreeBSD$
*/
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_mib.h>
#include <net/if_types.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>
#include <bsnmp/snmpmod.h>
#include <bsnmp/snmp_mibII.h>
#include "bridge_tree.h"
#include "bridge_snmp.h"
static int
val2snmp_truth(uint8_t val)
{
if (val == 0)
return (2);
return (1);
}
static int
snmp_truth2val(int32_t truth)
{
if (truth == 2)
return (0);
else if (truth == 1)
return (1);
return (-1);
}
int
op_begemot_bridge_pf(struct snmp_context *ctx, struct snmp_value *val,
uint sub, uint iidx __unused, enum snmp_op op)
{
int k_val;
if (val->var.subs[sub - 1] > LEAF_begemotBridgeLayer2PfStatus)
return (SNMP_ERR_NOSUCHNAME);
switch (op) {
case SNMP_OP_GETNEXT:
abort();
case SNMP_OP_ROLLBACK:
bridge_do_pfctl(val->var.subs[sub - 1] - 1,
op, &(ctx->scratch->int1));
return (SNMP_ERR_NOERROR);
case SNMP_OP_COMMIT:
return (SNMP_ERR_NOERROR);
case SNMP_OP_SET:
ctx->scratch->int1 =
bridge_get_pfval(val->var.subs[sub - 1]);
if ((k_val = snmp_truth2val(val->v.integer)) < 0)
return (SNMP_ERR_BADVALUE);
case SNMP_OP_GET:
break;
}
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgePfilStatus:
case LEAF_begemotBridgePfilMembers:
case LEAF_begemotBridgePfilIpOnly:
case LEAF_begemotBridgeLayer2PfStatus:
if (bridge_do_pfctl(val->var.subs[sub - 1] - 1,
op, &k_val) < 0)
return (SNMP_ERR_GENERR);
val->v.integer = val2snmp_truth(k_val);
break;
abort();
}
return (SNMP_ERR_NOERROR);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,327 @@
/*-
* Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Bridge MIB implementation for SNMPd.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_mib.h>
#include <net/if_types.h>
#include <errno.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <syslog.h>
#include <bsnmp/snmpmod.h>
#include <bsnmp/snmp_mibII.h>
#include "bridge_tree.h"
#include "bridge_snmp.h"
#include "bridge_oid.h"
static struct lmodule *bridge_module;
/* For the registration. */
static const struct asn_oid oid_dot1Bridge = OIDX_dot1dBridge;
/* The registration. */
static uint reg_bridge;
/* Periodic timer for polling all bridges' data. */
static void *bridge_data_timer;
static void *bridge_tc_timer;
static int bridge_data_maxage = SNMP_BRIDGE_DATA_MAXAGE;
static int bridge_poll_ticks = SNMP_BRIDGE_POLL_INTERVAL * 100;
static int bridge_tc_poll_ticks = SNMP_BRIDGE_TC_POLL_INTERVAL * 100;
/*
* Our default bridge, whose info will be visible under
* the dot1dBridge subtree and functions to set/fetch it.
*/
static char bif_default_name[IFNAMSIZ] = "bridge0";
static struct bridge_if *bif_default;
struct bridge_if *
bridge_get_default(void)
{
struct mibif *ifp;
if (bif_default != NULL) {
/* Walk through the mibII interface list. */
for (ifp = mib_first_if(); ifp != NULL; ifp = mib_next_if(ifp))
if (strcmp(ifp->name, bif_default->bif_name) == 0)
break;
if (ifp == NULL)
bif_default = NULL;
}
return (bif_default);
}
void
bridge_set_default(struct bridge_if *bif)
{
bif_default = bif;
syslog(LOG_ERR, "Set default bridge interface to: %s",
bif == NULL ? "(none)" : bif->bif_name);
}
const char *
bridge_get_default_name(void)
{
return (bif_default_name);
}
static int
bridge_set_default_name(const char *bif_name, uint len)
{
struct bridge_if *bif;
if (len >= IFNAMSIZ)
return (-1);
bcopy(bif_name, bif_default_name, len);
bif_default_name[len] = '\0';
if ((bif = bridge_if_find_ifname(bif_default_name)) == NULL)
return (0);
bif_default = bif;
return (1);
}
int
bridge_get_data_maxage(void)
{
return (bridge_data_maxage);
}
static void
bridge_set_poll_ticks(int poll_ticks)
{
if (bridge_data_timer != NULL)
timer_stop(bridge_data_timer);
bridge_poll_ticks = poll_ticks;
bridge_data_timer = timer_start_repeat(bridge_poll_ticks,
bridge_poll_ticks, bridge_update_all, NULL, bridge_module);
}
/*
* The bridge module configuration via SNMP.
*/
static int
bridge_default_name_save(struct snmp_context *ctx, const char *bridge_default)
{
if ((ctx->scratch->int1 = strlen(bridge_default)) >= IFNAMSIZ)
return (-1);
if ((ctx->scratch->ptr1 = malloc(IFNAMSIZ)) == NULL)
return (-1);
strncpy(ctx->scratch->ptr1, bridge_default, ctx->scratch->int1);
return (0);
}
int
op_begemot_bridge_config(struct snmp_context *ctx, struct snmp_value *val,
uint sub, uint iidx __unused, enum snmp_op op)
{
switch (op) {
case SNMP_OP_GET:
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeDefaultBridgeIf:
string_get(val, bridge_get_default_name(), -1);
break;
case LEAF_begemotBridgeDataUpdate:
val->v.integer = bridge_data_maxage;
break;
case LEAF_begemotBridgeDataPoll:
val->v.integer = bridge_poll_ticks / 100;
break;
}
return (SNMP_ERR_NOERROR);
case SNMP_OP_GETNEXT:
abort();
case SNMP_OP_SET:
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeDefaultBridgeIf:
/*
* Cannot use string_save() here - requires either
* a fixed-sized or var-length string - not less
* than or equal.
*/
if (bridge_default_name_save(ctx,
bridge_get_default_name()) < 0)
return (SNMP_ERR_RES_UNAVAIL);
if (bridge_set_default_name(val->v.octetstring.octets,
val->v.octetstring.len) < 0)
return (SNMP_ERR_BADVALUE);
break;
case LEAF_begemotBridgeDataUpdate:
ctx->scratch->int1 = bridge_data_maxage;
bridge_data_maxage = val->v.integer;
break;
case LEAF_begemotBridgeDataPoll:
ctx->scratch->int1 = val->v.integer;
break;
}
return (SNMP_ERR_NOERROR);
case SNMP_OP_ROLLBACK:
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeDefaultBridgeIf:
bridge_set_default_name(ctx->scratch->ptr1,
ctx->scratch->int1);
free(ctx->scratch->ptr1);
break;
case LEAF_begemotBridgeDataUpdate:
bridge_data_maxage = ctx->scratch->int1;
break;
}
return (SNMP_ERR_NOERROR);
case SNMP_OP_COMMIT:
switch (val->var.subs[sub - 1]) {
case LEAF_begemotBridgeDefaultBridgeIf:
free(ctx->scratch->ptr1);
break;
case LEAF_begemotBridgeDataPoll:
bridge_set_poll_ticks(ctx->scratch->int1 * 100);
break;
}
return (SNMP_ERR_NOERROR);
}
return (SNMP_ERR_NOERROR);
}
/*
* Bridge mib module initialization hook.
* Returns 0 on success, < 0 on error.
*/
static int
bridge_init(struct lmodule * mod, int argc __unused, char *argv[] __unused)
{
bridge_module = mod;
if (bridge_kmod_load() < 0)
return (-1);
if (bridge_ioctl_init() < 0)
return (-1);
/* Register to get creation messages for bridge interfaces. */
if (mib_register_newif(bridge_attach_newif, bridge_module)) {
syslog(LOG_ERR, "Cannot register newif function: %s",
strerror(errno));
return (-1);
}
return (0);
}
/*
* Bridge mib module finalization hook.
*/
static int
bridge_fini(void)
{
mib_unregister_newif(bridge_module);
or_unregister(reg_bridge);
if (bridge_data_timer != NULL) {
timer_stop(bridge_data_timer);
bridge_data_timer = NULL;
}
if (bridge_tc_timer != NULL) {
timer_stop(bridge_tc_timer);
bridge_tc_timer = NULL;
}
bridge_ifs_fini();
bridge_ports_fini();
bridge_addrs_fini();
return (0);
}
/*
* Bridge mib module start operation.
*/
static void
bridge_start(void)
{
reg_bridge = or_register(&oid_dot1Bridge,
"The IETF MIB for Bridges (RFC 4188).", bridge_module);
bridge_data_timer = timer_start_repeat(bridge_poll_ticks,
bridge_poll_ticks, bridge_update_all, NULL, bridge_module);
bridge_tc_timer = timer_start_repeat(bridge_tc_poll_ticks,
bridge_tc_poll_ticks, bridge_update_tc_time, NULL, bridge_module);
}
static void
bridge_dump(void)
{
struct bridge_if *bif;
if ((bif = bridge_get_default()) == NULL)
syslog(LOG_ERR, "Dump: no default bridge interface");
else
syslog(LOG_ERR, "Dump: default bridge interface %s",
bif->bif_name);
bridge_ifs_dump();
bridge_pf_dump();
}
const struct snmp_module config = {
.comment = "This module implements the bridge mib (RFC 4188).",
.init = bridge_init,
.fini = bridge_fini,
.start = bridge_start,
.tree = bridge_ctree,
.dump = bridge_dump,
.tree_size = bridge_CTREE_SIZE,
};

View File

@ -0,0 +1,307 @@
/*-
* Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Bridge MIB implementation for SNMPd.
*
* $FreeBSD$
*/
#ifndef SNMP_BRIDGE_H
#define SNMP_BRIDGE_H
#define SNMP_BRIDGE_ID_LEN 8
typedef uint8_t port_id[2];
typedef u_char bridge_id[SNMP_BRIDGE_ID_LEN];
#define SNMP_BRIDGE_MAX_PRIORITY 65535
#define SNMP_BRIDGE_MIN_AGE_TIME 10
#define SNMP_BRIDGE_MAX_AGE_TIME 1000000
#define SNMP_PORT_PATHCOST_OBSOLETE 65535
#define SNMP_BRIDGE_DATA_MAXAGE 10
/* By default poll kernel data every 5 minutes. */
#define SNMP_BRIDGE_POLL_INTERVAL (5 * 60)
/* Poll for a topology change once every 30 seconds. */
#define SNMP_BRIDGE_TC_POLL_INTERVAL 30
struct bridge_if *bridge_get_default(void);
void bridge_set_default(struct bridge_if *bif);
const char *bridge_get_default_name(void);
int bridge_get_data_maxage(void);
/*
* Bridge Addresses Table.
*/
struct tp_entry {
uint32_t sysindex; /* The bridge if sysindex. */
int32_t port_no;
enum TpFdbStatus status;
uint8_t tp_addr[ETHER_ADDR_LEN];
uint8_t flags;
TAILQ_ENTRY(tp_entry) tp_e;
};
/*
* Bridge ports.
* The bridge port system interface index is used for a
* port number. Transparent bridging statistics and STP
* information for a port are also contained here.
*/
struct bridge_port {
/* dot1dBase subtree objects. */
uint32_t sysindex; /* The bridge interface sysindex. */
int32_t port_no; /* The bridge member system index. */
int32_t if_idx; /* SNMP ifIndex from mibII. */
int8_t span_enable; /* Span flag set - private MIB. */
struct asn_oid circuit; /* Unused. */
uint32_t dly_ex_drops; /* Drops on output. */
uint32_t dly_mtu_drops; /* MTU exceeded drops. */
int32_t status; /* The entry status. */
/* dot1dStp subtree objects. */
int32_t path_cost;
int32_t priority;
int32_t design_cost;
uint32_t fwd_trans;
char p_name[IFNAMSIZ]; /* Not in BRIDGE-MIB. */
enum StpPortState state;
enum dot1dStpPortEnable enable;
port_id design_port;
bridge_id design_root;
bridge_id design_bridge;
/* dot1dTp subtree objects. */
int32_t max_info;
int32_t in_frames;
int32_t out_frames;
int32_t in_drops;
uint8_t flags;
TAILQ_ENTRY(bridge_port) b_p;
};
/*
* A bridge interface.
* The system interface index of the bridge is not required neither by the
* standard BRIDGE-MIB nor by the private BEGEMOT-BRIDGE-MIB, but is used
* as key for looking up the other info for this bridge.
*/
struct bridge_if {
/* dot1dBase subtree objects. */
uint32_t sysindex; /* The system interface index. */
int32_t num_ports; /* Number of ports. */
enum BaseType br_type; /* Bridge type. */
enum RowStatus if_status; /* Bridge status. */
char bif_name[IFNAMSIZ]; /* Bridge interface name. */
struct ether_addr br_addr; /* Bridge address. */
struct bridge_port *f_bp; /* This bridge's first entry
* in the base ports TAILQ. */
/* dot1dStp subtree objects. */
int32_t priority;
int32_t root_cost;
int32_t root_port;
int32_t max_age; /* Current max age. */
int32_t hello_time; /* Current hello time. */
int32_t fwd_delay; /* Current forward delay. */
int32_t hold_time;
int32_t bridge_max_age; /* Configured max age. */
int32_t bridge_hello_time; /* Configured hello time. */
int32_t bridge_fwd_delay; /* Configured forward delay. */
uint32_t top_changes;
enum dot1dStpProtocolSpecification prot_spec;
struct timeval last_tc_time;
bridge_id design_root;
/* dot1dTp subtree objects. */
int32_t lrnt_drops; /* Dropped addresses. */
int32_t age_time; /* Address entry timeout. */
int32_t num_addrs; /* Current # of addresses in cache. */
int32_t max_addrs; /* Max # of addresses in cache. */
struct tp_entry *f_tpa; /* This bridge's first entry in
* the tp addresses TAILQ. */
time_t entry_age;
time_t ports_age;
time_t addrs_age;
TAILQ_ENTRY(bridge_if) b_if;
};
void bridge_ifs_fini(void);
struct bridge_if *bridge_if_find_ifs(uint32_t sysindex);
struct bridge_if *bridge_if_find_ifname(const char *b_name);
const char *bridge_if_find_name(uint32_t sysindex);
int bridge_compare_sysidx(uint32_t i1, uint32_t i2);
int bridge_attach_newif(struct mibif *ifp);
struct bridge_if *bridge_first_bif(void);
struct bridge_if *bridge_next_bif(struct bridge_if *b_pr);
void bridge_remove_bif(struct bridge_if *bif);
void bridge_update_all_ports(void);
void bridge_update_all_addrs(void);
void bridge_update_all_ifs(void);
void bridge_update_all(void *arg);
void bridge_update_tc_time(void *arg);
void bridge_ifs_dump(void);
/* Bridge ports. */
void bridge_ports_update_listage(void);
void bridge_ports_fini(void);
void bridge_members_free(struct bridge_if *bif);
struct bridge_port *bridge_new_port(struct mibif *mif, struct bridge_if *bif);
void bridge_port_remove(struct bridge_port *bp, struct bridge_if *bif);
struct bridge_port *bridge_port_bif_first(struct bridge_if *bif);
struct bridge_port *bridge_port_bif_next(struct bridge_port *bp);
struct bridge_port *bridge_port_find(int32_t if_idx, struct bridge_if *bif);
void bridge_port_getinfo_mibif(struct mibif *m_if, struct bridge_port *bp);
int bridge_getinfo_bif_ports(struct bridge_if *bif);
int bridge_update_memif(struct bridge_if *bif);
void bridge_ports_dump(struct bridge_if *bif);
/* Bridge addresses. */
void bridge_addrs_update_listage(void);
void bridge_addrs_fini(void);
void bridge_addrs_free(struct bridge_if *bif);
struct tp_entry *bridge_new_addrs(uint8_t *mac, struct bridge_if *bif);
void bridge_addrs_remove(struct tp_entry *te, struct bridge_if *bif);
struct tp_entry *bridge_addrs_find(uint8_t *mac, struct bridge_if *bif);
struct tp_entry *bridge_addrs_bif_first(struct bridge_if *bif);
struct tp_entry *bridge_addrs_bif_next(struct tp_entry *te);
int bridge_getinfo_bif_addrs(struct bridge_if *bif);
int bridge_update_addrs(struct bridge_if *bif);
void bridge_addrs_dump(struct bridge_if *bif);
/* Bridge PF. */
void bridge_pf_dump(void);
/* System specific. */
/* Open the socket for the ioctls. */
int bridge_ioctl_init(void);
/* Load bridge kernel module. */
int bridge_kmod_load(void);
/* Get the bridge interface information. */
int bridge_getinfo_bif(struct bridge_if *bif);
/* Get the bridge interface STP parameters. */
int bridge_get_op_param(struct bridge_if *bif);
/* Set the bridge priority. */
int bridge_set_priority(struct bridge_if *bif, int32_t priority);
/* Set the bridge max age. */
int bridge_set_maxage(struct bridge_if *bif, int32_t max_age);
/* Set the bridge hello time.*/
int bridge_set_hello_time(struct bridge_if *bif, int32_t hello_time);
/* Set the bridge forward delay.*/
int bridge_set_forward_delay(struct bridge_if *bif, int32_t fwd_delay);
/* Set the bridge address cache max age. */
int bridge_set_aging_time(struct bridge_if *bif, int32_t age_time);
/* Set the max number of entries in the bridge address cache. */
int bridge_set_max_cache(struct bridge_if *bif, int32_t max_cache);
/* Set the bridge interface status to up/down. */
int bridge_set_if_up(const char* b_name, int8_t up);
/* Create a bridge interface. */
int bridge_create(const char *b_name);
/* Destroy a bridge interface. */
int bridge_destroy(const char *b_name);
/* Fetch the bridge mac address. */
u_char *bridge_get_basemac(const char *bif_name, u_char *mac);
/* Set a bridge member priority. */
int bridge_port_set_priority(const char *bif_name, struct bridge_port *bp,
int32_t priority);
/* Set a bridge member STP-enabled flag. */
int bridge_port_set_stp_enable(const char *bif_name, struct bridge_port *bp,
uint32_t enable);
/* Set a bridge member STP path cost. */
int bridge_port_set_path_cost(const char *bif_name, struct bridge_port *bp,
int32_t path_cost);
/* Add a bridge member port. */
int bridge_port_addm(struct bridge_port *bp, const char *b_name);
/* Delete a bridge member port. */
int bridge_port_delm(struct bridge_port *bp, const char *b_name);
/* Get the current value from the module for bridge PF control. */
int32_t bridge_get_pfval(uint8_t which);
/* Get/Set a bridge PF control. */
int32_t bridge_do_pfctl(int32_t bridge_ctl, enum snmp_op op, int32_t *val);
#endif /* SNMP_BRIDGE_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,242 @@
#-
# Copyright (c) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
#
#include "tc.def"
typedef TruthValue ENUM (
1 true
2 false
)
typedef RowStatus ENUM (
1 active
2 notInService
3 notReady
4 createAndGo
5 createAndWait
6 destroy
)
typedef StpPortState ENUM (
1 disabled
2 blocking
3 listening
4 learning
5 forwarding
6 broken
)
typedef BaseType ENUM (
1 unknown
2 transparent-only
3 sourceroute-only
4 srt
)
typedef TpFdbStatus ENUM (
1 other
2 invalid
3 learned
4 self
5 mgmt
)
(1 internet
(2 mgmt
(1 mib_2
(17 dot1dBridge
(0 dot1dNotifications
(1 newRoot OID op_snmp_trap)
(2 topologyChange OID op_snmp_trap)
)
(1 dot1dBase
(1 dot1dBaseBridgeAddress OCTETSTRING | MacAddress op_dot1d_base GET)
(2 dot1dBaseNumPorts INTEGER32 op_dot1d_base GET)
(3 dot1dBaseType BaseType op_dot1d_base GET)
(4 dot1dBasePortTable
(1 dot1dBasePortEntry : INTEGER op_dot1d_base_port
(1 dot1dBasePort INTEGER GET)
(2 dot1dBasePortIfIndex INTEGER GET)
(3 dot1dBasePortCircuit OID GET)
(4 dot1dBasePortDelayExceededDiscards COUNTER GET)
(5 dot1dBasePortMtuExceededDiscards COUNTER GET)
))
)
(2 dot1dStp
(1 dot1dStpProtocolSpecification ENUM ( 1 unknown 2 decLb100 3 ieee8021d ) op_dot1d_stp GET)
(2 dot1dStpPriority INTEGER op_dot1d_stp GET SET)
(3 dot1dStpTimeSinceTopologyChange TIMETICKS op_dot1d_stp GET)
(4 dot1dStpTopChanges COUNTER op_dot1d_stp GET)
(5 dot1dStpDesignatedRoot OCTETSTRING | BridgeId op_dot1d_stp GET)
(6 dot1dStpRootCost INTEGER32 op_dot1d_stp GET)
(7 dot1dStpRootPort INTEGER32 op_dot1d_stp GET)
(8 dot1dStpMaxAge INTEGER op_dot1d_stp GET)
(9 dot1dStpHelloTime INTEGER op_dot1d_stp GET)
(10 dot1dStpHoldTime INTEGER32 op_dot1d_stp GET)
(11 dot1dStpForwardDelay INTEGER op_dot1d_stp GET)
(12 dot1dStpBridgeMaxAge INTEGER op_dot1d_stp GET SET)
(13 dot1dStpBridgeHelloTime INTEGER op_dot1d_stp GET SET)
(14 dot1dStpBridgeForwardDelay INTEGER op_dot1d_stp GET SET)
(15 dot1dStpPortTable
(1 dot1dStpPortEntry : INTEGER op_dot1d_stp_port
(1 dot1dStpPort INTEGER GET)
(2 dot1dStpPortPriority INTEGER GET SET)
(3 dot1dStpPortState StpPortState GET)
(4 dot1dStpPortEnable ENUM ( 1 enabled 2 disabled ) GET SET)
(5 dot1dStpPortPathCost INTEGER GET SET)
(6 dot1dStpPortDesignatedRoot OCTETSTRING | BridgeId GET)
(7 dot1dStpPortDesignatedCost INTEGER32 GET)
(8 dot1dStpPortDesignatedBridge OCTETSTRING | BridgeId GET)
(9 dot1dStpPortDesignatedPort OCTETSTRING | BridgePortId GET)
(10 dot1dStpPortForwardTransitions COUNTER GET)
))
)
(3 dot1dSr
)
(4 dot1dTp
(1 dot1dTpLearnedEntryDiscards COUNTER op_dot1d_tp GET)
(2 dot1dTpAgingTime INTEGER op_dot1d_tp GET SET)
(3 dot1dTpFdbTable
(1 dot1dTpFdbEntry : OCTETSTRING | MacAddress op_dot1d_tp_fdb
(1 dot1dTpFdbAddress OCTETSTRING | MacAddress GET)
(2 dot1dTpFdbPort INTEGER32 GET)
(3 dot1dTpFdbStatus TpFdbStatus GET)
))
(4 dot1dTpPortTable
(1 dot1dTpPortEntry : INTEGER op_dot1d_tp_port
(1 dot1dTpPort INTEGER GET)
(2 dot1dTpPortMaxInfo INTEGER32 GET)
(3 dot1dTpPortInFrames COUNTER GET)
(4 dot1dTpPortOutFrames COUNTER GET)
(5 dot1dTpPortInDiscards COUNTER GET)
))
)
(5 dot1dStatic
)
(8 dot1dConformance
(1 dot1dGroups
)
(2 dot1dCompliances
)
)
)))
(4 private
(1 enterprises
(12325 fokus
(1 begemot
(205 begemotBridge
(0 begemotBridgeNotifications
(1 begemotBridgeNewRoot OID op_snmp_trap)
(2 begemotBridgeTopologyChange OID op_snmp_trap)
)
(1 begemotBridgeBase
(1 begemotBridgeBaseTable
(1 begemotBridgeBaseEntry : OCTETSTRING | BridgeIfName op_begemot_base_bridge
(1 begemotBridgeBaseName OCTETSTRING | BridgeIfName GET)
(2 begemotBridgeBaseAddress OCTETSTRING | MacAddress GET)
(3 begemotBridgeBaseNumPorts INTEGER32 GET)
(4 begemotBridgeBaseType BaseType GET)
(5 begemotBridgeBaseStatus RowStatus GET SET)
))
(2 begemotBridgeBasePortTable
(1 begemotBridgeBasePortEntry : OCTETSTRING | BridgeIfName INTEGER op_begemot_base_port
(1 begemotBridgeBasePort INTEGER GET)
(2 begemotBridgeBasePortIfIndex INTEGER GET)
(3 begemotBridgeBaseSpanEnabled ENUM ( 1 enabled 2 disabled ) GET SET)
(4 begemotBridgeBasePortDelayExceededDiscards COUNTER GET)
(5 begemotBridgeBasePortMtuExceededDiscards COUNTER GET)
(6 begemotBridgeBasePortStatus RowStatus GET SET)
))
)
(2 begemotBridgeStp
(1 begemotBridgeStpTable
(1 begemotBridgeStpEntry : OCTETSTRING | BridgeIfName op_begemot_stp
(1 begemotBridgeStpProtocolSpecification ENUM ( 1 unknown 2 decLb100 3 ieee8021d ) GET)
(2 begemotBridgeStpPriority INTEGER GET SET)
(3 begemotBridgeStpTimeSinceTopologyChange TIMETICKS GET)
(4 begemotBridgeStpTopChanges COUNTER GET)
(5 begemotBridgeStpDesignatedRoot OCTETSTRING | BridgeId GET)
(6 begemotBridgeStpRootCost INTEGER32 GET)
(7 begemotBridgeStpRootPort INTEGER32 GET)
(8 begemotBridgeStpMaxAge INTEGER GET)
(9 begemotBridgeStpHelloTime INTEGER GET)
(10 begemotBridgeStpHoldTime INTEGER32 GET)
(11 begemotBridgeStpForwardDelay INTEGER GET)
(12 begemotBridgeStpBridgeMaxAge INTEGER GET SET)
(13 begemotBridgeStpBridgeHelloTime INTEGER GET SET)
(14 begemotBridgeStpBridgeForwardDelay INTEGER GET SET)
))
(2 begemotBridgeStpPortTable
(1 begemotBridgeStpPortEntry : OCTETSTRING | BridgeIfName INTEGER op_begemot_stp_port
(1 begemotBridgeStpPort INTEGER GET)
(2 begemotBridgeStpPortPriority INTEGER GET SET)
(3 begemotBridgeStpPortState StpPortState GET)
(4 begemotBridgeStpPortEnable ENUM ( 1 enabled 2 disabled ) GET SET)
(5 begemotBridgeStpPortPathCost INTEGER GET SET)
(6 begemotBridgeStpPortDesignatedRoot OCTETSTRING | BridgeId GET)
(7 begemotBridgeStpPortDesignatedCost INTEGER32 GET)
(8 begemotBridgeStpPortDesignatedBridge OCTETSTRING | BridgeId GET)
(9 begemotBridgeStpPortDesignatedPort OCTETSTRING | BridgePortId GET)
(10 begemotBridgeStpPortForwardTransitions COUNTER GET)
))
)
(3 begemotBridgeTp
(1 begemotBridgeTpTable
(1 begemotBridgeTpEntry : OCTETSTRING | BridgeIfName op_begemot_tp
(1 begemotBridgeTpLearnedEntryDiscards COUNTER GET)
(2 begemotBridgeTpAgingTime INTEGER GET SET)
(3 begemotBridgeTpMaxAddresses INTEGER GET SET)
))
(2 begemotBridgeTpFdbTable
(1 begemotBridgeTpFdbEntry : OCTETSTRING | BridgeIfName OCTETSTRING | MacAddress op_begemot_tp_fdb
(1 begemotBridgeTpFdbAddress OCTETSTRING | MacAddress GET)
(2 begemotBridgeTpFdbPort INTEGER32 GET)
(3 begemotBridgeTpFdbStatus TpFdbStatus GET)
))
(3 begemotBridgeTpPortTable
(1 begemotBridgeTpPortEntry : OCTETSTRING | BridgeIfName INTEGER op_begemot_tp_port
(1 begemotBridgeTpPort INTEGER GET)
(2 begemotBridgeTpPortMaxInfo INTEGER32 GET)
(3 begemotBridgeTpPortInFrames COUNTER GET)
(4 begemotBridgeTpPortOutFrames COUNTER GET)
(5 begemotBridgeTpPortInDiscards COUNTER GET)
))
)
(4 begemotBridgePf
(1 begemotBridgePfilStatus TruthValue op_begemot_bridge_pf GET SET)
(2 begemotBridgePfilMembers TruthValue op_begemot_bridge_pf GET SET)
(3 begemotBridgePfilIpOnly TruthValue op_begemot_bridge_pf GET SET)
(4 begemotBridgeLayer2PfStatus ENUM ( 1 enabled 2 disabled ) op_begemot_bridge_pf GET SET)
)
(5 begemotBridgeConfigObjects
(1 begemotBridgeDefaultBridgeIf OCTETSTRING | BridgeIfNameOrEmpty op_begemot_bridge_config GET SET)
(2 begemotBridgeDataUpdate INTEGER op_begemot_bridge_config GET SET)
(3 begemotBridgeDataPoll INTEGER op_begemot_bridge_config GET SET)
)
)))))
)

View File

@ -0,0 +1,113 @@
.\"-
.\" Copyright (C) 2006 Shteryana Shopova <syrinx@FreeBSD.org>
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd August 18, 2006
.Dt snmp_bridge 3
.Os
.Sh NAME
.Nm snmp_bridge
.Nd "bridge module for snmpd.
.Sh LIBRARY
.Pq begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so"
.Sh DESCRIPTION
The
.Nm snmp_bridge
module implements the BRIDGE-MIB as standardized in RFC 4188 and a private
BEGEMOT-BRIDGE-MIB, which allows management of multiple bridge interfaces.
Most of the objects defined in the private BEGEMOT-BRIDGE-MIB are duplicates
of the original objects defined by the standard BRIDGE-MIB, but the private
MIB also defines additional objects which make the functionality of
.Nm
similar to
.Xr ifconfig 8
for configuring bridge interfaces.
Therefore one should consider adding write comminities or loading the
.Nm
module on systems where security is crucial.
.Sh IMPLEMENTATION NOTES
The additional objects to configure a bridge are:
.Bl -tag -width "XXXXXXXXX"
.It Va begemotBridgeBaseStatus
Bridge interfaces can be created and destroyed via this object.
SNMP SET operations with the following values are allowed:
.Bl -tag -width ".It Va createAndWait"
.It Va createAndWait
will attempt to create a bridge interface with the name given by the table
index.
.It Va createAndGo
will attempt to create a bridge interface with the name given by the table
index and set the status of the interface to "active/up".
.It Va destroy
will attempt to destory the bridge interface.
.El
.It Va begemotBridgeBaseSpanEnabled
A SNMP SET operation on this object is only successfull if the corresponding
port has not been added as member of the bridge interface on the system.
.It Va begemotBridgeBasePortStatus
SNMP SET operations with the following values are allowed:
.Bl -tag -width ".It Va createAndWait"
.It Va createAndWait
will create a new row for the bridge member in the SNMP
.Va begemotBridgeBasePortTable
but will not try to commit the information to the system.
.It Va active
will attempt to commit the information to the system and will be successful
only if a value for
.Va begemotBridgeBaseSpanEnabled
has been SET already.
.It Va destroy
will attempt to remove the interface from the system bridge interface.
.El
.El
.Sh RESTRICTIONS
Not all information in the MIBs is currently available in FreeBSD.
The following variables carry no information:
.Bl -tag -width "XXXXXXXXX"
.It Va dot1dBasePortCircuit
.It Va dot1dBasePortDelayExceededDiscards
.It Va dot1dBasePortMtuExceededDiscards
.It Va begemotBridgeBasePortDelayExceededDiscards
.It Va begemotBridgeBasePortMtuExceededDiscards
.El
.Sh FILES
.Bl -tag -width "XXXXXXXXX"
.It Pa /usr/share/snmp/defs/bridge_tree.def
The description of the MIB tree implemented by
.Nm .
.It Pa /usr/share/snmp/mibs/BRIDGE-MIB.txt
This is the BRIDGE-MIB that is implemented by this module.
.It Pa /usr/share/snmp/mibs/BEGEMOT-BRIDGE-MIB.txt
This is the private BEGEMOT-BRIDGE-MIB that is implemented by this module.
.El
.Sh SEE ALSO
.Xr bsnmpd 1 ,
.Xr gensnmptree 1 ,
.Xr if_bridge 4 ,
.Xr ifconfig 8 ,
.Xr snmpmod 3
.Sh AUTHORS
.An Shteryana Shopova Aq syrinx@FreeBSD.org