Commit 50b95529 authored by Michal Wasiak's avatar Michal Wasiak Committed by Adam Wujek

snmp/bridge_mib: generate dot1dBasePortTable

Generate dot1dBasePortTable with a command:
mib2c -c mib2c.mfd.conf BRIDGE-MIB::dot1dBasePortTable

The data in this table is static, it does not need a cache.
Signed-off-by: 's avatarMichal Wasiak <michal.wasiak@gmail.com>
parent e6582246
########################################################################
##
## mib2c node setting for dot1dBasePort
##
## Remove the '##' comment delimeter to change settings
##
########################################################################
## Node declaration type? This is the C type to be used when
## declaring a variable to hold a value for this column. It
## is strongly recommended that you do not change this value.
## If you do, it is likely to break lots of generated code that
## you will have to fix.
##
## @eval $m2c_decl = long@
##
########################################################################
## Generate/use mapping functions? Useful if the MIB defines
## a different format or enumerations than you data store uses.
##
## @eval $m2c_node_skip_mapping = 1@
##
########################################################################
## Need a length for the value? Most OCTET-STRING based values will
## need a length, most other types will not. Do not change this one
## unless you know what you are doing! You will almost certainly need
## to fix lots of generated code if you do.
##
## @eval $m2c_node_needlength = 0@
##
########################################################################
## Skip get? Set this to 1 if you do not want to implement a value
## for this column.
##
## @eval $m2c_node_skip_get = 0@
##
########################################################################
##
## mib2c node setting for dot1dBasePortCircuit
##
## Remove the '##' comment delimeter to change settings
##
########################################################################
## Node declaration type? This is the C type to be used when
## declaring a variable to hold a value for this column. It
## is strongly recommended that you do not change this value.
## If you do, it is likely to break lots of generated code that
## you will have to fix.
##
## @eval $m2c_decl = oid@
##
########################################################################
## Generate/use mapping functions? Useful if the MIB defines
## a different format or enumerations than you data store uses.
##
## @eval $m2c_node_skip_mapping = 1@
##
########################################################################
## Need a length for the value? Most OCTET-STRING based values will
## need a length, most other types will not. Do not change this one
## unless you know what you are doing! You will almost certainly need
## to fix lots of generated code if you do.
##
## @eval $m2c_node_needlength = 1@
##
########################################################################
## Skip get? Set this to 1 if you do not want to implement a value
## for this column.
##
## @eval $m2c_node_skip_get = 0@
##
########################################################################
## Allow realloc when data size exceeds length? If your data
## store for this node is a pointer allocated with one of the
## alloc family functions, you can set this to 1 to use realloc
## when a new value length exceeds the old lenght. If you are
## using a fixed size buffer, this value should be 0.
##
## @eval $m2c_node_realloc = 0@
########################################################################
##
## mib2c node setting for dot1dBasePortDelayExceededDiscards
##
## Remove the '##' comment delimeter to change settings
##
########################################################################
## Node declaration type? This is the C type to be used when
## declaring a variable to hold a value for this column. It
## is strongly recommended that you do not change this value.
## If you do, it is likely to break lots of generated code that
## you will have to fix.
##
## @eval $m2c_decl = u_long@
##
########################################################################
## Generate/use mapping functions? Useful if the MIB defines
## a different format or enumerations than you data store uses.
##
## @eval $m2c_node_skip_mapping = 1@
##
########################################################################
## Need a length for the value? Most OCTET-STRING based values will
## need a length, most other types will not. Do not change this one
## unless you know what you are doing! You will almost certainly need
## to fix lots of generated code if you do.
##
## @eval $m2c_node_needlength = 0@
##
########################################################################
## Skip get? Set this to 1 if you do not want to implement a value
## for this column.
##
## @eval $m2c_node_skip_get = 0@
##
########################################################################
##
## mib2c node setting for dot1dBasePortIfIndex
##
## Remove the '##' comment delimeter to change settings
##
########################################################################
## Node declaration type? This is the C type to be used when
## declaring a variable to hold a value for this column. It
## is strongly recommended that you do not change this value.
## If you do, it is likely to break lots of generated code that
## you will have to fix.
##
## @eval $m2c_decl = long@
##
########################################################################
## Generate/use mapping functions? Useful if the MIB defines
## a different format or enumerations than you data store uses.
##
## @eval $m2c_node_skip_mapping = 1@
##
########################################################################
## Need a length for the value? Most OCTET-STRING based values will
## need a length, most other types will not. Do not change this one
## unless you know what you are doing! You will almost certainly need
## to fix lots of generated code if you do.
##
## @eval $m2c_node_needlength = 0@
##
########################################################################
## Skip get? Set this to 1 if you do not want to implement a value
## for this column.
##
## @eval $m2c_node_skip_get = 0@
##
########################################################################
##
## mib2c node setting for dot1dBasePortMtuExceededDiscards
##
## Remove the '##' comment delimeter to change settings
##
########################################################################
## Node declaration type? This is the C type to be used when
## declaring a variable to hold a value for this column. It
## is strongly recommended that you do not change this value.
## If you do, it is likely to break lots of generated code that
## you will have to fix.
##
## @eval $m2c_decl = u_long@
##
########################################################################
## Generate/use mapping functions? Useful if the MIB defines
## a different format or enumerations than you data store uses.
##
## @eval $m2c_node_skip_mapping = 1@
##
########################################################################
## Need a length for the value? Most OCTET-STRING based values will
## need a length, most other types will not. Do not change this one
## unless you know what you are doing! You will almost certainly need
## to fix lots of generated code if you do.
##
## @eval $m2c_node_needlength = 0@
##
########################################################################
## Skip get? Set this to 1 if you do not want to implement a value
## for this column.
##
## @eval $m2c_node_skip_get = 0@
##
## ########################################################################
##
## mib2c Table setting for dot1dBasePortTable
##
## ########################################################################
##
## User context structure type
##
@eval $m2c_context_reg = "netsnmp_data_list"@
##
## ########################################################################
##
## Allocate data structure in row structure? (vs embedd)
##
@eval $m2c_data_allocate = 0@
##
## ########################################################################
##
## Generate code to cache data?
##
@eval $m2c_data_cache = 0@
##
## ########################################################################
##
## Data context structure type
##
@eval $m2c_data_context = "generated"@ [generated|NAME]
##
## ########################################################################
##
## Generate function to initialize row context when created?
##
@eval $m2c_data_init = 1@
##
## ########################################################################
##
## Persistence of data context
## // 0:persistent, 1:semi-transient, 2:transient
##
@eval $m2c_data_transient = 0@
##
## ########################################################################
##
## Include some example code?
##
@eval $m2c_include_examples = 1@
##
## ########################################################################
##
## Generate code for irreversible_commit mode?
##
@eval $m2c_irreversible_commit = 0@
##
## ########################################################################
##
## Data access method
##
@eval $m2c_table_access = "container-cached"@
##
## ########################################################################
##
## Generate row dependency function?
##
@eval $m2c_table_dependencies = 0@
##
## ########################################################################
##
## Generate data store/restore functions for persistent storage?
##
@eval $m2c_table_persistent = 0@
##
## ########################################################################
##
## Generate code for dynamic row creation?
##
@eval $m2c_table_row_creation = 0@
##
## ########################################################################
##
## Generate code for settable objects?
##
@eval $m2c_table_settable = 0@
##
## ########################################################################
##
## Skip mapping between data context and MIB formats?
## // 0:generate maps, 1:skip maps, -1:skip unless enum/oid
##
@eval $m2c_table_skip_mapping = 1@
##
## ########################################################################
##
## Generate code for sparse tables?
##
@eval $m2c_table_sparse = 0@
##
## ########################################################################
##
## Generate Makefile/AgentX code?
##
@eval $mfd_generate_makefile = 1@
@eval $mfd_generate_subagent = 1@
##
************************************************************************
dot1dBasePortTable README
------------------------------------------------------------------------
This document describes the results of the mib2c code generation
system using the mfd code generation template. The resulting files
are documented both in this README file as well as per-table specific
README files. All of the files generated by this run of mib2c will
begin with the dot1dBasePortTable prefix.
Quick Start
-----------
For those interested in a quick start, to get a pseudo-todo list, try
this command in directory with the generated code:
grep -n "TODO:" *.[ch] | sed 's/\([^ ]*\) \(.*\)TODO\(.*\)/\3 (\1)/' | sort -n
Key:
:o: Optional
:r: Recommended
:M: Mandatory
:A: Advanced users
This will give you and ordered list of places in the code that you
may (or must) take a closer look at).
You may also want to take a look at the on-line tutorial, found here:
http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mfd/index.html
MIBs For Dummies Overview
-------------------------
The MIBs For Dummies (MFD) configuration files have been written to help
SNMP novices implement SNMP MIBs. This section will be a brief
introduction to some of the general concepts you should be familar with.
Managed Information Base (MIB)
------------------------------
A SNMP MIB (Managed information base) is a text file that describes the
syntax for some set of data objects. The MIB creates a correlation
between an ASCII name for an object and a number OID (Object Identifier).
The SNMP protocol communicates information using the OIDs, and the MIB
allows tools to display a name, which we humans find easier to deal with.
To use an analogy, a MIB is much like a menu at a restaurant. If you've
ever been to a reataurant and ordered a meal, and later received a bill
that simply had '#6' on it, you get the idea. The name is easier for
the customers to remember, and the waiters and chefs use the number for
efficency.
Scalars
-------
A scalar variable is a unique object in a MIB which can represent
a single value. For example, the SNMP standard MIB-II defines a
variable, sysContact.0, which is a string containing the contact
information for the person in charge of a particular agent. Note
that scalar variable always end with '.0'.
Rows and Tables
---------------
When a group of related attributes occur more than once, they can be
grouped together in a table. A table has an index, which uniquely
identifies a particular row, and data columns, which contain the
attributes for that row.
For example, the SNMP standard MIB-II defines a table, ifTable, which
contains information on the ethernet interfaces on a system.
Data Structures
---------------
The code generated by the MFD configuration files has a few important
structures.
The Data Context
----------------
The data context structure should contain the necessary information
to provide the data for the columns in a given row. As long as you
can extract the data for a column for the data context, the data context
can be anything you want: a pointer to an existing structure, the
parameters needed for a function call or an actual copy of the data.
By default, a data context structure is generated with storage for
all the data in a row. Information on changing the default is presented
later on in this help.
The MIB Context
---------------
The MIB context structure is generated with storage for all the
indexes of a table. This data will be used when searching for the
correct row to process for a request.
The Row Request Context
-----------------------
Each table will have a unique data structure for holding data during
the processing of a particular row. The row request context contains
the registration context (that you supply during initilization),
the data context, the MIB context, the undo context (for settable
tables) and other data. There is also a netsnmp_data_list, which can
be used to temporary storage during processing.
The Table Registration Pointer
------------------------------
During initilization, you may provide a pointer to arbitrary data for
you own use. This pointer will be saved in the row request context,
and is passed as a parameter to several functions. It is not required,
and is provided as a way for you to access table specific data in
the generated code.
These files are top-level files potentially useful for all the tables:
------------------------------------------------------------------------
File : dot1dBasePortTable_Makefile
----------------------------------------------------------------------
Purpose : Make file for compiling a (sub)agent. This file is only
useful if you don't want to compile your code directly
into the Net-SNMP master agent.
Editable: Optional
Usage : make -f dot1dBasePortTable_Makefile
File : dot1dBasePortTable_subagent.c
----------------------------------------------------------------------
Purpose : This file contains a main() function for an agent or
sub-agent and is compiled using the Makefile above.
Table specific README files
------------------------------------------------------------------------
Each table for which code was generated has its own README file
describing the files specifically associated with each table. You
should probably read these next:
dot1dBasePortTable-README-dot1dBasePortTable.txt
These are miscellaneous auto-generated code files you generally
shouldn't edit. They contain code that ties your code together with
the Net-SNMP agent.
------------------------------------------------------------------------
File : dot1dBasePortTable.h
Purpose : Header file for the module set. Includes config_require
macros to auto-load the other code pieces when compiled
into the agent.
File : dot1dBasePortTable_oids.h
Purpose : C #define definitions of the tables, columns, and OIDs
File : dot1dBasePortTable_enums.h
Purpose : C #define definitions of the enumerated type values for
each column of each table that requires them.
File : dot1dBasePortTable_interface.c
Purpose : MFD interface to Net-SNMP. This auto-generated code ties the
functions you will fill out to the code that the agent needs.
************************************************************************
dot1dBasePortTable README
------------------------------------------------------------------------
This readme file describes the code generated by mib2c (using the MIBs
for Dummies (MFD) configuration file). The code generated was
generated specifically for the following SNMP table:
dot1dBasePortTable
Your code will be called when the snmp agent receives requests for
the dot1dBasePortTable table. The agent will start by looking for the right
row in your existing data to operate on, if one exists.
Configuration Variables
------------------------------------------------------------
Some variables used for code generation may be set to affect the code
generation. You may override these variables by setting them in the
file defaults/table-dot1dBasePortTable.m2d, and then re-running mib2c.
m2c_table_settable (currently '0')
--------------------------------------------------------
This variable determines whether or not code is generated to support
MIB object which have an access of read-write or read-create. The
default is set based on whether or not the table contains writable
objects, but can be over-ridden.
Syntax: @eval $m2c_table_settable = 0@
m2c_table_dependencies (currently '0')
--------------------------------------------------------
This variable determines whether or not code is generated to support
checking dependencies between columns, rows or tables. The default
is set based on whether or not the table contains writable objects,
but can be over-ridden.
Syntax: @eval $m2c_table_dependencies = 0@
m2c_table_row_creation (currently '0')
--------------------------------------------------------
This variable determines whether or not code is generated to support
checking creation of new rows via SNMP. The default is set based on
whether or not the table contains read-create objects, but can be
over-ridden.
Syntax: @eval $m2c_table_row_creation = 0@
m2c_context_reg (currently 'netsnmp_data_list')
--------------------------------------------------------
This variable contains the structure name to typedef for the
dot1dBasePortTable_registration.
During initilization, you will provide a pointer to a structure of
this type. This pointer is used as a parameter to many functions so
that you have access to your registration data. The default is a
netsnmp_data_list pointer, which will allow you to keep multiple
pointers tagged by a text name. If you have a new or existing structure
you would rather use, you can redefine this variable.
To avoid regenerating code, you may also change this typedef directly
in the dot1dBasePortTable.h header.
Syntax: @eval $m2c_context_reg = "struct my_registration_context@
m2c_data_context (currently 'generated')
--------------------------------------------------------
This variable contains the structure name to typedef for the
dot1dBasePortTable_data.
This typedef is used in the row request context structure for the table,
dot1dBasePortTable_rowreq_ctx.
The typedef in the primary table context will be used for the data and
undo structure types. This structure should contain all the data
needed for all the columns in the table. The default is 'generated',
which will cuase a new data strcuture to be generated with data members
for each column.
To avoid regenerating code, you may also change this typedef directly
in the dot1dBasePortTable.h header.
Syntax: @eval $m2c_data_context = "struct my_data_context"@
m2c_data_allocate (currently '0')
--------------------------------------------------------
This variable determines whether or not the data context (see above)
requires memory to be allocated. The default generated data structure
does not. If you are using a custom data context which needs to
allocate memory, override this value and two additional functions
will be generated:
dot1dBasePortTable_allocate_data
dot1dBasePortTable_release_data
Syntax: @eval $m2c_data_allocate = 1@
m2c_data_init (currently '1')
--------------------------------------------------------
This variable determines whether or not the data context (see above)
or any other items you have added to the table context requires
initialization. The default generated data structure does not. If you
are using a custom data context or have added items needing initialization
to the table context, override this value and two additional functions
will be generated:
dot1dBasePortTable_rowreq_ctx_init
dot1dBasePortTable_rowreq_ctx_cleanup
Syntax: @eval 1 = 1@
m2c_table_access (currently 'container-cached')
------------------------------------------------------------------
This variable determines which data interface will be use to generate
code for looking up data for a given index. The default is the
'container-cached' access code, which caches the data in a netsnmp-
container (usually a sorted array).
Available options can be determined by checking for mib2c configuration
files that begin with 'mfd-access-*'.
Syntax: @eval $m2c_table_access = 'container-cached'@
m2c_include_examples (currently '1')
------------------------------------------------------------------
This variable determines whether or not to generate example code. The
default is to generate example code.
Syntax: @eval $m2c_include_examples = 0@
m2c_data_transient (currently '0')
------------------------------------------------------------------
This variable determines how the generated example code deals with the
data during data lookup. See the table readme file for details on how
the current table access method interprets this value. In general,
a value of 0 indicates persistent data, 1 indicates semi-transient and
2 indicates transient data.
Syntax: @eval $m2c_data_transient = 0@
Index(es) for the dot1dBasePortTable table
------------------------------------------------------------
The index(es) for the dot1dBasePortTable table are:
dot1dBasePort:
Syntax: INTEGER32
DataType: INTEGER32
ASN type: ASN_INTEGER
C-code type: long
You should know how to set all these values from your data context,
dot1dBasePortTable_data.
************************************************************************
dot1dBasePortTable File Overview
------------------------------------------------------------------------
Several files have been generated to implement the dot1dBasePortTable
table. We'll go through these files, one by one, explaining each and
letting you know which you need to edit.
File: dot1dBasePortTable_data_access.[c|h]
------------------------------------------------------------------------
The dot1dBasePortTable_data_access file contains the interface to your data in
its raw format. These functions are used to build the row cache or
locate the row (depending on the table access method).
Set MIB context
-----------------
TODO : Set MIB index values
FUNC : dot1dBasePortTable_indexes_set
WHERE: dot1dBasePortTable_data_access.c
This is a convenience function for setting the index context from
the native C data. Where necessary, value mapping should be done.
This function should update the table index values (found in
tbl_idx) for the given raw data.
container summary
------------------------
The container data access code is for cases when you want to
store your data in the agent/sub-agent.
... to be continued...
File: dot1dBasePortTable_enums.h
------------------------------------------------------------------------
This file contains macros for mapping enumeration values when the
enumerated values defined by the MIB do not match the values used
internally.
Review this file to see if any values need to be updated.
File: dot1dBasePortTable_data_get.c
------------------------------------------------------------------------
Get data for column
-------------------
TODO : retrieve column data from raw data
FUNC : dot1dBasePortIfIndex_get
Get data for column
-------------------
TODO : retrieve column data from raw data
FUNC : dot1dBasePortCircuit_get
Get data for column
-------------------
TODO : retrieve column data from raw data
FUNC : dot1dBasePortDelayExceededDiscards_get
Get data for column
-------------------
TODO : retrieve column data from raw data
FUNC : dot1dBasePortMtuExceededDiscards_get
File: dot1dBasePortTable_data_set.c
------------------------------------------------------------------------
This table does not support set requests.
************************************************************************
dot1dBasePortTable Reference
------------------------------------------------------------------------
Function flow
----------------------------------------------------
To give you the general idea of how the functions flow works, this
example flow is from a complete table implementation.
NOTE: Depending on your configuration, some of the functions used in the
examples below may not have been generated for the
dot1dBasePortTable table.
Conversely, the examples below may not include some functions that
were generated for the dot1dBasePortTable table.
To watch the flow of the dot1dBasePortTable table, use the
following debug tokens:
snmp_agent
helper:table:req
dot1dBasePortTable
verbose:dot1dBasePortTable
internal:dot1dBasePortTable
e.g.
snmpd -f -Le -Ddot1dBasePortTable,verbose:dot1dBasePortTable,internal:dot1dBasePortTable
Initialization
--------------------------------
init_xxxTable: called xxx.c
initialize_table_xxxTable xxx.c
_xxxTable_initialize_interface xxx_interface.c
xxxTable_init_data xxx_data_access.c
_xxxTable_container_init xxx_interface.c
xxxTable_container_init xxx_data_access.c
GET Request
--------------------------------
_cache_load xxx_interface.c
xxxTable_cache_load xxx_data_access.c
xxxTable_allocate_rowreq_ctx xxx_interface.c
xxxTable_allocate_data xxx_data_get.c
xxxTable_rowreq_ctx_init xxx_data_get.c
xxxTable_indexes_set xxx_data_get.c
xxxTable_indexes_set_tbl_idx xxx_data_get.c
xxxTable_pre_request
_mfd_xxxTable_object_lookup xxx_interface.c
xxxTable_row_prep xxx_data_access.c
_mfd_xxxTable_get_values xxx_interface.c
_mfd_xxxTable_get_column xxx_interface.c
yyy_get xxx_data_get.c
xxxTable_post_request
GETNEXT Request
--------------------------------
_cache_load ...
xxxTable_pre_request ...
_mfd_xxxTable_object_lookup ...
_mfd_xxxTable_get_values ...
xxxTable_post_request ...
SET Request: success
--------------------------------
_cache_load ...
xxxTable_pre_request
_mfd_xxxTable_object_lookup ...
_mfd_xxxTable_check_objects xxx_interface.c
_xxxTable_check_column xxx_interface.c
yyy_check_value xxx_data_set.c
_mfd_xxxTable_undo_setup xxx_interface.c
xxxTable_allocate_data ...
xxxTable_undo_setup xxx_interface.c
_xxxTable_undo_setup_column xxx_interface.c
yyy_undo_setup xxx_data_set.c
_mfd_xxxTable_set_values xxx_interface.c
_xxxTable_set_column xxx_interface.c
yyy_set xxx_data_set.c
_mfd_xxxTable_check_dependencies xxx_interface.c
xxxTable_check_dependencies xxx_data_set.c
_mfd_xxxTable_commit xxx_interface.c
xxxTable_commit xxx_data_set.c
_mfd_xxxTable_undo_cleanup xxx_interface.c
xxxTable_undo_cleanup xxx_data_set.c
xxxTable_release_data ...
xxxTable_post_request ...
SET Request: row creation
--------------------------------
_cache_load ...
xxxTable_pre_request
_mfd_xxxTable_object_lookup ...
xxxTable_index_from_oid xxx_interface.c
xxxTable_allocate_rowreq_ctx ...
...
_xxxTable_check_indexes xxx_interface.c
yyy_check_index xxx_data_set.c
xxxTable_validate_index xxx_data_set.c
_mfd_xxxTable_check_objects ...
_xxxTable_check_column ...
yyy_check_value ...
_xxxTable_check_column ...
yyy_check_value ...
_mfd_xxxTable_undo_setup ...
_mfd_xxxTable_set_values ...
_mfd_xxxTable_check_dependencies ...
_mfd_xxxTable_commit ...
_mfd_xxxTable_undo_cleanup ...
xxxTable_post_request ...
SET Resuest: value error
--------------------------------
_cache_load ...
xxxTable_pre_request ...
_mfd_xxxTable_object_lookup ...
_mfd_xxxTable_check_objects ...
_xxxTable_check_column ...
yyy_check_value ...
ERROR:"yyy value not supported"
xxxTable_post_request ...
SET Request: commit failure
--------------------------------
_cache_load ...
xxxTable_pre_request ...
_mfd_xxxTable_object_lookup ...
_mfd_xxxTable_check_objects ...
_mfd_xxxTable_undo_setup ...
_mfd_xxxTable_set_values ...
_mfd_xxxTable_check_dependencies ...
_mfd_xxxTable_commit ...
xxxTable_commit ...
ERROR: bad rc -1
_mfd_xxxTable_undo_commit xxx_interface.c
xxxTable_undo_commit xxx_data_set.c
_mfd_xxxTable_undo_values xxx_interface.c
_xxxTable_undo_column xxx_interface.c
yyy_undo xxx_data_set.c
_mfd_xxxTable_undo_cleanup ...
xxxTable_post_request ...
Row release (user initiated)
--------------------------------
xxxTable_release_rowreq_ctx xxx_interface.c
xxxTable_rowreq_ctx_cleanup xxx_data_get.c
xxxTable_release_data xxx_data_get.c
Table / column details
----------------------------------------------------
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePort
* dot1dBasePort is subid 1 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.1
* Description:
The port number of the port for which this entry
contains bridge management information.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 1 hashint 0
* settable 0
*
* Ranges: 1 - 65535;
*
* Its syntax is INTEGER32 (based on perltype INTEGER32)
* The net-snmp type is ASN_INTEGER. The C type decl is long (long)
*/
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortIfIndex
* dot1dBasePortIfIndex is subid 2 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.2
* Description:
The value of the instance of the ifIndex object,
defined in IF-MIB, for the interface corresponding
to this port.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 1 hashint 1
* settable 0
* hint: d
*
* Ranges: 1 - 2147483647;
*
* Its syntax is InterfaceIndex (based on perltype INTEGER32)
* The net-snmp type is ASN_INTEGER. The C type decl is long (long)
*/
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortCircuit
* dot1dBasePortCircuit is subid 3 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.3
* Description:
For a port that (potentially) has the same value of
dot1dBasePortIfIndex as another port on the same bridge.
This object contains the name of an object instance
unique to this port. For example, in the case where
multiple ports correspond one-to-one with multiple X.25
virtual circuits, this value might identify an (e.g.,
the first) object instance associated with the X.25
virtual circuit corresponding to this port.
For a port which has a unique value of
dot1dBasePortIfIndex, this object can have the value
{ 0 0 }.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is OBJECTID (based on perltype OBJECTID)
* The net-snmp type is ASN_OBJECT_ID. The C type decl is oid (oid)
* This data type requires a length.
*/
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortDelayExceededDiscards
* dot1dBasePortDelayExceededDiscards is subid 4 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.4
* Description:
The number of frames discarded by this port due
to excessive transit delay through the bridge. It
is incremented by both transparent and source
route bridges.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is COUNTER (based on perltype COUNTER)
* The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
*/
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortMtuExceededDiscards
* dot1dBasePortMtuExceededDiscards is subid 5 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.5
* Description:
The number of frames discarded by this port due
to an excessive size. It is incremented by both
transparent and source route bridges.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is COUNTER (based on perltype COUNTER)
* The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
*/
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
/** \page MFD helper for dot1dBasePortTable
*
* \section intro Introduction
* Introductory text.
*
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
#include <net-snmp/agent/mib_modules.h>
#include "dot1dBasePortTable_interface.h"
const oid dot1dBasePortTable_oid[] = { DOT1DBASEPORTTABLE_OID };
const int dot1dBasePortTable_oid_size = OID_LENGTH(dot1dBasePortTable_oid);
dot1dBasePortTable_registration dot1dBasePortTable_user_context;
void initialize_table_dot1dBasePortTable(void);
void shutdown_table_dot1dBasePortTable(void);
/**
* Initializes the dot1dBasePortTable module
*/
void
init_dot1dBasePortTable(void)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:init_dot1dBasePortTable","called\n"));
/*
* TODO:300:o: Perform dot1dBasePortTable one-time module initialization.
*/
/*
* here we initialize all the tables we're planning on supporting
*/
if (should_init("dot1dBasePortTable"))
initialize_table_dot1dBasePortTable();
} /* init_dot1dBasePortTable */
/**
* Shut-down the dot1dBasePortTable module (agent is exiting)
*/
void
shutdown_dot1dBasePortTable(void)
{
if (should_init("dot1dBasePortTable"))
shutdown_table_dot1dBasePortTable();
}
/**
* Initialize the table dot1dBasePortTable
* (Define its contents and how it's structured)
*/
void
initialize_table_dot1dBasePortTable(void)
{
dot1dBasePortTable_registration * user_context;
u_long flags;
DEBUGMSGTL(("verbose:dot1dBasePortTable:initialize_table_dot1dBasePortTable","called\n"));
/*
* TODO:301:o: Perform dot1dBasePortTable one-time table initialization.
*/
/*
* TODO:302:o: |->Initialize dot1dBasePortTable user context
* if you'd like to pass in a pointer to some data for this
* table, allocate or set it up here.
*/
/*
* a netsnmp_data_list is a simple way to store void pointers. A simple
* string token is used to add, find or remove pointers.
*/
user_context = netsnmp_create_data_list("dot1dBasePortTable", NULL, NULL);
/*
* No support for any flags yet, but in the future you would
* set any flags here.
*/
flags = 0;
/*
* call interface initialization code
*/
_dot1dBasePortTable_initialize_interface(user_context, flags);
} /* initialize_table_dot1dBasePortTable */
/**
* Shutdown the table dot1dBasePortTable
*/
void
shutdown_table_dot1dBasePortTable(void)
{
/*
* call interface shutdown code
*/
_dot1dBasePortTable_shutdown_interface(&dot1dBasePortTable_user_context);
}
/**
* extra context initialization (eg default values)
*
* @param rowreq_ctx : row request context
* @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
*
* @retval MFD_SUCCESS : no errors
* @retval MFD_ERROR : error (context allocate will fail)
*/
int
dot1dBasePortTable_rowreq_ctx_init(dot1dBasePortTable_rowreq_ctx *rowreq_ctx,
void *user_init_ctx)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_rowreq_ctx_init","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:210:o: |-> Perform extra dot1dBasePortTable rowreq initialization. (eg DEFVALS)
*/
return MFD_SUCCESS;
} /* dot1dBasePortTable_rowreq_ctx_init */
/**
* extra context cleanup
*
*/
void dot1dBasePortTable_rowreq_ctx_cleanup(dot1dBasePortTable_rowreq_ctx *rowreq_ctx)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_rowreq_ctx_cleanup","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:211:o: |-> Perform extra dot1dBasePortTable rowreq cleanup.
*/
} /* dot1dBasePortTable_rowreq_ctx_cleanup */
/**
* pre-request callback
*
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : other error
*/
int
dot1dBasePortTable_pre_request(dot1dBasePortTable_registration * user_context)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_pre_request","called\n"));
/*
* TODO:510:o: Perform dot1dBasePortTable pre-request actions.
*/
return MFD_SUCCESS;
} /* dot1dBasePortTable_pre_request */
/**
* post-request callback
*
* Note:
* New rows have been inserted into the container, and
* deleted rows have been removed from the container and
* released.
*
* @param user_context
* @param rc : MFD_SUCCESS if all requests succeeded
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : other error (ignored)
*/
int
dot1dBasePortTable_post_request(dot1dBasePortTable_registration * user_context, int rc)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_post_request","called\n"));
/*
* TODO:511:o: Perform dot1dBasePortTable post-request actions.
*/
return MFD_SUCCESS;
} /* dot1dBasePortTable_post_request */
/** @{ */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
#ifndef DOT1DBASEPORTTABLE_H
#define DOT1DBASEPORTTABLE_H
#ifdef __cplusplus
extern "C" {
#endif
/** @addtogroup misc misc: Miscellaneous routines
*
* @{
*/
#include <net-snmp/library/asn1.h>
/* other required module components */
/* *INDENT-OFF* */
config_add_mib(BRIDGE-MIB)
config_require(BRIDGE-MIB/dot1dBasePortTable/dot1dBasePortTable_interface)
config_require(BRIDGE-MIB/dot1dBasePortTable/dot1dBasePortTable_data_access)
config_require(BRIDGE-MIB/dot1dBasePortTable/dot1dBasePortTable_data_get)
config_require(BRIDGE-MIB/dot1dBasePortTable/dot1dBasePortTable_data_set)
/* *INDENT-ON* */
/* OID and column number definitions for dot1dBasePortTable */
#include "dot1dBasePortTable_oids.h"
/* enum definions */
#include "dot1dBasePortTable_enums.h"
/* *********************************************************************
* function declarations
*/
void init_dot1dBasePortTable(void);
void shutdown_dot1dBasePortTable(void);
/* *********************************************************************
* Table declarations
*/
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
/* *********************************************************************
* When you register your mib, you get to provide a generic
* pointer that will be passed back to you for most of the
* functions calls.
*
* TODO:100:r: Review all context structures
*/
/*
* TODO:101:o: |-> Review dot1dBasePortTable registration context.
*/
typedef netsnmp_data_list dot1dBasePortTable_registration;
/**********************************************************************/
/*
* TODO:110:r: |-> Review dot1dBasePortTable data context structure.
* This structure is used to represent the data for dot1dBasePortTable.
*/
/*
* This structure contains storage for all the columns defined in the
* dot1dBasePortTable.
*/
typedef struct dot1dBasePortTable_data_s {
/*
* dot1dBasePortIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H
*/
long dot1dBasePortIfIndex;
/*
* dot1dBasePortCircuit(3)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h
*/
oid dot1dBasePortCircuit[128];
size_t dot1dBasePortCircuit_len; /* # of oid elements, not bytes */
/*
* dot1dBasePortDelayExceededDiscards(4)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
*/
u_long dot1dBasePortDelayExceededDiscards;
/*
* dot1dBasePortMtuExceededDiscards(5)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h
*/
u_long dot1dBasePortMtuExceededDiscards;
} dot1dBasePortTable_data;
/*
* TODO:120:r: |-> Review dot1dBasePortTable mib index.
* This structure is used to represent the index for dot1dBasePortTable.
*/
typedef struct dot1dBasePortTable_mib_index_s {
/*
* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h
*/
long dot1dBasePort;
} dot1dBasePortTable_mib_index;
/*
* TODO:121:r: | |-> Review dot1dBasePortTable max index length.
* If you KNOW that your indexes will never exceed a certain
* length, update this macro to that length.
*/
#define MAX_dot1dBasePortTable_IDX_LEN 1
/* *********************************************************************
* TODO:130:o: |-> Review dot1dBasePortTable Row request (rowreq) context.
* When your functions are called, you will be passed a
* dot1dBasePortTable_rowreq_ctx pointer.
*/
typedef struct dot1dBasePortTable_rowreq_ctx_s {
/** this must be first for container compare to work */
netsnmp_index oid_idx;
oid oid_tmp[MAX_dot1dBasePortTable_IDX_LEN];
dot1dBasePortTable_mib_index tbl_idx;
dot1dBasePortTable_data data;
/*
* flags per row. Currently, the first (lower) 8 bits are reserved
* for the user. See mfd.h for other flags.
*/
u_int rowreq_flags;
/*
* TODO:131:o: | |-> Add useful data to dot1dBasePortTable rowreq context.
*/
/*
* storage for future expansion
*/
netsnmp_data_list *dot1dBasePortTable_data_list;
} dot1dBasePortTable_rowreq_ctx;
typedef struct dot1dBasePortTable_ref_rowreq_ctx_s {
dot1dBasePortTable_rowreq_ctx *rowreq_ctx;
} dot1dBasePortTable_ref_rowreq_ctx;
/* *********************************************************************
* function prototypes
*/
int dot1dBasePortTable_pre_request(dot1dBasePortTable_registration * user_context);
int dot1dBasePortTable_post_request(dot1dBasePortTable_registration * user_context,
int rc);
int dot1dBasePortTable_rowreq_ctx_init(dot1dBasePortTable_rowreq_ctx *rowreq_ctx,
void *user_init_ctx);
void dot1dBasePortTable_rowreq_ctx_cleanup(dot1dBasePortTable_rowreq_ctx *rowreq_ctx);
dot1dBasePortTable_rowreq_ctx *
dot1dBasePortTable_row_find_by_mib_index(dot1dBasePortTable_mib_index *mib_idx);
extern const oid dot1dBasePortTable_oid[];
extern const int dot1dBasePortTable_oid_size;
#include "dot1dBasePortTable_interface.h"
#include "dot1dBasePortTable_data_access.h"
#include "dot1dBasePortTable_data_get.h"
#include "dot1dBasePortTable_data_set.h"
/*
* DUMMY markers, ignore
*
* TODO:099:x: *************************************************************
* TODO:199:x: *************************************************************
* TODO:299:x: *************************************************************
* TODO:399:x: *************************************************************
* TODO:499:x: *************************************************************
*/
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_H */
/** @} */
CC=gcc
TABLE_PREFIX=dot1dBasePortTable
NETSNMPCONFIG=net-snmp-config
# uncomment this if you have GNU make
#NETSNMPCFLAGS := $(shell $(NETSNMPCONFIG) --base-cflags)
#NETSNMPLIBS := $(shell $(NETSNMPCONFIG) --agent-libs)
NETSNMPCFLAGS=`$(NETSNMPCONFIG) --base-cflags`
NETSNMPLIBS=`$(NETSNMPCONFIG) --agent-libs`
LIBS=$(NETSNMPLIBS)
STRICT_FLAGS = -Wall -Wstrict-prototypes
CFLAGS=-I. $(NETSNMPCFLAGS) $(STRICT_FLAGS)
USER_SRCS = \
$(TABLE_PREFIX)_data_get.c \
$(TABLE_PREFIX)_data_set.c \
$(TABLE_PREFIX)_data_access.c
SRCS = $(USER_SRCS) \
$(TABLE_PREFIX).c \
$(TABLE_PREFIX)_subagent.c \
$(TABLE_PREFIX)_interface.c
USER_OBJS = \
$(TABLE_PREFIX)_data_get.o \
$(TABLE_PREFIX)_data_set.o \
$(TABLE_PREFIX)_data_access.o
OBJS = $(USER_OBJS) \
$(TABLE_PREFIX).o \
$(TABLE_PREFIX)_subagent.o \
$(TABLE_PREFIX)_interface.o
TARGETS=$(TABLE_PREFIX)
.SUFFIXES:
.SUFFIXES: .c .o .deps
all: $(TARGETS)
user: $(USER_OBJS)
$(TARGETS): $(LIB_DEPS)
$(TABLE_PREFIX): $(OBJS) $(TABLE_PREFIX)_Makefile
$(CC) -o $(TABLE_PREFIX) $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) $(TARGETS)
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
#include "dot1dBasePortTable_data_access.h"
/** @ingroup interface
* @addtogroup data_access data_access: Routines to access data
*
* These routines are used to locate the data used to satisfy
* requests.
*
* @{
*/
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
/**
* initialization for dot1dBasePortTable data access
*
* This function is called during startup to allow you to
* allocate any resources you need for the data table.
*
* @param dot1dBasePortTable_reg
* Pointer to dot1dBasePortTable_registration
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : unrecoverable error.
*/
int
dot1dBasePortTable_init_data(dot1dBasePortTable_registration * dot1dBasePortTable_reg)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_init_data","called\n"));
/*
* TODO:303:o: Initialize dot1dBasePortTable data.
*/
/*
***************************************************
*** START EXAMPLE CODE ***
***---------------------------------------------***/
/*
* if you are the sole writer for the file, you could
* open it here. However, as stated earlier, we are assuming
* the worst case, which in this case means that the file is
* written to by someone else, and might not even exist when
* we start up. So we can't do anything here.
*/
/*
***---------------------------------------------***
*** END EXAMPLE CODE ***
***************************************************/
return MFD_SUCCESS;
} /* dot1dBasePortTable_init_data */
/**
* container overview
*
*/
/**
* container initialization
*
* @param container_ptr_ptr A pointer to a container pointer. If you
* create a custom container, use this parameter to return it
* to the MFD helper. If set to NULL, the MFD helper will
* allocate a container for you.
*
* This function is called at startup to allow you to customize certain
* aspects of the access method. For the most part, it is for advanced
* users. The default code should suffice for most cases. If no custom
* container is allocated, the MFD code will create one for your.
*
* @remark
* This would also be a good place to do any initialization needed
* for you data source. For example, opening a connection to another
* process that will supply the data, opening a database, etc.
*/
void
dot1dBasePortTable_container_init(netsnmp_container **container_ptr_ptr)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_container_init","called\n"));
if (NULL == container_ptr_ptr) {
snmp_log(LOG_ERR,"bad container param to dot1dBasePortTable_container_init\n");
return;
}
/*
* For advanced users, you can use a custom container. If you
* do not create one, one will be created for you.
*/
*container_ptr_ptr = NULL;
} /* dot1dBasePortTable_container_init */
/**
* container shutdown
*
* @param container_ptr A pointer to the container.
*
* This function is called at shutdown to allow you to customize certain
* aspects of the access method. For the most part, it is for advanced
* users. The default code should suffice for most cases.
*
* This function is called before dot1dBasePortTable_container_free().
*
* @remark
* This would also be a good place to do any cleanup needed
* for you data source. For example, closing a connection to another
* process that supplied the data, closing a database, etc.
*/
void
dot1dBasePortTable_container_shutdown(netsnmp_container *container_ptr)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_container_shutdown","called\n"));
if (NULL == container_ptr) {
snmp_log(LOG_ERR,"bad params to dot1dBasePortTable_container_shutdown\n");
return;
}
} /* dot1dBasePortTable_container_shutdown */
/**
* load initial data
*
* TODO:350:M: Implement dot1dBasePortTable data load
*
* @param container container to which items should be inserted
*
* @retval MFD_SUCCESS : success.
* @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
* @retval MFD_ERROR : other error.
*
* This function is called to load the index(es) (and data, optionally)
* for the every row in the data set.
*
* @remark
* While loading the data, the only important thing is the indexes.
* If access to your data is cheap/fast (e.g. you have a pointer to a
* structure in memory), it would make sense to update the data here.
* If, however, the accessing the data invovles more work (e.g. parsing
* some other existing data, or peforming calculations to derive the data),
* then you can limit yourself to setting the indexes and saving any
* information you will need later. Then use the saved information in
* dot1dBasePortTable_row_prep() for populating data.
*
* @note
* If you need consistency between rows (like you want statistics
* for each row to be from the same time frame), you should set all
* data here.
*
*/
int
dot1dBasePortTable_container_load(netsnmp_container *container)
{
dot1dBasePortTable_rowreq_ctx *rowreq_ctx;
size_t count = 0;
/*
* temporary storage for index values
*/
/*
* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h
*/
long dot1dBasePort;
/*
* this example code is based on a data source that is a
* text file to be read and parsed.
*/
FILE *filep;
char line[MAX_LINE_SIZE];
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_container_load","called\n"));
/*
***************************************************
*** START EXAMPLE CODE ***
***---------------------------------------------***/
/*
* open our data file.
*/
filep = fopen("/etc/dummy.conf", "r");
if(NULL == filep) {
return MFD_RESOURCE_UNAVAILABLE;
}
/*
***---------------------------------------------***
*** END EXAMPLE CODE ***
***************************************************/
/*
* TODO:351:M: |-> Load/update data in the dot1dBasePortTable container.
* loop over your dot1dBasePortTable data, allocate a rowreq context,
* set the index(es) [and data, optionally] and insert into
* the container.
*/
while( 1 ) {
/*
***************************************************
*** START EXAMPLE CODE ***
***---------------------------------------------***/
/*
* get a line (skip blank lines)
*/
do {
if (!fgets(line, sizeof(line), filep)) {
/* we're done */
fclose(filep);
filep = NULL;
}
} while (filep && (line[0] == '\n'));
/*
* check for end of data
*/
if(NULL == filep)
break;
/*
* parse line into variables
*/
/*
***---------------------------------------------***
*** END EXAMPLE CODE ***
***************************************************/
/*
* TODO:352:M: | |-> set indexes in new dot1dBasePortTable rowreq context.
* data context will be set from the param (unless NULL,
* in which case a new data context will be allocated)
*/
rowreq_ctx = dot1dBasePortTable_allocate_rowreq_ctx(NULL);
if (NULL == rowreq_ctx) {
snmp_log(LOG_ERR, "memory allocation failed\n");
return MFD_RESOURCE_UNAVAILABLE;
}
if(MFD_SUCCESS != dot1dBasePortTable_indexes_set(rowreq_ctx
, dot1dBasePort
)) {
snmp_log(LOG_ERR,"error setting index while loading "
"dot1dBasePortTable data.\n");
dot1dBasePortTable_release_rowreq_ctx(rowreq_ctx);
continue;
}
/*
* TODO:352:r: | |-> populate dot1dBasePortTable data context.
* Populate data context here. (optionally, delay until row prep)
*/
/* non-TRANSIENT data: no need to copy. set pointer to data */
/*
* insert into table container
*/
CONTAINER_INSERT(container, rowreq_ctx);
++count;
}
/*
***************************************************
*** START EXAMPLE CODE ***
***---------------------------------------------***/
if(NULL != filep)
fclose(filep);
/*
***---------------------------------------------***
*** END EXAMPLE CODE ***
***************************************************/
DEBUGMSGT(("verbose:dot1dBasePortTable:dot1dBasePortTable_container_load",
"inserted %d records\n", count));
return MFD_SUCCESS;
} /* dot1dBasePortTable_container_load */
/**
* container clean up
*
* @param container container with all current items
*
* This optional callback is called prior to all
* item's being removed from the container. If you
* need to do any processing before that, do it here.
*
* @note
* The MFD helper will take care of releasing all the row contexts.
*
*/
void
dot1dBasePortTable_container_free(netsnmp_container *container)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_container_free","called\n"));
/*
* TODO:380:M: Free dot1dBasePortTable container data.
*/
} /* dot1dBasePortTable_container_free */
/**
* prepare row for processing.
*
* When the agent has located the row for a request, this function is
* called to prepare the row for processing. If you fully populated
* the data context during the index setup phase, you may not need to
* do anything.
*
* @param rowreq_ctx pointer to a context.
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : other error.
*/
int
dot1dBasePortTable_row_prep( dot1dBasePortTable_rowreq_ctx *rowreq_ctx)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_row_prep","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:390:o: Prepare row for request.
* If populating row data was delayed, this is the place to
* fill in the row for this request.
*/
return MFD_SUCCESS;
} /* dot1dBasePortTable_row_prep */
/** @} */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
#ifndef DOT1DBASEPORTTABLE_DATA_ACCESS_H
#define DOT1DBASEPORTTABLE_DATA_ACCESS_H
#ifdef __cplusplus
extern "C" {
#endif
/* *********************************************************************
* function declarations
*/
/* *********************************************************************
* Table declarations
*/
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
int dot1dBasePortTable_init_data(dot1dBasePortTable_registration * dot1dBasePortTable_reg);
void dot1dBasePortTable_container_init(netsnmp_container **container_ptr_ptr);
void dot1dBasePortTable_container_shutdown(netsnmp_container *container_ptr);
int dot1dBasePortTable_container_load(netsnmp_container *container);
void dot1dBasePortTable_container_free(netsnmp_container *container);
/*
***************************************************
*** START EXAMPLE CODE ***
***---------------------------------------------***/
/* *********************************************************************
* Since we have no idea how you really access your data, we'll go with
* a worst case example: a flat text file.
*/
#define MAX_LINE_SIZE 256
/*
***---------------------------------------------***
*** END EXAMPLE CODE ***
***************************************************/
int dot1dBasePortTable_row_prep( dot1dBasePortTable_rowreq_ctx *rowreq_ctx);
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_DATA_ACCESS_H */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
/** @defgroup data_get data_get: Routines to get data
*
* TODO:230:M: Implement dot1dBasePortTable get routines.
* TODO:240:M: Implement dot1dBasePortTable mapping routines (if any).
*
* These routine are used to get the value for individual objects. The
* row context is passed, along with a pointer to the memory where the
* value should be copied.
*
* @{
*/
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
/* ---------------------------------------------------------------------
* TODO:200:r: Implement dot1dBasePortTable data context functions.
*/
/**
* set mib index(es)
*
* @param tbl_idx mib index structure
* @param dot1dBasePort_val
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : other error.
*
* @remark
* This convenience function is useful for setting all the MIB index
* components with a single function call. It is assume that the C values
* have already been mapped from their native/rawformat to the MIB format.
*/
int
dot1dBasePortTable_indexes_set_tbl_idx(dot1dBasePortTable_mib_index *tbl_idx, long dot1dBasePort_val)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_indexes_set_tbl_idx","called\n"));
/* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h */
tbl_idx->dot1dBasePort = dot1dBasePort_val;
return MFD_SUCCESS;
} /* dot1dBasePortTable_indexes_set_tbl_idx */
/**
* @internal
* set row context indexes
*
* @param reqreq_ctx the row context that needs updated indexes
*
* @retval MFD_SUCCESS : success.
* @retval MFD_ERROR : other error.
*
* @remark
* This function sets the mib indexs, then updates the oid indexs
* from the mib index.
*/
int
dot1dBasePortTable_indexes_set(dot1dBasePortTable_rowreq_ctx *rowreq_ctx, long dot1dBasePort_val)
{
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_indexes_set","called\n"));
if(MFD_SUCCESS != dot1dBasePortTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx
, dot1dBasePort_val
))
return MFD_ERROR;
/*
* convert mib index to oid index
*/
rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
if(0 != dot1dBasePortTable_index_to_oid(&rowreq_ctx->oid_idx,
&rowreq_ctx->tbl_idx)) {
return MFD_ERROR;
}
return MFD_SUCCESS;
} /* dot1dBasePortTable_indexes_set */
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortIfIndex
* dot1dBasePortIfIndex is subid 2 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.2
* Description:
The value of the instance of the ifIndex object,
defined in IF-MIB, for the interface corresponding
to this port.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 1 hashint 1
* settable 0
* hint: d
*
* Ranges: 1 - 2147483647;
*
* Its syntax is InterfaceIndex (based on perltype INTEGER32)
* The net-snmp type is ASN_INTEGER. The C type decl is long (long)
*/
/**
* Extract the current value of the dot1dBasePortIfIndex data.
*
* Set a value using the data context for the row.
*
* @param rowreq_ctx
* Pointer to the row request context.
* @param dot1dBasePortIfIndex_val_ptr
* Pointer to storage for a long variable
*
* @retval MFD_SUCCESS : success
* @retval MFD_SKIP : skip this node (no value for now)
* @retval MFD_ERROR : Any other error
*/
int
dot1dBasePortIfIndex_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, long * dot1dBasePortIfIndex_val_ptr )
{
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != dot1dBasePortIfIndex_val_ptr );
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortIfIndex_get","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:231:o: |-> Extract the current value of the dot1dBasePortIfIndex data.
* copy (* dot1dBasePortIfIndex_val_ptr ) from rowreq_ctx->data
*/
(* dot1dBasePortIfIndex_val_ptr ) = rowreq_ctx->data.dot1dBasePortIfIndex;
return MFD_SUCCESS;
} /* dot1dBasePortIfIndex_get */
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortCircuit
* dot1dBasePortCircuit is subid 3 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.3
* Description:
For a port that (potentially) has the same value of
dot1dBasePortIfIndex as another port on the same bridge.
This object contains the name of an object instance
unique to this port. For example, in the case where
multiple ports correspond one-to-one with multiple X.25
virtual circuits, this value might identify an (e.g.,
the first) object instance associated with the X.25
virtual circuit corresponding to this port.
For a port which has a unique value of
dot1dBasePortIfIndex, this object can have the value
{ 0 0 }.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is OBJECTID (based on perltype OBJECTID)
* The net-snmp type is ASN_OBJECT_ID. The C type decl is oid (oid)
* This data type requires a length.
*/
/**
* Extract the current value of the dot1dBasePortCircuit data.
*
* Set a value using the data context for the row.
*
* @param rowreq_ctx
* Pointer to the row request context.
* @param dot1dBasePortCircuit_val_ptr_ptr
* Pointer to storage for a oid variable
* @param dot1dBasePortCircuit_val_ptr_len_ptr
* Pointer to a size_t. On entry, it will contain the size (in bytes)
* pointed to by dot1dBasePortCircuit.
* On exit, this value should contain the data size (in bytes).
*
* @retval MFD_SUCCESS : success
* @retval MFD_SKIP : skip this node (no value for now)
* @retval MFD_ERROR : Any other error
*
* @note If you need more than (*dot1dBasePortCircuit_val_ptr_len_ptr) bytes of memory,
* allocate it using malloc() and update dot1dBasePortCircuit_val_ptr_ptr.
* <b>DO NOT</b> free the previous pointer.
* The MFD helper will release the memory you allocate.
*
* @remark If you call this function yourself, you are responsible
* for checking if the pointer changed, and freeing any
* previously allocated memory. (Not necessary if you pass
* in a pointer to static memory, obviously.)
*/
int
dot1dBasePortCircuit_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, oid **dot1dBasePortCircuit_val_ptr_ptr, size_t *dot1dBasePortCircuit_val_ptr_len_ptr )
{
/** we should have a non-NULL pointer and enough storage */
netsnmp_assert( (NULL != dot1dBasePortCircuit_val_ptr_ptr) && (NULL != *dot1dBasePortCircuit_val_ptr_ptr));
netsnmp_assert( NULL != dot1dBasePortCircuit_val_ptr_len_ptr );
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortCircuit_get","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:231:o: |-> Extract the current value of the dot1dBasePortCircuit data.
* copy (* dot1dBasePortCircuit_val_ptr_ptr ) data and (* dot1dBasePortCircuit_val_ptr_len_ptr ) from rowreq_ctx->data
*/
/*
* make sure there is enough space for dot1dBasePortCircuit data
*/
if ((NULL == (* dot1dBasePortCircuit_val_ptr_ptr )) ||
((* dot1dBasePortCircuit_val_ptr_len_ptr ) <
(rowreq_ctx->data.dot1dBasePortCircuit_len* sizeof(rowreq_ctx->data.dot1dBasePortCircuit[0])))) {
/*
* allocate space for dot1dBasePortCircuit data
*/
(* dot1dBasePortCircuit_val_ptr_ptr ) = malloc(rowreq_ctx->data.dot1dBasePortCircuit_len* sizeof(rowreq_ctx->data.dot1dBasePortCircuit[0]));
if(NULL == (* dot1dBasePortCircuit_val_ptr_ptr )) {
snmp_log(LOG_ERR,"could not allocate memory (rowreq_ctx->data.dot1dBasePortCircuit)\n");
return MFD_ERROR;
}
}
(* dot1dBasePortCircuit_val_ptr_len_ptr ) = rowreq_ctx->data.dot1dBasePortCircuit_len* sizeof(rowreq_ctx->data.dot1dBasePortCircuit[0]);
memcpy( (* dot1dBasePortCircuit_val_ptr_ptr ), rowreq_ctx->data.dot1dBasePortCircuit, rowreq_ctx->data.dot1dBasePortCircuit_len* sizeof(rowreq_ctx->data.dot1dBasePortCircuit[0]) );
return MFD_SUCCESS;
} /* dot1dBasePortCircuit_get */
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortDelayExceededDiscards
* dot1dBasePortDelayExceededDiscards is subid 4 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.4
* Description:
The number of frames discarded by this port due
to excessive transit delay through the bridge. It
is incremented by both transparent and source
route bridges.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is COUNTER (based on perltype COUNTER)
* The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
*/
/**
* Extract the current value of the dot1dBasePortDelayExceededDiscards data.
*
* Set a value using the data context for the row.
*
* @param rowreq_ctx
* Pointer to the row request context.
* @param dot1dBasePortDelayExceededDiscards_val_ptr
* Pointer to storage for a u_long variable
*
* @retval MFD_SUCCESS : success
* @retval MFD_SKIP : skip this node (no value for now)
* @retval MFD_ERROR : Any other error
*/
int
dot1dBasePortDelayExceededDiscards_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, u_long * dot1dBasePortDelayExceededDiscards_val_ptr )
{
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != dot1dBasePortDelayExceededDiscards_val_ptr );
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortDelayExceededDiscards_get","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:231:o: |-> Extract the current value of the dot1dBasePortDelayExceededDiscards data.
* copy (* dot1dBasePortDelayExceededDiscards_val_ptr ) from rowreq_ctx->data
*/
(* dot1dBasePortDelayExceededDiscards_val_ptr ) = rowreq_ctx->data.dot1dBasePortDelayExceededDiscards;
return MFD_SUCCESS;
} /* dot1dBasePortDelayExceededDiscards_get */
/*---------------------------------------------------------------------
* BRIDGE-MIB::dot1dBasePortEntry.dot1dBasePortMtuExceededDiscards
* dot1dBasePortMtuExceededDiscards is subid 5 of dot1dBasePortEntry.
* Its status is Current, and its access level is ReadOnly.
* OID: .1.3.6.1.2.1.17.1.4.1.5
* Description:
The number of frames discarded by this port due
to an excessive size. It is incremented by both
transparent and source route bridges.
*
* Attributes:
* accessible 1 isscalar 0 enums 0 hasdefval 0
* readable 1 iscolumn 1 ranges 0 hashint 0
* settable 0
*
*
* Its syntax is COUNTER (based on perltype COUNTER)
* The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
*/
/**
* Extract the current value of the dot1dBasePortMtuExceededDiscards data.
*
* Set a value using the data context for the row.
*
* @param rowreq_ctx
* Pointer to the row request context.
* @param dot1dBasePortMtuExceededDiscards_val_ptr
* Pointer to storage for a u_long variable
*
* @retval MFD_SUCCESS : success
* @retval MFD_SKIP : skip this node (no value for now)
* @retval MFD_ERROR : Any other error
*/
int
dot1dBasePortMtuExceededDiscards_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, u_long * dot1dBasePortMtuExceededDiscards_val_ptr )
{
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != dot1dBasePortMtuExceededDiscards_val_ptr );
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortMtuExceededDiscards_get","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
/*
* TODO:231:o: |-> Extract the current value of the dot1dBasePortMtuExceededDiscards data.
* copy (* dot1dBasePortMtuExceededDiscards_val_ptr ) from rowreq_ctx->data
*/
(* dot1dBasePortMtuExceededDiscards_val_ptr ) = rowreq_ctx->data.dot1dBasePortMtuExceededDiscards;
return MFD_SUCCESS;
} /* dot1dBasePortMtuExceededDiscards_get */
/** @} */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*
* @file dot1dBasePortTable_data_get.h
*
* @addtogroup get
*
* Prototypes for get functions
*
* @{
*/
#ifndef DOT1DBASEPORTTABLE_DATA_GET_H
#define DOT1DBASEPORTTABLE_DATA_GET_H
#ifdef __cplusplus
extern "C" {
#endif
/* *********************************************************************
* GET function declarations
*/
/* *********************************************************************
* GET Table declarations
*/
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
/*
* indexes
*/
int dot1dBasePortIfIndex_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, long * dot1dBasePortIfIndex_val_ptr );
int dot1dBasePortCircuit_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, oid **dot1dBasePortCircuit_val_ptr_ptr, size_t *dot1dBasePortCircuit_val_ptr_len_ptr );
int dot1dBasePortDelayExceededDiscards_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, u_long * dot1dBasePortDelayExceededDiscards_val_ptr );
int dot1dBasePortMtuExceededDiscards_get( dot1dBasePortTable_rowreq_ctx *rowreq_ctx, u_long * dot1dBasePortMtuExceededDiscards_val_ptr );
int dot1dBasePortTable_indexes_set_tbl_idx(dot1dBasePortTable_mib_index *tbl_idx, long dot1dBasePort_val);
int dot1dBasePortTable_indexes_set(dot1dBasePortTable_rowreq_ctx *rowreq_ctx, long dot1dBasePort_val);
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_DATA_GET_H */
/** @} */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
/** @defgroup data_set data_set: Routines to set data
*
* These routines are used to set the value for individual objects. The
* row context is passed, along with the new value.
*
* @{
*/
/** @} */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
#ifndef DOT1DBASEPORTTABLE_DATA_SET_H
#define DOT1DBASEPORTTABLE_DATA_SET_H
#ifdef __cplusplus
extern "C" {
#endif
/* *********************************************************************
* SET function declarations
*/
/* *********************************************************************
* SET Table declarations
*/
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_DATA_SET_H */
/*
* Note: this file originally auto-generated by mib2c using
* $
*
* $Id:$
*/
#ifndef DOT1DBASEPORTTABLE_ENUMS_H
#define DOT1DBASEPORTTABLE_ENUMS_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* NOTES on enums
* ==============
*
* Value Mapping
* -------------
* If the values for your data type don't exactly match the
* possible values defined by the mib, you should map them
* below. For example, a boolean flag (1/0) is usually represented
* as a TruthValue in a MIB, which maps to the values (1/2).
*
*/
/*************************************************************************
*************************************************************************
*
* enum definitions for table dot1dBasePortTable
*
*************************************************************************
*************************************************************************/
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_ENUMS_H */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
/*
* *********************************************************************
* *********************************************************************
* *********************************************************************
* *** ***
* *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
* *** ***
* *** ***
* *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
* *** ***
* *** ***
* *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
* *** ***
* *** ***
* *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
* *** ***
* *** ***
* *********************************************************************
* *********************************************************************
* *********************************************************************
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
#include <net-snmp/agent/table_container.h>
#include <net-snmp/library/container.h>
#include "dot1dBasePortTable_interface.h"
netsnmp_feature_require(baby_steps)
netsnmp_feature_require(row_merge)
netsnmp_feature_require(check_all_requests_error)
#include <ctype.h>
/**********************************************************************
**********************************************************************
***
*** Table dot1dBasePortTable
***
**********************************************************************
**********************************************************************/
/*
* BRIDGE-MIB::dot1dBasePortTable is subid 4 of dot1dBase.
* Its status is Current.
* OID: .1.3.6.1.2.1.17.1.4, length: 9
*/
typedef struct dot1dBasePortTable_interface_ctx_s {
netsnmp_container *container;
dot1dBasePortTable_registration * user_ctx;
netsnmp_table_registration_info tbl_info;
netsnmp_baby_steps_access_methods access_multiplexer;
} dot1dBasePortTable_interface_ctx;
static dot1dBasePortTable_interface_ctx dot1dBasePortTable_if_ctx;
static void _dot1dBasePortTable_container_init(
dot1dBasePortTable_interface_ctx *if_ctx);
static void _dot1dBasePortTable_container_shutdown(
dot1dBasePortTable_interface_ctx *if_ctx);
netsnmp_container *
dot1dBasePortTable_container_get( void )
{
return dot1dBasePortTable_if_ctx.container;
}
dot1dBasePortTable_registration *
dot1dBasePortTable_registration_get( void )
{
return dot1dBasePortTable_if_ctx.user_ctx;
}
dot1dBasePortTable_registration *
dot1dBasePortTable_registration_set( dot1dBasePortTable_registration * newreg )
{
dot1dBasePortTable_registration * old = dot1dBasePortTable_if_ctx.user_ctx;
dot1dBasePortTable_if_ctx.user_ctx = newreg;
return old;
}
int
dot1dBasePortTable_container_size( void )
{
return CONTAINER_SIZE(dot1dBasePortTable_if_ctx.container);
}
/*
* mfd multiplexer modes
*/
static Netsnmp_Node_Handler _mfd_dot1dBasePortTable_pre_request;
static Netsnmp_Node_Handler _mfd_dot1dBasePortTable_post_request;
static Netsnmp_Node_Handler _mfd_dot1dBasePortTable_object_lookup;
static Netsnmp_Node_Handler _mfd_dot1dBasePortTable_get_values;
/**
* @internal
* Initialize the table dot1dBasePortTable
* (Define its contents and how it's structured)
*/
void
_dot1dBasePortTable_initialize_interface(dot1dBasePortTable_registration * reg_ptr, u_long flags)
{
netsnmp_baby_steps_access_methods *access_multiplexer =
&dot1dBasePortTable_if_ctx.access_multiplexer;
netsnmp_table_registration_info *tbl_info = &dot1dBasePortTable_if_ctx.tbl_info;
netsnmp_handler_registration *reginfo;
netsnmp_mib_handler *handler;
int mfd_modes = 0;
DEBUGMSGTL(("internal:dot1dBasePortTable:_dot1dBasePortTable_initialize_interface","called\n"));
/*************************************************
*
* save interface context for dot1dBasePortTable
*/
/*
* Setting up the table's definition
*/
netsnmp_table_helper_add_indexes(tbl_info,
ASN_INTEGER, /** index: dot1dBasePort */
0);
/* Define the minimum and maximum accessible columns. This
optimizes retrieval. */
tbl_info->min_column = DOT1DBASEPORTTABLE_MIN_COL;
tbl_info->max_column = DOT1DBASEPORTTABLE_MAX_COL;
/*
* save users context
*/
dot1dBasePortTable_if_ctx.user_ctx = reg_ptr;
/*
* call data access initialization code
*/
dot1dBasePortTable_init_data(reg_ptr);
/*
* set up the container
*/
_dot1dBasePortTable_container_init(&dot1dBasePortTable_if_ctx);
if (NULL == dot1dBasePortTable_if_ctx.container) {
snmp_log(LOG_ERR,"could not initialize container for dot1dBasePortTable\n");
return;
}
/*
* access_multiplexer: REQUIRED wrapper for get request handling
*/
access_multiplexer->object_lookup = _mfd_dot1dBasePortTable_object_lookup;
access_multiplexer->get_values = _mfd_dot1dBasePortTable_get_values;
/*
* no wrappers yet
*/
access_multiplexer->pre_request = _mfd_dot1dBasePortTable_pre_request;
access_multiplexer->post_request = _mfd_dot1dBasePortTable_post_request;
#ifndef NETSNMP_DISABLE_SET_SUPPORT
#endif
/*************************************************
*
* Create a registration, save our reg data, register table.
*/
DEBUGMSGTL(("dot1dBasePortTable:init_dot1dBasePortTable",
"Registering dot1dBasePortTable as a mibs-for-dummies table.\n"));
handler = netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
reginfo = netsnmp_handler_registration_create("dot1dBasePortTable", handler,
dot1dBasePortTable_oid,
dot1dBasePortTable_oid_size,
HANDLER_CAN_BABY_STEP |
#if !(defined(NETSNMP_NO_WRITE_SUPPORT) || defined(NETSNMP_DISABLE_SET_SUPPORT))
HANDLER_CAN_RONLY
#else
HANDLER_CAN_RONLY
#endif /* NETSNMP_NO_WRITE_SUPPORT || NETSNMP_DISABLE_SET_SUPPORT */
);
if(NULL == reginfo) {
snmp_log(LOG_ERR,"error registering table dot1dBasePortTable\n");
return;
}
reginfo->my_reg_void = &dot1dBasePortTable_if_ctx;
/*************************************************
*
* set up baby steps handler, create it and inject it
*/
if( access_multiplexer->object_lookup )
mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
if( access_multiplexer->pre_request )
mfd_modes |= BABY_STEP_PRE_REQUEST;
if( access_multiplexer->post_request )
mfd_modes |= BABY_STEP_POST_REQUEST;
#if !(defined(NETSNMP_NO_WRITE_SUPPORT) || defined(NETSNMP_DISABLE_SET_SUPPORT))
if( access_multiplexer->set_values )
mfd_modes |= BABY_STEP_SET_VALUES;
if( access_multiplexer->irreversible_commit )
mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
if( access_multiplexer->object_syntax_checks )
mfd_modes |= BABY_STEP_CHECK_OBJECT;
if( access_multiplexer->undo_setup )
mfd_modes |= BABY_STEP_UNDO_SETUP;
if( access_multiplexer->undo_cleanup )
mfd_modes |= BABY_STEP_UNDO_CLEANUP;
if( access_multiplexer->undo_sets )
mfd_modes |= BABY_STEP_UNDO_SETS;
if( access_multiplexer->row_creation )
mfd_modes |= BABY_STEP_ROW_CREATE;
if( access_multiplexer->consistency_checks )
mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
if( access_multiplexer->commit )
mfd_modes |= BABY_STEP_COMMIT;
if( access_multiplexer->undo_commit )
mfd_modes |= BABY_STEP_UNDO_COMMIT;
#endif /* NETSNMP_NO_WRITE_SUPPORT || NETSNMP_DISABLE_SET_SUPPORT */
handler = netsnmp_baby_steps_handler_get(mfd_modes);
netsnmp_inject_handler(reginfo, handler);
/*************************************************
*
* inject row_merge helper with prefix rootoid_len + 2 (entry.col)
*/
handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
netsnmp_inject_handler(reginfo, handler);
/*************************************************
*
* inject container_table helper
*/
handler =
netsnmp_container_table_handler_get(tbl_info,
dot1dBasePortTable_if_ctx.container,
TABLE_CONTAINER_KEY_NETSNMP_INDEX);
netsnmp_inject_handler( reginfo, handler );
/*
* register table
*/
netsnmp_register_table(reginfo, tbl_info);
} /* _dot1dBasePortTable_initialize_interface */
/**
* @internal
* Shutdown the table dot1dBasePortTable
*/
void
_dot1dBasePortTable_shutdown_interface(dot1dBasePortTable_registration * reg_ptr)
{
/*
* shutdown the container
*/
_dot1dBasePortTable_container_shutdown(&dot1dBasePortTable_if_ctx);
}
void
dot1dBasePortTable_valid_columns_set(netsnmp_column_info *vc)
{
dot1dBasePortTable_if_ctx.tbl_info.valid_columns = vc;
} /* dot1dBasePortTable_valid_columns_set */
/**
* @internal
* convert the index component stored in the context to an oid
*/
int
dot1dBasePortTable_index_to_oid(netsnmp_index *oid_idx,
dot1dBasePortTable_mib_index *mib_idx)
{
int err = SNMP_ERR_NOERROR;
/*
* temp storage for parsing indexes
*/
/*
* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h
*/
netsnmp_variable_list var_dot1dBasePort;
/*
* set up varbinds
*/
memset( &var_dot1dBasePort, 0x00, sizeof(var_dot1dBasePort) );
var_dot1dBasePort.type = ASN_INTEGER;
/*
* chain temp index varbinds together
*/
var_dot1dBasePort.next_variable = NULL;
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_index_to_oid","called\n"));
/* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h */
snmp_set_var_value(&var_dot1dBasePort, &mib_idx->dot1dBasePort, sizeof(mib_idx->dot1dBasePort));
err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
NULL, 0, &var_dot1dBasePort);
if(err)
snmp_log(LOG_ERR,"error %d converting index to oid\n", err);
/*
* parsing may have allocated memory. free it.
*/
snmp_reset_var_buffers( &var_dot1dBasePort );
return err;
} /* dot1dBasePortTable_index_to_oid */
/**
* extract dot1dBasePortTable indexes from a netsnmp_index
*
* @retval SNMP_ERR_NOERROR : no error
* @retval SNMP_ERR_GENERR : error
*/
int
dot1dBasePortTable_index_from_oid(netsnmp_index *oid_idx,
dot1dBasePortTable_mib_index *mib_idx)
{
int err = SNMP_ERR_NOERROR;
/*
* temp storage for parsing indexes
*/
/*
* dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h
*/
netsnmp_variable_list var_dot1dBasePort;
/*
* set up varbinds
*/
memset( &var_dot1dBasePort, 0x00, sizeof(var_dot1dBasePort) );
var_dot1dBasePort.type = ASN_INTEGER;
/*
* chain temp index varbinds together
*/
var_dot1dBasePort.next_variable = NULL;
DEBUGMSGTL(("verbose:dot1dBasePortTable:dot1dBasePortTable_index_from_oid","called\n"));
/*
* parse the oid into the individual index components
*/
err = parse_oid_indexes( oid_idx->oids, oid_idx->len,
&var_dot1dBasePort );
if (err == SNMP_ERR_NOERROR) {
/*
* copy out values
*/
mib_idx->dot1dBasePort = *((long *)var_dot1dBasePort.val.string);
}
/*
* parsing may have allocated memory. free it.
*/
snmp_reset_var_buffers( &var_dot1dBasePort );
return err;
} /* dot1dBasePortTable_index_from_oid */
/* *********************************************************************
* @internal
* allocate resources for a dot1dBasePortTable_rowreq_ctx
*/
dot1dBasePortTable_rowreq_ctx *
dot1dBasePortTable_allocate_rowreq_ctx(void *user_init_ctx)
{
dot1dBasePortTable_rowreq_ctx *rowreq_ctx =
SNMP_MALLOC_TYPEDEF(dot1dBasePortTable_rowreq_ctx);
DEBUGMSGTL(("internal:dot1dBasePortTable:dot1dBasePortTable_allocate_rowreq_ctx","called\n"));
if(NULL == rowreq_ctx) {
snmp_log(LOG_ERR,"Couldn't allocate memory for a "
"dot1dBasePortTable_rowreq_ctx.\n");
return NULL;
}
rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
rowreq_ctx->dot1dBasePortTable_data_list = NULL;
/*
* if we allocated data, call init routine
*/
if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
if(SNMPERR_SUCCESS !=
dot1dBasePortTable_rowreq_ctx_init(rowreq_ctx, user_init_ctx)) {
dot1dBasePortTable_release_rowreq_ctx(rowreq_ctx);
rowreq_ctx = NULL;
}
}
return rowreq_ctx;
} /* dot1dBasePortTable_allocate_rowreq_ctx */
/*
* @internal
* release resources for a dot1dBasePortTable_rowreq_ctx
*/
void
dot1dBasePortTable_release_rowreq_ctx(dot1dBasePortTable_rowreq_ctx *rowreq_ctx)
{
DEBUGMSGTL(("internal:dot1dBasePortTable:dot1dBasePortTable_release_rowreq_ctx","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
dot1dBasePortTable_rowreq_ctx_cleanup(rowreq_ctx);
/*
* free index oid pointer
*/
if(rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
free(rowreq_ctx->oid_idx.oids);
SNMP_FREE(rowreq_ctx);
} /* dot1dBasePortTable_release_rowreq_ctx */
/**
* @internal
* wrapper
*/
static int
_mfd_dot1dBasePortTable_pre_request(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *agtreq_info,
netsnmp_request_info *requests)
{
int rc;
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_pre_request",
"called\n"));
if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
DEBUGMSGTL(("internal:dot1dBasePortTable",
"skipping additional pre_request\n"));
return SNMP_ERR_NOERROR;
}
rc = dot1dBasePortTable_pre_request(dot1dBasePortTable_if_ctx.user_ctx);
if (MFD_SUCCESS != rc) {
/*
* nothing we can do about it but log it
*/
DEBUGMSGTL(("dot1dBasePortTable","error %d from "
"dot1dBasePortTable_pre_request\n", rc));
netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
}
return SNMP_ERR_NOERROR;
} /* _mfd_dot1dBasePortTable_pre_request */
/**
* @internal
* wrapper
*/
static int
_mfd_dot1dBasePortTable_post_request(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *agtreq_info,
netsnmp_request_info *requests)
{
dot1dBasePortTable_rowreq_ctx *rowreq_ctx = (dot1dBasePortTable_rowreq_ctx*)
netsnmp_container_table_row_extract(requests);
int rc, packet_rc;
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_post_request",
"called\n"));
/*
* release row context, if deleted
*/
if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
dot1dBasePortTable_release_rowreq_ctx(rowreq_ctx);
/*
* wait for last call before calling user
*/
if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
DEBUGMSGTL(("internal:dot1dBasePortTable",
"waiting for last post_request\n"));
return SNMP_ERR_NOERROR;
}
packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
rc = dot1dBasePortTable_post_request(dot1dBasePortTable_if_ctx.user_ctx,packet_rc);
if (MFD_SUCCESS != rc) {
/*
* nothing we can do about it but log it
*/
DEBUGMSGTL(("dot1dBasePortTable","error %d from "
"dot1dBasePortTable_post_request\n", rc));
}
return SNMP_ERR_NOERROR;
} /* _mfd_dot1dBasePortTable_post_request */
/**
* @internal
* wrapper
*/
static int
_mfd_dot1dBasePortTable_object_lookup(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *agtreq_info,
netsnmp_request_info *requests)
{
int rc = SNMP_ERR_NOERROR;
dot1dBasePortTable_rowreq_ctx *rowreq_ctx = (dot1dBasePortTable_rowreq_ctx*)
netsnmp_container_table_row_extract(requests);
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_object_lookup","called\n"));
/*
* get our context from mfd
* dot1dBasePortTable_interface_ctx *if_ctx =
* (dot1dBasePortTable_interface_ctx *)reginfo->my_reg_void;
*/
if(NULL == rowreq_ctx) {
rc = SNMP_ERR_NOCREATION;
}
if (MFD_SUCCESS != rc)
netsnmp_request_set_error_all(requests, rc);
else
dot1dBasePortTable_row_prep(rowreq_ctx);
return SNMP_VALIDATE_ERR(rc);
} /* _mfd_dot1dBasePortTable_object_lookup */
/***********************************************************************
*
* GET processing
*
***********************************************************************/
/*
* @internal
* Retrieve the value for a particular column
*/
NETSNMP_STATIC_INLINE int
_dot1dBasePortTable_get_column( dot1dBasePortTable_rowreq_ctx *rowreq_ctx,
netsnmp_variable_list *var, int column )
{
int rc = SNMPERR_SUCCESS;
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_get_column",
"called for %d\n", column));
netsnmp_assert(NULL != rowreq_ctx);
switch(column) {
/* (INDEX) dot1dBasePort(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h */
case COLUMN_DOT1DBASEPORT:
var->type = ASN_INTEGER;
var->val_len = sizeof(long);
(*var->val.integer) = rowreq_ctx->tbl_idx.dot1dBasePort;
break;
/* dot1dBasePortIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H */
case COLUMN_DOT1DBASEPORTIFINDEX:
var->val_len = sizeof(long);
var->type = ASN_INTEGER;
rc = dot1dBasePortIfIndex_get(rowreq_ctx, (long *)var->val.string );
break;
/* dot1dBasePortCircuit(3)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h */
case COLUMN_DOT1DBASEPORTCIRCUIT:
var->type = ASN_OBJECT_ID;
rc = dot1dBasePortCircuit_get(rowreq_ctx, (oid **)&var->val.string, &var->val_len );
break;
/* dot1dBasePortDelayExceededDiscards(4)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h */
case COLUMN_DOT1DBASEPORTDELAYEXCEEDEDDISCARDS:
var->val_len = sizeof(u_long);
var->type = ASN_COUNTER;
rc = dot1dBasePortDelayExceededDiscards_get(rowreq_ctx, (u_long *)var->val.string );
break;
/* dot1dBasePortMtuExceededDiscards(5)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h */
case COLUMN_DOT1DBASEPORTMTUEXCEEDEDDISCARDS:
var->val_len = sizeof(u_long);
var->type = ASN_COUNTER;
rc = dot1dBasePortMtuExceededDiscards_get(rowreq_ctx, (u_long *)var->val.string );
break;
default:
if (DOT1DBASEPORTTABLE_MIN_COL <= column && column <= DOT1DBASEPORTTABLE_MAX_COL) {
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_get_column",
"assume column %d is reserved\n", column));
rc = MFD_SKIP;
} else {
snmp_log(LOG_ERR,
"unknown column %d in _dot1dBasePortTable_get_column\n", column);
}
break;
}
return rc;
} /* _dot1dBasePortTable_get_column */
int
_mfd_dot1dBasePortTable_get_values(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *agtreq_info,
netsnmp_request_info *requests)
{
dot1dBasePortTable_rowreq_ctx *rowreq_ctx = (dot1dBasePortTable_rowreq_ctx*)
netsnmp_container_table_row_extract(requests);
netsnmp_table_request_info * tri;
u_char * old_string;
void (*dataFreeHook)(void *);
int rc;
DEBUGMSGTL(("internal:dot1dBasePortTable:_mfd_dot1dBasePortTable_get_values","called\n"));
netsnmp_assert(NULL != rowreq_ctx);
for(;requests; requests = requests->next) {
/*
* save old pointer, so we can free it if replaced
*/
old_string = requests->requestvb->val.string;
dataFreeHook = requests->requestvb->dataFreeHook;
if(NULL == requests->requestvb->val.string) {
requests->requestvb->val.string = requests->requestvb->buf;
requests->requestvb->val_len = sizeof(requests->requestvb->buf);
}
else if(requests->requestvb->buf == requests->requestvb->val.string) {
if(requests->requestvb->val_len != sizeof(requests->requestvb->buf))
requests->requestvb->val_len = sizeof(requests->requestvb->buf);
}
/*
* get column data
*/
tri = netsnmp_extract_table_info(requests);
if(NULL == tri)
continue;
rc = _dot1dBasePortTable_get_column(rowreq_ctx, requests->requestvb, tri->colnum);
if(rc) {
if(MFD_SKIP == rc) {
requests->requestvb->type = SNMP_NOSUCHINSTANCE;
rc = SNMP_ERR_NOERROR;
}
}
else if (NULL == requests->requestvb->val.string) {
snmp_log(LOG_ERR,"NULL varbind data pointer!\n");
rc = SNMP_ERR_GENERR;
}
if(rc)
netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
/*
* if the buffer wasn't used previously for the old data (i.e. it
* was allcoated memory) and the get routine replaced the pointer,
* we need to free the previous pointer.
*/
if(old_string && (old_string != requests->requestvb->buf) &&
(requests->requestvb->val.string != old_string)) {
if(dataFreeHook)
(*dataFreeHook)(old_string);
else
free(old_string);
}
} /* for results */
return SNMP_ERR_NOERROR;
} /* _mfd_dot1dBasePortTable_get_values */
/***********************************************************************
*
* SET processing
*
***********************************************************************/
/*
* SET PROCESSING NOT APPLICABLE (per MIB or user setting)
*/
/***********************************************************************
*
* DATA ACCESS
*
***********************************************************************/
/**
* @internal
*/
static void
_container_item_free(dot1dBasePortTable_rowreq_ctx *rowreq_ctx, void *context)
{
DEBUGMSGTL(("internal:dot1dBasePortTable:_container_item_free","called\n"));
if(NULL == rowreq_ctx)
return;
dot1dBasePortTable_release_rowreq_ctx(rowreq_ctx);
} /* _container_item_free */
/**
* @internal
*/
static void
_container_free(netsnmp_container *container)
{
DEBUGMSGTL(("internal:dot1dBasePortTable:_container_free","called\n"));
if (NULL == container) {
snmp_log(LOG_ERR, "invalid container in dot1dBasePortTable_container_free\n");
return;
}
/*
* call user code
*/
dot1dBasePortTable_container_free(container);
/*
* free all items. inefficient, but easy.
*/
CONTAINER_CLEAR(container,
(netsnmp_container_obj_func *)_container_item_free,
NULL);
} /* _container_free */
/**
* @internal
* initialize the container with functions or wrappers
*/
void
_dot1dBasePortTable_container_init(dot1dBasePortTable_interface_ctx *if_ctx)
{
DEBUGMSGTL(("internal:dot1dBasePortTable:_dot1dBasePortTable_container_init","called\n"));
/*
* container init
*/
dot1dBasePortTable_container_init(&if_ctx->container);
if(NULL == if_ctx->container)
if_ctx->container = netsnmp_container_find("dot1dBasePortTable:table_container");
if(NULL == if_ctx->container) {
snmp_log(LOG_ERR,"error creating container in "
"dot1dBasePortTable_container_init\n");
return;
}
} /* _dot1dBasePortTable_container_init */
/**
* @internal
* shutdown the container with functions or wrappers
*/
void
_dot1dBasePortTable_container_shutdown(dot1dBasePortTable_interface_ctx *if_ctx)
{
DEBUGMSGTL(("internal:dot1dBasePortTable:_dot1dBasePortTable_container_shutdown","called\n"));
dot1dBasePortTable_container_shutdown(if_ctx->container);
_container_free(if_ctx->container);
} /* _dot1dBasePortTable_container_shutdown */
dot1dBasePortTable_rowreq_ctx *
dot1dBasePortTable_row_find_by_mib_index(dot1dBasePortTable_mib_index *mib_idx)
{
dot1dBasePortTable_rowreq_ctx *rowreq_ctx;
oid oid_tmp[MAX_OID_LEN];
netsnmp_index oid_idx;
int rc;
/*
* set up storage for OID
*/
oid_idx.oids = oid_tmp;
oid_idx.len = sizeof(oid_tmp)/sizeof(oid);
/*
* convert
*/
rc = dot1dBasePortTable_index_to_oid(&oid_idx, mib_idx);
if (MFD_SUCCESS != rc)
return NULL;
rowreq_ctx = (dot1dBasePortTable_rowreq_ctx*)CONTAINER_FIND(dot1dBasePortTable_if_ctx.container, &oid_idx);
return rowreq_ctx;
}
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*
* $Id:$
*/
/** @ingroup interface: Routines to interface to Net-SNMP
*
* \warning This code should not be modified, called directly,
* or used to interpret functionality. It is subject to
* change at any time.
*
* @{
*/
/*
* *********************************************************************
* *********************************************************************
* *********************************************************************
* *** ***
* *** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
* *** ***
* *** ***
* *** THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE. ***
* *** ***
* *** ***
* *** THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND ***
* *** ***
* *** ***
* *** IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES. ***
* *** ***
* *** ***
* *********************************************************************
* *********************************************************************
* *********************************************************************
*/
#ifndef DOT1DBASEPORTTABLE_INTERFACE_H
#define DOT1DBASEPORTTABLE_INTERFACE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "dot1dBasePortTable.h"
/* ********************************************************************
* Table declarations
*/
/* PUBLIC interface initialization routine */
void _dot1dBasePortTable_initialize_interface(dot1dBasePortTable_registration * user_ctx,
u_long flags);
void _dot1dBasePortTable_shutdown_interface(dot1dBasePortTable_registration * user_ctx);
dot1dBasePortTable_registration *
dot1dBasePortTable_registration_get( void );
dot1dBasePortTable_registration *
dot1dBasePortTable_registration_set( dot1dBasePortTable_registration * newreg );
netsnmp_container *dot1dBasePortTable_container_get( void );
int dot1dBasePortTable_container_size( void );
dot1dBasePortTable_rowreq_ctx * dot1dBasePortTable_allocate_rowreq_ctx(void *);
void dot1dBasePortTable_release_rowreq_ctx(dot1dBasePortTable_rowreq_ctx *rowreq_ctx);
int dot1dBasePortTable_index_to_oid(netsnmp_index *oid_idx,
dot1dBasePortTable_mib_index *mib_idx);
int dot1dBasePortTable_index_from_oid(netsnmp_index *oid_idx,
dot1dBasePortTable_mib_index *mib_idx);
/*
* access to certain internals. use with caution!
*/
void dot1dBasePortTable_valid_columns_set(netsnmp_column_info *vc);
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_INTERFACE_H */
/** @} */
/*
* Note: this file originally auto-generated by mib2c using
* $
*
* $Id:$
*/
#ifndef DOT1DBASEPORTTABLE_OIDS_H
#define DOT1DBASEPORTTABLE_OIDS_H
#ifdef __cplusplus
extern "C" {
#endif
/* column number definitions for table dot1dBasePortTable */
#define DOT1DBASEPORTTABLE_OID 1,3,6,1,2,1,17,1,4
#define COLUMN_DOT1DBASEPORT 1
#define COLUMN_DOT1DBASEPORTIFINDEX 2
#define COLUMN_DOT1DBASEPORTCIRCUIT 3
#define COLUMN_DOT1DBASEPORTDELAYEXCEEDEDDISCARDS 4
#define COLUMN_DOT1DBASEPORTMTUEXCEEDEDDISCARDS 5
#define DOT1DBASEPORTTABLE_MIN_COL COLUMN_DOT1DBASEPORT
#define DOT1DBASEPORTTABLE_MAX_COL COLUMN_DOT1DBASEPORTMTUEXCEEDEDDISCARDS
#ifdef __cplusplus
}
#endif
#endif /* DOT1DBASEPORTTABLE_OIDS_H */
/*
* Note: this file originally auto-generated by mib2c using
* version $ of $
*/
/* standard Net-SNMP includes */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
/* include our parent header */
#include "dot1dBasePortTable.h"
#include <signal.h>
/*
* If compiling within the net-snmp source code, this will trigger the feature
* detection mechansim to ensure the agent_check_and_process() function
* is left available even if --enable-minimialist is turned on. If you
* have configured net-snmp using --enable-minimialist and want to compile
* this code externally to the Net-SNMP code base, then please add
* --with-features="agent_check_and_process enable_stderrlog" to your
* configure line.
*/
netsnmp_feature_require(agent_check_and_process)
netsnmp_feature_require(enable_stderrlog)
static int keep_running;
static RETSIGTYPE
stop_server(int a) {
keep_running = 0;
}
static void usage(void) {
printf("usage: dot1dBasePortTable [-D<tokens>] [-f] [-L] [-M] [-H] [LISTENING ADDRESSES]\n"
"\t-f Do not fork() from the calling shell.\n"
"\t-DTOKEN[,TOKEN,...]\n"
"\t\tTurn on debugging output for the given TOKEN(s).\n"
"\t\tWithout any tokens specified, it defaults to printing\n"
"\t\tall the tokens (which is equivalent to the keyword 'ALL').\n"
"\t\tYou might want to try ALL for extremely verbose output.\n"
"\t\tNote: You can't put a space between the -D and the TOKENs.\n"
"\t-H\tDisplay a list of configuration file directives\n"
"\t\tunderstood by the agent and then exit.\n"
"\t-M\tRun as a normal SNMP Agent instead of an AgentX sub-agent.\n"
"\t-x ADDRESS\tconnect to master agent at ADDRESS (default /var/agentx/master).\n"
"\t-L\tDo not open a log file; print all messages to stderr.\n");
exit(0);
}
int
main (int argc, char **argv) {
int agentx_subagent=1; /* change this if you want to be a SNMP master agent */
/* Defs for arg-handling code: handles setting of policy-related variables */
int ch;
extern char *optarg;
int dont_fork = 0, use_syslog = 0;
char *agentx_socket = NULL;
while ((ch = getopt(argc, argv, "D:fHLMx:")) != EOF)
switch(ch) {
case 'D':
debug_register_tokens(optarg);
snmp_set_do_debugging(1);
break;
case 'f':
dont_fork = 1;
break;
case 'H':
netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1);
init_agent("dot1dBasePortTable"); /* register our .conf handlers */
init_dot1dBasePortTable();
init_snmp("dot1dBasePortTable");
fprintf(stderr, "Configuration directives understood:\n");
read_config_print_usage(" ");
exit(0);
case 'M':
agentx_subagent = 0;
break;
case 'L':
use_syslog = 0; /* use stderr */
break;
case 'x':
agentx_socket = optarg;
break;
default:
fprintf(stderr,"unknown option %c\n", ch);
usage();
}
if (optind < argc) {
int i;
/*
* There are optional transport addresses on the command line.
*/
DEBUGMSGTL(("snmpd/main", "optind %d, argc %d\n", optind, argc));
for (i = optind; i < argc; i++) {
char *c, *astring;
if ((c = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS))) {
astring = malloc(strlen(c) + 2 + strlen(argv[i]));
if (astring == NULL) {
fprintf(stderr, "malloc failure processing argv[%d]\n", i);
exit(1);
}
sprintf(astring, "%s,%s", c, argv[i]);
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS, astring);
SNMP_FREE(astring);
} else {
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS, argv[i]);
}
}
DEBUGMSGTL(("snmpd/main", "port spec: %s\n",
netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_PORTS)));
}
/* we're an agentx subagent? */
if (agentx_subagent) {
/* make us a agentx client. */
netsnmp_enable_subagent();
if (NULL != agentx_socket)
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_X_SOCKET, agentx_socket);
}
snmp_disable_log();
if (use_syslog)
snmp_enable_calllog();
else
snmp_enable_stderrlog();
/* daemonize */
if(!dont_fork) {
int rc = netsnmp_daemonize(1,!use_syslog);
if(rc)
exit(-1);
}
/* initialize tcp/ip if necessary */
SOCK_STARTUP;
/* initialize the agent library */
init_agent("dot1dBasePortTable");
/* init dot1dBasePortTable mib code */
init_dot1dBasePortTable();
/* read dot1dBasePortTable.conf files. */
init_snmp("dot1dBasePortTable");
/* If we're going to be a snmp master agent, initial the ports */
if (!agentx_subagent)
init_master_agent(); /* open the port to listen on (defaults to udp:161) */
/* In case we recevie a request to stop (kill -TERM or kill -INT) */
keep_running = 1;
signal(SIGTERM, stop_server);
signal(SIGINT, stop_server);
/* you're main loop here... */
while(keep_running) {
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/* --- OR --- */
agent_check_and_process(1); /* 0 == don't block */
}
/* at shutdown time */
snmp_shutdown("dot1dBasePortTable");
SOCK_CLEANUP;
exit(0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment