From 50b95529b90d99fc65ba1593134a293bbc124fcf Mon Sep 17 00:00:00 2001 From: Michal Wasiak <michal.wasiak@gmail.com> Date: Thu, 8 Oct 2020 15:11:58 +0200 Subject: [PATCH] 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: Michal Wasiak <michal.wasiak@gmail.com> --- .../defaults/node-dot1dBasePort.m2d | 35 + .../defaults/node-dot1dBasePortCircuit.m2d | 43 + ...ode-dot1dBasePortDelayExceededDiscards.m2d | 35 + .../defaults/node-dot1dBasePortIfIndex.m2d | 35 + .../node-dot1dBasePortMtuExceededDiscards.m2d | 35 + .../defaults/table-dot1dBasePortTable.m2d | 103 +++ .../dot1dBasePortTable-README-FIRST.txt | 167 ++++ ...asePortTable-README-dot1dBasePortTable.txt | 542 ++++++++++++ .../dot1dBasePortTable/dot1dBasePortTable.c | 202 +++++ .../dot1dBasePortTable/dot1dBasePortTable.h | 201 +++++ .../dot1dBasePortTable_Makefile | 57 ++ .../dot1dBasePortTable_data_access.c | 355 ++++++++ .../dot1dBasePortTable_data_access.h | 66 ++ .../dot1dBasePortTable_data_get.c | 366 ++++++++ .../dot1dBasePortTable_data_get.h | 62 ++ .../dot1dBasePortTable_data_set.c | 25 + .../dot1dBasePortTable_data_set.h | 27 + .../dot1dBasePortTable_enums.h | 40 + .../dot1dBasePortTable_interface.c | 825 ++++++++++++++++++ .../dot1dBasePortTable_interface.h | 84 ++ .../dot1dBasePortTable_oids.h | 39 + .../dot1dBasePortTable_subagent.c | 177 ++++ 22 files changed, 3521 insertions(+) create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePort.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortCircuit.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortDelayExceededDiscards.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortIfIndex.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortMtuExceededDiscards.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/table-dot1dBasePortTable.m2d create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-FIRST.txt create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-dot1dBasePortTable.txt create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.c create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_Makefile create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.c create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.c create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.c create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_enums.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.c create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_oids.h create mode 100644 userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_subagent.c diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePort.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePort.m2d new file mode 100644 index 000000000..e358c5cb7 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePort.m2d @@ -0,0 +1,35 @@ +######################################################################## +## +## 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@ +## diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortCircuit.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortCircuit.m2d new file mode 100644 index 000000000..44e018889 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortCircuit.m2d @@ -0,0 +1,43 @@ +######################################################################## +## +## 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@ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortDelayExceededDiscards.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortDelayExceededDiscards.m2d new file mode 100644 index 000000000..1b74231c5 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortDelayExceededDiscards.m2d @@ -0,0 +1,35 @@ +######################################################################## +## +## 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@ +## diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortIfIndex.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortIfIndex.m2d new file mode 100644 index 000000000..25f0f98ca --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortIfIndex.m2d @@ -0,0 +1,35 @@ +######################################################################## +## +## 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@ +## diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortMtuExceededDiscards.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortMtuExceededDiscards.m2d new file mode 100644 index 000000000..f5a58797f --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/node-dot1dBasePortMtuExceededDiscards.m2d @@ -0,0 +1,35 @@ +######################################################################## +## +## 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@ +## diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/table-dot1dBasePortTable.m2d b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/table-dot1dBasePortTable.m2d new file mode 100644 index 000000000..f5104f9cc --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/defaults/table-dot1dBasePortTable.m2d @@ -0,0 +1,103 @@ +## ######################################################################## +## +## 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@ +## diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-FIRST.txt b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-FIRST.txt new file mode 100644 index 000000000..801e4df67 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-FIRST.txt @@ -0,0 +1,167 @@ +************************************************************************ +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. + diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-dot1dBasePortTable.txt b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-dot1dBasePortTable.txt new file mode 100644 index 000000000..fbde18d4b --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable-README-dot1dBasePortTable.txt @@ -0,0 +1,542 @@ +************************************************************************ +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) + */ + + diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.c new file mode 100644 index 000000000..88f1ca0fa --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.c @@ -0,0 +1,202 @@ +/* + * 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 */ + + +/** @{ */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.h new file mode 100644 index 000000000..c0531f54e --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable.h @@ -0,0 +1,201 @@ +/* + * 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 */ +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_Makefile b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_Makefile new file mode 100644 index 000000000..34aaf3940 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_Makefile @@ -0,0 +1,57 @@ + +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) + diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.c new file mode 100644 index 000000000..5aceecc0e --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.c @@ -0,0 +1,355 @@ +/* + * 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 */ + +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.h new file mode 100644 index 000000000..a775947ee --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_access.h @@ -0,0 +1,66 @@ +/* + * 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 */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.c new file mode 100644 index 000000000..6e8c65bcc --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.c @@ -0,0 +1,366 @@ +/* + * 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 */ + + + +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.h new file mode 100644 index 000000000..a266d51c5 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_get.h @@ -0,0 +1,62 @@ +/* + * 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 */ +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.c new file mode 100644 index 000000000..29e1d930f --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.c @@ -0,0 +1,25 @@ +/* + * 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. + * + * @{ + */ +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.h new file mode 100644 index 000000000..09e2cbf26 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_data_set.h @@ -0,0 +1,27 @@ +/* + * 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 */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_enums.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_enums.h new file mode 100644 index 000000000..0c218dfe0 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_enums.h @@ -0,0 +1,40 @@ +/* + * 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 */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.c new file mode 100644 index 000000000..d34801216 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.c @@ -0,0 +1,825 @@ +/* + * 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; +} + diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.h new file mode 100644 index 000000000..3aa51cc23 --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_interface.h @@ -0,0 +1,84 @@ +/* + * 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 */ +/** @} */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_oids.h b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_oids.h new file mode 100644 index 000000000..cb086b4dd --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_oids.h @@ -0,0 +1,39 @@ +/* + * 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 */ diff --git a/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_subagent.c b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_subagent.c new file mode 100644 index 000000000..59d89031b --- /dev/null +++ b/userspace/snmpd/bridge_mib/dot1dBasePortTable/dot1dBasePortTable_subagent.c @@ -0,0 +1,177 @@ +/* + * 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); +} + -- GitLab