From 32c13f8502b9520a49fb88a6737801d705fcbb9f Mon Sep 17 00:00:00 2001
From: Mitsuru Chinen <mitch@linux.vnet.ibm.com>
Date: Mon, 20 Oct 2008 17:57:27 +0900
Subject: [PATCH] Improve IP Statistics tables

This patch fixes the ipSystemStatsTable and adds ipIfStatsTable for IPv6.

From net-snmp patch tracker:
[ 1797111 ] Better support for ipIfStatsTable
http://sourceforge.net/tracker/index.php?func=detail&aid=1797111&group_id=12694&atid=312694

Signed-off-by: Mitsuru Chinen <mitch@linux.vnet.ibm.com>
---
 README.agent-mibs                                  |    2 +-
 .../ip-mib/data_access/systemstats_common.c        |  119 +-
 .../ip-mib/data_access/systemstats_linux.c         |  389 +++-
 agent/mibgroup/ip-mib/ipIfStatsTable.h             |    8 +
 .../ip-mib/ipIfStatsTable/ipIfStatsTable.c         |  216 ++
 .../ip-mib/ipIfStatsTable/ipIfStatsTable.h         |  200 ++
 .../ipIfStatsTable/ipIfStatsTable_data_access.c    |  408 +++
 .../ipIfStatsTable/ipIfStatsTable_data_access.h    |   70 +
 .../ipIfStatsTable/ipIfStatsTable_data_get.c       | 3015 ++++++++++++++++++++
 .../ipIfStatsTable/ipIfStatsTable_data_get.h       |  246 ++
 .../ip-mib/ipIfStatsTable/ipIfStatsTable_enums.h   |   56 +
 .../ipIfStatsTable/ipIfStatsTable_interface.c      | 1395 +++++++++
 .../ipIfStatsTable/ipIfStatsTable_interface.h      |   99 +
 .../ip-mib/ipIfStatsTable/ipIfStatsTable_oids.h    |  122 +
 .../ip-mib/ipSystemStatsTable/ipSystemStatsTable.c |  154 +-
 .../ipSystemStatsTable_data_access.c               |   60 +-
 include/net-snmp/data_access/ipstats.h             |   66 +-
 include/net-snmp/data_access/systemstats.h         |   14 +-
 18 files changed, 6494 insertions(+), 145 deletions(-)
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.c
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.c
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.c
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_enums.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.c
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.h
 create mode 100644 agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_oids.h

diff --git a/README.agent-mibs b/README.agent-mibs
index 8716f8d..ff5ce6a 100644
--- a/README.agent-mibs
+++ b/README.agent-mibs
@@ -152,7 +152,7 @@ IP-MIB
 
  ipSystemStatsTable           L         5.2     M ip-mib/=/*
  ipIfStatsTableLastChange.0   ---
- ipIfStatsTable               ---
+ ipIfStatsTable               L--       5.5     M ip-mib/=/*
 
  ipAddrTable (D)              U $2      4.2     O mibII/ipAddr.c
  ipAddressSpinLock.0          ---
diff --git a/agent/mibgroup/ip-mib/data_access/systemstats_common.c b/agent/mibgroup/ip-mib/data_access/systemstats_common.c
index 83e1867..a09cacf 100644
--- a/agent/mibgroup/ip-mib/data_access/systemstats_common.c
+++ b/agent/mibgroup/ip-mib/data_access/systemstats_common.c
@@ -1,5 +1,5 @@
 /*
- *  Systemstats MIB architecture support
+ *  ipSystemStatsTable and ipIfStatsTable MIB architecture support
  *
  * $Id: systemstats_common.c 11913 2005-02-08 21:58:36Z nba $
  */
@@ -163,7 +163,7 @@ netsnmp_access_systemstats_entry_get_by_index(netsnmp_container *container, oid
 /**
  */
 netsnmp_systemstats_entry *
-netsnmp_access_systemstats_entry_create(int version)
+netsnmp_access_systemstats_entry_create(int version, int if_index)
 {
     netsnmp_systemstats_entry *entry =
         SNMP_MALLOC_TYPEDEF(netsnmp_systemstats_entry);
@@ -173,10 +173,10 @@ netsnmp_access_systemstats_entry_create(int version)
     if(NULL == entry)
         return NULL;
 
-    entry->ns_ip_version = version;
-
-    entry->oid_index.len = 1;
-    entry->oid_index.oids = (oid *) & entry->ns_ip_version;
+    entry->oid_index.len = 2;
+    entry->oid_index.oids = entry->index;
+    entry->index[0] = version;
+    entry->index[1] = if_index;
 
     return entry;
 }
@@ -217,6 +217,64 @@ _entry_release(netsnmp_systemstats_entry * entry, void *context)
     netsnmp_access_systemstats_entry_free(entry);
 }
 
+/*
+ * Calculates the entries, which are not provided by OS, but can be 
+ * computed from the others.
+ */
+static void
+_calculate_entries(netsnmp_systemstats_entry * entry)
+{
+    U64 calc_val;
+    
+    /*
+     * HCInForwDatagrams = HCInNoRoutes + HCOutForwDatagrams
+     */
+    if (!entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINNOROUTES]) {
+        
+        entry->stats.HCInForwDatagrams = entry->stats.HCInNoRoutes;
+        u64Incr(&entry->stats.HCInForwDatagrams, &entry->stats.HCOutForwDatagrams);
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS] = 1;
+    }
+
+    /*
+     * HCOutFragReqds = HCOutFragOKs + HCOutFragFails
+     */
+    if (!entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGOKS]
+           && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS]) {
+        
+        entry->stats.HCOutFragReqds = entry->stats.HCOutFragOKs;
+        u64Incr(&entry->stats.HCOutFragReqds, &entry->stats.HCOutFragFails);
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS] = 1;
+    }
+    
+    /*
+     * HCOutTransmits = HCOutRequests  + HCOutForwDatagrams + HCOutFragCreates  
+     *                  - HCOutFragReqds - HCOutNoRoutes  - HCOutDiscards
+     */
+    if (!entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS]
+           && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS]
+           && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTNOROUTES]
+           && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES]
+        && entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTDISCARDS]) {
+
+        U64 tmp, tmp2, tmp3;
+        tmp = entry->stats.HCOutRequests;
+        u64Incr(&tmp, &entry->stats.HCOutForwDatagrams);
+        u64Incr(&tmp, &entry->stats.HCOutFragCreates);
+        
+        u64Subtract(&tmp, &entry->stats.HCOutFragReqds, &tmp2);
+        u64Subtract(&tmp2, &entry->stats.HCOutNoRoutes, &tmp3);
+        u64Subtract(&tmp3, &entry->stats.HCOutDiscards, &entry->stats.HCOutTransmits);
+                
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS] = 1;
+    }
+}
+
 /**
  * update entry stats (checking for counter wrap)
  *
@@ -233,7 +291,8 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
      * sanity checks
      */
     if ((NULL == prev_vals) || (NULL == new_vals) ||
-        (prev_vals->ns_ip_version != new_vals->ns_ip_version))
+        (prev_vals->index[0] != new_vals->index[0])
+        || (prev_vals->index[1] != new_vals->index[1]))
         return -1;
 
     /*
@@ -241,6 +300,7 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
      */
     if (0 == need_wrap_check) {
         memcpy(&prev_vals->stats, &new_vals->stats, sizeof(new_vals->stats));
+        _calculate_entries(prev_vals);
         return 0;
     }
 
@@ -257,8 +317,8 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
         /*
          * update straight 32 bit counters
          */
+        memcpy(&prev_vals->stats.columnAvail[0], &new_vals->stats.columnAvail[0], sizeof(new_vals->stats.columnAvail));
         prev_vals->stats.InHdrErrors = new_vals->stats.InHdrErrors;
-        prev_vals->stats.InNoRoutes = new_vals->stats.InNoRoutes;
         prev_vals->stats.InAddrErrors = new_vals->stats.InAddrErrors;
         prev_vals->stats.InUnknownProtos = new_vals->stats.InUnknownProtos;
         prev_vals->stats.InTruncatedPkts = new_vals->stats.InTruncatedPkts;
@@ -266,16 +326,38 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
         prev_vals->stats.ReasmOKs = new_vals->stats.ReasmOKs;
         prev_vals->stats.ReasmFails = new_vals->stats.ReasmFails;
         prev_vals->stats.InDiscards = new_vals->stats.InDiscards;
-        prev_vals->stats.OutNoRoutes = new_vals->stats.OutNoRoutes;
-        prev_vals->stats.OutDiscards = new_vals->stats.OutDiscards;
-        prev_vals->stats.OutFragReqds = new_vals->stats.OutFragReqds;
-        prev_vals->stats.OutFragOKs = new_vals->stats.OutFragOKs;
-        prev_vals->stats.OutFragFails = new_vals->stats.OutFragFails;
-        prev_vals->stats.OutFragCreates = new_vals->stats.OutFragCreates;
 
         /*
          * update 64bit counters
          */
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCInNoRoutes,
+                                       &new_vals->stats.HCInNoRoutes,
+                                       &prev_vals->old_stats->HCInNoRoutes,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutNoRoutes,
+                                       &new_vals->stats.HCOutNoRoutes,
+                                       &prev_vals->old_stats->HCOutNoRoutes,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutDiscards,
+                                       &new_vals->stats.HCOutDiscards,
+                                       &prev_vals->old_stats->HCOutDiscards,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragReqds,
+                                       &new_vals->stats.HCOutFragReqds,
+                                       &prev_vals->old_stats->HCOutFragReqds,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragOKs,
+                                       &new_vals->stats.HCOutFragOKs,
+                                       &prev_vals->old_stats->HCOutFragOKs,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragFails,
+                                       &new_vals->stats.HCOutFragFails,
+                                       &prev_vals->old_stats->HCOutFragFails,
+                                       &need_wrap_check);
+        netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragCreates,
+                                       &new_vals->stats.HCOutFragCreates,
+                                       &prev_vals->old_stats->HCOutFragCreates,
+                                       &need_wrap_check);
         netsnmp_c64_check32_and_update(&prev_vals->stats.HCInReceives,
                                        &new_vals->stats.HCInReceives,
                                        &prev_vals->old_stats->HCInReceives,
@@ -333,7 +415,7 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
                                        &prev_vals->old_stats->HCOutBcastPkts,
                                        &need_wrap_check);
     }
-    
+
     /*
      * if we've decided we no longer need to check wraps, free old stats
      */
@@ -346,7 +428,9 @@ netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_v
      * careful - old_stats is a pointer to stats...
      */
     memcpy(prev_vals->old_stats, &new_vals->stats, sizeof(new_vals->stats));
-    
+
+    _calculate_entries(prev_vals);
+
     return 0;
 }
 
@@ -367,7 +451,8 @@ netsnmp_access_systemstats_entry_update(netsnmp_systemstats_entry * lhs,
     DEBUGMSGTL(("access:systemstats", "copy\n"));
     
     if ((NULL == lhs) || (NULL == rhs) ||
-        (lhs->ns_ip_version != rhs->ns_ip_version))
+        (lhs->index[0] != rhs->index[0])
+        || (lhs->index[1] != rhs->index[1]))
         return -1;
 
     /*
diff --git a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
index 947afe8..552a745 100644
--- a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
+++ b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
@@ -1,5 +1,5 @@
 /*
- *  Interface MIB architecture support
+ *  ipSystemStatsTable and ipIfStatsTable interface MIB architecture support
  *
  * $Id: systemstats_linux.c 15220 2006-09-15 00:48:50Z tanders $
  */
@@ -10,11 +10,22 @@
 #include <net-snmp/data_access/ipstats.h>
 #include <net-snmp/data_access/systemstats.h>
 
+#include "../ipSystemStatsTable/ipSystemStatsTable.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <ctype.h>
+
 static int _systemstats_v4(netsnmp_container* container, u_int load_flags);
+static int _additional_systemstats_v4(netsnmp_systemstats_entry* entry,
+                                      u_int load_flags);
+
 #if defined (NETSNMP_ENABLE_IPV6)
 static int _systemstats_v6(netsnmp_container* container, u_int load_flags);
 #endif
 
+static netsnmp_column_info valid_columns;
+static unsigned int my_columns[IPSYSTEMSTATSTABLE_MAX_COL];
 
 void
 netsnmp_access_systemstats_arch_init(void)
@@ -62,7 +73,7 @@ netsnmp_access_systemstats_container_arch_load(netsnmp_container* container,
         snmp_log(LOG_ERR, "no container specified/found for access_systemstats_\n");
         return -1;
     }
-
+    
     /*
      * load v4 and v6 stats. Even if one fails, try the other.
      * If they have the same rc, return it. if the differ, return
@@ -81,6 +92,9 @@ netsnmp_access_systemstats_container_arch_load(netsnmp_container* container,
 #endif
 }
 
+/*
+ * Based on load_flags, load ipSystemStatsTable or ipIfStatsTable for ipv4 entries. 
+ */
 static int
 _systemstats_v4(netsnmp_container* container, u_int load_flags)
 {
@@ -97,6 +111,11 @@ _systemstats_v4(netsnmp_container* container, u_int load_flags)
 
     netsnmp_assert(container != NULL); /* load function shoulda checked this */
 
+    if (load_flags & NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE) {
+        /* we do not support ipIfStatsTable for ipv4 */
+        return 0;
+    }
+
     if (!(devin = fopen("/proc/net/snmp", "r"))) {
         DEBUGMSGTL(("access:systemstats",
                     "Failed to load Systemstats Table (linux1)\n"));
@@ -144,7 +163,7 @@ _systemstats_v4(netsnmp_container* container, u_int load_flags)
         while (*stats == ' ') /* skip spaces before stats */
             stats++;
 
-        entry = netsnmp_access_systemstats_entry_create(1);
+        entry = netsnmp_access_systemstats_entry_create(1, 0);
         if(NULL == entry) {
             netsnmp_access_systemstats_container_free(container,
                                                       NETSNMP_ACCESS_SYSTEMSTATS_FREE_NOFLAGS);
@@ -185,23 +204,54 @@ _systemstats_v4(netsnmp_container* container, u_int load_flags)
         entry->stats.HCInReceives.high = scan_vals[2] >> 32;
         entry->stats.InHdrErrors = scan_vals[3];
         entry->stats.InAddrErrors = scan_vals[4];
-        entry->stats.HCInForwDatagrams.low = scan_vals[5] & 0xffffffff;
-        entry->stats.HCInForwDatagrams.high = scan_vals[5] >> 32;
+        entry->stats.HCOutForwDatagrams.low = scan_vals[5] & 0xffffffff;
+        entry->stats.HCOutForwDatagrams.high = scan_vals[5] >> 32;
         entry->stats.InUnknownProtos = scan_vals[6];
         entry->stats.InDiscards = scan_vals[7];
         entry->stats.HCInDelivers.low = scan_vals[8] & 0xffffffff;
         entry->stats.HCInDelivers.high = scan_vals[8] >> 32;
         entry->stats.HCOutRequests.low = scan_vals[9] & 0xffffffff;
         entry->stats.HCOutRequests.high = scan_vals[9] >> 32;
-        entry->stats.OutDiscards = scan_vals[10];
-        entry->stats.OutNoRoutes = scan_vals[11];
+        entry->stats.HCOutDiscards.low = scan_vals[10] & 0xffffffff;;
+        entry->stats.HCOutDiscards.high = scan_vals[10] >> 32;
+        entry->stats.HCOutNoRoutes.low = scan_vals[11] & 0xffffffff;;
+        entry->stats.HCOutNoRoutes.high = scan_vals[11] >> 32;
         /* entry->stats. = scan_vals[12]; / * ReasmTimeout */
         entry->stats.ReasmReqds = scan_vals[13];
         entry->stats.ReasmOKs = scan_vals[14];
         entry->stats.ReasmFails = scan_vals[15];
-        entry->stats.OutFragOKs = scan_vals[16];
-        entry->stats.OutFragFails = scan_vals[17];
-        entry->stats.OutFragCreates = scan_vals[18];
+        entry->stats.HCOutFragOKs.low = scan_vals[16] & 0xffffffff;;
+        entry->stats.HCOutFragOKs.high = scan_vals[16] >> 32;
+        entry->stats.HCOutFragFails.low = scan_vals[17] & 0xffffffff;;
+        entry->stats.HCOutFragFails.high = scan_vals[17] >> 32;
+        entry->stats.HCOutFragCreates.low = scan_vals[18] & 0xffffffff;;
+        entry->stats.HCOutFragCreates.high = scan_vals[18] >> 32;
+
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INHDRERRORS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INADDRERRORS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INUNKNOWNPROTOS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INDISCARDS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTDISCARDS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTNOROUTES] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMREQDS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMOKS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMFAILS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGOKS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_DISCONTINUITYTIME] = 1;
+        entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REFRESHRATE] = 1;
+
+        /*
+         * load addtional statistics defined by RFC 4293
+         * As these are supported linux 2.6.22 or later, it is no problem
+         * if loading them are failed.
+         */
+        _additional_systemstats_v4(entry, load_flags);
 
         /*
          * add to container
@@ -211,49 +261,106 @@ _systemstats_v4(netsnmp_container* container, u_int load_flags)
     return 0;
 }
     
-#if defined (NETSNMP_ENABLE_IPV6)
+#define IP_EXT_HEAD "IpExt:"
 static int
-_systemstats_v6(netsnmp_container* container, u_int load_flags)
+_additional_systemstats_v4(netsnmp_systemstats_entry* entry,
+	                           u_int load_flags)
 {
     FILE           *devin;
     char            line[1024];
-    netsnmp_systemstats_entry *entry = NULL;
-    int             scan_count = 0;
-    char           *stats, *start = line;
-    int             len, rc;
-    uintmax_t       scan_val;
-    const char     *filename = "/proc/net/snmp6";
-    static int      warned_open = 0;
+    int             scan_count;
+    uintmax_t       scan_vals[6];
+    int             retval = 0;
 
-    DEBUGMSGTL(("access:systemstats:container:arch", "load v6 (flags %p)\n",
-                load_flags));
+    DEBUGMSGTL(("access:systemstats:container:arch",
+		"load addtional v4 (flags %p)\n", load_flags));
 
-    netsnmp_assert(container != NULL); /* load function shoulda checked this */
+    if (!(devin = fopen("/proc/net/netstat", "r"))) {
+	DEBUGMSGTL(("access:systemstats",
+		    "cannot open /proc/net/netstat\n"));
+	return -2;
+    }
 
-    entry = netsnmp_access_systemstats_entry_create(2);
-    if(NULL == entry)
-        return -3;
-    
     /*
-     * try to open file. If we can't, that's ok - maybe the module hasn't
-     * been loaded yet.
+     * Get header and stat lines
      */
-    if (!(devin = fopen(filename, "r"))) {
-        DEBUGMSGTL(("access:systemstats",
-                    "Failed to load Systemstats Table (linux1)\n"));
-        if(!warned_open) {
-            ++warned_open;
-            snmp_log(LOG_ERR, "cannot open %s ...\n", filename);
-        }
-        free(entry);
-        return 0;
+    while (fgets(line, sizeof(line), devin)) {
+	if (strncmp(IP_EXT_HEAD, line, sizeof(IP_EXT_HEAD) - 1) == 0) {
+	    /* next line should includes IPv4 addtional statistics */
+	    if ((fgets(line, sizeof(line), devin)) == NULL) {
+		retval = -4;
+		break;
+	    }
+	    if (strncmp(IP_EXT_HEAD, line, sizeof(IP_EXT_HEAD) - 1) != 0) {
+		retval = -4;
+		break;
+	    }
+
+	    memset(scan_vals, 0x0, sizeof(scan_vals));
+	    scan_count = sscanf(line,
+		    "%*s"   /* ignore `IpExt:' */
+		    "%llu %llu %llu %llu %llu %llu",
+		    &scan_vals[0], &scan_vals[1], &scan_vals[2],
+		    &scan_vals[3], &scan_vals[4], &scan_vals[5]);
+	    if (scan_count < 6) {
+		snmp_log(LOG_ERR,
+			"error scanning addtional systemstats data"
+			"(minimum expected %d, got %d)\n",
+			6, scan_count);
+		retval = -4;
+		break;
+	    }
+
+	    entry->stats.HCInNoRoutes.low    = scan_vals[0] & 0xffffffff;
+	    entry->stats.HCInNoRoutes.high   = scan_vals[0] >> 32;
+	    entry->stats.InTruncatedPkts     = scan_vals[1];
+	    entry->stats.HCInMcastPkts.low   = scan_vals[2] & 0xffffffff;
+	    entry->stats.HCInMcastPkts.high  = scan_vals[2] >> 32;
+	    entry->stats.HCOutMcastPkts.low  = scan_vals[3] & 0xffffffff;
+	    entry->stats.HCOutMcastPkts.high = scan_vals[3] >> 32;
+	    entry->stats.HCInBcastPkts.low   = scan_vals[4] & 0xffffffff;
+	    entry->stats.HCInBcastPkts.high  = scan_vals[4] >> 32;
+	    entry->stats.HCOutBcastPkts.low  = scan_vals[5] & 0xffffffff;
+	    entry->stats.HCOutBcastPkts.high = scan_vals[5] >> 32;
+
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINNOROUTES] = 1;
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INTRUNCATEDPKTS] = 1;
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS] = 1;
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS] = 1;
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINBCASTPKTS] = 1;
+	    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS] = 1;
+	}
     }
 
+    fclose(devin);
+
+    if (retval < 0)
+	DEBUGMSGTL(("access:systemstats",
+		    "/proc/net/netstat does not include addtional stats\n"));
+
+    return retval;
+}
+
+#if defined (NETSNMP_ENABLE_IPV6)
+
+/*
+ * Load one /proc/net/snmp6 - like file (e.g. /proc/net/dev_snmp6/*)
+ */
+    static int
+_systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin)
+{
+    char            line[1024];
+    char           *stats, *start = line;
+    int             len, rc;
+    int             scan_count;
+    uintmax_t       scan_val;
+
     /*
      * This file provides the statistics for each systemstats.
      * Read in each line in turn, isolate the systemstats name
      *   and retrieve (or create) the corresponding data structure.
      */
+    rc = 0;
     while (1) {
         start = fgets(line, sizeof(line), devin);
         if (NULL == start)
@@ -283,77 +390,101 @@ _systemstats_v6(netsnmp_container* container, u_int load_flags)
          *      data structure accordingly.
          */
         scan_val = atoll(stats);
-        if (0 == scan_val)
-            continue;
 
         rc = 0;
         if ('I' == line[3]) { /* In */
             if ('A' == line[5]) {
                 entry->stats.InAddrErrors = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INADDRERRORS] = 1;
             } else if ('D' == line[5]) {
                 if ('e' == line[6]) {
                     entry->stats.HCInDelivers.low = scan_val  & 0xffffffff;
                     entry->stats.HCInDelivers.high = scan_val >> 32;
-                } else if ('i' == line[6])
+                    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS] = 1;
+                } else if ('i' == line[6]) {
                     entry->stats.InDiscards = scan_val;
-                else
+                    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INDISCARDS] = 1;
+                } else
                     rc = 1;
             } else if ('H' == line[5]) {
                 entry->stats.InHdrErrors = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INHDRERRORS] = 1;
             } else if ('M' == line[5]) {
                 entry->stats.HCInMcastPkts.low = scan_val  & 0xffffffff;
                 entry->stats.HCInMcastPkts.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS] = 1;
             } else if ('N' == line[5]) {
-                entry->stats.InNoRoutes = scan_val;
+                entry->stats.HCInNoRoutes.low = scan_val & 0xffffffff;
+                entry->stats.HCInNoRoutes.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINNOROUTES] = 1;
             } else if ('R' == line[5]) {
                 entry->stats.HCInReceives.low = scan_val & 0xffffffff;
                 entry->stats.HCInReceives.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES] = 1;
             } else if ('T' == line[5]) {
                 if ('r' == line[6]) {
                     entry->stats.InTruncatedPkts = scan_val  & 0xffffffff;
+                    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INTRUNCATEDPKTS] = 1;
                 } else if ('o' == line[6])
                     ; /* TooBig isn't in the MIB, so ignore it */
                 else
                     rc = 1;
             } else if ('U' == line[5]) {
                 entry->stats.InUnknownProtos = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_INUNKNOWNPROTOS] = 1;
             } else
                 rc = 1;
         } else if ('O' == line[3]) { /* Out */
             if ('D' == line[6]) {
-                entry->stats.OutDiscards = scan_val;
+                entry->stats.HCOutDiscards.low = scan_val & 0xffffffff;
+                entry->stats.HCOutDiscards.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTDISCARDS] = 1;
             } else if ('F' == line[6]) {
                 entry->stats.HCOutForwDatagrams.low = scan_val & 0xffffffff;
                 entry->stats.HCOutForwDatagrams.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS] = 1;
             } else if ('M' == line[6]) {
                 entry->stats.HCOutMcastPkts.low = scan_val & 0xffffffff;
                 entry->stats.HCOutMcastPkts.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS] = 1;
             } else if ('N' == line[6]) {
-                entry->stats.OutNoRoutes = scan_val;
+                entry->stats.HCOutNoRoutes.low = scan_val & 0xffffffff;
+                entry->stats.HCOutNoRoutes.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTNOROUTES] = 1;
             } else if ('R' == line[6]) {
                 entry->stats.HCOutRequests.low = scan_val & 0xffffffff;
                 entry->stats.HCOutRequests.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS] = 1;
             } else
                 rc = 1;
         } else if ('R' == line[3]) { /* Reasm */
             if ('F' == line[8]) {
                 entry->stats.ReasmFails = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMFAILS] = 1;
             } else if ('O' == line[8]) {
                 entry->stats.ReasmOKs = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMOKS] = 1;
             } else if ('R' == line[8]) {
                 entry->stats.ReasmReqds = scan_val;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMREQDS] = 1;
             } else if ('T' == line[8]) {
                 ; /* no mib entry for reasm timeout */
             } else
                 rc = 1;
         } else if ('F' == line[3]) { /* Frag */
-            if ('C' == line[7])
-                entry->stats.OutFragCreates = scan_val;
-            else if ('O' == line[7])
-                entry->stats.OutFragOKs = scan_val;
-            else if ('F' == line[7])
-                entry->stats.OutFragFails = scan_val;
-            else
+            if ('C' == line[7]) {
+                entry->stats.HCOutFragCreates.low = scan_val & 0xffffffff;
+                entry->stats.HCOutFragCreates.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES] = 1;
+            } else if ('O' == line[7]) {
+                entry->stats.HCOutFragOKs.low = scan_val & 0xffffffff;
+                entry->stats.HCOutFragOKs.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGOKS] = 1;
+            } else if ('F' == line[7]) {
+                entry->stats.HCOutFragFails.low = scan_val & 0xffffffff;
+                entry->stats.HCOutFragFails.high = scan_val >> 32;
+                entry->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS] = 1;
+            } else
                 rc = 1;
         } else
             rc = 1;
@@ -363,6 +494,47 @@ _systemstats_v6(netsnmp_container* container, u_int load_flags)
         else
             ++scan_count;
     }
+    /*
+     * Let DiscontinuityTime and RefreshRate active
+     */
+    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_DISCONTINUITYTIME] = 1;
+    entry->stats.columnAvail[IPSYSTEMSTATSTABLE_REFRESHRATE] = 1;
+
+    return rc;
+}
+
+/*
+ * load ipSystemStatsTable for ipv6 entries
+ */
+static int 
+_systemstats_v6_load_systemstats(netsnmp_container* container, u_int load_flags)
+{
+    FILE *devin;
+    netsnmp_systemstats_entry *entry = NULL;
+    const char     *filename = "/proc/net/snmp6";
+    static int      warned_open = 0;
+    int rc = 0;
+    
+    entry = netsnmp_access_systemstats_entry_create(2, 0);
+    if(NULL == entry)
+        return -3;
+    
+    /*
+     * try to open file. If we can't, that's ok - maybe the module hasn't
+     * been loaded yet.
+     */
+    if (!(devin = fopen(filename, "r"))) {
+        DEBUGMSGTL(("access:systemstats",
+                    "Failed to load Systemstats Table (linux1)\n"));
+        if(!warned_open) {
+            ++warned_open;
+            snmp_log(LOG_ERR, "cannot open %s ...\n", filename);
+        }
+        free(entry);
+        return 0;
+    }
+    
+    rc = _systemstats_v6_load_file(entry, devin);
 
     fclose(devin);
 
@@ -373,4 +545,119 @@ _systemstats_v6(netsnmp_container* container, u_int load_flags)
 
     return rc;
 }
+
+#define DEV_SNMP6_DIRNAME   "/proc/net/dev_snmp6"
+#define IFINDEX_LINE        "ifIndex"
+#define DEV_FILENAME_LEN    64
+
+/*
+ * load ipIfStatsTable for ipv6 entries
+ */
+static int 
+_systemstats_v6_load_ifstats(netsnmp_container* container, u_int load_flags)
+{
+    DIR            *dev_snmp6_dir;
+    struct dirent  *dev_snmp6_entry;
+    char           dev_filename[DEV_FILENAME_LEN];
+    FILE           *devin;
+    char           line[1024];
+    char           *stats, *start = line;
+    int            rc;
+    char           *scan_str;
+    uintmax_t       scan_val;
+    netsnmp_systemstats_entry *entry = NULL;
+            
+    /*
+     * try to open /proc/net/dev_snmp6 directory. If we can't, that' ok -
+     * maybe it is not supported by the current running kernel.
+     */
+    if ((dev_snmp6_dir = opendir(DEV_SNMP6_DIRNAME)) == NULL) {
+        DEBUGMSGTL(("access:ifstats",
+        "Failed to load IPv6 IfStats Table (linux)\n"));
+        return 0;
+    }
+    
+    /*
+     * Read each per interface statistics proc file
+     */
+    rc = 0;
+    while ((dev_snmp6_entry = readdir(dev_snmp6_dir)) != NULL) {
+        if (dev_snmp6_entry->d_name[0] == '.')
+            continue;
+    
+        if (snprintf(dev_filename, DEV_FILENAME_LEN, "%s/%s", DEV_SNMP6_DIRNAME,
+                dev_snmp6_entry->d_name) > DEV_FILENAME_LEN) {
+            snmp_log(LOG_ERR, "Interface name %s is too long\n",
+                    dev_snmp6_entry->d_name);
+            continue;
+        }
+        if (NULL == (devin = fopen(dev_filename, "r"))) {
+            snmp_log(LOG_ERR, "Failed to open %s\n", dev_filename);
+            continue;
+        }
+    
+        /*
+         * If a stat file name is made of digits, the name is interface index.
+         * If it is an interface name, the file includes a line labeled ifIndex.
+         */
+        if (isdigit(dev_snmp6_entry->d_name[0])) {
+            scan_val = strtoull(dev_snmp6_entry->d_name, NULL, 0);
+        } else {
+            if (NULL == (start = fgets(line, sizeof(line), devin))) {
+                snmp_log(LOG_ERR, "%s doesn't include any lines\n",
+                        dev_filename);
+                fclose(devin);
+                continue;
+            }
+    
+            if (0 != strncmp(start, IFINDEX_LINE, 7)) {
+                snmp_log(LOG_ERR, "%s doesn't include ifIndex line",
+                        dev_filename);
+                fclose(devin);
+                continue;
+            }
+
+            scan_str = strrchr(line, ' ');
+            if (NULL == scan_str) {
+                snmp_log(LOG_ERR, "%s is wrong format", dev_filename);
+                fclose(devin);
+                continue;
+            }
+            scan_val = strtoull(scan_str, NULL, 0);
+        }
+        
+        entry = netsnmp_access_systemstats_entry_create(2, scan_val);
+        if(NULL == entry) {
+            fclose(devin);
+            closedir(dev_snmp6_dir);
+            return -3;
+        }
+        
+        _systemstats_v6_load_file(entry, devin);
+        CONTAINER_INSERT(container, entry);
+        fclose(devin);
+    }
+    closedir(dev_snmp6_dir);
+    return 0;
+}
+
+/*
+ * Based on load_flags, load ipSystemStatsTable or ipIfStatsTable for ipv6 entries. 
+ */
+static int
+_systemstats_v6(netsnmp_container* container, u_int load_flags)
+{
+    DEBUGMSGTL(("access:systemstats:container:arch", "load v6 (flags %p)\n",
+                load_flags));
+
+    netsnmp_assert(container != NULL); /* load function shoulda checked this */
+
+    if (load_flags & NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE) {
+        /* load ipIfStatsTable */
+        return _systemstats_v6_load_ifstats(container, load_flags);
+    } else {
+        /* load ipSystemStatsTable */
+        return _systemstats_v6_load_systemstats(container, load_flags);
+    }
+}
 #endif /* NETSNMP_ENABLE_IPV6 */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable.h b/agent/mibgroup/ip-mib/ipIfStatsTable.h
new file mode 100644
index 0000000..da1d85c
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable.h
@@ -0,0 +1,8 @@
+/*
+ * module to include the modules
+ */
+
+config_require(ip-mib/data_access/systemstats)
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable)
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_interface)
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_data_access)
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.c b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.c
new file mode 100644
index 0000000..6af3529
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.c
@@ -0,0 +1,216 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 14170 $ of $ 
+ *
+ * $Id:$
+ */
+/** \page MFD helper for ipIfStatsTable
+ *
+ * \section intro Introduction
+ * Introductory text.
+ *
+ */
+/*
+ * standard Net-SNMP includes 
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+/*
+ * include our parent header 
+ */
+#include "ipIfStatsTable.h"
+
+#include <net-snmp/agent/mib_modules.h>
+
+#include "ipIfStatsTable_interface.h"
+
+oid             ipIfStatsTable_oid[] = { IPIFSTATSTABLE_OID };
+int             ipIfStatsTable_oid_size = OID_LENGTH(ipIfStatsTable_oid);
+
+ipIfStatsTable_registration ipIfStatsTable_user_context;
+
+void            initialize_table_ipIfStatsTable(void);
+void            shutdown_table_ipIfStatsTable(void);
+
+
+/**
+ * Initializes the ipIfStatsTable module
+ */
+void
+init_ipIfStatsTable(void)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:init_ipIfStatsTable", "called\n"));
+
+    /*
+     * TODO:300:o: Perform ipIfStatsTable one-time module initialization.
+     */
+
+    /*
+     * here we initialize all the tables we're planning on supporting
+     */
+    if (should_init("ipIfStatsTable"))
+        initialize_table_ipIfStatsTable();
+
+    /*
+     * last changed should be 0 at startup
+     */
+    ipIfStatsTable_lastChange_set(0);
+}                               /* init_ipIfStatsTable */
+
+/**
+ * Shut-down the ipIfStatsTable module (agent is exiting)
+ */
+void
+shutdown_ipIfStatsTable(void)
+{
+    if (should_init("ipIfStatsTable"))
+        shutdown_table_ipIfStatsTable();
+
+}
+
+/**
+ * Initialize the table ipIfStatsTable 
+ *    (Define its contents and how it's structured)
+ */
+void
+initialize_table_ipIfStatsTable(void)
+{
+    ipIfStatsTable_registration *user_context;
+    u_long          flags;
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:initialize_table_ipIfStatsTable",
+                "called\n"));
+
+    /*
+     * TODO:301:o: Perform ipIfStatsTable one-time table initialization.
+     */
+
+    /*
+     * TODO:302:o: |->Initialize ipIfStatsTable 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("ipIfStatsTable", NULL, NULL);
+
+    /*
+     * No support for any flags yet, but in the future you would
+     * set any flags here.
+     */
+    flags = 0;
+
+    /*
+     * call interface initialization code
+     */
+    _ipIfStatsTable_initialize_interface(user_context, flags);
+}                               /* initialize_table_ipIfStatsTable */
+
+/**
+ * Shutdown the table ipIfStatsTable 
+ */
+void
+shutdown_table_ipIfStatsTable(void)
+{
+    /*
+     * call interface shutdown code
+     */
+    _ipIfStatsTable_shutdown_interface(&ipIfStatsTable_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
+ipIfStatsTable_rowreq_ctx_init(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                               void *user_init_ctx)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_rowreq_ctx_init",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:210:o: |-> Perform extra ipIfStatsTable rowreq initialization. (eg DEFVALS)
+     */
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_rowreq_ctx_init */
+
+/**
+ * extra context cleanup
+ *
+ */
+void
+ipIfStatsTable_rowreq_ctx_cleanup(ipIfStatsTable_rowreq_ctx * rowreq_ctx)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_rowreq_ctx_cleanup",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:211:o: |-> Perform extra ipIfStatsTable rowreq cleanup.
+     */
+}                               /* ipIfStatsTable_rowreq_ctx_cleanup */
+
+/**
+ * pre-request callback
+ *
+ *
+ * @retval MFD_SUCCESS              : success.
+ * @retval MFD_ERROR                : other error
+ */
+int
+ipIfStatsTable_pre_request(ipIfStatsTable_registration * user_context)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_pre_request",
+                "called\n"));
+
+    /*
+     * TODO:510:o: Perform ipIfStatsTable pre-request actions.
+     */
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_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
+ipIfStatsTable_post_request(ipIfStatsTable_registration * user_context,
+                            int rc)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_post_request",
+                "called\n"));
+
+    /*
+     * TODO:511:o: Perform ipIfStatsTable post-request actions.
+     */
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_post_request */
+
+
+/** @{ */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.h
new file mode 100644
index 0000000..8bf0a7a
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable.h
@@ -0,0 +1,200 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 14170 $ of $
+ *
+ * $Id:$
+ */
+#ifndef IPIFSTATSTABLE_H
+#define IPIFSTATSTABLE_H
+
+#ifdef __cplusplus
+extern          "C" {
+#endif
+
+
+/** @addtogroup misc misc: Miscellaneous routines
+ *
+ * @{
+ */
+#include <net-snmp/library/asn1.h>
+#include <net-snmp/data_access/ipstats.h>
+#include <net-snmp/data_access/systemstats.h>
+
+    /*
+     * other required module components 
+     */
+    /* *INDENT-OFF*  */
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_interface)
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_data_access)
+config_require(ip-mib/ipIfStatsTable/ipIfStatsTable_data_get)
+    /* *INDENT-ON*  */
+
+    /*
+     * OID and column number definitions for ipIfStatsTable 
+     */
+#include "ipIfStatsTable_oids.h"
+
+    /*
+     * enum definions 
+     */
+#include "ipIfStatsTable_enums.h"
+
+    /*
+     *********************************************************************
+     * function declarations
+     */
+    void            init_ipIfStatsTable(void);
+    void            shutdown_ipIfStatsTable(void);
+
+    /*
+     *********************************************************************
+     * Table declarations
+     */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+    /*
+     * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+     * Its status is Current.
+     * OID: .1.3.6.1.2.1.4.31.3, 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 ipIfStatsTable registration context.
+     */
+    typedef netsnmp_data_list ipIfStatsTable_registration;
+
+/**********************************************************************/
+    /*
+     * TODO:110:r: |-> Review ipIfStatsTable data context structure.
+     * This structure is used to represent the data for ipIfStatsTable.
+     */
+    typedef netsnmp_systemstats_entry ipIfStatsTable_data;
+
+
+    /*
+     * TODO:120:r: |-> Review ipIfStatsTable mib index.
+     * This structure is used to represent the index for ipIfStatsTable.
+     */
+    typedef struct ipIfStatsTable_mib_index_s {
+
+        /*
+         * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
+         */
+        u_long          ipIfStatsIPVersion;
+
+        /*
+         * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+         */
+        long            ipIfStatsIfIndex;
+
+
+    } ipIfStatsTable_mib_index;
+
+    /*
+     * TODO:121:r: |   |-> Review ipIfStatsTable max index length.
+     * If you KNOW that your indexes will never exceed a certain
+     * length, update this macro to that length.
+     */
+#define MAX_ipIfStatsTable_IDX_LEN     2
+
+
+    /*
+     *********************************************************************
+     * TODO:130:o: |-> Review ipIfStatsTable Row request (rowreq) context.
+     * When your functions are called, you will be passed a
+     * ipIfStatsTable_rowreq_ctx pointer.
+     */
+    typedef struct ipIfStatsTable_rowreq_ctx_s {
+
+    /** this must be first for container compare to work */
+        netsnmp_index   oid_idx;
+        oid             oid_tmp[MAX_ipIfStatsTable_IDX_LEN];
+
+        ipIfStatsTable_mib_index tbl_idx;
+
+        ipIfStatsTable_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 ipIfStatsTable rowreq context.
+         */
+        char            known_missing;
+        uint32_t        ipIfStatsDiscontinuityTime;
+        uint32_t        ipIfStatsRefreshRate;
+
+        /*
+         * storage for future expansion
+         */
+        netsnmp_data_list *ipIfStatsTable_data_list;
+
+    } ipIfStatsTable_rowreq_ctx;
+
+    typedef struct ipIfStatsTable_ref_rowreq_ctx_s {
+        ipIfStatsTable_rowreq_ctx *rowreq_ctx;
+    } ipIfStatsTable_ref_rowreq_ctx;
+
+    /*
+     *********************************************************************
+     * function prototypes
+     */
+    int             ipIfStatsTable_pre_request(ipIfStatsTable_registration
+                                               * user_context);
+    int             ipIfStatsTable_post_request(ipIfStatsTable_registration
+                                                * user_context, int rc);
+
+    int            
+        ipIfStatsTable_rowreq_ctx_init(ipIfStatsTable_rowreq_ctx *
+                                       rowreq_ctx, void *user_init_ctx);
+    void           
+        ipIfStatsTable_rowreq_ctx_cleanup(ipIfStatsTable_rowreq_ctx *
+                                          rowreq_ctx);
+
+    ipIfStatsTable_data *ipIfStatsTable_allocate_data(void);
+    void            ipIfStatsTable_release_data(ipIfStatsTable_data *
+                                                data);
+
+
+    ipIfStatsTable_rowreq_ctx
+        *ipIfStatsTable_row_find_by_mib_index(ipIfStatsTable_mib_index *
+                                              mib_idx);
+
+    extern oid      ipIfStatsTable_oid[];
+    extern int      ipIfStatsTable_oid_size;
+
+
+#include "ipIfStatsTable_interface.h"
+#include "ipIfStatsTable_data_access.h"
+#include "ipIfStatsTable_data_get.h"
+
+    /*
+     * DUMMY markers, ignore
+     *
+     * TODO:099:x: *************************************************************
+     * TODO:199:x: *************************************************************
+     * TODO:299:x: *************************************************************
+     * TODO:399:x: *************************************************************
+     * TODO:499:x: *************************************************************
+     */
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_H */
+/** @} */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.c b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.c
new file mode 100644
index 0000000..f2ec1a1
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.c
@@ -0,0 +1,408 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 14170 $ of $ 
+ *
+ * $Id:$
+ */
+/*
+ * standard Net-SNMP includes 
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+/*
+ * include our parent header 
+ */
+#include "ipIfStatsTable.h"
+
+
+#include "ipIfStatsTable_data_access.h"
+
+static int      ipis_cache_refresh = IPIFSTATSTABLE_CACHE_TIMEOUT;
+
+/** @ingroup interface
+ * @addtogroup data_access data_access: Routines to access data
+ *
+ * These routines are used to locate the data used to satisfy
+ * requests.
+ * 
+ * @{
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.4.31.3, length: 9
+ */
+
+/**
+ * initialization for ipIfStatsTable data access
+ *
+ * This function is called during startup to allow you to
+ * allocate any resources you need for the data table.
+ *
+ * @param ipIfStatsTable_reg
+ *        Pointer to ipIfStatsTable_registration
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR   : unrecoverable error.
+ */
+int
+ipIfStatsTable_init_data(ipIfStatsTable_registration * ipIfStatsTable_reg)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_init_data",
+                "called\n"));
+
+    /*
+     * TODO:303:o: Initialize ipIfStatsTable data.
+     */
+    netsnmp_access_systemstats_init();
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_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.
+ * @param  cache A pointer to a cache structure. You can set the timeout
+ *         and other cache flags using this pointer.
+ *
+ *  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.
+ *
+ *  This is also the place to set up cache behavior. The default, to
+ *  simply set the cache timeout, will work well with the default
+ *  container. If you are using a custom container, you may want to
+ *  look at the cache helper documentation to see if there are any
+ *  flags you want to set.
+ *
+ * @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
+ipIfStatsTable_container_init(netsnmp_container ** container_ptr_ptr,
+                              netsnmp_cache * cache)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_container_init",
+                "called\n"));
+
+    if (NULL == container_ptr_ptr) {
+        snmp_log(LOG_ERR,
+                 "bad container param to ipIfStatsTable_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.
+     */
+    /*
+     * We create a custom container here so we can pre-load it, which
+     * will result in all new entries with last changed values. we need
+     * to clear those...  We also need to make sure ifIndexes have been
+     * assigned...
+     */
+    *container_ptr_ptr =
+        netsnmp_container_find("ipIfStatsTable:table_container");
+    if (NULL != *container_ptr_ptr)
+        ipIfStatsTable_container_load(*container_ptr_ptr);
+    if (NULL == cache) {
+        snmp_log(LOG_ERR,
+                 "bad cache param to ipIfStatsTable_container_init\n");
+        return;
+    }
+
+    /*
+     * TODO:345:A: Set up ipIfStatsTable cache properties.
+     *
+     * Also for advanced users, you can set parameters for the
+     * cache. Do not change the magic pointer, as it is used
+     * by the MFD helper. To completely disable caching, set
+     * cache->enabled to 0.
+     */
+    cache->timeout = IPIFSTATSTABLE_CACHE_TIMEOUT;      /* seconds */
+
+    cache->flags |=
+        (NETSNMP_CACHE_DONT_AUTO_RELEASE | NETSNMP_CACHE_DONT_FREE_EXPIRED
+         | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD |
+         NETSNMP_CACHE_AUTO_RELOAD);
+}                               /* ipIfStatsTable_container_init */
+
+/**
+ * check entry for update
+ */
+static void
+_check_for_updates(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                   netsnmp_container *stats)
+{
+    netsnmp_systemstats_entry *ifstats_entry;
+
+    /*
+     * check for matching entry. works because indexes are the same.
+     */
+    ifstats_entry = CONTAINER_FIND(stats, rowreq_ctx->data);
+    if (NULL == ifstats_entry) {
+        DEBUGMSGTL(("ipIfStatsTable:access",
+                    "updating missing entry\n"));
+
+        /*
+         * mark row as missing, so we can set discontinuity
+         * when it comes back.
+         *
+         * what else should we do? set refresh to 0? that's not quite right...
+         */
+        rowreq_ctx->known_missing = 1;
+    } else {
+        DEBUGMSGTL(("ipIfStatsTable:access",
+                    "updating existing entry\n"));
+
+        /*
+         * Check for changes & update
+         */
+        netsnmp_access_systemstats_entry_update(rowreq_ctx->data,
+                                            ifstats_entry);
+
+        /*
+         * set discontinuity if previously missing.
+         */
+        if (1 == rowreq_ctx->known_missing) {
+            rowreq_ctx->known_missing = 0;
+            rowreq_ctx->ipIfStatsDiscontinuityTime =
+                netsnmp_get_agent_uptime();
+            ipIfStatsTable_lastChange_set(netsnmp_get_agent_uptime());
+        }
+
+        /*
+         * remove entry from container
+         */
+        CONTAINER_REMOVE(stats, ifstats_entry);
+        netsnmp_access_systemstats_entry_free(ifstats_entry);
+    }
+}
+
+/**
+ * add new entry
+ */
+static void
+_add_new(netsnmp_systemstats_entry *ifstats_entry,
+         netsnmp_container *container)
+{
+    ipIfStatsTable_rowreq_ctx *rowreq_ctx;
+
+    DEBUGMSGTL(("ipIfStatsTable:access", "creating new entry\n"));
+
+    netsnmp_assert(NULL != ifstats_entry);
+    netsnmp_assert(NULL != container);
+
+    /*
+     * allocate an row context and set the index(es)
+     */
+    rowreq_ctx =
+        ipIfStatsTable_allocate_rowreq_ctx(ifstats_entry, NULL);
+    if ((NULL != rowreq_ctx)
+        && (MFD_SUCCESS ==
+            ipIfStatsTable_indexes_set(rowreq_ctx,
+                                       ifstats_entry->index[0],
+                                       ifstats_entry->index[1]))) {
+        rowreq_ctx->ipIfStatsRefreshRate = ipis_cache_refresh * 1000;   /* milli-seconds */
+        CONTAINER_INSERT(container, rowreq_ctx);
+        ipIfStatsTable_lastChange_set(netsnmp_get_agent_uptime());
+    } else {
+        if (NULL != rowreq_ctx) {
+            snmp_log(LOG_ERR, "error setting index while loading "
+                     "ipIfStatsTable cache.\n");
+            ipIfStatsTable_release_rowreq_ctx(rowreq_ctx);
+        } else {
+            snmp_log(LOG_ERR, "memory allocation failed while loading "
+                     "ipIfStatsTable cache.\n");
+            netsnmp_access_systemstats_entry_free(ifstats_entry);
+        }
+    }
+}
+
+/**
+ * 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 ipIfStatsTable_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
+ipIfStatsTable_container_shutdown(netsnmp_container * container_ptr)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_container_shutdown",
+                "called\n"));
+
+    if (NULL == container_ptr) {
+        snmp_log(LOG_ERR,
+                 "bad params to ipIfStatsTable_container_shutdown\n");
+        return;
+    }
+
+}                               /* ipIfStatsTable_container_shutdown */
+
+/**
+ * load initial data
+ *
+ * TODO:350:M: Implement ipIfStatsTable data load
+ * This function will also be called by the cache helper to load
+ * the container again (after the container free function has been
+ * called to free the previous contents).
+ *
+ * @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
+ *  ipIfStatsTable_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
+ipIfStatsTable_container_load(netsnmp_container * container)
+{
+    netsnmp_container *stats;
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_container_load",
+                "called\n"));
+
+    netsnmp_assert(NULL != container);
+
+    stats = netsnmp_access_systemstats_container_load(NULL, NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE);
+    if (NULL == stats)
+        return MFD_RESOURCE_UNAVAILABLE;        /* msg already logged */
+
+    /*
+     * TODO:351:M: |-> Load/update data in the ipIfStatsTable container.
+     * loop over your ipIfStatsTable data, allocate a rowreq context,
+     * set the index(es) [and data, optionally] and insert into
+     * the container.
+     */
+
+    /*
+     * we just got a fresh copy of data. compare it to
+     * what we've already got, and make any adjustements...
+     */
+    CONTAINER_FOR_EACH(container, (netsnmp_container_obj_func *)
+                       _check_for_updates, stats);
+
+    /*
+     * now add any new entries
+     */
+    CONTAINER_FOR_EACH(stats, (netsnmp_container_obj_func *)
+                       _add_new, container);
+
+
+    /*
+      * free the container. we've either claimed each ifentry, or released it,
+     * so the dal function doesn't need to clear the container.
+     */
+    netsnmp_access_systemstats_container_free(stats,
+                                          NETSNMP_ACCESS_SYSTEMSTATS_FREE_DONT_CLEAR);
+
+    DEBUGMSGT(("verbose:ipIfStatsTable:ipIfStatsTable_container_load",
+               "%d records\n", CONTAINER_SIZE(container)));
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_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
+ipIfStatsTable_container_free(netsnmp_container * container)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_container_free",
+                "called\n"));
+
+    /*
+     * TODO:380:M: Free ipIfStatsTable container data.
+     */
+}                               /* ipIfStatsTable_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
+ipIfStatsTable_row_prep(ipIfStatsTable_rowreq_ctx * rowreq_ctx)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_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;
+}                               /* ipIfStatsTable_row_prep */
+
+/** @} */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.h
new file mode 100644
index 0000000..5ef7682
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_access.h
@@ -0,0 +1,70 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 14170 $ of $
+ *
+ * $Id:$
+ */
+#ifndef IPIFSTATSTABLE_DATA_ACCESS_H
+#define IPIFSTATSTABLE_DATA_ACCESS_H
+
+#ifdef __cplusplus
+extern          "C" {
+#endif
+
+
+    /*
+     *********************************************************************
+     * function declarations
+     */
+
+    /*
+     *********************************************************************
+     * Table declarations
+     */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+    /*
+     * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+     * Its status is Current.
+     * OID: .1.3.6.1.2.1.4.31.3, length: 9
+     */
+
+
+    int             ipIfStatsTable_init_data(ipIfStatsTable_registration *
+                                             ipIfStatsTable_reg);
+
+
+    /*
+     * TODO:180:o: Review ipIfStatsTable cache timeout.
+     * The number of seconds before the cache times out
+     */
+#define IPIFSTATSTABLE_CACHE_TIMEOUT   60
+
+    void            ipIfStatsTable_container_init(netsnmp_container **
+                                                  container_ptr_ptr,
+                                                  netsnmp_cache * cache);
+    void            ipIfStatsTable_container_shutdown(netsnmp_container *
+                                                      container_ptr);
+
+    int             ipIfStatsTable_container_load(netsnmp_container *
+                                                  container);
+    void            ipIfStatsTable_container_free(netsnmp_container *
+                                                  container);
+
+    int             ipIfStatsTable_cache_load(netsnmp_container *
+                                              container);
+    void            ipIfStatsTable_cache_free(netsnmp_container *
+                                              container);
+
+    int             ipIfStatsTable_row_prep(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx);
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_DATA_ACCESS_H */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.c b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.c
new file mode 100644
index 0000000..db673dc
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.c
@@ -0,0 +1,3015 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 12088 $ of $ 
+ *
+ * $Id:$
+ */
+/*
+ * standard Net-SNMP includes 
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+/*
+ * include our parent header 
+ */
+#include "ipIfStatsTable.h"
+
+
+/** @defgroup data_get data_get: Routines to get data
+ *
+ * TODO:230:M: Implement ipIfStatsTable get routines.
+ * TODO:240:M: Implement ipIfStatsTable 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 ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.4.31.3, length: 9
+ */
+
+/*
+ * ---------------------------------------------------------------------
+ * * TODO:200:r: Implement ipIfStatsTable data context functions.
+ */
+/*
+ * ipIfStatsTable_allocate_data
+ *
+ * Purpose: create new ipIfStatsTable_data.
+ */
+ipIfStatsTable_data *
+ipIfStatsTable_allocate_data(void)
+{
+    /*
+     * TODO:201:r: |-> allocate memory for the ipIfStatsTable data context.
+     */
+    ipIfStatsTable_data *rtn = SNMP_MALLOC_TYPEDEF(ipIfStatsTable_data);
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_allocate_data",
+                "called\n"));
+
+    if (NULL == rtn) {
+        snmp_log(LOG_ERR, "unable to malloc memory for new "
+                 "ipIfStatsTable_data.\n");
+    }
+
+    return rtn;
+}                               /* ipIfStatsTable_allocate_data */
+
+/*
+ * ipIfStatsTable_release_data
+ *
+ * Purpose: release ipIfStatsTable data.
+ */
+void
+ipIfStatsTable_release_data(ipIfStatsTable_data * data)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_release_data",
+                "called\n"));
+
+    /*
+     * TODO:202:r: |-> release memory for the ipIfStatsTable data context.
+     */
+    free(data);
+}                               /* ipIfStatsTable_release_data */
+
+
+
+/**
+ * set mib index(es)
+ *
+ * @param tbl_idx mib index structure
+ * @param ipIfStatsIPVersion_val
+ * @param ipIfStatsIfIndex_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
+ipIfStatsTable_indexes_set_tbl_idx(ipIfStatsTable_mib_index * tbl_idx,
+                                   u_long ipIfStatsIPVersion_val,
+                                   long ipIfStatsIfIndex_val)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_indexes_set_tbl_idx", "called\n"));
+
+    /*
+     * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h 
+     */
+    /** WARNING: this code might not work for netsnmp_ifstats_entry */
+    tbl_idx->ipIfStatsIPVersion = ipIfStatsIPVersion_val;
+
+    /*
+     * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H 
+     */
+    /** WARNING: this code might not work for netsnmp_ifstats_entry */
+    tbl_idx->ipIfStatsIfIndex = ipIfStatsIfIndex_val;
+
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_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
+ipIfStatsTable_indexes_set(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           u_long ipIfStatsIPVersion_val,
+                           long ipIfStatsIfIndex_val)
+{
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_indexes_set",
+                "called\n"));
+
+    if (MFD_SUCCESS !=
+        ipIfStatsTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
+                                           ipIfStatsIPVersion_val,
+                                           ipIfStatsIfIndex_val))
+        return MFD_ERROR;
+
+    /*
+     * convert mib index to oid index
+     */
+    rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+    if (0 != ipIfStatsTable_index_to_oid(&rowreq_ctx->oid_idx,
+                                         &rowreq_ctx->tbl_idx)) {
+        return MFD_ERROR;
+    }
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsTable_indexes_set */
+
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInReceives
+ * ipIfStatsInReceives is subid 3 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.3
+ * Description:
+The total number of input IP datagrams received, including
+            those received in error.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInReceives data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInReceives_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
+ipIfStatsInReceives_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsInReceives_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInReceives_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInReceives_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInReceives data.
+     * copy (* ipIfStatsInReceives_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES])
+        return MFD_SKIP;
+
+    (*ipIfStatsInReceives_val_ptr) =
+        rowreq_ctx->data->stats.HCInReceives.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInReceives_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInReceives
+ * ipIfStatsHCInReceives is subid 4 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.4
+ * Description:
+The total number of input IP datagrams received, including
+            those received in error.  This object counts the same
+            datagrams as ipIfStatsInReceives, but allows for larger
+            values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInReceives data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInReceives_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInReceives_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          U64 * ipIfStatsHCInReceives_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInReceives_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInReceives data.
+     * get (* ipIfStatsHCInReceives_val_ptr ).low and (* ipIfStatsHCInReceives_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInReceives_val_ptr).low =
+        rowreq_ctx->data->stats.HCInReceives.low;
+    (*ipIfStatsHCInReceives_val_ptr).high =
+        rowreq_ctx->data->stats.HCInReceives.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInReceives_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInOctets
+ * ipIfStatsInOctets is subid 5 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.5
+ * Description:
+The total number of octets received in input IP datagrams,
+            including those received in error.  Octets from datagrams
+            counted in ipIfStatsInReceives MUST be counted here.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInOctets_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
+ipIfStatsInOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                      u_long * ipIfStatsInOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInOctets_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInOctets_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInOctets data.
+     * copy (* ipIfStatsInOctets_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInOctets_val_ptr) =
+        rowreq_ctx->data->stats.HCInOctets.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInOctets
+ * ipIfStatsHCInOctets is subid 6 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.6
+ * Description:
+The total number of octets received in input IP datagrams,
+            including those received in error.  This object counts the
+            same octets as ipIfStatsInOctets, but allows for larger
+            values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInOctets_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        U64 * ipIfStatsHCInOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInOctets_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInOctets data.
+     * get (* ipIfStatsHCInOctets_val_ptr ).low and (* ipIfStatsHCInOctets_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInOctets_val_ptr).low =
+        rowreq_ctx->data->stats.HCInOctets.low;
+    (*ipIfStatsHCInOctets_val_ptr).high =
+        rowreq_ctx->data->stats.HCInOctets.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInHdrErrors
+ * ipIfStatsInHdrErrors is subid 7 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.7
+ * Description:
+The number of input IP datagrams discarded due to errors in
+            their IP headers, including version number mismatch, other
+            format errors, hop count exceeded, errors discovered in
+            processing their IP options, etc.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInHdrErrors data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInHdrErrors_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
+ipIfStatsInHdrErrors_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsInHdrErrors_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInHdrErrors_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInHdrErrors_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInHdrErrors data.
+     * copy (* ipIfStatsInHdrErrors_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INHDRERRORS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInHdrErrors_val_ptr) =
+        rowreq_ctx->data->stats.InHdrErrors;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInHdrErrors_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInNoRoutes
+ * ipIfStatsInNoRoutes is subid 8 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.8
+ * Description:
+The number of input IP datagrams discarded because no route
+            could be found to transmit them to their destination.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInNoRoutes data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInNoRoutes_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
+ipIfStatsInNoRoutes_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsInNoRoutes_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInNoRoutes_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInNoRoutes_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInNoRoutes data.
+     * copy (* ipIfStatsInNoRoutes_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINNOROUTES])
+        return MFD_SKIP;
+
+    (*ipIfStatsInNoRoutes_val_ptr) =
+        rowreq_ctx->data->stats.HCInNoRoutes.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInNoRoutes_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInAddrErrors
+ * ipIfStatsInAddrErrors is subid 9 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.9
+ * Description:
+The number of input IP datagrams discarded because the IP
+            address in their IP header's destination field was not a
+            valid address to be received at this entity.  This count
+            includes invalid addresses (e.g., ::0).  For entities that
+            are not IP routers and therefore do not forward datagrams,
+            this counter includes datagrams discarded because the
+            destination address was not a local address.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInAddrErrors data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInAddrErrors_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
+ipIfStatsInAddrErrors_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsInAddrErrors_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInAddrErrors_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInAddrErrors_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInAddrErrors data.
+     * copy (* ipIfStatsInAddrErrors_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INADDRERRORS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInAddrErrors_val_ptr) =
+        rowreq_ctx->data->stats.InAddrErrors;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInAddrErrors_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInUnknownProtos
+ * ipIfStatsInUnknownProtos is subid 10 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.10
+ * Description:
+The number of locally-addressed IP datagrams received
+            successfully but discarded because of an unknown or
+            unsupported protocol.
+
+            When tracking interface statistics, the counter of the
+            interface to which these datagrams were addressed is
+            incremented.  This interface might not be the same as the
+            input interface for some of the datagrams.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+
+
+
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInUnknownProtos data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInUnknownProtos_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
+ipIfStatsInUnknownProtos_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                             u_long * ipIfStatsInUnknownProtos_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInUnknownProtos_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInUnknownProtos_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInUnknownProtos data.
+     * copy (* ipIfStatsInUnknownProtos_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INUNKNOWNPROTOS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInUnknownProtos_val_ptr) =
+        rowreq_ctx->data->stats.InUnknownProtos;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInUnknownProtos_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInTruncatedPkts
+ * ipIfStatsInTruncatedPkts is subid 11 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.11
+ * Description:
+The number of input IP datagrams discarded because the
+            datagram frame didn't carry enough data.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInTruncatedPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInTruncatedPkts_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
+ipIfStatsInTruncatedPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                             u_long * ipIfStatsInTruncatedPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInTruncatedPkts_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInTruncatedPkts_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInTruncatedPkts data.
+     * copy (* ipIfStatsInTruncatedPkts_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INTRUNCATEDPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInTruncatedPkts_val_ptr) =
+        rowreq_ctx->data->stats.InTruncatedPkts;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInTruncatedPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInForwDatagrams
+ * ipIfStatsInForwDatagrams is subid 12 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.12
+ * Description:
+The number of input datagrams for which this entity was not
+            their final IP destination and for which this entity
+            attempted to find a route to forward them to that final
+            destination.  In entities that do not act as IP routers,
+            this counter will include only those datagrams that were
+            Source-Routed via this entity, and the Source-Route
+            processing was successful.
+
+            When tracking interface statistics, the counter of the
+            incoming interface is incremented for each datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInForwDatagrams data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInForwDatagrams_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
+ipIfStatsInForwDatagrams_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                             u_long * ipIfStatsInForwDatagrams_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInForwDatagrams_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInForwDatagrams_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInForwDatagrams data.
+     * copy (* ipIfStatsInForwDatagrams_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInForwDatagrams_val_ptr) =
+        rowreq_ctx->data->stats.HCInForwDatagrams.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInForwDatagrams_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInForwDatagrams
+ * ipIfStatsHCInForwDatagrams is subid 13 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.13
+ * Description:
+The number of input datagrams for which this entity was not
+            their final IP destination and for which this entity
+            attempted to find a route to forward them to that final
+            destination.  This object counts the same packets as
+
+
+
+            ipIfStatsInForwDatagrams, but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInForwDatagrams data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInForwDatagrams_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInForwDatagrams_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                               U64 * ipIfStatsHCInForwDatagrams_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInForwDatagrams_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInForwDatagrams data.
+     * get (* ipIfStatsHCInForwDatagrams_val_ptr ).low and (* ipIfStatsHCInForwDatagrams_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInForwDatagrams_val_ptr).low =
+        rowreq_ctx->data->stats.HCInForwDatagrams.low;
+    (*ipIfStatsHCInForwDatagrams_val_ptr).high =
+        rowreq_ctx->data->stats.HCInForwDatagrams.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInForwDatagrams_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsReasmReqds
+ * ipIfStatsReasmReqds is subid 14 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.14
+ * Description:
+The number of IP fragments received that needed to be
+            reassembled at this interface.
+
+            When tracking interface statistics, the counter of the
+            interface to which these fragments were addressed is
+            incremented.  This interface might not be the same as the
+            input interface for some of the fragments.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsReasmReqds data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsReasmReqds_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
+ipIfStatsReasmReqds_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsReasmReqds_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsReasmReqds_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsReasmReqds_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsReasmReqds data.
+     * copy (* ipIfStatsReasmReqds_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMREQDS])
+        return MFD_SKIP;
+
+    (*ipIfStatsReasmReqds_val_ptr) =
+        rowreq_ctx->data->stats.ReasmReqds;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsReasmReqds_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsReasmOKs
+ * ipIfStatsReasmOKs is subid 15 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.15
+ * Description:
+The number of IP datagrams successfully reassembled.
+
+            When tracking interface statistics, the counter of the
+            interface to which these datagrams were addressed is
+            incremented.  This interface might not be the same as the
+            input interface for some of the datagrams.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsReasmOKs data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsReasmOKs_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
+ipIfStatsReasmOKs_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                      u_long * ipIfStatsReasmOKs_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsReasmOKs_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsReasmOKs_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsReasmOKs data.
+     * copy (* ipIfStatsReasmOKs_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMOKS])
+        return MFD_SKIP;
+
+    (*ipIfStatsReasmOKs_val_ptr) =
+        rowreq_ctx->data->stats.ReasmOKs;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsReasmOKs_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsReasmFails
+ * ipIfStatsReasmFails is subid 16 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.16
+ * Description:
+The number of failures detected by the IP re-assembly
+            algorithm (for whatever reason: timed out, errors, etc.).
+            Note that this is not necessarily a count of discarded IP
+            fragments since some algorithms (notably the algorithm in
+            RFC 815) can lose track of the number of fragments by
+            combining them as they are received.
+
+            When tracking interface statistics, the counter of the
+            interface to which these fragments were addressed is
+            incremented.  This interface might not be the same as the
+            input interface for some of the fragments.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsReasmFails data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsReasmFails_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
+ipIfStatsReasmFails_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsReasmFails_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsReasmFails_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsReasmFails_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsReasmFails data.
+     * copy (* ipIfStatsReasmFails_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMFAILS])
+        return MFD_SKIP;
+
+    (*ipIfStatsReasmFails_val_ptr) =
+        rowreq_ctx->data->stats.ReasmFails;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsReasmFails_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInDiscards
+ * ipIfStatsInDiscards is subid 17 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.17
+ * Description:
+The number of input IP datagrams for which no problems were
+            encountered to prevent their continued processing, but
+            were discarded (e.g., for lack of buffer space).  Note that
+            this counter does not include any datagrams discarded while
+            awaiting re-assembly.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInDiscards data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInDiscards_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
+ipIfStatsInDiscards_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsInDiscards_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInDiscards_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInDiscards_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInDiscards data.
+     * copy (* ipIfStatsInDiscards_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INDISCARDS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInDiscards_val_ptr) =
+        rowreq_ctx->data->stats.InDiscards;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInDiscards_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInDelivers
+ * ipIfStatsInDelivers is subid 18 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.18
+ * Description:
+The total number of datagrams successfully delivered to IP
+            user-protocols (including ICMP).
+
+            When tracking interface statistics, the counter of the
+            interface to which these datagrams were addressed is
+            incremented.  This interface might not be the same as the
+
+
+
+            input interface for some of the datagrams.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInDelivers data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInDelivers_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
+ipIfStatsInDelivers_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsInDelivers_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInDelivers_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInDelivers_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInDelivers data.
+     * copy (* ipIfStatsInDelivers_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInDelivers_val_ptr) =
+        rowreq_ctx->data->stats.HCInDelivers.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInDelivers_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInDelivers
+ * ipIfStatsHCInDelivers is subid 19 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.19
+ * Description:
+The total number of datagrams successfully delivered to IP
+            user-protocols (including ICMP).  This object counts the
+            same packets as ipIfStatsInDelivers, but allows for larger
+            values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInDelivers data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInDelivers_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInDelivers_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          U64 * ipIfStatsHCInDelivers_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInDelivers_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInDelivers data.
+     * get (* ipIfStatsHCInDelivers_val_ptr ).low and (* ipIfStatsHCInDelivers_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInDelivers_val_ptr).low =
+        rowreq_ctx->data->stats.HCInDelivers.low;
+    (*ipIfStatsHCInDelivers_val_ptr).high =
+        rowreq_ctx->data->stats.HCInDelivers.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInDelivers_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutRequests
+ * ipIfStatsOutRequests is subid 20 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.20
+ * Description:
+The total number of IP datagrams that local IP user-
+            protocols (including ICMP) supplied to IP in requests for
+            transmission.  Note that this counter does not include any
+            datagrams counted in ipIfStatsOutForwDatagrams.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutRequests data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutRequests_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
+ipIfStatsOutRequests_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsOutRequests_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutRequests_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutRequests_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutRequests data.
+     * copy (* ipIfStatsOutRequests_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutRequests_val_ptr) =
+        rowreq_ctx->data->stats.HCOutRequests.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutRequests_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutRequests
+ * ipIfStatsHCOutRequests is subid 21 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.21
+ * Description:
+The total number of IP datagrams that local IP user-
+            protocols (including ICMP) supplied to IP in requests for
+            transmission.  This object counts the same packets as
+
+
+
+            ipIfStatsOutRequests, but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutRequests data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutRequests_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutRequests_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           U64 * ipIfStatsHCOutRequests_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutRequests_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutRequests data.
+     * get (* ipIfStatsHCOutRequests_val_ptr ).low and (* ipIfStatsHCOutRequests_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutRequests_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutRequests.low;
+    (*ipIfStatsHCOutRequests_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutRequests.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutRequests_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutForwDatagrams
+ * ipIfStatsOutForwDatagrams is subid 23 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.23
+ * Description:
+The number of datagrams for which this entity was not their
+            final IP destination and for which it was successful in
+            finding a path to their final destination.  In entities
+            that do not act as IP routers, this counter will include
+            only those datagrams that were Source-Routed via this
+            entity, and the Source-Route processing was successful.
+
+            When tracking interface statistics, the counter of the
+            outgoing interface is incremented for a successfully
+            forwarded datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutForwDatagrams data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutForwDatagrams_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
+ipIfStatsOutForwDatagrams_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                              u_long * ipIfStatsOutForwDatagrams_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutForwDatagrams_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutForwDatagrams_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutForwDatagrams data.
+     * copy (* ipIfStatsOutForwDatagrams_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutForwDatagrams_val_ptr) =
+        rowreq_ctx->data->stats.HCOutForwDatagrams.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutForwDatagrams_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutForwDatagrams
+ * ipIfStatsHCOutForwDatagrams is subid 24 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.24
+ * Description:
+The number of datagrams for which this entity was not their
+            final IP destination and for which it was successful in
+            finding a path to their final destination.  This object
+            counts the same packets as ipIfStatsOutForwDatagrams, but
+            allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+
+
+
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutForwDatagrams data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutForwDatagrams_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutForwDatagrams_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                                U64 * ipIfStatsHCOutForwDatagrams_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutForwDatagrams_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutForwDatagrams data.
+     * get (* ipIfStatsHCOutForwDatagrams_val_ptr ).low and (* ipIfStatsHCOutForwDatagrams_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutForwDatagrams_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutForwDatagrams.low;
+    (*ipIfStatsHCOutForwDatagrams_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutForwDatagrams.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutForwDatagrams_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutDiscards
+ * ipIfStatsOutDiscards is subid 25 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.25
+ * Description:
+The number of output IP datagrams for which no problem was
+            encountered to prevent their transmission to their
+            destination, but were discarded (e.g., for lack of
+            buffer space).  Note that this counter would include
+            datagrams counted in ipIfStatsOutForwDatagrams if any such
+            datagrams met this (discretionary) discard criterion.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutDiscards data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutDiscards_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
+ipIfStatsOutDiscards_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsOutDiscards_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutDiscards_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutDiscards_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutDiscards data.
+     * copy (* ipIfStatsOutDiscards_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTDISCARDS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutDiscards_val_ptr) =
+        rowreq_ctx->data->stats.HCOutDiscards.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutDiscards_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutFragReqds
+ * ipIfStatsOutFragReqds is subid 26 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.26
+ * Description:
+The number of IP datagrams that would require fragmentation
+            in order to be transmitted.
+
+            When tracking interface statistics, the counter of the
+            outgoing interface is incremented for a successfully
+            fragmented datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutFragReqds data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutFragReqds_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
+ipIfStatsOutFragReqds_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsOutFragReqds_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutFragReqds_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutFragReqds_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutFragReqds data.
+     * copy (* ipIfStatsOutFragReqds_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutFragReqds_val_ptr) =
+        rowreq_ctx->data->stats.HCOutFragReqds.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutFragReqds_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutFragOKs
+ * ipIfStatsOutFragOKs is subid 27 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.27
+ * Description:
+The number of IP datagrams that have been successfully
+            fragmented.
+
+            When tracking interface statistics, the counter of the
+
+
+
+            outgoing interface is incremented for a successfully
+            fragmented datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutFragOKs data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutFragOKs_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
+ipIfStatsOutFragOKs_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                        u_long * ipIfStatsOutFragOKs_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutFragOKs_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutFragOKs_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutFragOKs data.
+     * copy (* ipIfStatsOutFragOKs_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGOKS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutFragOKs_val_ptr) =
+        rowreq_ctx->data->stats.HCOutFragOKs.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutFragOKs_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutFragFails
+ * ipIfStatsOutFragFails is subid 28 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.28
+ * Description:
+The number of IP datagrams that have been discarded because
+            they needed to be fragmented but could not be.  This
+            includes IPv4 packets that have the DF bit set and IPv6
+            packets that are being forwarded and exceed the outgoing
+            link MTU.
+
+            When tracking interface statistics, the counter of the
+            outgoing interface is incremented for an unsuccessfully
+            fragmented datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutFragFails data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutFragFails_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
+ipIfStatsOutFragFails_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsOutFragFails_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutFragFails_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutFragFails_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutFragFails data.
+     * copy (* ipIfStatsOutFragFails_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutFragFails_val_ptr) =
+        rowreq_ctx->data->stats.HCOutFragFails.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutFragFails_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutFragCreates
+ * ipIfStatsOutFragCreates is subid 29 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.29
+ * Description:
+The number of output datagram fragments that have been
+            generated as a result of IP fragmentation.
+
+            When tracking interface statistics, the counter of the
+            outgoing interface is incremented for a successfully
+            fragmented datagram.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutFragCreates data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutFragCreates_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
+ipIfStatsOutFragCreates_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                            u_long * ipIfStatsOutFragCreates_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutFragCreates_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutFragCreates_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutFragCreates data.
+     * copy (* ipIfStatsOutFragCreates_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutFragCreates_val_ptr) =
+        rowreq_ctx->data->stats.HCOutFragCreates.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutFragCreates_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutTransmits
+ * ipIfStatsOutTransmits is subid 30 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.30
+ * Description:
+The total number of IP datagrams that this entity supplied
+            to the lower layers for transmission.  This includes
+            datagrams generated locally and those forwarded by this
+            entity.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutTransmits data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutTransmits_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
+ipIfStatsOutTransmits_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsOutTransmits_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutTransmits_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutTransmits_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutTransmits data.
+     * copy (* ipIfStatsOutTransmits_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutTransmits_val_ptr) =
+        rowreq_ctx->data->stats.HCOutTransmits.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutTransmits_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutTransmits
+ * ipIfStatsHCOutTransmits is subid 31 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.31
+ * Description:
+The total number of IP datagrams that this entity supplied
+            to the lower layers for transmission.  This object counts
+            the same datagrams as ipIfStatsOutTransmits, but allows for
+            larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutTransmits data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutTransmits_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutTransmits_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                            U64 * ipIfStatsHCOutTransmits_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutTransmits_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutTransmits data.
+     * get (* ipIfStatsHCOutTransmits_val_ptr ).low and (* ipIfStatsHCOutTransmits_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutTransmits_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutTransmits.low;
+    (*ipIfStatsHCOutTransmits_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutTransmits.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutTransmits_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutOctets
+ * ipIfStatsOutOctets is subid 32 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.32
+ * Description:
+The total number of octets in IP datagrams delivered to the
+            lower layers for transmission.  Octets from datagrams
+            counted in ipIfStatsOutTransmits MUST be counted here.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutOctets_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
+ipIfStatsOutOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                       u_long * ipIfStatsOutOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutOctets_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutOctets_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutOctets data.
+     * copy (* ipIfStatsOutOctets_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutOctets_val_ptr) =
+        rowreq_ctx->data->stats.HCOutOctets.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutOctets
+ * ipIfStatsHCOutOctets is subid 33 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.33
+ * Description:
+The total number of octets in IP datagrams delivered to the
+            lower layers for transmission.  This objects counts the same
+            octets as ipIfStatsOutOctets, but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutOctets_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         U64 * ipIfStatsHCOutOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutOctets_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutOctets data.
+     * get (* ipIfStatsHCOutOctets_val_ptr ).low and (* ipIfStatsHCOutOctets_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutOctets_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutOctets.low;
+    (*ipIfStatsHCOutOctets_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutOctets.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInMcastPkts
+ * ipIfStatsInMcastPkts is subid 34 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.34
+ * Description:
+The number of IP multicast datagrams received.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInMcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInMcastPkts_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
+ipIfStatsInMcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsInMcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInMcastPkts_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInMcastPkts_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInMcastPkts data.
+     * copy (* ipIfStatsInMcastPkts_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInMcastPkts_val_ptr) =
+        rowreq_ctx->data->stats.HCInMcastPkts.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInMcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInMcastPkts
+ * ipIfStatsHCInMcastPkts is subid 35 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.35
+ * Description:
+The number of IP multicast datagrams received.  This object
+            counts the same datagrams as ipIfStatsInMcastPkts, but
+            allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInMcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInMcastPkts_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInMcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           U64 * ipIfStatsHCInMcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInMcastPkts_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInMcastPkts data.
+     * get (* ipIfStatsHCInMcastPkts_val_ptr ).low and (* ipIfStatsHCInMcastPkts_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInMcastPkts_val_ptr).low =
+        rowreq_ctx->data->stats.HCInMcastPkts.low;
+    (*ipIfStatsHCInMcastPkts_val_ptr).high =
+        rowreq_ctx->data->stats.HCInMcastPkts.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInMcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInMcastOctets
+ * ipIfStatsInMcastOctets is subid 36 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.36
+ * Description:
+The total number of octets received in IP multicast
+
+
+
+            datagrams.  Octets from datagrams counted in
+            ipIfStatsInMcastPkts MUST be counted here.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInMcastOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInMcastOctets_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
+ipIfStatsInMcastOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           u_long * ipIfStatsInMcastOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInMcastOctets_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInMcastOctets_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInMcastOctets data.
+     * copy (* ipIfStatsInMcastOctets_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInMcastOctets_val_ptr) =
+                rowreq_ctx->data->stats.HCInMcastOctets.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInMcastOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInMcastOctets
+ * ipIfStatsHCInMcastOctets is subid 37 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.37
+ * Description:
+The total number of octets received in IP multicast
+            datagrams.  This object counts the same octets as
+            ipIfStatsInMcastOctets, but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInMcastOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInMcastOctets_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInMcastOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                             U64 * ipIfStatsHCInMcastOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInMcastOctets_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInMcastOctets data.
+     * get (* ipIfStatsHCInMcastOctets_val_ptr ).low and (* ipIfStatsHCInMcastOctets_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInMcastOctets_val_ptr).low =
+        rowreq_ctx->data->stats.HCInMcastOctets.low;
+    (*ipIfStatsHCInMcastOctets_val_ptr).high =
+        rowreq_ctx->data->stats.HCInMcastOctets.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInMcastOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutMcastPkts
+ * ipIfStatsOutMcastPkts is subid 38 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.38
+ * Description:
+The number of IP multicast datagrams transmitted.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutMcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutMcastPkts_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
+ipIfStatsOutMcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsOutMcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutMcastPkts_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutMcastPkts_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutMcastPkts data.
+     * copy (* ipIfStatsOutMcastPkts_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutMcastPkts_val_ptr) =
+        rowreq_ctx->data->stats.HCOutMcastPkts.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutMcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutMcastPkts
+ * ipIfStatsHCOutMcastPkts is subid 39 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.39
+ * Description:
+The number of IP multicast datagrams transmitted.  This
+            object counts the same datagrams as ipIfStatsOutMcastPkts,
+            but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+
+
+
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutMcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutMcastPkts_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutMcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                            U64 * ipIfStatsHCOutMcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutMcastPkts_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutMcastPkts data.
+     * get (* ipIfStatsHCOutMcastPkts_val_ptr ).low and (* ipIfStatsHCOutMcastPkts_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutMcastPkts_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutMcastPkts.low;
+    (*ipIfStatsHCOutMcastPkts_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutMcastPkts.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutMcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutMcastOctets
+ * ipIfStatsOutMcastOctets is subid 40 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.40
+ * Description:
+The total number of octets transmitted in IP multicast
+            datagrams.  Octets from datagrams counted in
+            ipIfStatsOutMcastPkts MUST be counted here.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutMcastOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutMcastOctets_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
+ipIfStatsOutMcastOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                            u_long * ipIfStatsOutMcastOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutMcastOctets_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutMcastOctets_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutMcastOctets data.
+     * copy (* ipIfStatsOutMcastOctets_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutMcastOctets_val_ptr) =
+        rowreq_ctx->data->stats.HCOutMcastOctets.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutMcastOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutMcastOctets
+ * ipIfStatsHCOutMcastOctets is subid 41 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.41
+ * Description:
+The total number of octets transmitted in IP multicast
+            datagrams.  This object counts the same octets as
+            ipIfStatsOutMcastOctets, but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutMcastOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutMcastOctets_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutMcastOctets_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                              U64 * ipIfStatsHCOutMcastOctets_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutMcastOctets_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutMcastOctets data.
+     * get (* ipIfStatsHCOutMcastOctets_val_ptr ).low and (* ipIfStatsHCOutMcastOctets_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTOCTETS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutMcastOctets_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutMcastOctets.low;
+    (*ipIfStatsHCOutMcastOctets_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutMcastOctets.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutMcastOctets_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsInBcastPkts
+ * ipIfStatsInBcastPkts is subid 42 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.42
+ * Description:
+The number of IP broadcast datagrams received.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsInBcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsInBcastPkts_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
+ipIfStatsInBcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsInBcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsInBcastPkts_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsInBcastPkts_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsInBcastPkts data.
+     * copy (* ipIfStatsInBcastPkts_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINBCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsInBcastPkts_val_ptr) =
+        rowreq_ctx->data->stats.HCInBcastPkts.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsInBcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCInBcastPkts
+ * ipIfStatsHCInBcastPkts is subid 43 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.43
+ * Description:
+The number of IP broadcast datagrams received.  This object
+            counts the same datagrams as ipIfStatsInBcastPkts, but
+            allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCInBcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCInBcastPkts_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCInBcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           U64 * ipIfStatsHCInBcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCInBcastPkts_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCInBcastPkts data.
+     * get (* ipIfStatsHCInBcastPkts_val_ptr ).low and (* ipIfStatsHCInBcastPkts_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINBCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCInBcastPkts_val_ptr).low =
+        rowreq_ctx->data->stats.HCInBcastPkts.low;
+    (*ipIfStatsHCInBcastPkts_val_ptr).high =
+        rowreq_ctx->data->stats.HCInBcastPkts.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCInBcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsOutBcastPkts
+ * ipIfStatsOutBcastPkts is subid 44 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.44
+ * Description:
+The number of IP broadcast datagrams transmitted.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * 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 ipIfStatsOutBcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsOutBcastPkts_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
+ipIfStatsOutBcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                          u_long * ipIfStatsOutBcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsOutBcastPkts_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsOutBcastPkts_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsOutBcastPkts data.
+     * copy (* ipIfStatsOutBcastPkts_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsOutBcastPkts_val_ptr) =
+        rowreq_ctx->data->stats.HCOutBcastPkts.low;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsOutBcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsHCOutBcastPkts
+ * ipIfStatsHCOutBcastPkts is subid 45 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.45
+ * Description:
+The number of IP broadcast datagrams transmitted.  This
+            object counts the same datagrams as ipIfStatsOutBcastPkts,
+            but allows for larger values.
+
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of
+            ipIfStatsDiscontinuityTime.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is COUNTER64 (based on perltype COUNTER64)
+ * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
+ */
+/**
+ * Extract the current value of the ipIfStatsHCOutBcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsHCOutBcastPkts_val_ptr
+ *        Pointer to storage for a U64 variable
+ *
+ * @retval MFD_SUCCESS         : success
+ * @retval MFD_SKIP            : skip this node (no value for now)
+ * @retval MFD_ERROR           : Any other error
+ */
+int
+ipIfStatsHCOutBcastPkts_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                            U64 * ipIfStatsHCOutBcastPkts_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsHCOutBcastPkts_val_ptr);
+
+    /*
+     * TODO:231:o: |-> copy ipIfStatsHCOutBcastPkts data.
+     * get (* ipIfStatsHCOutBcastPkts_val_ptr ).low and (* ipIfStatsHCOutBcastPkts_val_ptr ).high from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS])
+        return MFD_SKIP;
+
+    (*ipIfStatsHCOutBcastPkts_val_ptr).low =
+        rowreq_ctx->data->stats.HCOutBcastPkts.low;
+    (*ipIfStatsHCOutBcastPkts_val_ptr).high =
+        rowreq_ctx->data->stats.HCOutBcastPkts.high;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsHCOutBcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsDiscontinuityTime
+ * ipIfStatsDiscontinuityTime is subid 46 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.46
+ * Description:
+The value of sysUpTime on the most recent occasion at which
+
+
+
+            any one or more of this entry's counters suffered a
+            discontinuity.
+
+            If no such discontinuities have occurred since the last re-
+            initialization of the local management subsystem, then this
+            object contains a zero value.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is TimeStamp (based on perltype TICKS)
+ * The net-snmp type is ASN_TIMETICKS. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ipIfStatsDiscontinuityTime data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsDiscontinuityTime_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
+ipIfStatsDiscontinuityTime_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                               u_long * ipIfStatsDiscontinuityTime_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsDiscontinuityTime_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsDiscontinuityTime_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsDiscontinuityTime data.
+     * copy (* ipIfStatsDiscontinuityTime_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_DISCONTINUITYTIME])
+        return MFD_SKIP;
+
+    (*ipIfStatsDiscontinuityTime_val_ptr) =
+        rowreq_ctx->ipIfStatsDiscontinuityTime;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsDiscontinuityTime_get */
+
+/*---------------------------------------------------------------------
+ * IP-MIB::ipIfStatsEntry.ipIfStatsRefreshRate
+ * ipIfStatsRefreshRate is subid 47 of ipIfStatsEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.4.31.3.1.47
+ * Description:
+The minimum reasonable polling interval for this entry.
+            This object provides an indication of the minimum amount of
+            time required to update the counters in this entry.
+ *
+ * Attributes:
+ *   accessible 1     isscalar 0     enums  0      hasdefval 0
+ *   readable   1     iscolumn 1     ranges 0      hashint   0
+ *   settable   0
+ *
+ *
+ * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
+ * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ipIfStatsRefreshRate data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ *        Pointer to the row request context.
+ * @param ipIfStatsRefreshRate_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
+ipIfStatsRefreshRate_get(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                         u_long * ipIfStatsRefreshRate_val_ptr)
+{
+   /** we should have a non-NULL pointer */
+    netsnmp_assert(NULL != ipIfStatsRefreshRate_val_ptr);
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsRefreshRate_get",
+                "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    /*
+     * TODO:231:o: |-> Extract the current value of the ipIfStatsRefreshRate data.
+     * copy (* ipIfStatsRefreshRate_val_ptr ) from rowreq_ctx->data
+     */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REFRESHRATE])
+        return MFD_SKIP;
+
+    (*ipIfStatsRefreshRate_val_ptr) =
+        rowreq_ctx->ipIfStatsRefreshRate;
+
+    return MFD_SUCCESS;
+}                               /* ipIfStatsRefreshRate_get */
+
+
+
+/** @} */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.h
new file mode 100644
index 0000000..0cc7e47
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_data_get.h
@@ -0,0 +1,246 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 12088 $ of $
+ *
+ * $Id:$
+ *
+ * @file ipIfStatsTable_data_get.h
+ *
+ * @addtogroup get
+ *
+ * Prototypes for get functions
+ *
+ * @{
+ */
+#ifndef IPIFSTATSTABLE_DATA_GET_H
+#define IPIFSTATSTABLE_DATA_GET_H
+
+#ifdef __cplusplus
+extern          "C" {
+#endif
+
+    /*
+     *********************************************************************
+     * GET function declarations
+     */
+
+    /*
+     *********************************************************************
+     * GET Table declarations
+     */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+    /*
+     * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+     * Its status is Current.
+     * OID: .1.3.6.1.2.1.4.31.3, length: 9
+     */
+    /*
+     * indexes
+     */
+
+    int             ipIfStatsInReceives_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsInReceives_val_ptr);
+    int             ipIfStatsHCInReceives_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              U64 *
+                                              ipIfStatsHCInReceives_val_ptr);
+    int             ipIfStatsInOctets_get(ipIfStatsTable_rowreq_ctx *
+                                          rowreq_ctx,
+                                          u_long *
+                                          ipIfStatsInOctets_val_ptr);
+    int             ipIfStatsHCInOctets_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            U64 *
+                                            ipIfStatsHCInOctets_val_ptr);
+    int             ipIfStatsInHdrErrors_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsInHdrErrors_val_ptr);
+    int             ipIfStatsInNoRoutes_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsInNoRoutes_val_ptr);
+    int             ipIfStatsInAddrErrors_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsInAddrErrors_val_ptr);
+    int             ipIfStatsInUnknownProtos_get(ipIfStatsTable_rowreq_ctx
+                                                 * rowreq_ctx,
+                                                 u_long *
+                                                 ipIfStatsInUnknownProtos_val_ptr);
+    int             ipIfStatsInTruncatedPkts_get(ipIfStatsTable_rowreq_ctx
+                                                 * rowreq_ctx,
+                                                 u_long *
+                                                 ipIfStatsInTruncatedPkts_val_ptr);
+    int             ipIfStatsInForwDatagrams_get(ipIfStatsTable_rowreq_ctx
+                                                 * rowreq_ctx,
+                                                 u_long *
+                                                 ipIfStatsInForwDatagrams_val_ptr);
+    int            
+        ipIfStatsHCInForwDatagrams_get(ipIfStatsTable_rowreq_ctx *
+                                       rowreq_ctx,
+                                       U64 *
+                                       ipIfStatsHCInForwDatagrams_val_ptr);
+    int             ipIfStatsReasmReqds_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsReasmReqds_val_ptr);
+    int             ipIfStatsReasmOKs_get(ipIfStatsTable_rowreq_ctx *
+                                          rowreq_ctx,
+                                          u_long *
+                                          ipIfStatsReasmOKs_val_ptr);
+    int             ipIfStatsReasmFails_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsReasmFails_val_ptr);
+    int             ipIfStatsInDiscards_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsInDiscards_val_ptr);
+    int             ipIfStatsInDelivers_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsInDelivers_val_ptr);
+    int             ipIfStatsHCInDelivers_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              U64 *
+                                              ipIfStatsHCInDelivers_val_ptr);
+    int             ipIfStatsOutRequests_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsOutRequests_val_ptr);
+    int             ipIfStatsHCOutRequests_get(ipIfStatsTable_rowreq_ctx *
+                                               rowreq_ctx,
+                                               U64 *
+                                               ipIfStatsHCOutRequests_val_ptr);
+    int             ipIfStatsOutForwDatagrams_get(ipIfStatsTable_rowreq_ctx
+                                                  * rowreq_ctx,
+                                                  u_long *
+                                                  ipIfStatsOutForwDatagrams_val_ptr);
+    int            
+        ipIfStatsHCOutForwDatagrams_get(ipIfStatsTable_rowreq_ctx *
+                                        rowreq_ctx,
+                                        U64 *
+                                        ipIfStatsHCOutForwDatagrams_val_ptr);
+    int             ipIfStatsOutDiscards_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsOutDiscards_val_ptr);
+    int             ipIfStatsOutFragReqds_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsOutFragReqds_val_ptr);
+    int             ipIfStatsOutFragOKs_get(ipIfStatsTable_rowreq_ctx *
+                                            rowreq_ctx,
+                                            u_long *
+                                            ipIfStatsOutFragOKs_val_ptr);
+    int             ipIfStatsOutFragFails_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsOutFragFails_val_ptr);
+    int             ipIfStatsOutFragCreates_get(ipIfStatsTable_rowreq_ctx *
+                                                rowreq_ctx,
+                                                u_long *
+                                                ipIfStatsOutFragCreates_val_ptr);
+    int             ipIfStatsOutTransmits_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsOutTransmits_val_ptr);
+    int             ipIfStatsHCOutTransmits_get(ipIfStatsTable_rowreq_ctx *
+                                                rowreq_ctx,
+                                                U64 *
+                                                ipIfStatsHCOutTransmits_val_ptr);
+    int             ipIfStatsOutOctets_get(ipIfStatsTable_rowreq_ctx *
+                                           rowreq_ctx,
+                                           u_long *
+                                           ipIfStatsOutOctets_val_ptr);
+    int             ipIfStatsHCOutOctets_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             U64 *
+                                             ipIfStatsHCOutOctets_val_ptr);
+    int             ipIfStatsInMcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsInMcastPkts_val_ptr);
+    int             ipIfStatsHCInMcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                               rowreq_ctx,
+                                               U64 *
+                                               ipIfStatsHCInMcastPkts_val_ptr);
+    int             ipIfStatsInMcastOctets_get(ipIfStatsTable_rowreq_ctx *
+                                               rowreq_ctx,
+                                               u_long *
+                                               ipIfStatsInMcastOctets_val_ptr);
+    int             ipIfStatsHCInMcastOctets_get(ipIfStatsTable_rowreq_ctx
+                                                 * rowreq_ctx,
+                                                 U64 *
+                                                 ipIfStatsHCInMcastOctets_val_ptr);
+    int             ipIfStatsOutMcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsOutMcastPkts_val_ptr);
+    int             ipIfStatsHCOutMcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                                rowreq_ctx,
+                                                U64 *
+                                                ipIfStatsHCOutMcastPkts_val_ptr);
+    int             ipIfStatsOutMcastOctets_get(ipIfStatsTable_rowreq_ctx *
+                                                rowreq_ctx,
+                                                u_long *
+                                                ipIfStatsOutMcastOctets_val_ptr);
+    int             ipIfStatsHCOutMcastOctets_get(ipIfStatsTable_rowreq_ctx
+                                                  * rowreq_ctx,
+                                                  U64 *
+                                                  ipIfStatsHCOutMcastOctets_val_ptr);
+    int             ipIfStatsInBcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsInBcastPkts_val_ptr);
+    int             ipIfStatsHCInBcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                               rowreq_ctx,
+                                               U64 *
+                                               ipIfStatsHCInBcastPkts_val_ptr);
+    int             ipIfStatsOutBcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                              rowreq_ctx,
+                                              u_long *
+                                              ipIfStatsOutBcastPkts_val_ptr);
+    int             ipIfStatsHCOutBcastPkts_get(ipIfStatsTable_rowreq_ctx *
+                                                rowreq_ctx,
+                                                U64 *
+                                                ipIfStatsHCOutBcastPkts_val_ptr);
+    int            
+        ipIfStatsDiscontinuityTime_get(ipIfStatsTable_rowreq_ctx *
+                                       rowreq_ctx,
+                                       u_long *
+                                       ipIfStatsDiscontinuityTime_val_ptr);
+    int             ipIfStatsRefreshRate_get(ipIfStatsTable_rowreq_ctx *
+                                             rowreq_ctx,
+                                             u_long *
+                                             ipIfStatsRefreshRate_val_ptr);
+
+
+    int            
+        ipIfStatsTable_indexes_set_tbl_idx(ipIfStatsTable_mib_index *
+                                           tbl_idx,
+                                           u_long ipIfStatsIPVersion_val,
+                                           long ipIfStatsIfIndex_val);
+    int             ipIfStatsTable_indexes_set(ipIfStatsTable_rowreq_ctx *
+                                               rowreq_ctx,
+                                               u_long
+                                               ipIfStatsIPVersion_val,
+                                               long ipIfStatsIfIndex_val);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_DATA_GET_H */
+/** @} */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_enums.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_enums.h
new file mode 100644
index 0000000..c3657d5
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_enums.h
@@ -0,0 +1,56 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *  : generic-table-enums.m2c 12526 2005-07-15 22:41:16Z rstory $
+ *
+ * $Id:$
+ */
+#ifndef IPIFSTATSTABLE_ENUMS_H
+#define IPIFSTATSTABLE_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 ipIfStatsTable
+ *
+ *************************************************************************
+ *************************************************************************/
+
+/*************************************************************
+ * constants for enums for the MIB node
+ * ipIfStatsIPVersion (InetVersion / ASN_INTEGER)
+ *
+ * since a Textual Convention may be referenced more than once in a
+ * MIB, protect againt redefinitions of the enum values.
+ */
+#ifndef INETVERSION_ENUMS
+#define INETVERSION_ENUMS
+
+#define INETVERSION_UNKNOWN  0
+#define INETVERSION_IPV4  1
+#define INETVERSION_IPV6  2
+
+#endif                          /* INETVERSION_ENUMS */
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_ENUMS_H */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.c b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.c
new file mode 100644
index 0000000..d415a83
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.c
@@ -0,0 +1,1395 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 15899 $ 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-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+/*
+ * include our parent header 
+ */
+#include "ipIfStatsTable.h"
+
+
+#include <net-snmp/agent/table_container.h>
+#include <net-snmp/library/container.h>
+
+#include "ipIfStatsTable_interface.h"
+
+#include <ctype.h>
+
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ipIfStatsTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * IP-MIB::ipIfStatsTable is subid 3 of ipTrafficStats.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.4.31.3, length: 9
+ */
+typedef struct ipIfStatsTable_interface_ctx_s {
+
+    netsnmp_container *container;
+    netsnmp_cache  *cache;
+
+    ipIfStatsTable_registration *user_ctx;
+
+    netsnmp_table_registration_info tbl_info;
+
+    netsnmp_baby_steps_access_methods access_multiplexer;
+
+    u_long last_changed;
+
+} ipIfStatsTable_interface_ctx;
+
+static ipIfStatsTable_interface_ctx ipIfStatsTable_if_ctx;
+
+static void     _ipIfStatsTable_container_init(ipIfStatsTable_interface_ctx
+                                               * if_ctx);
+static void    
+_ipIfStatsTable_container_shutdown(ipIfStatsTable_interface_ctx * if_ctx);
+
+
+netsnmp_container *
+ipIfStatsTable_container_get(void)
+{
+    return ipIfStatsTable_if_ctx.container;
+}
+
+ipIfStatsTable_registration *
+ipIfStatsTable_registration_get(void)
+{
+    return ipIfStatsTable_if_ctx.user_ctx;
+}
+
+ipIfStatsTable_registration *
+ipIfStatsTable_registration_set(ipIfStatsTable_registration * newreg)
+{
+    ipIfStatsTable_registration *old = ipIfStatsTable_if_ctx.user_ctx;
+    ipIfStatsTable_if_ctx.user_ctx = newreg;
+    return old;
+}
+
+int
+ipIfStatsTable_container_size(void)
+{
+    return CONTAINER_SIZE(ipIfStatsTable_if_ctx.container);
+}
+
+/*
+ * ipIfStatsTableLastChanged, which is the last time that a row in
+ * the table was changed or the last time a row was added/deleted from the
+ * table.
+ */
+void
+ipIfStatsTable_lastChange_set(u_long table_changed)
+{
+    DEBUGMSGTL(("ipIfStatsTable:lastChanged_set",
+                "called. was %ld, now %ld\n",
+                ipIfStatsTable_if_ctx.last_changed, table_changed));
+    ipIfStatsTable_if_ctx.last_changed = table_changed;
+}
+
+/*
+ * mfd multiplexer modes
+ */
+static Netsnmp_Node_Handler _mfd_ipIfStatsTable_pre_request;
+static Netsnmp_Node_Handler _mfd_ipIfStatsTable_post_request;
+static Netsnmp_Node_Handler _mfd_ipIfStatsTable_object_lookup;
+static Netsnmp_Node_Handler _mfd_ipIfStatsTable_get_values;
+/**
+ * @internal
+ * Initialize the table ipIfStatsTable 
+ *    (Define its contents and how it's structured)
+ */
+void
+_ipIfStatsTable_initialize_interface(ipIfStatsTable_registration * reg_ptr,
+                                     u_long flags)
+{
+    netsnmp_baby_steps_access_methods *access_multiplexer =
+        &ipIfStatsTable_if_ctx.access_multiplexer;
+    netsnmp_table_registration_info *tbl_info =
+        &ipIfStatsTable_if_ctx.tbl_info;
+    netsnmp_handler_registration *reginfo;
+    netsnmp_mib_handler *handler;
+    int             mfd_modes = 0;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_ipIfStatsTable_initialize_interface", "called\n"));
+
+
+    /*************************************************
+     *
+     * save interface context for ipIfStatsTable
+     */
+    /*
+     * Setting up the table's definition
+     */
+    netsnmp_table_helper_add_indexes(tbl_info, ASN_INTEGER,
+                                               /** index: ipIfStatsIPVersion */
+                                     ASN_INTEGER,
+                                               /** index: ipIfStatsIfIndex */
+                                     0);
+
+    /*
+     * Define the minimum and maximum accessible columns.  This
+     * optimizes retrival. 
+     */
+    tbl_info->min_column = IPIFSTATSTABLE_MIN_COL;
+    tbl_info->max_column = IPIFSTATSTABLE_MAX_COL;
+
+    /*
+     * save users context
+     */
+    ipIfStatsTable_if_ctx.user_ctx = reg_ptr;
+
+    /*
+     * call data access initialization code
+     */
+    ipIfStatsTable_init_data(reg_ptr);
+
+    /*
+     * set up the container
+     */
+    _ipIfStatsTable_container_init(&ipIfStatsTable_if_ctx);
+    if (NULL == ipIfStatsTable_if_ctx.container) {
+        snmp_log(LOG_ERR,
+                 "could not initialize container for ipIfStatsTable\n");
+        return;
+    }
+
+    /*
+     * access_multiplexer: REQUIRED wrapper for get request handling
+     */
+    access_multiplexer->object_lookup = _mfd_ipIfStatsTable_object_lookup;
+    access_multiplexer->get_values = _mfd_ipIfStatsTable_get_values;
+
+    /*
+     * no wrappers yet
+     */
+    access_multiplexer->pre_request = _mfd_ipIfStatsTable_pre_request;
+    access_multiplexer->post_request = _mfd_ipIfStatsTable_post_request;
+
+
+    /*************************************************
+     *
+     * Create a registration, save our reg data, register table.
+     */
+    DEBUGMSGTL(("ipIfStatsTable:init_ipIfStatsTable",
+                "Registering ipIfStatsTable as a mibs-for-dummies table.\n"));
+    handler =
+        netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+    reginfo =
+        netsnmp_handler_registration_create("ipIfStatsTable", handler,
+                                            ipIfStatsTable_oid,
+                                            ipIfStatsTable_oid_size,
+                                            HANDLER_CAN_BABY_STEP |
+                                            HANDLER_CAN_RONLY);
+    if (NULL == reginfo) {
+        snmp_log(LOG_ERR, "error registering table ipIfStatsTable\n");
+        return;
+    }
+    reginfo->my_reg_void = &ipIfStatsTable_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->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->pre_request)
+        mfd_modes |= BABY_STEP_PRE_REQUEST;
+    if (access_multiplexer->post_request)
+        mfd_modes |= BABY_STEP_POST_REQUEST;
+
+    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;
+
+    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,
+                                            ipIfStatsTable_if_ctx.
+                                            container,
+                                            TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+    netsnmp_inject_handler(reginfo, handler);
+
+    /*************************************************
+     *
+     * inject cache helper
+     */
+    if (NULL != ipIfStatsTable_if_ctx.cache) {
+        handler = netsnmp_cache_handler_get(ipIfStatsTable_if_ctx.cache);
+        netsnmp_inject_handler(reginfo, handler);
+    }
+
+    /*
+     * register table
+     */
+    netsnmp_register_table(reginfo, tbl_info);
+    
+    /*
+     * register LastChanged
+     */
+    {
+        oid     lc_oid[] = { IPIFSTATSTABLELASTCHANGE_OID };
+        netsnmp_register_watched_scalar(netsnmp_create_handler_registration
+                ("ipIfStatsTableLastChanged", NULL,
+                 lc_oid, OID_LENGTH(lc_oid),
+                 HANDLER_CAN_RONLY),
+                netsnmp_create_watcher_info((void
+                        *)
+                    &ipIfStatsTable_if_ctx.
+                    last_changed,
+                    sizeof
+                    (u_long),
+                    ASN_TIMETICKS,
+                    WATCHER_FIXED_SIZE));
+    }
+}                               /* _ipIfStatsTable_initialize_interface */
+
+/**
+ * @internal
+ * Shutdown the table ipIfStatsTable
+ */
+void
+_ipIfStatsTable_shutdown_interface(ipIfStatsTable_registration * reg_ptr)
+{
+    /*
+     * shutdown the container
+     */
+    _ipIfStatsTable_container_shutdown(&ipIfStatsTable_if_ctx);
+}
+
+void
+ipIfStatsTable_valid_columns_set(netsnmp_column_info *vc)
+{
+    ipIfStatsTable_if_ctx.tbl_info.valid_columns = vc;
+}                               /* ipIfStatsTable_valid_columns_set */
+
+/**
+ * @internal
+ * convert the index component stored in the context to an oid
+ */
+int
+ipIfStatsTable_index_to_oid(netsnmp_index * oid_idx,
+                            ipIfStatsTable_mib_index * mib_idx)
+{
+    int             err = SNMP_ERR_NOERROR;
+
+    /*
+     * temp storage for parsing indexes
+     */
+    /*
+     * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
+     */
+    netsnmp_variable_list var_ipIfStatsIPVersion;
+    /*
+     * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+     */
+    netsnmp_variable_list var_ipIfStatsIfIndex;
+
+    /*
+     * set up varbinds
+     */
+    memset(&var_ipIfStatsIPVersion, 0x00, sizeof(var_ipIfStatsIPVersion));
+    var_ipIfStatsIPVersion.type = ASN_INTEGER;
+    memset(&var_ipIfStatsIfIndex, 0x00, sizeof(var_ipIfStatsIfIndex));
+    var_ipIfStatsIfIndex.type = ASN_INTEGER;
+
+    /*
+     * chain temp index varbinds together
+     */
+    var_ipIfStatsIPVersion.next_variable = &var_ipIfStatsIfIndex;
+    var_ipIfStatsIfIndex.next_variable = NULL;
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_index_to_oid",
+                "called\n"));
+
+    /*
+     * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h 
+     */
+    snmp_set_var_value(&var_ipIfStatsIPVersion,
+                       (u_char *) & mib_idx->ipIfStatsIPVersion,
+                       sizeof(mib_idx->ipIfStatsIPVersion));
+
+    /*
+     * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H 
+     */
+    snmp_set_var_value(&var_ipIfStatsIfIndex,
+                       (u_char *) & mib_idx->ipIfStatsIfIndex,
+                       sizeof(mib_idx->ipIfStatsIfIndex));
+
+
+    err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
+                            NULL, 0, &var_ipIfStatsIPVersion);
+    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_ipIfStatsIPVersion);
+
+    return err;
+}                               /* ipIfStatsTable_index_to_oid */
+
+/**
+ * extract ipIfStatsTable indexes from a netsnmp_index
+ *
+ * @retval SNMP_ERR_NOERROR  : no error
+ * @retval SNMP_ERR_GENERR   : error
+ */
+int
+ipIfStatsTable_index_from_oid(netsnmp_index * oid_idx,
+                              ipIfStatsTable_mib_index * mib_idx)
+{
+    int             err = SNMP_ERR_NOERROR;
+
+    /*
+     * temp storage for parsing indexes
+     */
+    /*
+     * ipIfStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
+     */
+    netsnmp_variable_list var_ipIfStatsIPVersion;
+    /*
+     * ipIfStatsIfIndex(2)/InterfaceIndex/ASN_INTEGER/long(long)//l/a/w/e/R/d/H
+     */
+    netsnmp_variable_list var_ipIfStatsIfIndex;
+
+    /*
+     * set up varbinds
+     */
+    memset(&var_ipIfStatsIPVersion, 0x00, sizeof(var_ipIfStatsIPVersion));
+    var_ipIfStatsIPVersion.type = ASN_INTEGER;
+    memset(&var_ipIfStatsIfIndex, 0x00, sizeof(var_ipIfStatsIfIndex));
+    var_ipIfStatsIfIndex.type = ASN_INTEGER;
+
+    /*
+     * chain temp index varbinds together
+     */
+    var_ipIfStatsIPVersion.next_variable = &var_ipIfStatsIfIndex;
+    var_ipIfStatsIfIndex.next_variable = NULL;
+
+
+    DEBUGMSGTL(("verbose:ipIfStatsTable:ipIfStatsTable_index_from_oid",
+                "called\n"));
+
+    /*
+     * parse the oid into the individual index components
+     */
+    err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
+                            &var_ipIfStatsIPVersion);
+    if (err == SNMP_ERR_NOERROR) {
+        /*
+         * copy out values
+         */
+        mib_idx->ipIfStatsIPVersion =
+            *((u_long *) var_ipIfStatsIPVersion.val.string);
+        mib_idx->ipIfStatsIfIndex =
+            *((long *) var_ipIfStatsIfIndex.val.string);
+
+
+    }
+
+    /*
+     * parsing may have allocated memory. free it.
+     */
+    snmp_reset_var_buffers(&var_ipIfStatsIPVersion);
+
+    return err;
+}                               /* ipIfStatsTable_index_from_oid */
+
+
+/*
+ *********************************************************************
+ * @internal
+ * allocate resources for a ipIfStatsTable_rowreq_ctx
+ */
+ipIfStatsTable_rowreq_ctx *
+ipIfStatsTable_allocate_rowreq_ctx(ipIfStatsTable_data * data,
+                                   void *user_init_ctx)
+{
+    ipIfStatsTable_rowreq_ctx *rowreq_ctx =
+        SNMP_MALLOC_TYPEDEF(ipIfStatsTable_rowreq_ctx);
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:ipIfStatsTable_allocate_rowreq_ctx", "called\n"));
+
+    if (NULL == rowreq_ctx) {
+        snmp_log(LOG_ERR, "Couldn't allocate memory for a "
+                 "ipIfStatsTable_rowreq_ctx.\n");
+        return NULL;
+    } else {
+        if (NULL != data) {
+            /*
+             * track if we got data from user
+             */
+            rowreq_ctx->rowreq_flags |= MFD_ROW_DATA_FROM_USER;
+            rowreq_ctx->data = data;
+        } else if (NULL ==
+                   (rowreq_ctx->data = ipIfStatsTable_allocate_data())) {
+            SNMP_FREE(rowreq_ctx);
+            return NULL;
+        }
+    }
+
+    /*
+     * undo context will be allocated when needed (in *_undo_setup)
+     */
+
+    rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+
+    rowreq_ctx->ipIfStatsTable_data_list = NULL;
+
+    /*
+     * if we allocated data, call init routine
+     */
+    if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
+        if (SNMPERR_SUCCESS !=
+            ipIfStatsTable_rowreq_ctx_init(rowreq_ctx, user_init_ctx)) {
+            ipIfStatsTable_release_rowreq_ctx(rowreq_ctx);
+            rowreq_ctx = NULL;
+        }
+    }
+
+    return rowreq_ctx;
+}                               /* ipIfStatsTable_allocate_rowreq_ctx */
+
+/*
+ * @internal
+ * release resources for a ipIfStatsTable_rowreq_ctx
+ */
+void
+ipIfStatsTable_release_rowreq_ctx(ipIfStatsTable_rowreq_ctx * rowreq_ctx)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:ipIfStatsTable_release_rowreq_ctx", "called\n"));
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    ipIfStatsTable_rowreq_ctx_cleanup(rowreq_ctx);
+
+    /*
+     * for non-transient data, don't free data we got from the user
+     */
+    if ((rowreq_ctx->data) &&
+        !(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER))
+        ipIfStatsTable_release_data(rowreq_ctx->data);
+
+    /*
+     * free index oid pointer
+     */
+    if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+        free(rowreq_ctx->oid_idx.oids);
+
+    SNMP_FREE(rowreq_ctx);
+}                               /* ipIfStatsTable_release_rowreq_ctx */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_ipIfStatsTable_pre_request(netsnmp_mib_handler *handler,
+                                netsnmp_handler_registration *reginfo,
+                                netsnmp_agent_request_info *agtreq_info,
+                                netsnmp_request_info *requests)
+{
+    int             rc;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_pre_request",
+                "called\n"));
+
+    if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
+        DEBUGMSGTL(("internal:ipIfStatsTable",
+                    "skipping additional pre_request\n"));
+        return SNMP_ERR_NOERROR;
+    }
+
+    rc = ipIfStatsTable_pre_request(ipIfStatsTable_if_ctx.user_ctx);
+    if (MFD_SUCCESS != rc) {
+        /*
+         * nothing we can do about it but log it
+         */
+        DEBUGMSGTL(("ipIfStatsTable", "error %d from "
+                    "ipIfStatsTable_pre_request\n", rc));
+        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+    }
+
+    return SNMP_ERR_NOERROR;
+}                               /* _mfd_ipIfStatsTable_pre_request */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_ipIfStatsTable_post_request(netsnmp_mib_handler *handler,
+                                 netsnmp_handler_registration *reginfo,
+                                 netsnmp_agent_request_info *agtreq_info,
+                                 netsnmp_request_info *requests)
+{
+    ipIfStatsTable_rowreq_ctx *rowreq_ctx =
+        netsnmp_container_table_row_extract(requests);
+    int             rc, packet_rc;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_post_request",
+                "called\n"));
+
+    /*
+     * release row context, if deleted
+     */
+    if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
+        ipIfStatsTable_release_rowreq_ctx(rowreq_ctx);
+
+    /*
+     * wait for last call before calling user
+     */
+    if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
+        DEBUGMSGTL(("internal:ipIfStatsTable",
+                    "waiting for last post_request\n"));
+        return SNMP_ERR_NOERROR;
+    }
+
+    packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
+    rc = ipIfStatsTable_post_request(ipIfStatsTable_if_ctx.user_ctx,
+                                     packet_rc);
+    if (MFD_SUCCESS != rc) {
+        /*
+         * nothing we can do about it but log it
+         */
+        DEBUGMSGTL(("ipIfStatsTable", "error %d from "
+                    "ipIfStatsTable_post_request\n", rc));
+    }
+
+    return SNMP_ERR_NOERROR;
+}                               /* _mfd_ipIfStatsTable_post_request */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_ipIfStatsTable_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;
+    ipIfStatsTable_rowreq_ctx *rowreq_ctx =
+        netsnmp_container_table_row_extract(requests);
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_object_lookup", "called\n"));
+
+    /*
+     * get our context from mfd
+     * ipIfStatsTable_interface_ctx *if_ctx =
+     *             (ipIfStatsTable_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
+        ipIfStatsTable_row_prep(rowreq_ctx);
+
+    return SNMP_VALIDATE_ERR(rc);
+}                               /* _mfd_ipIfStatsTable_object_lookup */
+
+/***********************************************************************
+ *
+ * GET processing
+ *
+ ***********************************************************************/
+/*
+ * @internal
+ * Retrieve the value for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_ipIfStatsTable_get_column(ipIfStatsTable_rowreq_ctx * rowreq_ctx,
+                           netsnmp_variable_list * var, int column)
+{
+    int             rc = SNMPERR_SUCCESS;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_get_column",
+                "called for %d\n", column));
+
+
+    netsnmp_assert(NULL != rowreq_ctx);
+
+    switch (column) {
+
+        /*
+         * ipIfStatsInReceives(3)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINRECEIVES:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInReceives_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInReceives(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINRECEIVES:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInReceives_get(rowreq_ctx,
+                                       (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInOctets(5)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINOCTETS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInOctets_get(rowreq_ctx, (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINOCTETS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInOctets_get(rowreq_ctx, (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInHdrErrors(7)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINHDRERRORS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInHdrErrors_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInNoRoutes(8)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINNOROUTES:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInNoRoutes_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInAddrErrors(9)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINADDRERRORS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInAddrErrors_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInUnknownProtos(10)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINUNKNOWNPROTOS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInUnknownProtos_get(rowreq_ctx,
+                                          (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInTruncatedPkts(11)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINTRUNCATEDPKTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInTruncatedPkts_get(rowreq_ctx,
+                                          (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInForwDatagrams(12)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINFORWDATAGRAMS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInForwDatagrams_get(rowreq_ctx,
+                                          (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInForwDatagrams(13)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINFORWDATAGRAMS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInForwDatagrams_get(rowreq_ctx,
+                                            (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsReasmReqds(14)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSREASMREQDS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsReasmReqds_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsReasmOKs(15)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSREASMOKS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsReasmOKs_get(rowreq_ctx, (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsReasmFails(16)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSREASMFAILS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsReasmFails_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInDiscards(17)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINDISCARDS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInDiscards_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInDelivers(18)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINDELIVERS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInDelivers_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInDelivers(19)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINDELIVERS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInDelivers_get(rowreq_ctx,
+                                       (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutRequests(20)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTREQUESTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutRequests_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutRequests(21)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTREQUESTS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutRequests_get(rowreq_ctx,
+                                        (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutForwDatagrams(23)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTFORWDATAGRAMS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutForwDatagrams_get(rowreq_ctx,
+                                           (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutForwDatagrams(24)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTFORWDATAGRAMS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutForwDatagrams_get(rowreq_ctx,
+                                             (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutDiscards(25)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTDISCARDS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutDiscards_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutFragReqds(26)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTFRAGREQDS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutFragReqds_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutFragOKs(27)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTFRAGOKS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutFragOKs_get(rowreq_ctx,
+                                     (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutFragFails(28)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTFRAGFAILS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutFragFails_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutFragCreates(29)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTFRAGCREATES:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutFragCreates_get(rowreq_ctx,
+                                         (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutTransmits(30)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTTRANSMITS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutTransmits_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutTransmits(31)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTTRANSMITS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutTransmits_get(rowreq_ctx,
+                                         (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutOctets(32)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTOCTETS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutOctets_get(rowreq_ctx,
+                                    (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutOctets(33)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTOCTETS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutOctets_get(rowreq_ctx, (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInMcastPkts(34)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINMCASTPKTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInMcastPkts_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInMcastPkts(35)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINMCASTPKTS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInMcastPkts_get(rowreq_ctx,
+                                        (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInMcastOctets(36)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINMCASTOCTETS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInMcastOctets_get(rowreq_ctx,
+                                        (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInMcastOctets(37)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINMCASTOCTETS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInMcastOctets_get(rowreq_ctx,
+                                          (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutMcastPkts(38)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTMCASTPKTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutMcastPkts_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutMcastPkts(39)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTMCASTPKTS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutMcastPkts_get(rowreq_ctx,
+                                         (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutMcastOctets(40)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTMCASTOCTETS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutMcastOctets_get(rowreq_ctx,
+                                         (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutMcastOctets(41)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTMCASTOCTETS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutMcastOctets_get(rowreq_ctx,
+                                           (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsInBcastPkts(42)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSINBCASTPKTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsInBcastPkts_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCInBcastPkts(43)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCINBCASTPKTS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCInBcastPkts_get(rowreq_ctx,
+                                        (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsOutBcastPkts(44)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSOUTBCASTPKTS:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_COUNTER;
+        rc = ipIfStatsOutBcastPkts_get(rowreq_ctx,
+                                       (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsHCOutBcastPkts(45)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSHCOUTBCASTPKTS:
+        var->val_len = sizeof(U64);
+        var->type = ASN_COUNTER64;
+        rc = ipIfStatsHCOutBcastPkts_get(rowreq_ctx,
+                                         (U64 *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsDiscontinuityTime(46)/TimeStamp/ASN_TIMETICKS/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSDISCONTINUITYTIME:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_TIMETICKS;
+        rc = ipIfStatsDiscontinuityTime_get(rowreq_ctx,
+                                            (u_long *) var->val.string);
+        break;
+
+        /*
+         * ipIfStatsRefreshRate(47)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h 
+         */
+    case COLUMN_IPIFSTATSREFRESHRATE:
+        var->val_len = sizeof(u_long);
+        var->type = ASN_UNSIGNED;
+        rc = ipIfStatsRefreshRate_get(rowreq_ctx,
+                                      (u_long *) var->val.string);
+        break;
+
+    default:
+        if (IPIFSTATSTABLE_MIN_COL <= column
+            && column <= IPIFSTATSTABLE_MAX_COL) {
+            DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_get_column", "assume column %d is reserved\n", column));
+            rc = MFD_SKIP;
+        } else {
+            snmp_log(LOG_ERR,
+                     "unknown column %d in _ipIfStatsTable_get_column\n",
+                     column);
+        }
+        break;
+    }
+
+    return rc;
+}                               /* _ipIfStatsTable_get_column */
+
+int
+_mfd_ipIfStatsTable_get_values(netsnmp_mib_handler *handler,
+                               netsnmp_handler_registration *reginfo,
+                               netsnmp_agent_request_info *agtreq_info,
+                               netsnmp_request_info *requests)
+{
+    ipIfStatsTable_rowreq_ctx *rowreq_ctx =
+        netsnmp_container_table_row_extract(requests);
+    netsnmp_table_request_info *tri;
+    u_char         *old_string;
+    void            (*dataFreeHook) (void *);
+    int             rc;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_mfd_ipIfStatsTable_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 = _ipIfStatsTable_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_ipIfStatsTable_get_values */
+
+
+/***********************************************************************
+ *
+ * SET processing
+ *
+ ***********************************************************************/
+
+/*
+ * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
+ */
+/***********************************************************************
+ *
+ * DATA ACCESS
+ *
+ ***********************************************************************/
+static void     _container_free(netsnmp_container * container);
+
+/**
+ * @internal
+ */
+static int
+_cache_load(netsnmp_cache * cache, void *vmagic)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:_cache_load", "called\n"));
+
+    if ((NULL == cache) || (NULL == cache->magic)) {
+        snmp_log(LOG_ERR, "invalid cache for ipIfStatsTable_cache_load\n");
+        return -1;
+    }
+
+    /** should only be called for an invalid or expired cache */
+    netsnmp_assert((0 == cache->valid) || (1 == cache->expired));
+
+    /*
+     * call user code
+     */
+    return ipIfStatsTable_container_load((netsnmp_container *) cache->
+                                         magic);
+}                               /* _cache_load */
+
+/**
+ * @internal
+ */
+static void
+_cache_free(netsnmp_cache * cache, void *magic)
+{
+    netsnmp_container *container;
+
+    DEBUGMSGTL(("internal:ipIfStatsTable:_cache_free", "called\n"));
+
+    if ((NULL == cache) || (NULL == cache->magic)) {
+        snmp_log(LOG_ERR, "invalid cache in ipIfStatsTable_cache_free\n");
+        return;
+    }
+
+    container = (netsnmp_container *) cache->magic;
+
+    _container_free(container);
+}                               /* _cache_free */
+
+/**
+ * @internal
+ */
+static void
+_container_item_free(ipIfStatsTable_rowreq_ctx * rowreq_ctx, void *context)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:_container_item_free",
+                "called\n"));
+
+    if (NULL == rowreq_ctx)
+        return;
+
+    ipIfStatsTable_release_rowreq_ctx(rowreq_ctx);
+}                               /* _container_item_free */
+
+/**
+ * @internal
+ */
+static void
+_container_free(netsnmp_container * container)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:_container_free", "called\n"));
+
+    if (NULL == container) {
+        snmp_log(LOG_ERR,
+                 "invalid container in ipIfStatsTable_container_free\n");
+        return;
+    }
+
+    /*
+     * call user code
+     */
+    ipIfStatsTable_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
+_ipIfStatsTable_container_init(ipIfStatsTable_interface_ctx * if_ctx)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:_ipIfStatsTable_container_init",
+                "called\n"));
+
+    /*
+     * cache init
+     */
+    if_ctx->cache = netsnmp_cache_create(30,    /* timeout in seconds */
+                                         _cache_load, _cache_free,
+                                         ipIfStatsTable_oid,
+                                         ipIfStatsTable_oid_size);
+
+    if (NULL == if_ctx->cache) {
+        snmp_log(LOG_ERR, "error creating cache for ipIfStatsTable\n");
+        return;
+    }
+
+    if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+
+    ipIfStatsTable_container_init(&if_ctx->container, if_ctx->cache);
+    if (NULL == if_ctx->container)
+        if_ctx->container =
+            netsnmp_container_find("ipIfStatsTable:table_container");
+    if (NULL == if_ctx->container) {
+        snmp_log(LOG_ERR, "error creating container in "
+                 "ipIfStatsTable_container_init\n");
+        return;
+    }
+
+    if (NULL != if_ctx->cache)
+        if_ctx->cache->magic = (void *) if_ctx->container;
+}                               /* _ipIfStatsTable_container_init */
+
+/**
+ * @internal
+ * shutdown the container with functions or wrappers
+ */
+void
+_ipIfStatsTable_container_shutdown(ipIfStatsTable_interface_ctx * if_ctx)
+{
+    DEBUGMSGTL(("internal:ipIfStatsTable:_ipIfStatsTable_container_shutdown", "called\n"));
+
+    ipIfStatsTable_container_shutdown(if_ctx->container);
+
+    _container_free(if_ctx->container);
+
+}                               /* _ipIfStatsTable_container_shutdown */
+
+
+ipIfStatsTable_rowreq_ctx *
+ipIfStatsTable_row_find_by_mib_index(ipIfStatsTable_mib_index * mib_idx)
+{
+    ipIfStatsTable_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 = ipIfStatsTable_index_to_oid(&oid_idx, mib_idx);
+    if (MFD_SUCCESS != rc)
+        return NULL;
+
+    rowreq_ctx = CONTAINER_FIND(ipIfStatsTable_if_ctx.container, &oid_idx);
+
+    return rowreq_ctx;
+}
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.h
new file mode 100644
index 0000000..c43de84
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_interface.h
@@ -0,0 +1,99 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *       version : 15899 $ 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 IPIFSTATSTABLE_INTERFACE_H
+#define IPIFSTATSTABLE_INTERFACE_H
+
+#ifdef __cplusplus
+extern          "C" {
+#endif
+
+
+#include "ipIfStatsTable.h"
+
+
+    /*
+     ********************************************************************
+     * Table declarations
+     */
+
+    /*
+     * PUBLIC interface initialization routine 
+     */
+    void           
+        _ipIfStatsTable_initialize_interface(ipIfStatsTable_registration *
+                                             user_ctx, u_long flags);
+    void           
+        _ipIfStatsTable_shutdown_interface(ipIfStatsTable_registration *
+                                           user_ctx);
+
+    ipIfStatsTable_registration *ipIfStatsTable_registration_get(void);
+
+    ipIfStatsTable_registration
+        *ipIfStatsTable_registration_set(ipIfStatsTable_registration *
+                                         newreg);
+
+    netsnmp_container *ipIfStatsTable_container_get(void);
+    int             ipIfStatsTable_container_size(void);
+
+    ipIfStatsTable_rowreq_ctx
+        *ipIfStatsTable_allocate_rowreq_ctx(ipIfStatsTable_data *, void *);
+    void           
+        ipIfStatsTable_release_rowreq_ctx(ipIfStatsTable_rowreq_ctx *
+                                          rowreq_ctx);
+
+    int             ipIfStatsTable_index_to_oid(netsnmp_index * oid_idx,
+                                                ipIfStatsTable_mib_index *
+                                                mib_idx);
+    int             ipIfStatsTable_index_from_oid(netsnmp_index * oid_idx,
+                                                  ipIfStatsTable_mib_index
+                                                  * mib_idx);
+
+    /*
+     * access to certain internals. use with caution!
+     */
+    void            ipIfStatsTable_valid_columns_set(netsnmp_column_info
+                                                     *vc);
+
+    /*
+     */
+    void            ipIfStatsTable_lastChange_set(u_long uptime);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_INTERFACE_H */
+/** @} */
diff --git a/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_oids.h b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_oids.h
new file mode 100644
index 0000000..76607a9
--- /dev/null
+++ b/agent/mibgroup/ip-mib/ipIfStatsTable/ipIfStatsTable_oids.h
@@ -0,0 +1,122 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *  : generic-table-oids.m2c 12855 2005-09-27 15:56:08Z rstory $
+ *
+ * $Id:$
+ */
+#ifndef IPIFSTATSTABLE_OIDS_H
+#define IPIFSTATSTABLE_OIDS_H
+
+#ifdef __cplusplus
+extern          "C" {
+#endif
+
+
+    /*
+     * column number definitions for table ipIfStatsTable 
+     */
+#define IPIFSTATSTABLE_OID              1,3,6,1,2,1,4,31,3
+#define IPIFSTATSTABLELASTCHANGE_OID    1,3,6,1,2,1,4,31,2
+
+#define COLUMN_IPIFSTATSIPVERSION         1
+
+#define COLUMN_IPIFSTATSIFINDEX         2
+
+#define COLUMN_IPIFSTATSINRECEIVES         3
+
+#define COLUMN_IPIFSTATSHCINRECEIVES         4
+
+#define COLUMN_IPIFSTATSINOCTETS         5
+
+#define COLUMN_IPIFSTATSHCINOCTETS         6
+
+#define COLUMN_IPIFSTATSINHDRERRORS         7
+
+#define COLUMN_IPIFSTATSINNOROUTES         8
+
+#define COLUMN_IPIFSTATSINADDRERRORS         9
+
+#define COLUMN_IPIFSTATSINUNKNOWNPROTOS         10
+
+#define COLUMN_IPIFSTATSINTRUNCATEDPKTS         11
+
+#define COLUMN_IPIFSTATSINFORWDATAGRAMS         12
+
+#define COLUMN_IPIFSTATSHCINFORWDATAGRAMS         13
+
+#define COLUMN_IPIFSTATSREASMREQDS         14
+
+#define COLUMN_IPIFSTATSREASMOKS         15
+
+#define COLUMN_IPIFSTATSREASMFAILS         16
+
+#define COLUMN_IPIFSTATSINDISCARDS         17
+
+#define COLUMN_IPIFSTATSINDELIVERS         18
+
+#define COLUMN_IPIFSTATSHCINDELIVERS         19
+
+#define COLUMN_IPIFSTATSOUTREQUESTS         20
+
+#define COLUMN_IPIFSTATSHCOUTREQUESTS         21
+
+#define COLUMN_IPIFSTATSOUTFORWDATAGRAMS         23
+
+#define COLUMN_IPIFSTATSHCOUTFORWDATAGRAMS         24
+
+#define COLUMN_IPIFSTATSOUTDISCARDS         25
+
+#define COLUMN_IPIFSTATSOUTFRAGREQDS         26
+
+#define COLUMN_IPIFSTATSOUTFRAGOKS         27
+
+#define COLUMN_IPIFSTATSOUTFRAGFAILS         28
+
+#define COLUMN_IPIFSTATSOUTFRAGCREATES         29
+
+#define COLUMN_IPIFSTATSOUTTRANSMITS         30
+
+#define COLUMN_IPIFSTATSHCOUTTRANSMITS         31
+
+#define COLUMN_IPIFSTATSOUTOCTETS         32
+
+#define COLUMN_IPIFSTATSHCOUTOCTETS         33
+
+#define COLUMN_IPIFSTATSINMCASTPKTS         34
+
+#define COLUMN_IPIFSTATSHCINMCASTPKTS         35
+
+#define COLUMN_IPIFSTATSINMCASTOCTETS         36
+
+#define COLUMN_IPIFSTATSHCINMCASTOCTETS         37
+
+#define COLUMN_IPIFSTATSOUTMCASTPKTS         38
+
+#define COLUMN_IPIFSTATSHCOUTMCASTPKTS         39
+
+#define COLUMN_IPIFSTATSOUTMCASTOCTETS         40
+
+#define COLUMN_IPIFSTATSHCOUTMCASTOCTETS         41
+
+#define COLUMN_IPIFSTATSINBCASTPKTS         42
+
+#define COLUMN_IPIFSTATSHCINBCASTPKTS         43
+
+#define COLUMN_IPIFSTATSOUTBCASTPKTS         44
+
+#define COLUMN_IPIFSTATSHCOUTBCASTPKTS         45
+
+#define COLUMN_IPIFSTATSDISCONTINUITYTIME         46
+
+#define COLUMN_IPIFSTATSREFRESHRATE         47
+
+
+#define IPIFSTATSTABLE_MIN_COL   COLUMN_IPIFSTATSINRECEIVES
+#define IPIFSTATSTABLE_MAX_COL   COLUMN_IPIFSTATSREFRESHRATE
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif                          /* IPIFSTATSTABLE_OIDS_H */
diff --git a/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable.c b/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable.c
index 4b1acb1..28e8538 100644
--- a/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable.c
+++ b/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable.c
@@ -387,11 +387,14 @@ ipSystemStatsInReceives_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
                 "called\n"));
 
     netsnmp_assert(NULL != rowreq_ctx);
-
+    
     /*
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInReceives data.
      * copy (* ipSystemStatsInReceives_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES])
+        return MFD_SKIP;
+
     (*ipSystemStatsInReceives_val_ptr) =
         rowreq_ctx->data->stats.HCInReceives.low;
 
@@ -453,6 +456,9 @@ ipSystemStatsHCInReceives_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCInReceives data.
      * get (* ipSystemStatsHCInReceives_val_ptr ).low and (* ipSystemStatsHCInReceives_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINRECEIVES])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInReceives_val_ptr).low =
         rowreq_ctx->data->stats.HCInReceives.low;
     (*ipSystemStatsHCInReceives_val_ptr).high =
@@ -517,6 +523,9 @@ ipSystemStatsInOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInOctets data.
      * copy (* ipSystemStatsInOctets_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInOctets_val_ptr) =
         rowreq_ctx->data->stats.HCInOctets.low;
 
@@ -574,6 +583,9 @@ ipSystemStatsHCInOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCInOctets data.
      * get (* ipSystemStatsHCInOctets_val_ptr ).low and (* ipSystemStatsHCInOctets_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInOctets_val_ptr).low =
         rowreq_ctx->data->stats.HCInOctets.low;
     (*ipSystemStatsHCInOctets_val_ptr).high =
@@ -641,6 +653,9 @@ ipSystemStatsInHdrErrors_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInHdrErrors data.
      * copy (* ipSystemStatsInHdrErrors_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INHDRERRORS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInHdrErrors_val_ptr) =
         rowreq_ctx->data->stats.InHdrErrors;
 
@@ -702,8 +717,11 @@ ipSystemStatsInNoRoutes_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInNoRoutes data.
      * copy (* ipSystemStatsInNoRoutes_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINNOROUTES])
+        return MFD_SKIP;
+
     (*ipSystemStatsInNoRoutes_val_ptr) =
-        rowreq_ctx->data->stats.InNoRoutes;
+        rowreq_ctx->data->stats.HCInNoRoutes.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsInNoRoutes_get */
@@ -769,6 +787,9 @@ ipSystemStatsInAddrErrors_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInAddrErrors data.
      * copy (* ipSystemStatsInAddrErrors_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INADDRERRORS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInAddrErrors_val_ptr) =
         rowreq_ctx->data->stats.InAddrErrors;
 
@@ -840,6 +861,9 @@ ipSystemStatsInUnknownProtos_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInUnknownProtos data.
      * copy (* ipSystemStatsInUnknownProtos_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INUNKNOWNPROTOS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInUnknownProtos_val_ptr) =
         rowreq_ctx->data->stats.InUnknownProtos;
 
@@ -902,6 +926,9 @@ ipSystemStatsInTruncatedPkts_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInTruncatedPkts data.
      * copy (* ipSystemStatsInTruncatedPkts_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INTRUNCATEDPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInTruncatedPkts_val_ptr) =
         rowreq_ctx->data->stats.InTruncatedPkts;
 
@@ -973,6 +1000,9 @@ ipSystemStatsInForwDatagrams_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInForwDatagrams data.
      * copy (* ipSystemStatsInForwDatagrams_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInForwDatagrams_val_ptr) =
         rowreq_ctx->data->stats.HCInForwDatagrams.low;
 
@@ -1033,6 +1063,9 @@ ipSystemStatsHCInForwDatagrams_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> copy ipSystemStatsHCInForwDatagrams data.
      * get (* ipSystemStatsHCInForwDatagrams_val_ptr ).low and (* ipSystemStatsHCInForwDatagrams_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInForwDatagrams_val_ptr).low =
         rowreq_ctx->data->stats.HCInForwDatagrams.low;
     (*ipSystemStatsHCInForwDatagrams_val_ptr).high =
@@ -1102,6 +1135,9 @@ ipSystemStatsReasmReqds_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsReasmReqds data.
      * copy (* ipSystemStatsReasmReqds_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMREQDS])
+        return MFD_SKIP;
+
     (*ipSystemStatsReasmReqds_val_ptr) =
         rowreq_ctx->data->stats.ReasmReqds;
 
@@ -1172,6 +1208,9 @@ ipSystemStatsReasmOKs_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsReasmOKs data.
      * copy (* ipSystemStatsReasmOKs_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMOKS])
+        return MFD_SKIP;
+
     (*ipSystemStatsReasmOKs_val_ptr) = rowreq_ctx->data->stats.ReasmOKs;
 
     return MFD_SUCCESS;
@@ -1242,6 +1281,9 @@ ipSystemStatsReasmFails_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsReasmFails data.
      * copy (* ipSystemStatsReasmFails_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REASMFAILS])
+        return MFD_SKIP;
+
     (*ipSystemStatsReasmFails_val_ptr) =
         rowreq_ctx->data->stats.ReasmFails;
 
@@ -1306,6 +1348,9 @@ ipSystemStatsInDiscards_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInDiscards data.
      * copy (* ipSystemStatsInDiscards_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_INDISCARDS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInDiscards_val_ptr) =
         rowreq_ctx->data->stats.InDiscards;
 
@@ -1373,6 +1418,9 @@ ipSystemStatsInDelivers_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInDelivers data.
      * copy (* ipSystemStatsInDelivers_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInDelivers_val_ptr) =
         rowreq_ctx->data->stats.HCInDelivers.low;
 
@@ -1430,6 +1478,9 @@ ipSystemStatsHCInDelivers_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCInDelivers data.
      * get (* ipSystemStatsHCInDelivers_val_ptr ).low and (* ipSystemStatsHCInDelivers_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINDELIVERS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInDelivers_val_ptr).low =
         rowreq_ctx->data->stats.HCInDelivers.low;
     (*ipSystemStatsHCInDelivers_val_ptr).high =
@@ -1495,6 +1546,9 @@ ipSystemStatsOutRequests_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutRequests data.
      * copy (* ipSystemStatsOutRequests_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutRequests_val_ptr) =
         rowreq_ctx->data->stats.HCOutRequests.low;
 
@@ -1552,6 +1606,9 @@ ipSystemStatsHCOutRequests_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCOutRequests data.
      * get (* ipSystemStatsHCOutRequests_val_ptr ).low and (* ipSystemStatsHCOutRequests_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTREQUESTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutRequests_val_ptr).low =
         rowreq_ctx->data->stats.HCOutRequests.low;
     (*ipSystemStatsHCOutRequests_val_ptr).high =
@@ -1616,8 +1673,11 @@ ipSystemStatsOutNoRoutes_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutNoRoutes data.
      * copy (* ipSystemStatsOutNoRoutes_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTNOROUTES])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutNoRoutes_val_ptr) =
-        rowreq_ctx->data->stats.OutNoRoutes;
+        rowreq_ctx->data->stats.HCOutNoRoutes.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutNoRoutes_get */
@@ -1691,6 +1751,9 @@ ipSystemStatsOutForwDatagrams_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutForwDatagrams data.
      * copy (* ipSystemStatsOutForwDatagrams_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutForwDatagrams_val_ptr) =
         rowreq_ctx->data->stats.HCOutForwDatagrams.low;
 
@@ -1751,6 +1814,9 @@ ipSystemStatsHCOutForwDatagrams_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> copy ipSystemStatsHCOutForwDatagrams data.
      * get (* ipSystemStatsHCOutForwDatagrams_val_ptr ).low and (* ipSystemStatsHCOutForwDatagrams_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutForwDatagrams_val_ptr).low =
         rowreq_ctx->data->stats.HCOutForwDatagrams.low;
     (*ipSystemStatsHCOutForwDatagrams_val_ptr).high =
@@ -1818,8 +1884,11 @@ ipSystemStatsOutDiscards_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutDiscards data.
      * copy (* ipSystemStatsOutDiscards_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTDISCARDS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutDiscards_val_ptr) =
-        rowreq_ctx->data->stats.OutDiscards;
+        rowreq_ctx->data->stats.HCOutDiscards.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutDiscards_get */
@@ -1887,8 +1956,11 @@ ipSystemStatsOutFragReqds_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutFragReqds data.
      * copy (* ipSystemStatsOutFragReqds_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutFragReqds_val_ptr) =
-        rowreq_ctx->data->stats.OutFragReqds;
+        rowreq_ctx->data->stats.HCOutFragReqds.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutFragReqds_get */
@@ -1953,9 +2025,11 @@ ipSystemStatsOutFragOKs_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutFragOKs data.
      * copy (* ipSystemStatsOutFragOKs_val_ptr ) from rowreq_ctx->data
      */
-    snmp_log(LOG_ERR,
-             "ipSystemStatsTable node ipSystemStatsOutFragOKs not implemented: skipping\n");
-    return MFD_SKIP;
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGOKS])
+        return MFD_SKIP;
+
+    (*ipSystemStatsOutFragOKs_val_ptr) =
+        rowreq_ctx->data->stats.HCOutFragOKs.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutFragOKs_get */
@@ -2023,8 +2097,11 @@ ipSystemStatsOutFragFails_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutFragFails data.
      * copy (* ipSystemStatsOutFragFails_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutFragFails_val_ptr) =
-        rowreq_ctx->data->stats.OutFragFails;
+        rowreq_ctx->data->stats.HCOutFragFails.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutFragFails_get */
@@ -2089,8 +2166,11 @@ ipSystemStatsOutFragCreates_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutFragCreates data.
      * copy (* ipSystemStatsOutFragCreates_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutFragCreates_val_ptr) =
-        rowreq_ctx->data->stats.OutFragCreates;
+        rowreq_ctx->data->stats.HCOutFragCreates.low;
 
     return MFD_SUCCESS;
 }                               /* ipSystemStatsOutFragCreates_get */
@@ -2152,6 +2232,9 @@ ipSystemStatsOutTransmits_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutTransmits data.
      * copy (* ipSystemStatsOutTransmits_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutTransmits_val_ptr) =
         rowreq_ctx->data->stats.HCOutTransmits.low;
 
@@ -2209,6 +2292,9 @@ ipSystemStatsHCOutTransmits_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCOutTransmits data.
      * get (* ipSystemStatsHCOutTransmits_val_ptr ).low and (* ipSystemStatsHCOutTransmits_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTTRANSMITS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutTransmits_val_ptr).low =
         rowreq_ctx->data->stats.HCOutTransmits.low;
     (*ipSystemStatsHCOutTransmits_val_ptr).high =
@@ -2273,6 +2359,9 @@ ipSystemStatsOutOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutOctets data.
      * copy (* ipSystemStatsOutOctets_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutOctets_val_ptr) =
         rowreq_ctx->data->stats.HCOutOctets.low;
 
@@ -2330,6 +2419,9 @@ ipSystemStatsHCOutOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCOutOctets data.
      * get (* ipSystemStatsHCOutOctets_val_ptr ).low and (* ipSystemStatsHCOutOctets_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutOctets_val_ptr).low =
         rowreq_ctx->data->stats.HCOutOctets.low;
     (*ipSystemStatsHCOutOctets_val_ptr).high =
@@ -2392,6 +2484,9 @@ ipSystemStatsInMcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInMcastPkts data.
      * copy (* ipSystemStatsInMcastPkts_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInMcastPkts_val_ptr) =
         rowreq_ctx->data->stats.HCInMcastPkts.low;
 
@@ -2448,6 +2543,9 @@ ipSystemStatsHCInMcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCInMcastPkts data.
      * get (* ipSystemStatsHCInMcastPkts_val_ptr ).low and (* ipSystemStatsHCInMcastPkts_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInMcastPkts_val_ptr).low =
         rowreq_ctx->data->stats.HCInMcastPkts.low;
     (*ipSystemStatsHCInMcastPkts_val_ptr).high =
@@ -2511,6 +2609,9 @@ ipSystemStatsInMcastOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInMcastOctets data.
      * copy (* ipSystemStatsInMcastOctets_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInMcastOctets_val_ptr) =
         rowreq_ctx->data->stats.HCInMcastOctets.low;
 
@@ -2569,6 +2670,9 @@ ipSystemStatsHCInMcastOctets_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> copy ipSystemStatsHCInMcastOctets data.
      * get (* ipSystemStatsHCInMcastOctets_val_ptr ).low and (* ipSystemStatsHCInMcastOctets_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINMCASTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInMcastOctets_val_ptr).low =
         rowreq_ctx->data->stats.HCInMcastOctets.low;
     (*ipSystemStatsHCInMcastOctets_val_ptr).high =
@@ -2631,6 +2735,9 @@ ipSystemStatsOutMcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutMcastPkts data.
      * copy (* ipSystemStatsOutMcastPkts_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutMcastPkts_val_ptr) =
         rowreq_ctx->data->stats.HCOutMcastPkts.low;
 
@@ -2687,6 +2794,9 @@ ipSystemStatsHCOutMcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCOutMcastPkts data.
      * get (* ipSystemStatsHCOutMcastPkts_val_ptr ).low and (* ipSystemStatsHCOutMcastPkts_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutMcastPkts_val_ptr).low =
         rowreq_ctx->data->stats.HCOutMcastPkts.low;
     (*ipSystemStatsHCOutMcastPkts_val_ptr).high =
@@ -2751,6 +2861,9 @@ ipSystemStatsOutMcastOctets_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutMcastOctets data.
      * copy (* ipSystemStatsOutMcastOctets_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutMcastOctets_val_ptr) =
         rowreq_ctx->data->stats.HCOutMcastOctets.low;
 
@@ -2813,6 +2926,9 @@ ipSystemStatsHCOutMcastOctets_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> copy ipSystemStatsHCOutMcastOctets data.
      * get (* ipSystemStatsHCOutMcastOctets_val_ptr ).low and (* ipSystemStatsHCOutMcastOctets_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTMCASTOCTETS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutMcastOctets_val_ptr).low =
         rowreq_ctx->data->stats.HCOutMcastOctets.low;
     (*ipSystemStatsHCOutMcastOctets_val_ptr).high =
@@ -2875,6 +2991,9 @@ ipSystemStatsInBcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsInBcastPkts data.
      * copy (* ipSystemStatsInBcastPkts_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINBCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsInBcastPkts_val_ptr) =
         rowreq_ctx->data->stats.HCInBcastPkts.low;
 
@@ -2931,6 +3050,9 @@ ipSystemStatsHCInBcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCInBcastPkts data.
      * get (* ipSystemStatsHCInBcastPkts_val_ptr ).low and (* ipSystemStatsHCInBcastPkts_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCINBCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCInBcastPkts_val_ptr).low =
         rowreq_ctx->data->stats.HCInBcastPkts.low;
     (*ipSystemStatsHCInBcastPkts_val_ptr).high =
@@ -2993,6 +3115,9 @@ ipSystemStatsOutBcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsOutBcastPkts data.
      * copy (* ipSystemStatsOutBcastPkts_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsOutBcastPkts_val_ptr) =
         rowreq_ctx->data->stats.HCOutBcastPkts.low;
 
@@ -3049,6 +3174,9 @@ ipSystemStatsHCOutBcastPkts_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> copy ipSystemStatsHCOutBcastPkts data.
      * get (* ipSystemStatsHCOutBcastPkts_val_ptr ).low and (* ipSystemStatsHCOutBcastPkts_val_ptr ).high from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS])
+        return MFD_SKIP;
+
     (*ipSystemStatsHCOutBcastPkts_val_ptr).low =
         rowreq_ctx->data->stats.HCOutBcastPkts.low;
     (*ipSystemStatsHCOutBcastPkts_val_ptr).high =
@@ -3113,6 +3241,9 @@ ipSystemStatsDiscontinuityTime_get(ipSystemStatsTable_rowreq_ctx *
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsDiscontinuityTime data.
      * copy (* ipSystemStatsDiscontinuityTime_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_DISCONTINUITYTIME])
+        return MFD_SKIP;
+
     (*ipSystemStatsDiscontinuityTime_val_ptr) =
         rowreq_ctx->ipSystemStatsDiscontinuityTime;
 
@@ -3169,6 +3300,9 @@ ipSystemStatsRefreshRate_get(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
      * TODO:231:o: |-> Extract the current value of the ipSystemStatsRefreshRate data.
      * copy (* ipSystemStatsRefreshRate_val_ptr ) from rowreq_ctx->data
      */
+    if (!rowreq_ctx->data->stats.columnAvail[IPSYSTEMSTATSTABLE_REFRESHRATE])
+        return MFD_SKIP;
+
     (*ipSystemStatsRefreshRate_val_ptr) =
         rowreq_ctx->ipSystemStatsRefreshRate;
 
diff --git a/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable_data_access.c b/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable_data_access.c
index c1d257d..56d163d 100644
--- a/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable_data_access.c
+++ b/agent/mibgroup/ip-mib/ipSystemStatsTable/ipSystemStatsTable_data_access.c
@@ -19,7 +19,7 @@
 
 #include "ipSystemStatsTable_data_access.h"
 
-static int      ipss_cache_refresh = 30;
+static int      ipss_cache_refresh = IPSYSTEMSTATSTABLE_CACHE_TIMEOUT;
 
 /** @ingroup interface 
  * @addtogroup data_access data_access: Routines to access data
@@ -58,61 +58,10 @@ int
 ipSystemStatsTable_init_data(ipSystemStatsTable_registration *
                              ipSystemStatsTable_reg)
 {
-    static unsigned int my_columns[] = {
-        COLUMN_IPSYSTEMSTATSINRECEIVES, COLUMN_IPSYSTEMSTATSHCINRECEIVES,
-        /** COLUMN_IPSYSTEMSTATSINOCTETS, */
-        COLUMN_IPSYSTEMSTATSHCINOCTETS,
-        COLUMN_IPSYSTEMSTATSINHDRERRORS,
-        /** COLUMN_IPSYSTEMSTATSINNOROUTES, */
-        COLUMN_IPSYSTEMSTATSINADDRERRORS,
-        COLUMN_IPSYSTEMSTATSINUNKNOWNPROTOS,
-        /** COLUMN_IPSYSTEMSTATSINTRUNCATEDPKTS, */
-        COLUMN_IPSYSTEMSTATSINFORWDATAGRAMS,
-        COLUMN_IPSYSTEMSTATSHCINFORWDATAGRAMS,
-        COLUMN_IPSYSTEMSTATSREASMREQDS,
-        COLUMN_IPSYSTEMSTATSREASMOKS, COLUMN_IPSYSTEMSTATSREASMFAILS,
-        COLUMN_IPSYSTEMSTATSINDISCARDS, COLUMN_IPSYSTEMSTATSINDELIVERS,
-        COLUMN_IPSYSTEMSTATSHCINDELIVERS, COLUMN_IPSYSTEMSTATSOUTREQUESTS,
-        COLUMN_IPSYSTEMSTATSHCOUTREQUESTS, COLUMN_IPSYSTEMSTATSOUTNOROUTES,
-        /** COLUMN_IPSYSTEMSTATSOUTFORWDATAGRAMS, */
-        COLUMN_IPSYSTEMSTATSHCOUTFORWDATAGRAMS,
-        COLUMN_IPSYSTEMSTATSOUTDISCARDS,
-        /** COLUMN_IPSYSTEMSTATSOUTFRAGREQDS, */
-        COLUMN_IPSYSTEMSTATSOUTFRAGOKS, COLUMN_IPSYSTEMSTATSOUTFRAGFAILS,
-        COLUMN_IPSYSTEMSTATSOUTFRAGCREATES,
-        /** COLUMN_IPSYSTEMSTATSOUTTRANSMITS, */
-        /** COLUMN_IPSYSTEMSTATSHCOUTTRANSMITS, */
-        /** COLUMN_IPSYSTEMSTATSOUTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSHCOUTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSINMCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSHCINMCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSINMCASTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSHCINMCASTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSOUTMCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSHCOUTMCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSOUTMCASTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSHCOUTMCASTOCTETS, */
-        /** COLUMN_IPSYSTEMSTATSINBCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSHCINBCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSOUTBCASTPKTS, */
-        /** COLUMN_IPSYSTEMSTATSHCOUTBCASTPKTS, */
-        COLUMN_IPSYSTEMSTATSDISCONTINUITYTIME,
-        COLUMN_IPSYSTEMSTATSREFRESHRATE
-    };
-    static netsnmp_column_info valid_columns;
-
     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_init_data",
                 "called\n"));
 
     /*
-     * we only want to process certain columns, and ignore
-     * anything else.
-     */
-    valid_columns.isRange = 0;
-    valid_columns.details.list = my_columns;
-    valid_columns.list_count = sizeof(my_columns) / sizeof(unsigned int);
-    ipSystemStatsTable_valid_columns_set(&valid_columns);
-    /*
      * TODO:303:o: Initialize ipSystemStatsTable data.
      */
 
@@ -166,7 +115,9 @@ ipSystemStatsTable_container_init(netsnmp_container **container_ptr_ptr,
      * 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;
+
+
+    *container_ptr_ptr = netsnmp_container_find("ipSystemStatsTable:table_container");
 
     if (NULL == cache) {
         snmp_log(LOG_ERR,
@@ -191,6 +142,7 @@ ipSystemStatsTable_container_init(netsnmp_container **container_ptr_ptr,
         (NETSNMP_CACHE_DONT_AUTO_RELEASE | NETSNMP_CACHE_DONT_FREE_EXPIRED
          | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD |
          NETSNMP_CACHE_AUTO_RELOAD);
+    ipSystemStatsTable_container_load(*container_ptr_ptr);
 }                               /* ipSystemStatsTable_container_init */
 
 /**
@@ -266,7 +218,7 @@ _add_new(netsnmp_systemstats_entry *systemstats_entry,
         && (MFD_SUCCESS ==
             ipSystemStatsTable_indexes_set(rowreq_ctx,
                                            systemstats_entry->
-                                           ns_ip_version))) {
+                                           index[0]))) {
         rowreq_ctx->ipSystemStatsRefreshRate = ipss_cache_refresh * 1000;       /* milli-seconds */
         CONTAINER_INSERT(container, rowreq_ctx);
     } else {
diff --git a/include/net-snmp/data_access/ipstats.h b/include/net-snmp/data_access/ipstats.h
index 0e7aa1e..0e1bc21 100644
--- a/include/net-snmp/data_access/ipstats.h
+++ b/include/net-snmp/data_access/ipstats.h
@@ -10,6 +10,40 @@
 extern          "C" {
 #endif
 
+#define IPSYSTEMSTATSTABLE_HCINRECEIVES       1
+#define IPSYSTEMSTATSTABLE_HCINOCTETS         2
+#define IPSYSTEMSTATSTABLE_INHDRERRORS        3
+#define IPSYSTEMSTATSTABLE_HCINNOROUTES       4 
+#define IPSYSTEMSTATSTABLE_INADDRERRORS       5
+#define IPSYSTEMSTATSTABLE_INUNKNOWNPROTOS    6
+#define IPSYSTEMSTATSTABLE_INTRUNCATEDPKTS    7
+#define IPSYSTEMSTATSTABLE_HCINFORWDATAGRAMS  8 
+#define IPSYSTEMSTATSTABLE_REASMREQDS         9
+#define IPSYSTEMSTATSTABLE_REASMOKS           10
+#define IPSYSTEMSTATSTABLE_REASMFAILS         11
+#define IPSYSTEMSTATSTABLE_INDISCARDS         12
+#define IPSYSTEMSTATSTABLE_HCINDELIVERS       13
+#define IPSYSTEMSTATSTABLE_HCOUTREQUESTS      14
+#define IPSYSTEMSTATSTABLE_HCOUTNOROUTES      15
+#define IPSYSTEMSTATSTABLE_HCOUTFORWDATAGRAMS 16
+#define IPSYSTEMSTATSTABLE_HCOUTDISCARDS      17
+#define IPSYSTEMSTATSTABLE_HCOUTFRAGREQDS     18
+#define IPSYSTEMSTATSTABLE_HCOUTFRAGOKS       19
+#define IPSYSTEMSTATSTABLE_HCOUTFRAGFAILS     20
+#define IPSYSTEMSTATSTABLE_HCOUTFRAGCREATES   21
+#define IPSYSTEMSTATSTABLE_HCOUTTRANSMITS     22
+#define IPSYSTEMSTATSTABLE_HCOUTOCTETS        23
+#define IPSYSTEMSTATSTABLE_HCINMCASTPKTS      24
+#define IPSYSTEMSTATSTABLE_HCINMCASTOCTETS    25
+#define IPSYSTEMSTATSTABLE_HCOUTMCASTPKTS     26
+#define IPSYSTEMSTATSTABLE_HCOUTMCASTOCTETS   27
+#define IPSYSTEMSTATSTABLE_HCINBCASTPKTS      28
+#define IPSYSTEMSTATSTABLE_HCOUTBCASTPKTS     29
+#define IPSYSTEMSTATSTABLE_DISCONTINUITYTIME  30
+#define IPSYSTEMSTATSTABLE_REFRESHRATE        31
+    
+#define IPSYSTEMSTATSTABLE_LAST IPSYSTEMSTATSTABLE_REFRESHRATE
+    
 /**---------------------------------------------------------------------*/
 /*
  * structure definitions
@@ -20,28 +54,42 @@ extern          "C" {
  */
 typedef struct netsnmp_ipstats_s {
 
+   /* Columns of ipStatsTable. Some of them are HC for computation of the 
+    * other columns, when underlying OS does not provide them.
+    * Always fill at least 32 bits, the table is periodically polled -> 32 bit
+    * overflow shall be detected and 64 bit value should be computed automatically. */
    U64             HCInReceives;
    U64             HCInOctets;
    u_long          InHdrErrors;
-   u_long          InNoRoutes;
+   U64             HCInNoRoutes; 
    u_long          InAddrErrors;
    u_long          InUnknownProtos;
    u_long          InTruncatedPkts;
-   U64             HCInForwDatagrams;
+   
+   /* optional, can be computed from HCInNoRoutes and HCOutForwDatagrams */
+   U64             HCInForwDatagrams; 
+   
    u_long          ReasmReqds;
    u_long          ReasmOKs;
    u_long          ReasmFails;
    u_long          InDiscards;
    U64             HCInDelivers;
    U64             HCOutRequests;
-   u_long          OutNoRoutes;
+   U64             HCOutNoRoutes;
    U64             HCOutForwDatagrams;
-   u_long          OutDiscards;
-   u_long          OutFragReqds;
-   u_long          OutFragOKs;
-   u_long          OutFragFails;
-   u_long          OutFragCreates;
+   U64             HCOutDiscards;
+   
+   /* optional, can be computed from HCOutFragOKs + HCOutFragFails*/
+   U64             HCOutFragReqds;
+   U64             HCOutFragOKs;
+   U64             HCOutFragFails;
+   U64             HCOutFragCreates;
+   
+   /* optional, can be computed from 
+    * HCOutRequests +HCOutForwDatagrams + HCOutFragCreates
+    * - HCOutFragReqds - HCOutNoRoutes  - HCOutDiscards */
    U64             HCOutTransmits;
+   
    U64             HCOutOctets;
    U64             HCInMcastPkts;
    U64             HCInMcastOctets;
@@ -50,6 +98,8 @@ typedef struct netsnmp_ipstats_s {
    U64             HCInBcastPkts;
    U64             HCOutBcastPkts;
 
+   /* Array of available columns.*/
+   int             columnAvail[IPSYSTEMSTATSTABLE_LAST+1];
 } netsnmp_ipstats;
 
 
diff --git a/include/net-snmp/data_access/systemstats.h b/include/net-snmp/data_access/systemstats.h
index 53dfd51..47e1076 100644
--- a/include/net-snmp/data_access/systemstats.h
+++ b/include/net-snmp/data_access/systemstats.h
@@ -22,7 +22,11 @@ extern          "C" {
 typedef struct netsnmp_systemstats_s {
 
    netsnmp_index oid_index;   /* MUST BE FIRST!! for container use */
-   oid           ns_ip_version;
+   /* 
+    * Index of the table
+    * First entry = ip version
+    * Second entry = interface index (0 for ipSystemStatsTable */
+   oid           index[2];           
 
    int       flags; /* for net-snmp use */
 
@@ -49,13 +53,15 @@ netsnmp_container * netsnmp_access_systemstats_container_init(u_int init_flags);
 #define NETSNMP_ACCESS_SYSTEMSTATS_INIT_NOFLAGS               0x0000
 #define NETSNMP_ACCESS_SYSTEMSTATS_INIT_ADDL_IDX_BY_ADDR      0x0001
 
-/*
- * load and free
+/**
+ * Load container. If the NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE is set
+ * the ipIfSystemStats table is loaded, else ipSystemStatsTable is loaded.
  */
 netsnmp_container*
 netsnmp_access_systemstats_container_load(netsnmp_container* container,
                                     u_int load_flags);
 #define NETSNMP_ACCESS_SYSTEMSTATS_LOAD_NOFLAGS               0x0000
+#define NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE               0x0001 
 
 void netsnmp_access_systemstats_container_free(netsnmp_container *container,
                                          u_int free_flags);
@@ -68,7 +74,7 @@ void netsnmp_access_systemstats_container_free(netsnmp_container *container,
  * create/free an entry
  */
 netsnmp_systemstats_entry *
-netsnmp_access_systemstats_entry_create(int version);
+netsnmp_access_systemstats_entry_create(int version, int if_index);
 
 void netsnmp_access_systemstats_entry_free(netsnmp_systemstats_entry * entry);
 
-- 
1.6.0.2

