

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.net-snmp.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Transport_Implementation_Notes</id>
		<title>Transport Implementation Notes - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.net-snmp.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Transport_Implementation_Notes"/>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;action=history"/>
		<updated>2026-05-02T00:21:32Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4989&amp;oldid=prev</id>
		<title>Wes: Undo revision 4988 by Newacct (talk) checking a NULL before free is always wise.</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4989&amp;oldid=prev"/>
				<updated>2011-06-02T13:45:37Z</updated>
		
		<summary type="html">&lt;p&gt;Undo revision 4988 by &lt;a href=&quot;/wiki/index.php/Special:Contributions/Newacct&quot; title=&quot;Special:Contributions/Newacct&quot;&gt;Newacct&lt;/a&gt; (&lt;a href=&quot;/wiki/index.php?title=User_talk:Newacct&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Newacct (page does not exist)&quot;&gt;talk&lt;/a&gt;) checking a NULL before free is always wise.&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 13:45, 2 June 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-l248&quot; &gt;Line 248:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&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; free(addr_pair);&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; free(addr_pair);&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; else {&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; else {&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; free(t-&amp;gt;data);&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; &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;if (t-&amp;gt;data != NULL)&lt;/ins&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 class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/ins&gt;free(t-&amp;gt;data);&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4988&amp;oldid=prev</id>
		<title>Newacct at 06:42, 2 June 2011</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4988&amp;oldid=prev"/>
				<updated>2011-06-02T06:42:10Z</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 06:42, 2 June 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-l248&quot; &gt;Line 248:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&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; free(addr_pair);&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; free(addr_pair);&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; else {&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; else {&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; &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;if (t-&amp;gt;data != NULL)&lt;/del&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; free(t-&amp;gt;data);&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;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/del&gt;free(t-&amp;gt;data);&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;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4929&amp;oldid=prev</id>
		<title>Wes: Reverted edits by Newacct (talk) to last revision by Wes</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4929&amp;oldid=prev"/>
				<updated>2011-05-06T13:49:33Z</updated>
		
		<summary type="html">&lt;p&gt;Reverted edits by &lt;a href=&quot;/wiki/index.php/Special:Contributions/Newacct&quot; title=&quot;Special:Contributions/Newacct&quot;&gt;Newacct&lt;/a&gt; (&lt;a href=&quot;/wiki/index.php?title=User_talk:Newacct&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Newacct (page does not exist)&quot;&gt;talk&lt;/a&gt;) to last revision by &lt;a href=&quot;/wiki/index.php/User:Wes&quot; title=&quot;User:Wes&quot;&gt;Wes&lt;/a&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 13:49, 6 May 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-l248&quot; &gt;Line 248:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&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; free(addr_pair);&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; free(addr_pair);&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; else {&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; else {&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; free(t-&amp;gt;data);&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; &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;if (t-&amp;gt;data != NULL)&lt;/ins&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 class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/ins&gt;free(t-&amp;gt;data);&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4928&amp;oldid=prev</id>
		<title>Newacct at 09:00, 6 May 2011</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4928&amp;oldid=prev"/>
				<updated>2011-05-06T09:00:36Z</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 09:00, 6 May 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-l248&quot; &gt;Line 248:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&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; free(addr_pair);&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; free(addr_pair);&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; else {&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; else {&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; &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;if (t-&amp;gt;data != NULL)&lt;/del&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; free(t-&amp;gt;data);&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;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/del&gt;free(t-&amp;gt;data);&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;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data = addr_pair;&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&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; t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4661&amp;oldid=prev</id>
		<title>Wes: /* How the configure script finds transports */</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4661&amp;oldid=prev"/>
				<updated>2011-01-04T21:05:17Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;How the configure script finds transports&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 21:05, 4 January 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-l41&quot; &gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 41:&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;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;will result in configure also including snmpUDPDomain.c.&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;will result in configure also including snmpUDPDomain.c.&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 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;All transport code files must be placed in the &amp;#039;&amp;#039;snmplib/transports&amp;#039;&amp;#039; directory.&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;/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;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;== Creating a transport ==&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;== Creating a transport ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4660&amp;oldid=prev</id>
		<title>Wes: /* How the configure script finds transports */</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4660&amp;oldid=prev"/>
				<updated>2011-01-04T21:04:43Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;How the configure script finds transports&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 21:04, 4 January 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-l27&quot; &gt;Line 27:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 27:&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;== How the configure script finds transports ==&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;== How the configure script finds transports ==&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;For the Net-SNMP configure script to properly find and call the&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;For the Net-SNMP configure script to properly find and call the&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;initialization function, the function must be &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;names &lt;/del&gt;appropriately. If&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;initialization function, the function must be &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;named &lt;/ins&gt;appropriately. If&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;you are defining the XYZ transport, the source file and header must be named&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;you are defining the XYZ transport, the source file and header must be named&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;snmpXYZDomain.c and snmpXYZDomain.h, respectively. The initialization&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;snmpXYZDomain.c and snmpXYZDomain.h, respectively. The initialization&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wes</name></author>	</entry>

	<entry>
		<id>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4659&amp;oldid=prev</id>
		<title>Wes: /* Introduction */</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4659&amp;oldid=prev"/>
				<updated>2011-01-04T21:03:03Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Introduction&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 21:03, 4 January 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-l10&quot; &gt;Line 10:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 10:&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;Transports are uniquely identified by a domain object identifier. The&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;Transports are uniquely identified by a domain object identifier. The&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;standard domains are defined in the transport mappings MIB, SNMPv2-TM.&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;standard domains are defined in the transport mappings MIB, SNMPv2-TM.&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;Initial &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;transport &lt;/del&gt;included UDP, DDP and IPX. Other transports, such as&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;Initial &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;transports &lt;/ins&gt;included UDP, DDP and IPX. Other transports, such as&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;the DTLSUDP transport, were defined in later modules. Enterprises may define&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;the &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[DTLS|&lt;/ins&gt;DTLSUDP&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]] &lt;/ins&gt;transport, were defined in later modules. Enterprises may define&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;their own transport domains in their own enterprise MIBs.&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;their own transport domains in their own enterprise MIBs.&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>http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4658&amp;oldid=prev</id>
		<title>Rstory at 20:21, 4 January 2011</title>
		<link rel="alternate" type="text/html" href="http://www.net-snmp.org/wiki/index.php?title=Transport_Implementation_Notes&amp;diff=4658&amp;oldid=prev"/>
				<updated>2011-01-04T20:21:59Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Net-SNMP uses a layer of abstraction over the various transport protocol&lt;br /&gt;
that are supported, which allows the SNMP specific portions of the&lt;br /&gt;
library to be kept clean of the details of sending and receiving data&lt;br /&gt;
for the transport protocols. Adding support for a new transport is relatively&lt;br /&gt;
simple, and does not require any knowledge of the internals of the SNMP&lt;br /&gt;
portions of the library.&lt;br /&gt;
&lt;br /&gt;
Transports are uniquely identified by a domain object identifier. The&lt;br /&gt;
standard domains are defined in the transport mappings MIB, SNMPv2-TM.&lt;br /&gt;
Initial transport included UDP, DDP and IPX. Other transports, such as&lt;br /&gt;
the DTLSUDP transport, were defined in later modules. Enterprises may define&lt;br /&gt;
their own transport domains in their own enterprise MIBs.&lt;br /&gt;
&lt;br /&gt;
When registering a transport domains with Net-SNMP, prefixes can be specified&lt;br /&gt;
as well, allowing users to easily specify transport domains on the &lt;br /&gt;
command line, without having to use a length object identifier. For&lt;br /&gt;
example, to use the secure DTLS over UDP transport defined in RFC 5953,&lt;br /&gt;
the user could use the following command:&lt;br /&gt;
&lt;br /&gt;
 snmpget dtlsudp:hostname sysContact.0&lt;br /&gt;
&lt;br /&gt;
The implementation for the DTLSUDP transport would automatically take&lt;br /&gt;
care of the details, including using the correct port (in this case, 10161).&lt;br /&gt;
&lt;br /&gt;
== How the configure script finds transports ==&lt;br /&gt;
For the Net-SNMP configure script to properly find and call the&lt;br /&gt;
initialization function, the function must be names appropriately. If&lt;br /&gt;
you are defining the XYZ transport, the source file and header must be named&lt;br /&gt;
snmpXYZDomain.c and snmpXYZDomain.h, respectively. The initialization&lt;br /&gt;
function must be named netsnmp_xyz_ctor. Note the the transport name&lt;br /&gt;
is converted to lower case.  This will allow configure to find and&lt;br /&gt;
include the XYZ transport when --with-transports=XYZ is specified.&lt;br /&gt;
&lt;br /&gt;
If the XYZ transport depends on another transport, the snmpXYZDomain&lt;br /&gt;
header must use the config_require macro. For example, if the XYZ&lt;br /&gt;
transport requires the UDP transport, the line&lt;br /&gt;
&lt;br /&gt;
 config_require(UDP)&lt;br /&gt;
&lt;br /&gt;
will result in configure also including snmpUDPDomain.c.&lt;br /&gt;
&lt;br /&gt;
== Creating a transport ==&lt;br /&gt;
The Net-SNMP transport structure has several function pointers that&lt;br /&gt;
a new transport must implement, and others that may be implemented as&lt;br /&gt;
needed. All of these functions take the transport&amp;#039;s pointer as the&lt;br /&gt;
first argument.&lt;br /&gt;
&lt;br /&gt;
=== Registering with snmplib ===&lt;br /&gt;
The transport initialization function (e.g. netsnmp_xyz_ctor) will be&lt;br /&gt;
called at startup. This functions is responsible for registering the&lt;br /&gt;
transport with the library. This is also where one would register any&lt;br /&gt;
transport specific configuration tokens.&lt;br /&gt;
&lt;br /&gt;
 void netsnmp_xyz_ctor(void) {&lt;br /&gt;
     static netsnmp_tdomain XYZDomain;&lt;br /&gt;
 &lt;br /&gt;
     /* OID/length for transport OID */&lt;br /&gt;
     XYZDomain.name = XYZDomain_oid;&lt;br /&gt;
     XYZDomain.name_length = XYZDomain_oid_length;&lt;br /&gt;
 &lt;br /&gt;
     /* NULL terminated array of prefix(es) */&lt;br /&gt;
     XYZDomain.prefix = (const char **)calloc(2, sizeof(char *));;&lt;br /&gt;
     XYZDomain.prefix[0] = &amp;quot;xyz&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     XYZDomain.f_create_from_tstring_new = netsnmp_xyz_create_tstring;&lt;br /&gt;
     XYZDomain.f_create_from_ostring = netsnmp_xyz_create_ostring;&lt;br /&gt;
 &lt;br /&gt;
     /* register domain with snmplib */&lt;br /&gt;
     netsnmp_tdomain_register(&amp;amp;xyzDomain);&lt;br /&gt;
 &lt;br /&gt;
     register_config_handler(&amp;quot;snmp&amp;quot;, &amp;quot;xyzPDQretry&amp;quot;, _parse_xyzPDQ,&lt;br /&gt;
                             NULL, NULL);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== creating a transport ===&lt;br /&gt;
When registering a transport domain, the f_create_from_tstring_new function&lt;br /&gt;
pointer must be set to a function that can create a netsnmp_transport&lt;br /&gt;
from a user-supplied text string. The function is also passed a flag&lt;br /&gt;
indicating if the transport is being opened for remote use (i.e. an&lt;br /&gt;
outgoing connection) or local use (i.e. incoming connections, or&lt;br /&gt;
server mode). Lastly, a default target may be provided, allowing ...&lt;br /&gt;
&lt;br /&gt;
[TBD: discuss default_target]&lt;br /&gt;
&lt;br /&gt;
The f_create_from_ostring function pointer must be set to a function that&lt;br /&gt;
can create a transport from a user specified opaque data pointer with its&lt;br /&gt;
length. This data pointer should contain an address in a format that the&lt;br /&gt;
domain can recognize and parse.&lt;br /&gt;
&lt;br /&gt;
==== netsnmp_transport structure ====&lt;br /&gt;
These functions should allocate and return a netsnmp_transport structure. A&lt;br /&gt;
brief description is given below for the various structure fields.&lt;br /&gt;
&lt;br /&gt;
* data / data_length: generally, a pointer (and its length) to the address extracted from the specified transport string.&lt;br /&gt;
* domain / domain_length: a pointer (and its length) to the domain OID&lt;br /&gt;
* sock: the socket file descriptor for the transport. Note that it is possible to delay the creating/opening of the socket until the transport is actually used.&lt;br /&gt;
* local: the local address (only for local/server mode)&lt;br /&gt;
* remote: the remote address (only for remote/client mode)&lt;br /&gt;
* msgMaxSize: the size of the largest message that the transport can send.&lt;br /&gt;
* flags. Examples:&lt;br /&gt;
  NETSNMP_TRANSPORT_FLAG_STREAM : a stream based (as opposed to packet&lt;br /&gt;
                                  based) transport.&lt;br /&gt;
  NETSNMP_TRANSPORT_FLAG_LISTEN : the transport is listening for incoming&lt;br /&gt;
                                  connections/packets.&lt;br /&gt;
* f_recv: REQUIRED function pointer used for receiving data&lt;br /&gt;
* f_send: REQUIRED function pointer used for sending data&lt;br /&gt;
* f_close: REQUIRED function pointer used to close transport socket&lt;br /&gt;
* f_fmtaddr: REQUIRED function pointer to convert transport specific address to a printable string&lt;br /&gt;
* f_open: OPTIONAL function pointer to open transport&lt;br /&gt;
* f_accept: function pointer to accept an incoming connection (REQUIRED for local stream based transports)&lt;br /&gt;
* f_config: OPTIONAL function pointer for providing additional configuration to a transport after it has been created.&lt;br /&gt;
* f_copy: OPTIONAL function pointer to copy a transport specific items. This function is called from netsnmp_transport_copy() after all the transport data has been copied, allowing a specific transport to do any addition work needed to create a complete copy.&lt;br /&gt;
* f_setup_session: OPTIONAL function pointer to allows transport to inspect/verify/modify session parameters.&lt;br /&gt;
* base_transport: (New in 5.7) OPTIONAL pointer to another transport which will be used instead of or in addition to the functionality of the current transport.&lt;br /&gt;
&lt;br /&gt;
== Preparing for use ==&lt;br /&gt;
After a transport has been created, at some point it will be associated&lt;br /&gt;
with a Net-SNMP session. If a f_config function is provided, it will&lt;br /&gt;
be called when this association occurs. Then the f_open function, if&lt;br /&gt;
provided, will be called. Finally, the f_setup_session, if provided, will&lt;br /&gt;
be called.&lt;br /&gt;
&lt;br /&gt;
=== f_config ===&lt;br /&gt;
The optional f_config function allows additional parameters to be passed&lt;br /&gt;
to the transport, usually from the command line. For example, the two&lt;br /&gt;
TLS transport use this to configure the certificates to be used for&lt;br /&gt;
a connection. The function is called with the transport pointer and&lt;br /&gt;
a token/value pair of strings.&lt;br /&gt;
&lt;br /&gt;
A simplified example:&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 netsnmp_tlsbase_config(struct netsnmp_transport_s *t, const char *token,&lt;br /&gt;
                        const char *value) {&lt;br /&gt;
    _netsnmpTLSBaseData *tlsdata = t-&amp;gt;data;&lt;br /&gt;
 &lt;br /&gt;
     if (strcmp(token, &amp;quot;localCert&amp;quot;) == 0) {&lt;br /&gt;
         SNMP_FREE(tlsdata-&amp;gt;our_identity);&lt;br /&gt;
         tlsdata-&amp;gt;our_identity = strdup(value);&lt;br /&gt;
     }&lt;br /&gt;
     return SNMPERR_SUCCESS;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== f_open ===&lt;br /&gt;
The optional f_open function performs any needed steps to open the transport.&lt;br /&gt;
Often the transport is opened when it is created, and this function is not&lt;br /&gt;
provided.&lt;br /&gt;
&lt;br /&gt;
A greatly simplified example for a TCP based transport:&lt;br /&gt;
&lt;br /&gt;
 netsnmp_transport *&lt;br /&gt;
 netsnmp_example_open(netsnmp_transport *t)&lt;br /&gt;
 {&lt;br /&gt;
    netsnmp_udp_addr_pair *addr_pair = NULL;&lt;br /&gt;
    int rc = 0;&lt;br /&gt;
 &lt;br /&gt;
    addr_pair = (netsnmp_udp_addr_pair*)t-&amp;gt;data;&lt;br /&gt;
 &lt;br /&gt;
    t-&amp;gt;sock = socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;
    if (t-&amp;gt;sock &amp;lt; 0)&lt;br /&gt;
        return NULL;&lt;br /&gt;
 &lt;br /&gt;
    t-&amp;gt;flags = NETSNMP_TRANSPORT_FLAG_STREAM;&lt;br /&gt;
    if (local) {&lt;br /&gt;
        t-&amp;gt;flags |= NETSNMP_TRANSPORT_FLAG_LISTEN;&lt;br /&gt;
        rc = bind(t-&amp;gt;sock, &amp;amp;addr_pair.sa, sizeof(struct sockaddr));&lt;br /&gt;
        if (rc != 0) {&lt;br /&gt;
            netsnmp_socketbase_close(t);&lt;br /&gt;
            return NULL;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        rc = listen(t-&amp;gt;sock, NETSNMP_STREAM_QUEUE_LEN);&lt;br /&gt;
        if (rc != 0) {&lt;br /&gt;
            netsnmp_socketbase_close(t);&lt;br /&gt;
            return NULL;&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        rc = connect(t-&amp;gt;sock, (struct sockaddr *)addr,&lt;br /&gt;
                     sizeof(struct sockaddr));&lt;br /&gt;
 &lt;br /&gt;
        if (rc &amp;lt; 0) {&lt;br /&gt;
            netsnmp_socketbase_close(t);&lt;br /&gt;
            return NULL;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return t;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== f_setup_session ===&lt;br /&gt;
The optional f_setup_session function allows the transport to inspect,&lt;br /&gt;
verify or modify session parameters.&lt;br /&gt;
&lt;br /&gt;
A simplified example from snmpTLSBaseDomain:&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 netsnmp_tlsbase_session_init(struct netsnmp_transport_s *transport,&lt;br /&gt;
                              struct snmp_session *sess)&lt;br /&gt;
 {&lt;br /&gt;
    if (sess-&amp;gt;securityModel == SNMP_DEFAULT_SECMODEL) {&lt;br /&gt;
        sess-&amp;gt;securityModel = SNMP_SEC_MODEL_TSM;&lt;br /&gt;
    } else if (sess-&amp;gt;securityModel != SNMP_SEC_MODEL_TSM) {&lt;br /&gt;
        sess-&amp;gt;securityModel = SNMP_SEC_MODEL_TSM;&lt;br /&gt;
        snmp_log(LOG_ERR,&lt;br /&gt;
                 &amp;quot;A non-TSM security model for (D)TLS; using TSM anyways\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (sess-&amp;gt;version != SNMP_VERSION_3) {&lt;br /&gt;
        sess-&amp;gt;version = SNMP_VERSION_3;&lt;br /&gt;
        snmp_log(LOG_ERR,&lt;br /&gt;
                 &amp;quot;SNMP version != 3 with (D)TLS; using 3 anyways\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (sess-&amp;gt;securityLevel &amp;lt;= 0)&lt;br /&gt;
        sess-&amp;gt;securityLevel = SNMP_SEC_LEVEL_AUTHPRIV;&lt;br /&gt;
 &lt;br /&gt;
    return SNMPERR_SUCCESS;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Stream connections ==&lt;br /&gt;
=== f_accept ===&lt;br /&gt;
For stream based transports, the f_accept function is called to accept&lt;br /&gt;
incoming connections.&lt;br /&gt;
&lt;br /&gt;
A simplified example based on snmpTCPDomain:&lt;br /&gt;
&lt;br /&gt;
 static int&lt;br /&gt;
 netsnmp_tcp_accept(netsnmp_transport *t)&lt;br /&gt;
 {&lt;br /&gt;
    struct sockaddr *peer = NULL;&lt;br /&gt;
    netsnmp_udp_addr_pair *addr_pair = NULL;&lt;br /&gt;
    int             newsock = -1;&lt;br /&gt;
    socklen_t       peerlen = sizeof(netsnmp_udp_addr_pair);&lt;br /&gt;
 &lt;br /&gt;
    addr_pair = (netsnmp_udp_addr_pair *)malloc(peerlen);&lt;br /&gt;
    if (addr_pair == NULL)&lt;br /&gt;
        return -1;&lt;br /&gt;
    &lt;br /&gt;
    memset(addr_pair, 0, sizeof *addr_pair);&lt;br /&gt;
    peer = &amp;amp;addr_pair-&amp;gt;remote_addr.sa;&lt;br /&gt;
 &lt;br /&gt;
    newsock = accept(t-&amp;gt;sock, peer, &amp;amp;peerlen);&lt;br /&gt;
    if (newsock &amp;lt; 0)&lt;br /&gt;
        free(addr_pair);&lt;br /&gt;
    else {&lt;br /&gt;
        if (t-&amp;gt;data != NULL)&lt;br /&gt;
            free(t-&amp;gt;data);&lt;br /&gt;
        t-&amp;gt;data = addr_pair;&lt;br /&gt;
        t-&amp;gt;data_length = sizeof(netsnmp_udp_addr_pair);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return newsock;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Data passing functions ==&lt;br /&gt;
=== f_recv ===&lt;br /&gt;
The f_recv function is used to receive data from the transport. In&lt;br /&gt;
addition to the transport pointer, this function takes a pointer to a&lt;br /&gt;
buffer for the received data and the size of the buffer. The number&lt;br /&gt;
of bytes received is returned by the function. Additionally a pointer&lt;br /&gt;
to a pointer and a pointer to a integer are used to return a newly&lt;br /&gt;
allocated opaque pointer and its length, which will be passed to the&lt;br /&gt;
send function later. This is generally used to return the address from&lt;br /&gt;
which the data was received, so that the reply goes to the same place.&lt;br /&gt;
&lt;br /&gt;
A simplified example, based on snmpUDPBaseDomain:&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 netsnmp_udpbase_recv(netsnmp_transport *t, void *buf, int size,&lt;br /&gt;
                      void **opaque, int *olength)&lt;br /&gt;
 {&lt;br /&gt;
     int             rc = -1;&lt;br /&gt;
     socklen_t       fromlen = sizeof(struct sockaddr);&lt;br /&gt;
     netsnmp_indexed_addr_pair *addr_pair = NULL;&lt;br /&gt;
     struct sockaddr *from;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * allocate space for saving remote address&lt;br /&gt;
      */&lt;br /&gt;
     addr_pair = (netsnmp_indexed_addr_pair *)&lt;br /&gt;
                 calloc(1, sizeof(netsnmp_indexed_addr_pair));&lt;br /&gt;
     if (addr_pair == NULL) {&lt;br /&gt;
         *opaque = NULL;&lt;br /&gt;
         *olength = 0;&lt;br /&gt;
         return -1;&lt;br /&gt;
     }&lt;br /&gt;
     from = &amp;amp;addr_pair-&amp;gt;remote_addr.sa;&lt;br /&gt;
 &lt;br /&gt;
     while (rc &amp;lt; 0) {&lt;br /&gt;
         rc = recvfrom(t-&amp;gt;sock, buf, size, NETSNMP_DONTWAIT, from, &amp;amp;fromlen);&lt;br /&gt;
         if (rc &amp;lt; 0 &amp;amp;&amp;amp; errno != EINTR)&lt;br /&gt;
             break;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     *opaque = (void *)addr_pair;&lt;br /&gt;
     *olength = sizeof(netsnmp_indexed_addr_pair);&lt;br /&gt;
 &lt;br /&gt;
     return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== f_send ===&lt;br /&gt;
The f_send function is used to send data to the transport.  In&lt;br /&gt;
addition to the transport pointer, this function takes a pointer to a&lt;br /&gt;
buffer for the data to be sent and the size of the buffer. The number&lt;br /&gt;
of bytes sent is returned by the function. Additionally a pointer&lt;br /&gt;
to a pointer and a pointer to a integer are passed in. If it is not NULL,&lt;br /&gt;
this opaque pointer was allocated by the f_receive function and should&lt;br /&gt;
contain the address where the packet should be sent. Otherwise, the&lt;br /&gt;
address should be in the transports data pointer.&lt;br /&gt;
&lt;br /&gt;
A simplified example, based on snmpUDPBaseDomain:&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size,&lt;br /&gt;
                      void **opaque, int *olength)&lt;br /&gt;
 {&lt;br /&gt;
     int rc = -1;&lt;br /&gt;
     netsnmp_indexed_addr_pair *addr_pair = NULL;&lt;br /&gt;
 &lt;br /&gt;
     /*&lt;br /&gt;
      * find address to send to, from opaque pointer or t-&amp;gt;data&lt;br /&gt;
      */&lt;br /&gt;
     if (opaque != NULL &amp;amp;&amp;amp; *opaque != NULL &amp;amp;&amp;amp;&lt;br /&gt;
         *olength == sizeof(netsnmp_indexed_addr_pair)) {&lt;br /&gt;
         addr_pair = (netsnmp_indexed_addr_pair *) (*opaque);&lt;br /&gt;
     } else if (t != NULL &amp;amp;&amp;amp; t-&amp;gt;data != NULL &amp;amp;&amp;amp;&lt;br /&gt;
                t-&amp;gt;data_length == sizeof(netsnmp_indexed_addr_pair))&lt;br /&gt;
        addr_pair = (netsnmp_indexed_addr_pair *) (t-&amp;gt;data);&lt;br /&gt;
 &lt;br /&gt;
     if (addr_pair != NULL &amp;amp;&amp;amp; t != NULL &amp;amp;&amp;amp; t-&amp;gt;sock &amp;gt;= 0) {&lt;br /&gt;
         struct sockaddr *to = &amp;amp;addr_pair-&amp;gt;remote_addr.sa;&lt;br /&gt;
         while (rc &amp;lt; 0) {&lt;br /&gt;
             rc = sendto(t-&amp;gt;sock, buf, size, 0, to, sizeof(struct sockaddr));&lt;br /&gt;
             if (rc &amp;lt; 0 &amp;amp;&amp;amp; errno != EINTR)&lt;br /&gt;
 		break;&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
     return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Utility functions ==&lt;br /&gt;
=== f_close ===&lt;br /&gt;
The f_close function is used to close transport socket and release any&lt;br /&gt;
resources that were allocated when the transport was created or opened.&lt;br /&gt;
&lt;br /&gt;
A simplified example based on snmpTLSTCPDomain:&lt;br /&gt;
&lt;br /&gt;
 static int&lt;br /&gt;
 netsnmp_tlstcp_close(netsnmp_transport *t)&lt;br /&gt;
 {&lt;br /&gt;
    _netsnmpTLSBaseData *tlsdata = (_netsnmpTLSBaseData *)t-&amp;gt;data;&lt;br /&gt;
    if (tlsdata-&amp;gt;ssl)&lt;br /&gt;
        SSL_shutdown(tlsdata-&amp;gt;ssl);&lt;br /&gt;
 &lt;br /&gt;
    netsnmp_tlsbase_free_tlsdata(tlsdata);&lt;br /&gt;
 &lt;br /&gt;
    t-&amp;gt;data = NULL;&lt;br /&gt;
    return netsnmp_socketbase_close(t);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== f_fmtaddr ===&lt;br /&gt;
The f_fmtaddr function converts the transport specific address to a&lt;br /&gt;
printable string, generally for logging and debugging.&lt;br /&gt;
&lt;br /&gt;
A simplified example from snmpIPv4BaseDomain:&lt;br /&gt;
&lt;br /&gt;
 char *&lt;br /&gt;
 netsnmp_ipv4_fmtaddr(const char *prefix, netsnmp_transport *t,&lt;br /&gt;
                      void *data, int len)&lt;br /&gt;
 {&lt;br /&gt;
    netsnmp_indexed_addr_pair *addr_pair = NULL;&lt;br /&gt;
    struct hostent *host;&lt;br /&gt;
    char tmp[64];&lt;br /&gt;
 &lt;br /&gt;
    if (data != NULL &amp;amp;&amp;amp; len == sizeof(netsnmp_indexed_addr_pair))&lt;br /&gt;
        addr_pair = (netsnmp_indexed_addr_pair *) data;&lt;br /&gt;
    else if (t != NULL &amp;amp;&amp;amp; t-&amp;gt;data != NULL)&lt;br /&gt;
        addr_pair = (netsnmp_indexed_addr_pair *) t-&amp;gt;data;&lt;br /&gt;
 &lt;br /&gt;
    if (addr_pair == NULL) {&lt;br /&gt;
        snprintf(tmp, sizeof(tmp), &amp;quot;%s: unknown&amp;quot;, prefix);&lt;br /&gt;
    } else {&lt;br /&gt;
        struct sockaddr_in *to = NULL;&lt;br /&gt;
        to = (struct sockaddr_in *) &amp;amp;(addr_pair-&amp;gt;remote_addr);&lt;br /&gt;
        if (to == NULL) {&lt;br /&gt;
            snprintf(tmp, sizeof(tmp), &amp;quot;%s: unknown-&amp;gt;[%s]:%hu&amp;quot;, prefix,&lt;br /&gt;
                     inet_ntoa(addr_pair-&amp;gt;local_addr.sin.sin_addr),&lt;br /&gt;
                     ntohs(addr_pair-&amp;gt;local_addr.sin.sin_port));&lt;br /&gt;
        } else if ( t &amp;amp;&amp;amp; t-&amp;gt;flags &amp;amp; NETSNMP_TRANSPORT_FLAG_HOSTNAME ) {&lt;br /&gt;
            host = gethostbyaddr((char *)&amp;amp;to-&amp;gt;sin_addr, 4, AF_INET);&lt;br /&gt;
            return (host ? strdup(host-&amp;gt;h_name) : NULL); &lt;br /&gt;
        } else {&lt;br /&gt;
            snprintf(tmp, sizeof(tmp), &amp;quot;%s: [%s]:%hu-&amp;gt;&amp;quot;, prefix,&lt;br /&gt;
                     inet_ntoa(to-&amp;gt;sin_addr), ntohs(to-&amp;gt;sin_port));&lt;br /&gt;
            snprintf(tmp + strlen(tmp), sizeof(tmp)-strlen(tmp), &amp;quot;[%s]:%hu&amp;quot;,&lt;br /&gt;
                     inet_ntoa(addr_pair-&amp;gt;local_addr.sin.sin_addr),&lt;br /&gt;
                     ntohs(addr_pair-&amp;gt;local_addr.sin.sin_port));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    tmp[sizeof(tmp)-1] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
    return strdup(tmp);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== f_copy ===&lt;br /&gt;
The f_copy function copies transport specific items. This function is&lt;br /&gt;
called from netsnmp_transport_copy() after all the transport data has&lt;br /&gt;
been copied, allowing a specific transport to do any addition work needed&lt;br /&gt;
to create a complete copy of itself.&lt;br /&gt;
&lt;br /&gt;
A simplified example from snmpTLSTCPDomain:&lt;br /&gt;
&lt;br /&gt;
 static int&lt;br /&gt;
 netsnmp_tlstcp_copy(netsnmp_transport *oldt, netsnmp_transport *newt)&lt;br /&gt;
 {&lt;br /&gt;
    _netsnmpTLSBaseData *oldtlsdata = (_netsnmpTLSBaseData *) oldt-&amp;gt;data;&lt;br /&gt;
    _netsnmpTLSBaseData *newtlsdata = (_netsnmpTLSBaseData *) newt-&amp;gt;data;&lt;br /&gt;
    &lt;br /&gt;
    if (oldtlsdata-&amp;gt;addr_string)&lt;br /&gt;
        newtlsdata-&amp;gt;addr_string = strdup(oldtlsdata-&amp;gt;addr_string);&lt;br /&gt;
    if (oldtlsdata-&amp;gt;securityName)&lt;br /&gt;
        newtlsdata-&amp;gt;securityName = strdup(oldtlsdata-&amp;gt;securityName);&lt;br /&gt;
    if (oldtlsdata-&amp;gt;addr)&lt;br /&gt;
        memdup((u_char**)&amp;amp;newtlsdata-&amp;gt;addr, oldtlsdata-&amp;gt;addr,&lt;br /&gt;
               sizeof(*oldtlsdata-&amp;gt;addr));&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Current Hierarchy ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== snmpUDPDomain ===&lt;br /&gt;
* snmpUDPIPv4Base (udpipv4base_transport)&lt;br /&gt;
* snmpIPv4Base (sockaddr_in, fmtaddr)&lt;br /&gt;
* snmpUDPBase (_recv, _send, _recvfrom, _sendto)&lt;br /&gt;
&lt;br /&gt;
=== snmpTCPDomain ===&lt;br /&gt;
* snmpIPv4Base&lt;br /&gt;
* snmpSocketBase (close)&lt;br /&gt;
* snmpTCPBase (recv, send)&lt;br /&gt;
&lt;br /&gt;
[[Category: Developer]]&lt;/div&gt;</summary>
		<author><name>Rstory</name></author>	</entry>

	</feed>