This commit was generated by cvs2svn to compensate for changes in r133488,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Hartmut Brandt 2004-08-11 12:17:54 +00:00
commit 4b61cb7ef9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=133489
8 changed files with 1417 additions and 2 deletions

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Begemot: libunimsg/libngatm/cccust.h,v 1.1 2004/07/08 08:35:37 brandt Exp $
* $Begemot: libunimsg/libngatm/cccust.h,v 1.2 2004/07/16 18:48:24 brandt Exp $
*
* Customisation of call control source to user space.
*/
@ -45,3 +45,5 @@
#define CCMALLOC(S) (malloc((S)))
#define CCZALLOC(S) (calloc(1, (S)))
#define CCFREE(P) do { free(P); } while (0)
#define CCGETERRNO() (errno)

View File

@ -26,7 +26,7 @@
*
* Author: Hartmut Brandt <harti@freebsd.org>
*
* $Begemot: libunimsg/libunimsg/unicust.h,v 1.4 2003/09/19 13:10:35 hbb Exp $
* $Begemot: libunimsg/libngatm/unicust.h,v 1.4 2003/09/19 13:10:35 hbb Exp $
*
* Customisation of signalling source to user space.
*/

View File

@ -0,0 +1,301 @@
--
-- Copyright (c) 2001-2002
-- Fraunhofer Institute for Open Communication Systems (FhG Fokus).
-- All rights reserved.
-- Copyright (c) 2004
-- Hartmut Brandt.
-- All rights reserved.
--
-- Author: Hartmut Brandt <harti@freebsd.org>
--
-- 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.
--
-- $Begemot: libunimsg/snmp_atm/BEGEMOT-ATM.txt,v 1.2 2004/08/06 14:50:26 brandt Exp $
--
-- Private Begemot MIB for ATM interfaces.
--
BEGEMOT-ATM-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, Unsigned32, TimeTicks
FROM SNMPv2-SMI
TEXTUAL-CONVENTION, DisplayString
FROM SNMPv2-TC
ifIndex
FROM IF-MIB
begemot
FROM BEGEMOT-MIB;
begemotAtm MODULE-IDENTITY
LAST-UPDATED "200407190000Z"
ORGANIZATION "German Aerospace Centre"
CONTACT-INFO
" Hartmut Brandt
Postal: German Aerospace Centre (DLR)
Institute of Communications and Navigation
82234 Wessling
Germany
Fax: +49 8153 28 2844
E-mail: harti@freebsd.org"
DESCRIPTION
"The Begemot MIB for ATM interfaces."
::= { begemot 101 }
begemotAtmObjects OBJECT IDENTIFIER ::= { begemotAtm 1 }
-- --------------------------------------------------------------------------
AtmESI ::= TEXTUAL-CONVENTION
DISPLAY-HINT "1x:"
STATUS current
DESCRIPTION
"An ATM End System Identifier. This is basically the same as
an Ethernet Address and is assigned using the same rules."
SYNTAX OCTET STRING (SIZE(6))
-- --------------------------------------------------------------------------
--
-- Interfaces table
--
begemotAtmIfTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotAtmIfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"This table contains an entry for each hardware ATM
interface. The table is indexed by the interface index."
::= { begemotAtmObjects 1 }
begemotAtmIfEntry OBJECT-TYPE
SYNTAX BegemotAtmIfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"This is a table entry describing one ATM hardware interface."
INDEX { ifIndex }
::= { begemotAtmIfTable 1 }
BegemotAtmIfEntry ::= SEQUENCE {
begemotAtmIfName DisplayString,
begemotAtmIfPcr Unsigned32,
begemotAtmIfMedia INTEGER,
begemotAtmIfVpiBits Unsigned32,
begemotAtmIfVciBits Unsigned32,
begemotAtmIfMaxVpcs Unsigned32,
begemotAtmIfMaxVccs Unsigned32,
begemotAtmIfEsi AtmESI,
begemotAtmIfCarrierStatus INTEGER,
begemotAtmIfMode INTEGER
}
begemotAtmIfName OBJECT-TYPE
SYNTAX DisplayString (SIZE(1..15))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Name of the ATM interface."
::= { begemotAtmIfEntry 1 }
begemotAtmIfPcr OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The line cell rate of the interface."
::= { begemotAtmIfEntry 2 }
begemotAtmIfMedia OBJECT-TYPE
SYNTAX INTEGER {
other(1),
unknown(3),
utp25(4),
taxi100(5),
taxi140(6),
mm155(7),
sm155(8),
utp155(9),
mm622(10),
sm622(11),
virtual(12)
}
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The physical medium."
::= { begemotAtmIfEntry 3 }
begemotAtmIfVpiBits OBJECT-TYPE
SYNTAX Unsigned32 (0..12)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of VPI bits that are used by the device."
::= { begemotAtmIfEntry 4 }
begemotAtmIfVciBits OBJECT-TYPE
SYNTAX Unsigned32 (0..16)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Number of VCI bits that are used by the device."
::= { begemotAtmIfEntry 5 }
begemotAtmIfMaxVpcs OBJECT-TYPE
SYNTAX Unsigned32 (0..256)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The maximum number of VPC supported on this device. This may not
be larger than 2^begemotAtmIfVpiBits."
::= { begemotAtmIfEntry 6 }
begemotAtmIfMaxVccs OBJECT-TYPE
SYNTAX Unsigned32 (0..16777216)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The maximum number of VCC supported on this device. This may not
be larger than 2^(begemotAtmIfVpiBits + begemotAtmVciBits)."
::= { begemotAtmIfEntry 7 }
begemotAtmIfEsi OBJECT-TYPE
SYNTAX AtmESI
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The default End System Identifier as reported by the hardware.
If the hardware has no ESI all six bytes are reported as 0."
::= { begemotAtmIfEntry 8 }
begemotAtmIfCarrierStatus OBJECT-TYPE
SYNTAX INTEGER { carrierOn(1), carrierOff(2), unknown(3), none(4) }
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The state of the carrier. For interfaces which don't have the
notion of a carriere none is reported."
::= { begemotAtmIfEntry 9 }
begemotAtmIfMode OBJECT-TYPE
SYNTAX INTEGER { sonet(1), sdh(2), unknown(3) }
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The mode of the SUNI interface. For interfaces without SUNI
unknown is reported in which case the variable is read-only.
Some types of interfaces may not be able to change this value."
::= { begemotAtmIfEntry 10 }
begemotAtmIfTableLastChange OBJECT-TYPE
SYNTAX TimeTicks
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of sysUpTime the last time that an entry in
begemotIfTable was created or destroyed. If the table is
unchanged since the last coldStart this value is zero."
::= { begemotAtmObjects 2 }
--
-- Interface hardware table
--
begemotAtmHWTable OBJECT-TYPE
SYNTAX SEQUENCE OF BegemotAtmHWEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"This table augments the begemotAtmIfTable and contains an entry
for each hardware ATM interface. The entries describe the
ATM hardware interface."
::= { begemotAtmObjects 3 }
begemotAtmHWEntry OBJECT-TYPE
SYNTAX BegemotAtmHWEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"This is a table entry describing one ATM hardware interface."
AUGMENTS { begemotAtmIfEntry }
::= { begemotAtmHWTable 1 }
BegemotAtmHWEntry ::= SEQUENCE {
begemotAtmHWVendor DisplayString,
begemotAtmHWDevice DisplayString,
begemotAtmHWSerial Unsigned32,
begemotAtmHWVersion Unsigned32,
begemotAtmHWSoftVersion Unsigned32
}
begemotAtmHWVendor OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A short string naming the vendor of the interface card."
::= { begemotAtmHWEntry 1 }
begemotAtmHWDevice OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A short string naming the brand of the interface card."
::= { begemotAtmHWEntry 2 }
begemotAtmHWSerial OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The serial number of the interface card or 0 if it doesn't
report a serial number."
::= { begemotAtmHWEntry 3 }
begemotAtmHWVersion OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The hardware version of the interface card or 0 if it doesn't
report a hardware version number."
::= { begemotAtmHWEntry 4 }
begemotAtmHWSoftVersion OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The firmware version of the interface card or 0 if it doesn't
report a firmware version number."
::= { begemotAtmHWEntry 5 }
-- --------------------------------------------------------------------
-- System specific parts
begemotAtmSysGroup OBJECT IDENTIFIER ::= { begemotAtmObjects 4 }
END

View File

@ -0,0 +1,96 @@
/*
* Copyright (c) 2004
* Deutsches Zentrum fuer Luft- und Raumfahrt.
* All rights reserved.
*
* Author: Hartmut Brandt <harti@freebsd.org>
*
* 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.
*
* $Begemot: libunimsg/snmp_atm/atm.h,v 1.2 2004/08/11 07:55:22 brandt Exp $
*/
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_mib.h>
#include <bsnmp/snmpmod.h>
#include <bsnmp/snmp_mibII.h>
#include "snmp_atm.h"
/*
* Event registrations
*/
struct atmif_reg {
TAILQ_ENTRY(atmif_reg) link;
void *data;
atmif_event_f func;
const struct lmodule *mod;
struct atmif_priv *aif; /* back pointer */
};
TAILQ_HEAD(atmif_reg_list, atmif_reg);
/*
* Interface data
*/
struct atmif_priv {
struct atmif pub; /* public part, must be first */
TAILQ_ENTRY(atmif_priv) link;
u_int index; /* if_index */
void *ifpreg;
struct atmif_sys *sys;
struct atmif_reg_list notify;
};
TAILQ_HEAD(atmif_list, atmif_priv);
/* list of all (known) ATM interfaces */
extern struct atmif_list atmif_list;
extern struct lmodule *module;
/* Check the carrier state of the interface */
void atmif_check_carrier(struct atmif_priv *);
/* Send notification to all listeners. */
void atmif_send_notification(struct atmif_priv *, enum atmif_notify, uintptr_t);
/* Get the interface point for a table access */
int atmif_get_aif(struct snmp_value *, u_int, enum snmp_op,
struct atmif_priv **);
/* Destroy system dependend stuff. */
void atmif_sys_destroy(struct atmif_priv *);
/* Attach to an ATM interface */
int atmif_sys_attach_if(struct atmif_priv *);
/* Get vendor string */
int atm_sys_get_hw_vendor(struct atmif_priv *, struct snmp_value *);
/* Get device string */
int atm_sys_get_hw_device(struct atmif_priv *, struct snmp_value *);
/* Extract the ATM MIB from the interface's private MIB */
void atmif_sys_fill_mib(struct atmif_priv *);

View File

@ -0,0 +1,75 @@
#
# Copyright (c) 2000-2003
# Fraunhofer Institut for Open Communication Systems (FOKUS).
# All rights reserved.
# Copyright (c) 2004
# Hartmut Brandt.
# All rights reserved.
#
# Author: Hartmut Brandt <harti@freebsd.org>
#
# 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.
#
# $Begemot: libunimsg/snmp_atm/atm_tree.def,v 1.3 2004/08/06 14:50:27 brandt Exp $
#
# SNMP module for ATM hardware interfaces.
#
# $Begemot: libunimsg/snmp_atm/atm_tree.def,v 1.3 2004/08/06 14:50:27 brandt Exp $
#
(1 internet
(4 private
(1 enterprises
(12325 fokus
(1 begemot
(101 begemotAtm
(1 begemotAtmObjects
(1 begemotAtmIfTable
(1 begemotAtmIfEntry : INTEGER op_atmif
(1 begemotAtmIfName OCTETSTRING GET)
(2 begemotAtmIfPcr UNSIGNED32 GET)
(3 begemotAtmIfMedia INTEGER GET)
(4 begemotAtmIfVpiBits UNSIGNED32 GET)
(5 begemotAtmIfVciBits UNSIGNED32 GET)
(6 begemotAtmIfMaxVpcs UNSIGNED32 GET)
(7 begemotAtmIfMaxVccs UNSIGNED32 GET)
(8 begemotAtmIfEsi OCTETSTRING GET)
(9 begemotAtmIfCarrierStatus INTEGER GET)
(10 begemotAtmIfMode INTEGER GET SET)
))
(2 begemotAtmIfTableLastChange TIMETICKS op_atm GET)
(3 begemotAtmHWTable
(1 begemotAtmHWEntry : INTEGER op_atmhw
(1 begemotAtmHWVendor OCTETSTRING GET)
(2 begemotAtmHWDevice OCTETSTRING GET)
(3 begemotAtmHWSerial UNSIGNED32 GET)
(4 begemotAtmHWVersion UNSIGNED32 GET)
(5 begemotAtmHWSoftVersion UNSIGNED32 GET)
))
(4 begemotAtmSysGroup
(1 begemotAtmFreeBSDGroup
)
)
)
))
)
)
))

View File

@ -0,0 +1,217 @@
.\"
.\" Copyright (c) 2001-2002
.\" Fraunhofer Institute for Open Communication Systems (FhG Fokus).
.\" All rights reserved.
.\" Copyright (c) 2003-2004
.\" Hartmut Brandt.
.\" All rights reserved.
.\"
.\" Author: Hartmut Brandt <harti@freebsd.org>
.\"
.\" 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.
.\"
.\" $Begemot: libunimsg/snmp_atm/snmp_atm.3,v 1.1 2004/07/20 16:30:03 brandt Exp $
.\"
.Dd July 20, 2004
.Dt snmp_atm 3
.Os
.Sh NAME
.Nm atmif_event_f ,
.Nm atm_find_if_name ,
.Nm atm_find_if ,
.Nm atm_notify_aif ,
.Nm atm_unnotify_aif
.Nd "ATM driver module for snmpd.
.Sh LIBRARY
.Pq begemotSnmpdModulePath."netgraph" = "@MODPATH@snmp_netgraph.so" (FreeBSD)
.Pq begemotSnmpdModulePath."mibII" = "@MODPATH@snmp_mibII.so"
.Pq begemotSnmpdModulePath."atm" = "@MODPATH@snmp_atm.so"
.Sh SYNOPSIS
.In bsnmp/snmpmod.h
.In bsnmp/snmp_mibII.h
.In bsnmp/snmp_atm.h
.Ft typedef void
.Fn (*atmif_event_f) "struct atmif *aif" "enum atmif_notify event" "uintptr_t data" "void *uarg"
.Ft struct atmif *
.Fn atm_find_if_name "const char *name"
.Ft struct atmif *
.Fn atm_find_if "u_int ifindex"
.Ft void *
.Fn atm_notify_aif "struct atmif *aif" "const struct lmodule *mod" "atmif_event_f func" "void *uarg"
.Ft void
.Fn atm_unnotify_aif "void *not"
.Sh DESCRIPTION
The
.Nm snmp_atm
module implements a number of tables and scalars that enable remote access to
the ATM devices in the system. It also exports a number of
functions, that allow other modules to easily access ATM devices.
.Pp
The module maintains an extension to the interface structure exported by
.Xr snmp_mibII 3
for all ATM devices. This structure has the following fields:
.Bd -literal -offset indent
struct atmif {
struct mibif *ifp; /* common interface data */
struct atmif_mib *mib; /* ATM MIB */
enum atmif_carrier_state carrier;
enum atmif_suni_mode mode; /* SUNI mode SDH or SONET */
};
.Ed
.Pp
The fields have the following meaning:
.Bl -tag -width XXX
.It Fa ifp
The field points to the
.Xr snmp_mibII 3
interface structure.
.It Fa mib
The special ATM interface MIB (see below).
.It Fa carrier
The current state of the carrier. One of the following:
.Bl -tag -width XXX
.It Dv ATMIF_CARRIER_ON
carrier detected,
.It Dv ATMIF_CARRIER_OFF
no carrier,
.It Dv ATMIF_CARRIER_UNKNOWN
the state of the carrier is unknown,
.It Dv ATMIF_CARRIER_NONE
the device has no notion of carrier or is not able to sense it.
.El
.It Fa mode
For ATM devices with a SUNI chip this is the current mode of the interface:
.Bl -tag -width XXX
.It Dv ATMIF_SUNI_MODE_SONET
The interface is in SONET mode.
.It Dv ATMIF_SUNI_MODE_SDH
The interface is in SDH mode.
.It Dv ATMIF_SUNI_MODE_UNKNOWN
The interface either has no SUNI interface or the mode is unknown (for example,
interface is down).
.El
.El
.Pp
An ATM interface can be found by name or by SNMP interface index (see
.Xr snmp_mibII 3
for a discussion of interface indexes).
The function
.Fn atm_find_if_name
searches an interface given a name.
The function
.Fn atm_find_if
searches an interface by its interface index.
Both functions return NULL if an interface cannot be found.
.Pp
The ATM MIB contains the following fields:
.Bd -literal -offset indent
struct atmif_mib {
u_int version; /* currently 0 */
u_int device; /* type of hardware (system specific) */
u_int serial; /* card serial number (device specific) */
u_int hw_version; /* card version (device specific) */
u_int sw_version; /* firmware version (device specific) */
u_int media; /* physical media (see MIB) */
u_char esi[6]; /* end system identifier (MAC) */
u_int pcr; /* supported peak cell rate */
u_int vpi_bits; /* number of used bits in VPI field */
u_int vci_bits; /* number of used bits in VCI field */
u_int max_vpcs; /* maximum number of VPCs */
u_int max_vccs; /* maximum number of VCCs */
};
.Ed
.Ss NOTIFICATIONS
An other module can register with
.Nm
to receive notifications when certain events happen on the ATM interface.
The registration is done with
.Fn atm_notify_aif
which takes a pointer to the interface, the calling module pointer, a callback
function and a user argument that is passed to the callback function.
The callback function is called with the interface pointer, a notification
code, a notification argument and the user argument. The following
notifications are defined:
.Bl -tag -width XXX
.It Dv ATMIF_NOTIFY_DESTROY
The interface is destroyed. The notification argument is not used.
.It Dv ATMIF_NOTIFY_CARRIER
The carrier state on the interface has changed. The argument is the
.Em old
state of the carrier. The new state can be obtained from the interface
structure.
.It Dv ATMIF_NOTIFY_VCC
A permanent VCC has been created or destroyed. The argument is an u_int that
can be decoded as follows:
.Bd -literal -offset indent
vpi = (arg >> 24) & 0xff;
vci = (arg >> 8) & 0xffff;
state = arg & 1;
.Ed
.Pp
.Va state
is 0 if the VCC was destroyed and 1 if it was created.
.El
The registration for notification can be undone by passing the return
value from
.Fn atm_notify_aif
to
.Fn atm_unnotify_aif .
The registrations is automatically removed if the interface is destroyed.
.Ss MIB
The MIB implemented by the module is defined in
.Pa BEGEMOT-ATM.txt .
In the generic part there are two tables and one scalar, there is also
a system specific group:
.Bl -tag -width XXX
.It Va begemotAtmIfTable
This table is an extension of
.Va ifTable .
It contains a row for each ATM interface and is index with
.Va ifIndex .
All fields are read-only except the
.Va begemotAtmIfMode
column.
.It Va begemotAtmIfTableLastChange
Contains the tick when a row was created or destroyed in the above table or
0, if the table did not change since start of the SNMP agent.
.It Va begemotAtmHWTable
Is also indexed by
.Va ifIndex
and contains hardware specific information. This table is read-only.
.El
.Sh FILES
.Bl -tag -width "XXXXXXXXX"
.It Pa @DEFPATH@atm_tree.def
The description of the MIB tree implemented by
.Nm .
.It Pa @MIBSPATH@BEGEMOT-ATM.txt
This is the MIB that is implemented by this module.
.Sh SEE ALSO
.Xr bsnmpd 1 ,
.Xr snmpmod 3 ,
.Xr snmp_mibII 3 ,
.Xr snmp_netgraph 3 ,
.Xr gensnmptree 1
.Sh AUTHORS
.An Hartmut Brandt Aq harti@freebsd.org

View File

@ -0,0 +1,622 @@
/*
* Copyright (c) 2001-2002
* Fraunhofer Institute for Open Communication Systems (FhG Fokus).
* All rights reserved.
* Copyright (c) 2003-2004
* Hartmut Brandt.
* All rights reserved.
*
* Author: Hartmut Brandt <harti@freebsd.org>
*
* 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.
*
* $Begemot: libunimsg/snmp_atm/snmp_atm.c,v 1.2 2004/08/06 17:30:40 brandt Exp $
*
* SNMP module for ATM hardware interfaces.
*/
#include "atm.h"
#include "atm_tree.h"
#include "atm_oid.h"
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <syslog.h>
#include <net/if_types.h>
#include <net/if_media.h>
#include <net/if_atm.h>
struct lmodule *module;
/* list of all (known) ATM interfaces */
struct atmif_list atmif_list = TAILQ_HEAD_INITIALIZER(atmif_list);
/* whether we are started or not */
static int started;
/* last time table was changed */
static uint32_t last_change;
/* for the registration */
static const struct asn_oid oid_begemotAtm = OIDX_begemotAtm;
/* the registration */
static u_int reg_atm;
/*
* Find an ATM interface by name
*/
struct atmif *
atm_find_if_name(const char *name)
{
struct atmif_priv *aif;
TAILQ_FOREACH(aif, &atmif_list, link)
if (strcmp(aif->pub.ifp->name, name) == 0)
return (&aif->pub);
return (NULL);
}
/*
* get the interface from the interface index
*/
struct atmif *
atm_find_if(u_int ifindex)
{
struct atmif_priv *aif;
TAILQ_FOREACH(aif, &atmif_list, link)
if (aif->index == ifindex)
return (&aif->pub);
return (NULL);
}
/*
* Send notification to all listeners.
*/
void
atmif_send_notification(struct atmif_priv *aif, enum atmif_notify code,
uintptr_t arg)
{
struct atmif_reg *r0, *r1;
r0 = TAILQ_FIRST(&aif->notify);
while (r0 != NULL) {
r1 = TAILQ_NEXT(r0, link);
r0->func(&aif->pub, code, arg, r0->data);
r0 = r1;
}
}
/*
* Destroy an interface
*/
static void
atmif_destroy(struct atmif_priv *aif)
{
struct atmif_reg *r0;
atmif_send_notification(aif, ATMIF_NOTIFY_DESTROY,
(uintptr_t)0);
atmif_sys_destroy(aif);
if (aif->ifpreg != NULL)
mibif_unnotify(aif->ifpreg);
while ((r0 = TAILQ_FIRST(&aif->notify)) != NULL) {
TAILQ_REMOVE(&aif->notify, r0, link);
free(r0);
}
TAILQ_REMOVE(&atmif_list, aif, link);
free(aif);
last_change = this_tick;
}
/*
* Function gets called from the MIB-II module for events on that interface
*/
static void
atmif_notify(struct mibif *ifp __unused, enum mibif_notify event, void *data)
{
struct atmif_priv *aif = data;
switch (event) {
case MIBIF_NOTIFY_DESTROY:
atmif_destroy(aif);
break;
}
}
/*
* Check the carrier state of the interface
*/
void
atmif_check_carrier(struct atmif_priv *aif)
{
struct ifmediareq ifmr;
enum atmif_carrier_state ost = aif->pub.carrier;
memset(&ifmr, 0, sizeof(ifmr));
strcpy(ifmr.ifm_name, aif->pub.ifp->name);
if (ioctl(mib_netsock, SIOCGIFMEDIA, &ifmr) == -1) {
aif->pub.carrier = ATMIF_CARRIER_UNKNOWN;
return;
}
if (!ifmr.ifm_status & IFM_AVALID) {
aif->pub.carrier = ATMIF_CARRIER_UNKNOWN;
return;
}
if (ifmr.ifm_status & IFM_ACTIVE)
aif->pub.carrier = ATMIF_CARRIER_ON;
else
aif->pub.carrier = ATMIF_CARRIER_OFF;
if (ost != aif->pub.carrier)
atmif_send_notification(aif, ATMIF_NOTIFY_CARRIER,
(uintptr_t)ost);
}
/*
* Retrieve the SUNI mode
*/
static int
atmif_get_mode(struct atmif_priv *aif)
{
struct ifmediareq ifmr;
memset(&ifmr, 0, sizeof(ifmr));
strcpy(ifmr.ifm_name, aif->pub.ifp->name);
if (ioctl(mib_netsock, SIOCGIFMEDIA, &ifmr) < 0) {
syslog(LOG_ERR, "SIOCGIFMEDIA: %m");
aif->pub.mode = ATMIF_SUNI_MODE_UNKNOWN;
return (SNMP_ERR_GENERR);
}
if (ifmr.ifm_current & IFM_ATM_SDH)
aif->pub.mode = ATMIF_SUNI_MODE_SDH;
else
aif->pub.mode = ATMIF_SUNI_MODE_SONET;
return (SNMP_ERR_NOERROR);
}
/*
* Change the SUNI mod
*/
static int
atmif_set_mode(struct atmif_priv *aif, int newmode)
{
struct ifmediareq ifmr;
struct ifreq ifr;
memset(&ifmr, 0, sizeof(ifmr));
strcpy(ifmr.ifm_name, aif->pub.ifp->name);
/* get current mode */
if (ioctl(mib_netsock, SIOCGIFMEDIA, &ifmr) < 0) {
syslog(LOG_ERR, "SIOCGIFMEDIA: %m");
return (SNMP_ERR_GENERR);
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, aif->pub.ifp->name);
ifr.ifr_media = ifmr.ifm_current;
if (newmode == ATMIF_SUNI_MODE_SDH)
ifr.ifr_media |= IFM_ATM_SDH;
else
ifr.ifr_media &= ~IFM_ATM_SDH;
if (ioctl(mib_netsock, SIOCSIFMEDIA, &ifr) < 0) {
syslog(LOG_ERR, "SIOCSIFMEDIA: %m");
return (SNMP_ERR_GENERR);
}
aif->pub.mode = newmode;
return (SNMP_ERR_NOERROR);
}
/*
* Attach to an ATM interface
*/
static void
attach_if(struct mibif *ifp)
{
struct atmif_priv *aif;
/* we should not know it */
TAILQ_FOREACH(aif, &atmif_list, link)
if (aif->pub.ifp == ifp) {
syslog(LOG_CRIT, "new ATM if already known '%s'",
ifp->name);
return;
}
/*
* tap it
*/
if ((aif = malloc(sizeof(*aif))) == NULL) {
syslog(LOG_ERR, "new atmif: %m");
return;
}
memset(aif, 0, sizeof(*aif));
aif->pub.ifp = ifp;
aif->index = ifp->index;
if (atmif_sys_attach_if(aif)) {
free(aif);
return;
}
aif->ifpreg = mibif_notify(ifp, module, atmif_notify, aif);
aif->pub.carrier = ATMIF_CARRIER_UNKNOWN;
atmif_check_carrier(aif);
(void)atmif_get_mode(aif);
INSERT_OBJECT_INT(aif, &atmif_list);
last_change = this_tick;
return;
}
/*
* Function gets called when a new interface is created. If this is an
* ATM interface, hook in. Claim the interface in any case even when
* the creation of our data structures fails.
*/
static int
new_if(struct mibif *ifp)
{
if (!started || ifp->mib.ifmd_data.ifi_type != IFT_ATM ||
ifp->xnotify != NULL)
return (0);
attach_if(ifp);
return (1);
}
/*
* Start the module
*/
static void
atm_start(void)
{
struct mibif *ifp;
reg_atm = or_register(&oid_begemotAtm,
"The Begemot MIB for ATM interfaces.", module);
started = 1;
for (ifp = mib_first_if(); ifp != NULL; ifp = mib_next_if(ifp))
if (ifp->mib.ifmd_data.ifi_type == IFT_ATM &&
ifp->xnotify == NULL)
attach_if(ifp);
}
/*
* Called when modules is loaded
*/
static int
atm_init(struct lmodule *mod, int argc __unused, char *argv[] __unused)
{
module = mod;
/* register to get creation messages for ATM interfaces */
if (mib_register_newif(new_if, module)) {
syslog(LOG_ERR, "cannot register newif function: %m");
return (-1);
}
return (0);
}
/*
* Called when module gets unloaded - free all resources
*/
static int
atm_fini(void)
{
struct atmif_priv *aif;
while ((aif = TAILQ_FIRST(&atmif_list)) != NULL)
atmif_destroy(aif);
mib_unregister_newif(module);
or_unregister(reg_atm);
return (0);
}
/*
* Other module unloaded/loaded
*/
static void
atm_loading(const struct lmodule *mod, int loading)
{
struct atmif_priv *aif;
struct atmif_reg *r0, *r1;
if (!loading) {
/* remove notifications for this module */
TAILQ_FOREACH(aif, &atmif_list, link)
TAILQ_FOREACH_SAFE(r0, &aif->notify, link, r1) {
if (r0->mod == mod) {
TAILQ_REMOVE(&aif->notify, r0, link);
free(r0);
}
}
}
}
const struct snmp_module config = {
.comment = "This module implements a private MIB for ATM interfaces.",
.init = atm_init,
.fini = atm_fini,
.start = atm_start,
.tree = atm_ctree,
.tree_size = atm_CTREE_SIZE,
.loading = atm_loading
};
/*
* Get the interface point for a table access
*/
int
atmif_get_aif(struct snmp_value *value, u_int sub, enum snmp_op op,
struct atmif_priv **aifp)
{
switch (op) {
case SNMP_OP_GETNEXT:
if ((*aifp = NEXT_OBJECT_INT(&atmif_list,
&value->var, sub)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
value->var.len = sub + 1;
value->var.subs[sub] = (*aifp)->index;
break;
case SNMP_OP_GET:
if ((*aifp = FIND_OBJECT_INT(&atmif_list,
&value->var, sub)) == NULL)
return (SNMP_ERR_NOSUCHNAME);
break;
case SNMP_OP_SET:
if ((*aifp = FIND_OBJECT_INT(&atmif_list,
&value->var, sub)) == NULL)
return (SNMP_ERR_NO_CREATION);
break;
case SNMP_OP_ROLLBACK:
case SNMP_OP_COMMIT:
if ((*aifp = FIND_OBJECT_INT(&atmif_list,
&value->var, sub)) == NULL)
abort();
return (SNMP_ERR_NOERROR);
}
if ((*aifp)->pub.mib->pcr == 0) {
mib_fetch_ifmib((*aifp)->pub.ifp);
atmif_sys_fill_mib(*aifp);
atmif_check_carrier(*aifp);
}
return (SNMP_ERR_NOERROR);
}
/*
* Table of all ATM interfaces
*/
int
op_atmif(struct snmp_context *ctx __unused, struct snmp_value *value,
u_int sub, u_int vindex __unused, enum snmp_op op)
{
struct atmif_priv *aif;
int err;
if ((err = atmif_get_aif(value, sub, op, &aif)) != SNMP_ERR_NOERROR)
return (err);
if (op == SNMP_OP_SET) {
switch (value->var.subs[sub - 1]) {
default:
return (SNMP_ERR_NOT_WRITEABLE);
case LEAF_begemotAtmIfMode:
if ((err = atmif_get_mode(aif)) != SNMP_ERR_NOERROR)
return (err);
if (aif->pub.mode == ATMIF_SUNI_MODE_UNKNOWN)
return (SNMP_ERR_INCONS_VALUE);
if (value->v.integer != ATMIF_SUNI_MODE_SONET &&
value->v.integer != ATMIF_SUNI_MODE_SDH)
return (SNMP_ERR_WRONG_VALUE);
if ((u_int)value->v.integer == aif->pub.mode)
return (SNMP_ERR_NOERROR);
return (atmif_set_mode(aif, value->v.integer));
}
abort();
}
switch (value->var.subs[sub - 1]) {
case LEAF_begemotAtmIfName:
return (string_get(value, aif->pub.ifp->name, -1));
case LEAF_begemotAtmIfPcr:
value->v.uint32 = aif->pub.mib->pcr;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfMedia:
value->v.integer = aif->pub.mib->media;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfVpiBits:
value->v.uint32 = aif->pub.mib->vpi_bits;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfVciBits:
value->v.uint32 = aif->pub.mib->vci_bits;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfMaxVpcs:
value->v.uint32 = aif->pub.mib->max_vpcs;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfMaxVccs:
value->v.uint32 = aif->pub.mib->max_vccs;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfEsi:
return (string_get(value, aif->pub.mib->esi, 6));
case LEAF_begemotAtmIfCarrierStatus:
value->v.integer = aif->pub.carrier;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmIfMode:
if ((err = atmif_get_mode(aif)) != SNMP_ERR_NOERROR)
return (err);
value->v.integer = aif->pub.mode;
return (SNMP_ERR_NOERROR);
}
abort();
}
/*
* Hardware table
*/
int
op_atmhw(struct snmp_context *ctx __unused, struct snmp_value *value,
u_int sub, u_int vindex __unused, enum snmp_op op)
{
struct atmif_priv *aif;
int err;
if ((err = atmif_get_aif(value, sub, op, &aif)) != SNMP_ERR_NOERROR)
return (err);
if (op == SNMP_OP_SET)
return (SNMP_ERR_NOT_WRITEABLE);
switch (value->var.subs[sub - 1]) {
case LEAF_begemotAtmHWVendor:
return (atm_sys_get_hw_vendor(aif, value));
case LEAF_begemotAtmHWDevice:
return (atm_sys_get_hw_device(aif, value));
case LEAF_begemotAtmHWSerial:
value->v.uint32 = aif->pub.mib->serial;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmHWVersion:
value->v.uint32 = aif->pub.mib->hw_version;
return (SNMP_ERR_NOERROR);
case LEAF_begemotAtmHWSoftVersion:
value->v.uint32 = aif->pub.mib->sw_version;
return (SNMP_ERR_NOERROR);
}
abort();
}
/*
* Scalars
*/
int
op_atm(struct snmp_context *ctx __unused, struct snmp_value *value,
u_int sub, u_int vindex __unused, enum snmp_op op)
{
switch (op) {
case SNMP_OP_GETNEXT:
abort();
case SNMP_OP_GET:
switch (value->var.subs[sub - 1]) {
case LEAF_begemotAtmIfTableLastChange:
value->v.uint32 =
(last_change == 0 ? 0 : last_change - start_tick);
return (SNMP_ERR_NOERROR);
}
abort();
case SNMP_OP_SET:
return (SNMP_ERR_NOT_WRITEABLE);
case SNMP_OP_ROLLBACK:
case SNMP_OP_COMMIT:
abort();
}
abort();
}
/*
* Register for interface notifications
*/
void *
atm_notify_aif(struct atmif *pub, const struct lmodule *mod,
atmif_event_f func, void *arg)
{
struct atmif_priv *aif = (struct atmif_priv *)pub;
struct atmif_reg *r0;
if ((r0 = malloc(sizeof(*r0))) == NULL) {
syslog(LOG_CRIT, "out of memory");
return (NULL);
}
r0->func = func;
r0->mod = mod;
r0->data = arg;
r0->aif = aif;
TAILQ_INSERT_TAIL(&aif->notify, r0, link);
return (r0);
}
/*
* Unregister it
*/
void
atm_unnotify_aif(void *arg)
{
struct atmif_reg *r0 = arg;
TAILQ_REMOVE(&r0->aif->notify, r0, link);
free(r0);
}

View File

@ -0,0 +1,102 @@
/*
* Copyright (c) 2001-2002
* Fraunhofer Institute for Open Communication Systems (FhG Fokus).
* All rights reserved.
* Copyright (c) 2003-2004
* Hartmut Brandt
* All rights reserved.
*
* Author: Hartmut Brandt <harti@freebsd.org>
*
* 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.
*
* $Begemot: libunimsg/snmp_atm/snmp_atm.h,v 1.2 2004/08/06 17:30:40 brandt Exp $
*/
#ifndef _BSNMP_SNMP_ATM_H
#define _BSNMP_SNMP_ATM_H
enum atmif_notify {
ATMIF_NOTIFY_DESTROY, /* interface has been destroyed */
ATMIF_NOTIFY_CARRIER, /* carriere change */
ATMIF_NOTIFY_VCC /* VCC change */
};
enum atmif_carrier_state {
ATMIF_CARRIER_ON = 1,
ATMIF_CARRIER_OFF = 2,
ATMIF_CARRIER_UNKNOWN = 3,
ATMIF_CARRIER_NONE = 4
};
enum atmif_suni_mode {
ATMIF_SUNI_MODE_SONET = 1,
ATMIF_SUNI_MODE_SDH = 2,
ATMIF_SUNI_MODE_UNKNOWN = 3
};
/* forward declaration */
struct atmif;
typedef void (*atmif_event_f)(struct atmif *, enum atmif_notify, uintptr_t,
void *);
struct atmif_mib {
u_int version; /* currently 0 */
u_int device; /* type of hardware (system specific) */
u_int serial; /* card serial number (device specific) */
u_int hw_version; /* card version (device specific) */
u_int sw_version; /* firmware version (device specific) */
u_int media; /* physical media (see MIB) */
u_char esi[6]; /* end system identifier (MAC) */
u_int pcr; /* supported peak cell rate */
u_int vpi_bits; /* number of used bits in VPI field */
u_int vci_bits; /* number of used bits in VCI field */
u_int max_vpcs; /* maximum number of VPCs */
u_int max_vccs; /* maximum number of VCCs */
};
struct atmif {
struct mibif *ifp; /* common interface data */
struct atmif_mib *mib; /* ATM MIB */
enum atmif_carrier_state carrier;
enum atmif_suni_mode mode; /* SUNI mode SDH or SONET */
};
/* find an ATM interface by name */
struct atmif *atm_find_if_name(const char *);
/* get the interface from the interface index */
struct atmif *atm_find_if(u_int);
/* register for notifications */
void *atm_notify_aif(struct atmif *, const struct lmodule *mod,
atmif_event_f, void *);
void atm_unnotify_aif(void *);
/* return the If for a system-specific node number */
struct atmif *atm_node2if(u_int);
/* return the node id for the if */
u_int atm_if2node(struct atmif *);
#endif