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