

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://net-snmp.sourceforge.io/wiki/index.php?action=history&amp;feed=atom&amp;title=MFD%3AifXTable%3AGet_Data</id>
		<title>MFD:ifXTable:Get Data - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://net-snmp.sourceforge.io/wiki/index.php?action=history&amp;feed=atom&amp;title=MFD%3AifXTable%3AGet_Data"/>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifXTable:Get_Data&amp;action=history"/>
		<updated>2026-04-08T00:46:48Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifXTable:Get_Data&amp;diff=5179&amp;oldid=prev</id>
		<title>Wes: Created page with &quot;{{MFDTutorial}}    == MIBs For Dummies : ifXTable data GET ==  Once the correct table context has been found, the individual node get routines will be called. These are generated...&quot;</title>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifXTable:Get_Data&amp;diff=5179&amp;oldid=prev"/>
				<updated>2011-07-13T22:03:28Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{MFDTutorial}}    == MIBs For Dummies : ifXTable data GET ==  Once the correct table context has been found, the individual node get routines will be called. These are generated...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{MFDTutorial}}&lt;br /&gt;
  &lt;br /&gt;
== MIBs For Dummies : ifXTable data GET ==&lt;br /&gt;
&lt;br /&gt;
Once the correct table context has been found, the individual node&lt;br /&gt;
get routines will be called. These are generated in the file&lt;br /&gt;
&amp;#039;&amp;#039;ifXTable_data_get.c&amp;#039;&amp;#039;. The code generated for each node&lt;br /&gt;
defaults to returning &amp;#039;&amp;#039;MFD_SKIP&amp;#039;&amp;#039;, which will cause Net-SNMP to&lt;br /&gt;
skip the column for the given table context. If you compile and run the&lt;br /&gt;
code before implementing any code in the get routines, and try to walk&lt;br /&gt;
the ifXTable, each node&amp;#039;s get routine will be called once for each&lt;br /&gt;
interface. Since every function will return &amp;#039;&amp;#039;MFD_SKIP&amp;#039;&amp;#039;, snmpwalk&lt;br /&gt;
will eventually return END OF MIB.&lt;br /&gt;
&lt;br /&gt;
=== Implementing the get routines ===&lt;br /&gt;
&lt;br /&gt;
We are using the same data structures that the &amp;#039;&amp;#039;ifTable&amp;#039;&amp;#039;&lt;br /&gt;
implementation uses for the Linux kernel. I won&amp;#039;t cover every&lt;br /&gt;
node, as they are all very similar.&lt;br /&gt;
&lt;br /&gt;
==== ifName_get ====&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;ifName&amp;#039;&amp;#039; node is a string. First we check that the string&lt;br /&gt;
is large enough to hold the name in our &amp;#039;&amp;#039;data context&amp;#039;&amp;#039;,&lt;br /&gt;
allocating memory if it is not. Then the name is copied and the length&lt;br /&gt;
variable is set.&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Generated code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Modified code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifName_get(ifXTable_ctx * ctx, char **ifName_ptr_ptr,&lt;br /&gt;
            size_t * ifName_len_ptr)&lt;br /&gt;
 {&lt;br /&gt;
     /** syntax-DisplayString-get.m2i not found, using generic */&lt;br /&gt;
    /** we should have a non-NULL pointer and enough storage */&lt;br /&gt;
     netsnmp_assert((NULL != ifName_ptr_ptr) &amp;amp;&amp;amp; (NULL != *ifName_ptr_ptr));&lt;br /&gt;
     netsnmp_assert(NULL != ifName_len_ptr);&lt;br /&gt;
 &lt;br /&gt;
     netsnmp_assert(NULL != ctx);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * set (* ifName_ptr_ptr) and (* ifName_len_ptr) from ctx-&amp;gt;data.&lt;br /&gt;
      */&lt;br /&gt;
     return MFD_SKIP;            /* TODO: remove this once you&amp;#039;ve set data */&lt;br /&gt;
 &lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifName_get(ifXTable_ctx * ctx, char **ifName_ptr_ptr,&lt;br /&gt;
            size_t * ifName_len_ptr)&lt;br /&gt;
 {&lt;br /&gt;
     /** syntax-DisplayString-get.m2i not found, using generic */&lt;br /&gt;
    /** we should have a non-NULL pointer and enough storage */&lt;br /&gt;
     netsnmp_assert((NULL != ifName_ptr_ptr) &amp;amp;&amp;amp; (NULL != *ifName_ptr_ptr));&lt;br /&gt;
     netsnmp_assert(NULL != ifName_len_ptr);&lt;br /&gt;
 &lt;br /&gt;
     netsnmp_assert(NULL != ctx);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * set (* ifName_ptr_ptr) and (* ifName_len_ptr) from ctx-&amp;gt;data.&lt;br /&gt;
      */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     if (*ifName_len_ptr &amp;lt; strnlen(ctx-&amp;gt;data.Name,sizeof(ctx-&amp;gt;data.Name))) {&lt;br /&gt;
        *ifName_ptr_ptr = malloc(strnlen(ctx-&amp;gt;data.Name,sizeof(ctx-&amp;gt;data.Name)));&lt;br /&gt;
     }&lt;br /&gt;
     *ifName_len_ptr = strnlen(ctx-&amp;gt;data.Name,sizeof(ctx-&amp;gt;data.Name));&lt;br /&gt;
     memcpy(*ifName_ptr_ptr, ctx-&amp;gt;data.Name, *ifName_len_ptr);&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
==== ifInMulticastPkts_get ====&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;ifInMulticastPkts&amp;#039;&amp;#039; node is a integer. However, we don&amp;#039;t&lt;br /&gt;
always have the data for this node. At compile time we test a macro that&lt;br /&gt;
will be set during configure to determine if the data is available.&lt;br /&gt;
variable is set.&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Generated code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Modified code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifInMulticastPkts_get(ifXTable_ctx * ctx, u_long * ifInMulticastPkts_ptr)&lt;br /&gt;
 {&lt;br /&gt;
     /** syntax-COUNTER-get.m2i not found, using generic */&lt;br /&gt;
    /** we should have a non-NULL pointer */&lt;br /&gt;
     netsnmp_assert(NULL != ifInMulticastPkts_ptr);&lt;br /&gt;
 &lt;br /&gt;
     netsnmp_assert(NULL != ctx);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * set (* ifInMulticastPkts_ptr) from ctx-&amp;gt;data.&lt;br /&gt;
      */&lt;br /&gt;
     return MFD_SKIP;            /* TODO: remove this once you&amp;#039;ve set data */&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * value mapping&lt;br /&gt;
      *&lt;br /&gt;
      * If the values for your data type don&amp;#039;t exactly match the&lt;br /&gt;
      * possible values defined by the mib, you should map them here.&lt;br /&gt;
      */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifInMulticastPkts_get(ifXTable_ctx * ctx, u_long * ifInMulticastPkts_ptr)&lt;br /&gt;
 {&lt;br /&gt;
     /** syntax-COUNTER-get.m2i not found, using generic */&lt;br /&gt;
    /** we should have a non-NULL pointer */&lt;br /&gt;
     netsnmp_assert(NULL != ifInMulticastPkts_ptr);&lt;br /&gt;
 &lt;br /&gt;
     netsnmp_assert(NULL != ctx);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * set (* ifInMulticastPkts_ptr) from ctx-&amp;gt;data.&lt;br /&gt;
      */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
 #if STRUCT_IFNET_HAS_IF_IMCASTS&lt;br /&gt;
     temp_ifInMulticastPkts = (u_long) ctx-&amp;gt;data.ifnet.if_imcasts;&lt;br /&gt;
 #else&amp;lt;/font&amp;gt;&lt;br /&gt;
     return MFD_SKIP;            /* TODO: remove this once you&amp;#039;ve set data */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * value mapping&lt;br /&gt;
      *&lt;br /&gt;
      * If the values for your data type don&amp;#039;t exactly match the&lt;br /&gt;
      * possible values defined by the mib, you should map them here.&lt;br /&gt;
      */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
==== ifHCInOctets_get ====&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;ifHCInOctets&amp;#039;&amp;#039; node is a 64 bit counter. Net-SNMP uses a&lt;br /&gt;
structure containing the high and low 32 bits for 64 bit counters. We&lt;br /&gt;
use if_ibytes if it is available, or if_ipackets otherwise. This logic&lt;br /&gt;
is straight from the current &amp;#039;&amp;#039;ifTable&amp;#039;&amp;#039; implementation.&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Generated code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;#039;&amp;#039;&amp;#039;Modified code&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifHCInOctets_get(ifXTable_ctx * ctx, U64 * ifHCInOctets_ptr)&lt;br /&gt;
 {&lt;br /&gt;
    /** we should have a non-NULL pointer */&lt;br /&gt;
     netsnmp_assert(NULL != ifHCInOctets_ptr);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * get (* ifHCInOctets_ptr).low and (* ifHCInOctets_ptr).high from ctx-&amp;gt;data.&lt;br /&gt;
      */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifHCInOctets_get(ifXTable_ctx * ctx, U64 * ifHCInOctets_ptr)&lt;br /&gt;
 {&lt;br /&gt;
    /** we should have a non-NULL pointer */&lt;br /&gt;
     netsnmp_assert(NULL != ifHCInOctets_ptr);&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * TODO:&lt;br /&gt;
      * get (* ifHCInOctets_ptr).low and (* ifHCInOctets_ptr).high from ctx-&amp;gt;data.&lt;br /&gt;
      */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     (*ifHCInOctets_ptr).high = 0;&lt;br /&gt;
 #ifdef STRUCT_IFNET_HAS_IF_IBYTES&lt;br /&gt;
     (*ifHCInOctets_ptr).low = (u_long) ctx-&amp;gt;data.ifnet.if_ibytes;&lt;br /&gt;
 #else&lt;br /&gt;
      (*ifHCInOctets_ptr).low = (u_long) ctx-&amp;gt;data.ifnet.if_ipackets * 308; /* XXX */&lt;br /&gt;
 #endif&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     return SNMP_ERR_NOERROR;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	</feed>