

<?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%3AifTable%3AData_Access</id>
		<title>MFD:ifTable:Data Access - 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%3AifTable%3AData_Access"/>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;action=history"/>
		<updated>2026-04-16T19:18:03Z</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:ifTable:Data_Access&amp;diff=5246&amp;oldid=prev</id>
		<title>Wes at 23:45, 18 July 2011</title>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;diff=5246&amp;oldid=prev"/>
				<updated>2011-07-18T23:45:56Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&#039;diff diff-contentalign-left&#039;&gt;
				&lt;col class=&#039;diff-marker&#039; /&gt;
				&lt;col class=&#039;diff-content&#039; /&gt;
				&lt;col class=&#039;diff-marker&#039; /&gt;
				&lt;col class=&#039;diff-content&#039; /&gt;
				&lt;tr style=&#039;vertical-align: top;&#039; lang=&#039;en&#039;&gt;
				&lt;td colspan=&#039;2&#039; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&#039;2&#039; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 23:45, 18 July 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l130&quot; &gt;Line 130:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 130:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;bold&amp;gt;&lt;/del&gt;Modified code&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/bold&amp;gt;&lt;/del&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Modified code&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;diff=5245&amp;oldid=prev</id>
		<title>Wes: /* Data init */</title>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;diff=5245&amp;oldid=prev"/>
				<updated>2011-07-18T23:43:51Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Data init&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&#039;diff diff-contentalign-left&#039;&gt;
				&lt;col class=&#039;diff-marker&#039; /&gt;
				&lt;col class=&#039;diff-content&#039; /&gt;
				&lt;col class=&#039;diff-marker&#039; /&gt;
				&lt;col class=&#039;diff-content&#039; /&gt;
				&lt;tr style=&#039;vertical-align: top;&#039; lang=&#039;en&#039;&gt;
				&lt;td colspan=&#039;2&#039; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&#039;2&#039; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 23:43, 18 July 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l76&quot; &gt;Line 76:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 76:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;bold&amp;gt;&lt;/del&gt;Modified code&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/bold&amp;gt;&lt;/del&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;Modified code&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#039;&amp;#039;&amp;#039;&lt;/ins&gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l114&quot; &gt;Line 114:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 114:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== Container init ====&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== Container init ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;diff=5161&amp;oldid=prev</id>
		<title>Wes: Created page with &quot;{{MFDTutorial}}    == MFD : ifTable data access ==      Now that we have the basic code generated, the next step is to implement the data access functions. The data access code i...&quot;</title>
		<link rel="alternate" type="text/html" href="https://net-snmp.sourceforge.io/wiki/index.php?title=MFD:ifTable:Data_Access&amp;diff=5161&amp;oldid=prev"/>
				<updated>2011-07-13T17:32:45Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{MFDTutorial}}    == MFD : ifTable data access ==      Now that we have the basic code generated, the next step is to implement the data access functions. The data access code i...&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;
== MFD : ifTable data access ==&lt;br /&gt;
    &lt;br /&gt;
Now that we have the basic code generated, the next step is to&lt;br /&gt;
implement the data access functions. The data access code is&lt;br /&gt;
responsible for reading the available data and determining the valid&lt;br /&gt;
indexes. For each data item, or row, a new &amp;#039;&amp;#039;row request&amp;#039;&amp;#039;&lt;br /&gt;
structure is created. The &amp;#039;&amp;#039;mib context&amp;#039;&amp;#039;, contained in the&lt;br /&gt;
&amp;#039;&amp;#039;row request&amp;#039;&amp;#039;, is initialized with the appropriate index&lt;br /&gt;
data for the row, and then the row is inserted into the table&lt;br /&gt;
container. The module can also initialize the &amp;#039;&amp;#039;data context&amp;#039;&amp;#039; at&lt;br /&gt;
this time, or delay that processing for later. (see&lt;br /&gt;
&amp;lt;a href=&amp;quot;../../faq.html#init_data_context&amp;quot;&amp;gt;When should I initialize&lt;br /&gt;
the data context?&amp;lt;/a&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
In the Linux kernel, interface&lt;br /&gt;
statistics are available by reading the file /proc/net/dev. The format&lt;br /&gt;
looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&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;
 Inter-|   Receive                                                |  Transmit&lt;br /&gt;
  face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed&lt;br /&gt;
     lo:45312667  382442    0    0    0     0          0         0 45312667  382442    0    0    0     0       0          0&lt;br /&gt;
   eth0:2116574495 13308144    0    0    0     0          0         0 816012310 7565504    0    0    0 3604480       0          0&lt;br /&gt;
             &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(If you want to try this tutorial on a non-Linux system, just copy&lt;br /&gt;
the above data to any file, and update the code to use a static copy&lt;br /&gt;
of the file. Note that some ioctl calls are made for some data that&lt;br /&gt;
isn&amp;#039;t found in /proc/net/dev. If your OS doesn&amp;#039;t support the ioctl&lt;br /&gt;
calls that are used, comment them out or replace them with code to&lt;br /&gt;
get the data for your OS.)&lt;br /&gt;
&lt;br /&gt;
As is often the case with external data, the interfaces data we get&lt;br /&gt;
from the kernel is not sorted by the index specified by the MIB. The&lt;br /&gt;
kernel reports data by interface names (&amp;#039;eth0&amp;#039;, &amp;#039;lo&amp;#039;, etc), and the&lt;br /&gt;
ifTable is ordered by the arbitrary ifIndex.&lt;br /&gt;
&lt;br /&gt;
To keep this tutorial simple, we aren&amp;#039;t going to implment&lt;br /&gt;
every column in the ifTable. In particular, the ifAdminStatus,&lt;br /&gt;
ifOperStatus and ifLastChange columns will not be implemented.&lt;br /&gt;
This also lets us ignore set support for the time being.&lt;br /&gt;
We&amp;#039;ll cover dealing with these columns later on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The default data access method used by MFD is the&lt;br /&gt;
&amp;lt;var&amp;gt;container-cached&amp;lt;/var&amp;gt; method. Basically this means that a&lt;br /&gt;
&amp;lt;var&amp;gt;netsnmp_container&amp;lt;/var&amp;gt; will be used to cache the data for&lt;br /&gt;
our table. (If you don&amp;#039;t want caching, don&amp;#039;t worry. You can&lt;br /&gt;
configure the cache to be rebuilt for every request.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
There are two initialization routines called for&lt;br /&gt;
&amp;lt;var&amp;gt;container-cached&amp;lt;/var&amp;gt;. One is the data init routine that&lt;br /&gt;
is common to all &amp;lt;var&amp;gt;MFD&amp;lt;/var&amp;gt; code. The other is specificly&lt;br /&gt;
to init the container and cache.&lt;br /&gt;
&lt;br /&gt;
==== Data init ====&lt;br /&gt;
&lt;br /&gt;
The data init routine is called at startup, and&lt;br /&gt;
any necessary data related setup can be done here. In this&lt;br /&gt;
example, we are going to set up a &amp;lt;var&amp;gt;netsnmp_column_info&amp;lt;/var&amp;gt;&lt;br /&gt;
structure to let the agent know which columns we will be&lt;br /&gt;
implementing. This will allow the agent to skip these columns.&lt;br /&gt;
&lt;br /&gt;
The format of the data file we are using changed between the&lt;br /&gt;
2.2 and 2.4 versions of the kernel. We need to know which format&lt;br /&gt;
the current system is using, so we call a routine that will take a peek&lt;br /&gt;
at the data file to determine the format of the file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bold&amp;gt;Modified code&amp;lt;/bold&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifTable_init_data(ifTable_registration_ptr ifTable_reg)&lt;br /&gt;
 {&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     static unsigned int my_columns[] = {&lt;br /&gt;
         COLUMN_IFINDEX, COLUMN_IFTYPE, COLUMN_IFPHYSADDRESS,&lt;br /&gt;
         COLUMN_IFINOCTETS, COLUMN_IFINUCASTPKTS,&lt;br /&gt;
         COLUMN_IFOUTOCTETS, COLUMN_IFOUTUCASTPKTS };&lt;br /&gt;
     static netsnmp_column_info valid_columns;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
     DEBUGMSGTL((&amp;quot;verbose:ifTable_init_data&amp;quot;, &amp;quot;called\n&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      ***************************************************&lt;br /&gt;
      ***             START EXAMPLE CODE              ***&lt;br /&gt;
      ***---------------------------------------------***/&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      * we only want to process certain columns, and ignore&lt;br /&gt;
      * anything else.&lt;br /&gt;
      */&lt;br /&gt;
     valid_columns.isRange = 0;&lt;br /&gt;
     valid_columns.details.list = my_columns;&lt;br /&gt;
     valid_columns.list_count = sizeof(my_columns)/sizeof(int);&lt;br /&gt;
     ifTable_valid_columns_set(&amp;amp;valid_columns);&lt;br /&gt;
 &lt;br /&gt;
     _choose_proc_format();&amp;lt;/font&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      ***---------------------------------------------***&lt;br /&gt;
      ***              END  EXAMPLE CODE              ***&lt;br /&gt;
      ***************************************************/&lt;br /&gt;
 &lt;br /&gt;
     return MFD_SUCCESS;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
==== Container init ====&lt;br /&gt;
&lt;br /&gt;
The container init routine is called right after the data&lt;br /&gt;
init routine. We are going to leave the default code as-is,&lt;br /&gt;
to have a container allocated for us. (The timeout could&lt;br /&gt;
be increased, depending on your tolerance for stale data.&lt;br /&gt;
Set it to -1 if you want to rebuild the cache for every&lt;br /&gt;
request.) We are going to to set one extra flag, to have&lt;br /&gt;
the cache pre-load right away. This will allow the agent to&lt;br /&gt;
discover all the index values at startup, which is necessar&lt;br /&gt;
because other parts of the agent need to know what ifIndex&lt;br /&gt;
values are valid.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td width=20&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bold&amp;gt;Modified code&amp;lt;/bold&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 void&lt;br /&gt;
 ifTable_container_init(netsnmp_container ** container_ptr_ptr,&lt;br /&gt;
                        netsnmp_cache * cache)&lt;br /&gt;
 {&lt;br /&gt;
     DEBUGMSGTL((&amp;quot;verbose:ifTable_container_init&amp;quot;, &amp;quot;called\n&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     if ((NULL == cache) || (NULL == container_ptr_ptr)) {&lt;br /&gt;
         snmp_log(LOG_ERR, &amp;quot;bad params to ifTable_container_init\n&amp;quot;);&lt;br /&gt;
         return;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * For advanced users, you can use a custom container. If you&lt;br /&gt;
      * do not create one, one will be created for you.&lt;br /&gt;
      */&lt;br /&gt;
     *container_ptr_ptr = NULL;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * Also for advance users, you can set parameters for the&lt;br /&gt;
      * cache. Do not change the magic pointer, as it is used&lt;br /&gt;
      * by the MFD helper.&lt;br /&gt;
      */&lt;br /&gt;
     cache-&amp;gt;timeout = 30;        /* seconds */&lt;br /&gt;
 &amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      * preload to assign initial index values&lt;br /&gt;
      */&lt;br /&gt;
     cache-&amp;gt;flags |= NETSNMP_CACHE_PRELOAD;&amp;lt;/font&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cache Helper ===&lt;br /&gt;
&lt;br /&gt;
The cache helper is used to load the indexes (and by default,&lt;br /&gt;
the data) for each row in a table. In this tutorial, we will be&lt;br /&gt;
using all of the default behavior, with the addition of the&lt;br /&gt;
pre-loading (remember the flag we set during continer init?).&lt;br /&gt;
&lt;br /&gt;
==== Cache Load ====&lt;br /&gt;
&lt;br /&gt;
The default behaviour is to load the cache when a request is&lt;br /&gt;
received for data from the table. If requests continue to come&lt;br /&gt;
in, the cached data will be used until the time expires, at&lt;br /&gt;
which point the cache will be unloaded and the re-loaded. &lt;br /&gt;
&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 bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifTable_cache_load(netsnmp_container * container)&lt;br /&gt;
 {&lt;br /&gt;
     ifTable_rowreq_ctx *rowreq_ctx;&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     int rc = MFD_SUCCESS;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * this example code is based on a data source that is a&lt;br /&gt;
      * text file to be read and parsed.&lt;br /&gt;
      */&lt;br /&gt;
     FILE           *filep;&lt;br /&gt;
     char            line[MAX_LINE_SIZE];&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     int             fd;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * temporary storage for index values&lt;br /&gt;
      */&lt;br /&gt;
     /*&lt;br /&gt;
      * ifIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H&lt;br /&gt;
      */&lt;br /&gt;
     long            ifIndex;&lt;br /&gt;
 &lt;br /&gt;
     DEBUGMSGTL((&amp;quot;verbose:ifTable_cache_load&amp;quot;, &amp;quot;called\n&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      ***************************************************&lt;br /&gt;
      ***             START EXAMPLE CODE              ***&lt;br /&gt;
      ***---------------------------------------------***/&lt;br /&gt;
     /*&lt;br /&gt;
      * open our data file.&lt;br /&gt;
      */&lt;br /&gt;
     filep = fopen(&amp;lt;font color=blue&amp;gt;&amp;quot;/proc/net/dev&amp;quot;&amp;lt;/font&amp;gt;, &amp;quot;r&amp;quot;);&lt;br /&gt;
     if (NULL == filep) {&lt;br /&gt;
         return MFD_RESOURCE_UNAVAILABLE;&lt;br /&gt;
     }&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * create socket for ioctls&lt;br /&gt;
      */&lt;br /&gt;
     fd = socket(AF_INET, SOCK_DGRAM, 0);&lt;br /&gt;
     if(fd &amp;lt; 0) {&lt;br /&gt;
         fclose(filep);&lt;br /&gt;
         return MFD_RESOURCE_UNAVAILABLE;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * ignore header lines&lt;br /&gt;
      */&lt;br /&gt;
     fgets(line, sizeof(line), filep);&lt;br /&gt;
     fgets(line, sizeof(line), filep);&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      ***---------------------------------------------***&lt;br /&gt;
      ***              END  EXAMPLE CODE              ***&lt;br /&gt;
      ***************************************************/&lt;br /&gt;
     /*&lt;br /&gt;
      * TODO: update container&lt;br /&gt;
      *&lt;br /&gt;
      * loop over your data, allocate, set index, insert into the container&lt;br /&gt;
      */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     /*&lt;br /&gt;
      * The rest of the file provides the statistics for an interface.&lt;br /&gt;
      * Read in each line in turn, isolate the interface name&lt;br /&gt;
      *   and retrieve (or create) the corresponding data structure.&lt;br /&gt;
      */&amp;lt;/font&amp;gt;&lt;br /&gt;
     while (1) {&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         struct ifreq    ifrq;&lt;br /&gt;
         int             scan_count;&lt;br /&gt;
         char           *stats, *ifstart;&lt;br /&gt;
         unsigned long   rec_pkt, rec_oct, rec_err, rec_drop;&lt;br /&gt;
         unsigned long   snd_pkt, snd_oct, snd_err, snd_drop, coll;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          ***************************************************&lt;br /&gt;
          ***             START EXAMPLE CODE              ***&lt;br /&gt;
          ***---------------------------------------------***/&lt;br /&gt;
         /*&lt;br /&gt;
          * get a line (skip blank lines)&lt;br /&gt;
          */&lt;br /&gt;
         do {&lt;br /&gt;
             if (!fgets(line, sizeof(line), filep)) {&lt;br /&gt;
                 /*&lt;br /&gt;
                  * we&amp;#039;re done &lt;br /&gt;
                  */&lt;br /&gt;
                 fclose(filep);&lt;br /&gt;
                 filep = NULL;&lt;br /&gt;
             }&lt;br /&gt;
         } while (filep &amp;amp;&amp;amp; (line[0] == &amp;#039;\n&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * check for end of data&lt;br /&gt;
          */&lt;br /&gt;
         if (NULL == filep)&lt;br /&gt;
             break;&lt;br /&gt;
         &lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: parse line&lt;br /&gt;
          * parse line into variables&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         ifstart = line;&lt;br /&gt;
         while (*ifstart &amp;amp;&amp;amp; *ifstart == &amp;#039; &amp;#039;)&lt;br /&gt;
             ifstart++;&lt;br /&gt;
         if ((!*ifstart) || ((stats = strrchr(ifstart, &amp;#039;:&amp;#039;)) == NULL)) {&lt;br /&gt;
             snmp_log(LOG_ERR,&lt;br /&gt;
                      &amp;quot;interface data format error 1, line ==|%s|\n&amp;quot;,&lt;br /&gt;
                      line);&lt;br /&gt;
             DEBUGMSGTL((&amp;quot;ifTable&amp;quot;, &amp;quot;found &amp;#039;%s&amp;#039;\n&amp;quot;, ifstart));&lt;br /&gt;
             continue;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * If we&amp;#039;ve met this interface before, use the same index.&lt;br /&gt;
          * Otherwise find an unused index value and use that.&lt;br /&gt;
          */&lt;br /&gt;
         *stats++ = 0; /* null terminate name */&lt;br /&gt;
         ifIndex = se_find_value_in_slist(&amp;quot;interfaces&amp;quot;, ifstart);&lt;br /&gt;
         if (ifIndex == SE_DNE) {&lt;br /&gt;
             ifIndex = se_find_free_value_in_slist(&amp;quot;interfaces&amp;quot;);&lt;br /&gt;
             if (ifIndex == SE_DNE)&lt;br /&gt;
                 ifIndex = 1;       /* Completely new list! */&lt;br /&gt;
             se_add_pair_to_slist(&amp;quot;interfaces&amp;quot;,&lt;br /&gt;
                                  strdup(ifstart), ifIndex);&lt;br /&gt;
             DEBUGMSGTL((&amp;quot;ifTable:ifIndex&amp;quot;, &amp;quot;new ifIndex %d for %s\n&amp;quot;,&lt;br /&gt;
                         ifIndex, ifstart));&lt;br /&gt;
         }&lt;br /&gt;
         if ((NULL == ifstart) || (0 == ifIndex)) {&lt;br /&gt;
             rc = MFD_END_OF_DATA;&lt;br /&gt;
             break;&lt;br /&gt;
         }&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          ***---------------------------------------------***&lt;br /&gt;
          ***              END  EXAMPLE CODE              ***&lt;br /&gt;
          ***************************************************/&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * allocate an row context and set the index(es)&lt;br /&gt;
          */&lt;br /&gt;
         rowreq_ctx = ifTable_allocate_rowreq_ctx();&lt;br /&gt;
         if (NULL == rowreq_ctx) {&lt;br /&gt;
             snmp_log(LOG_ERR, &amp;quot;memory allocation failed\n&amp;quot;);&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
             rc = MFD_RESOURCE_UNAVAILABLE;&lt;br /&gt;
             break;&amp;lt;/font&amp;gt;&lt;br /&gt;
         }&lt;br /&gt;
         if (MFD_SUCCESS != ifTable_indexes_set(rowreq_ctx, ifIndex)) {&lt;br /&gt;
             snmp_log(LOG_ERR, &amp;quot;error setting index while loading &amp;quot;&lt;br /&gt;
                      &amp;quot;ifTable cache.\n&amp;quot;);&lt;br /&gt;
             ifTable_release_rowreq_ctx(rowreq_ctx);&lt;br /&gt;
             continue;&lt;br /&gt;
         }&lt;br /&gt;
 &amp;lt;font color=blue&amp;gt;        &lt;br /&gt;
         rec_pkt = rec_oct = rec_err = rec_drop = 0;&lt;br /&gt;
         snd_pkt = snd_oct = snd_err = snd_drop = coll = 0;&lt;br /&gt;
         if (scan_line_to_use == scan_line_2_2) {&lt;br /&gt;
             scan_count = sscanf(stats, scan_line_to_use,&lt;br /&gt;
                                 &amp;amp;rec_oct, &amp;amp;rec_pkt, &amp;amp;rec_err, &amp;amp;rec_drop,&lt;br /&gt;
                                 &amp;amp;snd_oct, &amp;amp;snd_pkt, &amp;amp;snd_err, &amp;amp;snd_drop,&lt;br /&gt;
                                 &amp;amp;coll);&lt;br /&gt;
         } else {&lt;br /&gt;
             scan_count = sscanf(stats, scan_line_to_use,&lt;br /&gt;
                                 &amp;amp;rec_pkt, &amp;amp;rec_err,&lt;br /&gt;
                                 &amp;amp;snd_pkt, &amp;amp;snd_err, &amp;amp;coll);&lt;br /&gt;
         }&lt;br /&gt;
         if(scan_count != scan_expected) {&lt;br /&gt;
             snmp_log(LOG_ERR,&lt;br /&gt;
                      &amp;quot;error scanning interface data (expected %d, got %d)\n&amp;quot;,&lt;br /&gt;
                      scan_expected, scan_count);&lt;br /&gt;
             rc = MFD_ERROR;&lt;br /&gt;
             break;&lt;br /&gt;
         }&lt;br /&gt;
         if (scan_line_to_use != scan_line_2_2) {&lt;br /&gt;
             rec_oct = rec_pkt * 308;&lt;br /&gt;
             snd_oct = snd_pkt * 308;&lt;br /&gt;
         }&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: populate data context&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * TRANSIENT or semi-TRANSIENT data:&lt;br /&gt;
          * copy data or save any info needed to do it in row_prep.&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifDescr&lt;br /&gt;
          * ifDescr(2)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         /** no code to get description yet */&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifDescr[0] = 0;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifDescr_len = 0;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifMtu&lt;br /&gt;
          * ifMtu(4)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifMtu = TODO_FIND_ifMtu;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifSpeed&lt;br /&gt;
          * ifSpeed(5)/GAUGE/ASN_GAUGE/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifSpeed = TODO_FIND_ifSpeed;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifPhysAddress&lt;br /&gt;
          * ifPhysAddress(6)/PhysAddress/ASN_OCTET_STR/char(char)//L/A/w/e/r/d/H&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * make sure there is enough space for data&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         if (sizeof(rowreq_ctx-&amp;gt;data.ifPhysAddress) &amp;lt; 6) {&lt;br /&gt;
             snmp_log(LOG_ERR, &amp;quot;not enough space for address while loading &amp;quot;&lt;br /&gt;
                          &amp;quot;ifTable cache.\n&amp;quot;);&lt;br /&gt;
             ifTable_release_rowreq_ctx(rowreq_ctx);&lt;br /&gt;
             continue;&lt;br /&gt;
         }&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifPhysAddress_len = 6;&lt;br /&gt;
         strncpy(ifrq.ifr_name, ifstart, sizeof(ifrq.ifr_name));&lt;br /&gt;
         ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;&lt;br /&gt;
         if (ioctl(fd, SIOCGIFHWADDR, &amp;amp;ifrq) &amp;lt; 0)&lt;br /&gt;
             memset(rowreq_ctx-&amp;gt;data.ifPhysAddress, (0), 6);&lt;br /&gt;
         else {&lt;br /&gt;
             memcpy(rowreq_ctx-&amp;gt;data.ifPhysAddress,&lt;br /&gt;
                    ifrq.ifr_hwaddr.sa_data, 6);&lt;br /&gt;
         }&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifType&lt;br /&gt;
          * ifType(3)/IANAifType/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * value mapping&lt;br /&gt;
          */&lt;br /&gt;
         if (MFD_SUCCESS !=&lt;br /&gt;
             ifType_map(&amp;amp;rowreq_ctx-&amp;gt;data.ifType,&lt;br /&gt;
                        &amp;lt;font color=blue&amp;gt;ifrq.ifr_hwaddr.sa_family&amp;lt;/font&amp;gt;)) {&lt;br /&gt;
             snmp_log(LOG_ERR, &amp;quot;error mapping ifType while loading &amp;quot;&lt;br /&gt;
                      &amp;quot;ifTable cache.\n&amp;quot;);&lt;br /&gt;
             ifTable_release_rowreq_ctx(rowreq_ctx);&lt;br /&gt;
             continue;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifAdminStatus&lt;br /&gt;
          * ifAdminStatus(7)/INTEGER/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * value mapping&lt;br /&gt;
          */&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOperStatus&lt;br /&gt;
          * ifOperStatus(8)/INTEGER/ASN_INTEGER/long(u_long)//l/A/w/E/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * value mapping&lt;br /&gt;
          */&lt;br /&gt;
 &lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifLastChange&lt;br /&gt;
          * ifLastChange(9)/TICKS/ASN_TIMETICKS/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifLastChange = TODO_FIND_ifLastChange;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInOctets&lt;br /&gt;
          * ifInOctets(10)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifInOctets = rec_oct;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInUcastPkts&lt;br /&gt;
          * ifInUcastPkts(11)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifInUcastPkts = rec_pkt;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInNUcastPkts&lt;br /&gt;
          * ifInNUcastPkts(12)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifInNUcastPkts = TODO_FIND_ifInNUcastPkts;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInDiscards&lt;br /&gt;
          * ifInDiscards(13)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifInDiscards = rec_drop;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInErrors&lt;br /&gt;
          * ifInErrors(14)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifInErrors = rec_err;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifInUnknownProtos&lt;br /&gt;
          * ifInUnknownProtos(15)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifInUnknownProtos = TODO_FIND_ifInUnknownProtos;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutOctets&lt;br /&gt;
          * ifOutOctets(16)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifOutOctets = snd_oct;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutUcastPkts&lt;br /&gt;
          * ifOutUcastPkts(17)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifOutUcastPkts = snd_pkt;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutNUcastPkts&lt;br /&gt;
          * ifOutNUcastPkts(18)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifOutNUcastPkts = TODO_FIND_ifOutNUcastPkts;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutDiscards&lt;br /&gt;
          * ifOutDiscards(19)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifOutDiscards = snd_drop;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutErrors&lt;br /&gt;
          * ifOutErrors(20)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         rowreq_ctx-&amp;gt;data.ifOutErrors = snd_err;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifOutQLen&lt;br /&gt;
          * ifOutQLen(21)/GAUGE/ASN_GAUGE/u_long(u_long)//l/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         //rowreq_ctx-&amp;gt;data.ifOutQLen = TODO_FIND_ifOutQLen;&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO: setup/save data for ifSpecific&lt;br /&gt;
          * ifSpecific(22)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h&lt;br /&gt;
          */&lt;br /&gt;
     /** no mapping */&lt;br /&gt;
         /*&lt;br /&gt;
          * TODO:&lt;br /&gt;
          * update, replace or delete, if needed.&lt;br /&gt;
          */&lt;br /&gt;
         /*&lt;br /&gt;
          * make sure there is enough space for data&lt;br /&gt;
          */&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
         /** not implemented */&lt;br /&gt;
 &amp;lt;/font&amp;gt;&lt;br /&gt;
         /*&lt;br /&gt;
          * insert into table container&lt;br /&gt;
          */&lt;br /&gt;
         CONTAINER_INSERT(container, rowreq_ctx);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     /*&lt;br /&gt;
      ***************************************************&lt;br /&gt;
      ***             START EXAMPLE CODE              ***&lt;br /&gt;
      ***---------------------------------------------***/&amp;lt;font color=blue&amp;gt;&lt;br /&gt;
     close(fd);&amp;lt;/font&amp;gt;&lt;br /&gt;
     if (NULL != filep)&lt;br /&gt;
         fclose(filep);&lt;br /&gt;
     /*&lt;br /&gt;
      ***---------------------------------------------***&lt;br /&gt;
      ***              END  EXAMPLE CODE              ***&lt;br /&gt;
      ***************************************************/&lt;br /&gt;
 &amp;lt;font color=blue&amp;gt;return rc;&amp;lt;/font&amp;gt;&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;
==== Cache Unload ====&lt;br /&gt;
&lt;br /&gt;
When a cache has expired, the unload routine is called. The MFD&lt;br /&gt;
interface code calls the cache free routine to allow your handler&lt;br /&gt;
to do any necessary cleanup. Note that you should not actually&lt;br /&gt;
remove items from the container or delete anything - that will be&lt;br /&gt;
handled automaticaly by the container class.&lt;br /&gt;
&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 bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 void&lt;br /&gt;
 ifTable_cache_free(netsnmp_container * container)&lt;br /&gt;
 {&lt;br /&gt;
     DEBUGMSGTL((&amp;quot;verbose:ifTable_cache_free&amp;quot;, &amp;quot;called\n&amp;quot;));&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;
In this simple example, we get most of our data from an external&lt;br /&gt;
file, so simply flushing the cache meets our needs. In later&lt;br /&gt;
tutorials, we&amp;#039;ll see how to supress the cache unload/free and&lt;br /&gt;
re-use existing data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The agent does runs a periodic check (the default is every 60&lt;br /&gt;
seconds, I believe) for expired caches, and will call the&lt;br /&gt;
unload routine for expired caches. See the documentation&lt;br /&gt;
page on the cache helper for ways to modify this behavior, if&lt;br /&gt;
you need to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Row preparation ===&lt;br /&gt;
&lt;br /&gt;
The row preparation function &amp;lt;var&amp;gt;ifTable_row_prep&amp;lt;/var&amp;gt; is common&lt;br /&gt;
to all data access methods. After the correct row request context&lt;br /&gt;
is found for a request, this routine will be called for each row&lt;br /&gt;
that is referenced in the incoming request. This gives you&lt;br /&gt;
one last chance to update the context before the request is processed.&lt;br /&gt;
&lt;br /&gt;
The primary purpose of the cache load&lt;br /&gt;
routine (for MFD tables) is to set up the indexes. In this case,&lt;br /&gt;
we have access to everything we need during cache loading, so we&lt;br /&gt;
set up all our data there. If some data needed to be retrieved&lt;br /&gt;
from another source, we could delay loading it until the row is&lt;br /&gt;
needed.&lt;br /&gt;
&lt;br /&gt;
Not, however, that while the cache load routine won&amp;#039;t be called&lt;br /&gt;
again until the cache expires, the row prep routine is called&lt;br /&gt;
for each request. This is why we perform the ioctl to retrieve the&lt;br /&gt;
physical address (ifPhysAddr) during the cache load. If the ioctl&lt;br /&gt;
was for data that changed frequently, we could have chosen to&lt;br /&gt;
update that data here. That is an option if you don&amp;#039;t mind having&lt;br /&gt;
a mix of cached data and fresh data.&lt;br /&gt;
&lt;br /&gt;
Since we have already done the processing we need to do, so we&amp;#039;ll&lt;br /&gt;
just leave this function as is.&lt;br /&gt;
&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 bgcolor=CCCCCC&amp;gt;&lt;br /&gt;
 int&lt;br /&gt;
 ifTable_row_prep(ifTable_rowreq_ctx * rowreq_ctx)&lt;br /&gt;
 {&lt;br /&gt;
     DEBUGMSGTL((&amp;quot;verbose:ifTable_row_prep&amp;quot;, &amp;quot;called\n&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
     netsnmp_assert(NULL != rowreq_ctx);&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
     return MFD_SUCCESS;&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;/div&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	</feed>