?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 6

Line No. Rev Author Line
1 6 kaklik <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3 <title>Procyon AVRlib: net/arp.c Source File</title>
4 <link href="dox.css" rel="stylesheet" type="text/css">
5 </head><body>
6 <!-- Generated by Doxygen 1.4.2 -->
7 <div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
8 <div class="nav">
9 <a class="el" href="dir_000001.html">net</a></div>
10 <h1>arp.c</h1><a href="arp_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*! \file arp.c \brief ARP Protocol Library. */</span>
11 00002 <span class="comment">//*****************************************************************************</span>
12 00003 <span class="comment">//</span>
13 00004 <span class="comment">// File Name : 'arp.c'</span>
14 00005 <span class="comment">// Title : ARP Protocol Library</span>
15 00006 <span class="comment">// Author : Pascal Stang</span>
16 00007 <span class="comment">// Created : 9/7/2004</span>
17 00008 <span class="comment">// Revised : 7/3/2005</span>
18 00009 <span class="comment">// Version : 0.1</span>
19 00010 <span class="comment">// Target MCU : Atmel AVR series</span>
20 00011 <span class="comment">// Editor Tabs : 4</span>
21 00012 <span class="comment">//</span>
22 00013 <span class="comment">//*****************************************************************************</span>
23 00014
24 00015 <span class="preprocessor">#include "<a class="code" href="global_8h.html">global.h</a>"</span>
25 00016 <span class="preprocessor">#include "<a class="code" href="net_8h.html">net.h</a>"</span>
26 00017 <span class="preprocessor">#include "<a class="code" href="nic_8h.html">nic.h</a>"</span>
27 00018 <span class="preprocessor">#include "<a class="code" href="arp_8h.html">arp.h</a>"</span>
28 00019
29 00020 <span class="preprocessor">#include "<a class="code" href="rprintf_8h.html">rprintf.h</a>"</span>
30 00021
31 00022 <span class="comment">// global variables</span>
32 00023 <span class="comment"></span>
33 00024 <span class="comment">/// Single ARP table entry/record</span>
34 00025 <span class="comment"></span><span class="keyword">struct </span>ArpEntry
35 00026 {
36 00027 uint32_t ipaddr; <span class="comment">///&lt; remote-note IP address</span>
37 00028 <span class="comment"></span> <span class="keyword">struct </span>netEthAddr ethaddr; <span class="comment">///&lt; remote-node ethernet (hardware/mac) address</span>
38 00029 <span class="comment"></span> uint8_t time; <span class="comment">///&lt; time to live (in ARP table); this is decremented by arpTimer()</span>
39 00030 <span class="comment"></span>};
40 00031
41 <a name="l00032"></a><a class="code" href="arp_8c.html#a0">00032</a> <span class="keyword">struct </span>ArpEntry ArpMyAddr; <span class="comment">///&lt; my local interface information (IP and MAC address)</span>
42 <a name="l00033"></a><a class="code" href="arp_8c.html#a1">00033</a> <span class="comment"></span><span class="keyword">struct </span>ArpEntry ArpTable[ARP_TABLE_SIZE]; <span class="comment">///&lt; ARP table of matched IP&lt;-&gt;MAC associations</span>
43 00034 <span class="comment"></span>
44 00035
45 <a name="l00036"></a><a class="code" href="group__arp.html#ga0">00036</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga0">arpInit</a>(<span class="keywordtype">void</span>)
46 00037 {
47 00038 u08 i;
48 00039 <span class="comment">// initialize all ArpTable elements to unused</span>
49 00040 <span class="keywordflow">for</span>(i=0; i&lt;ARP_TABLE_SIZE; i++)
50 00041 {
51 00042 ArpTable[i].ipaddr = 0;
52 00043 ArpTable[i].time = 0;
53 00044 }
54 00045 }
55 00046
56 <a name="l00047"></a><a class="code" href="group__arp.html#ga1">00047</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga1">arpSetAddress</a>(<span class="keyword">struct</span> netEthAddr* myeth, uint32_t myip)
57 00048 {
58 00049 <span class="comment">// set local address record</span>
59 00050 ArpMyAddr.ethaddr = *myeth;
60 00051 ArpMyAddr.ipaddr = myip;
61 00052 }
62 00053
63 <a name="l00054"></a><a class="code" href="group__arp.html#ga2">00054</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga2">arpArpIn</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <span class="keyword">struct</span> netEthArpHeader* packet)
64 00055 {
65 00056 <span class="preprocessor"> #ifdef ARP_DEBUG</span>
66 00057 <span class="preprocessor"></span> <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Received ARP Request\r\n"</span>);
67 00058 <a class="code" href="group__arp.html#ga7">arpPrintHeader</a>( &amp;packet-&gt;arp );
68 00059 <span class="preprocessor"> #endif</span>
69 00060 <span class="preprocessor"></span>
70 00061 <span class="comment">// for now, we just reply to requests</span>
71 00062 <span class="comment">// need to add ARP cache</span>
72 00063 <span class="keywordflow">if</span>( (packet-&gt;arp.dipaddr == <a class="code" href="group__net.html#ga34">HTONL</a>(ArpMyAddr.ipaddr)) &amp;&amp;
73 00064 (packet-&gt;arp.opcode == <a class="code" href="group__net.html#ga2">htons</a>(ARP_OPCODE_REQUEST)) )
74 00065 {
75 00066 <span class="comment">// in ARP header</span>
76 00067 <span class="comment">// copy sender's address info to dest. fields</span>
77 00068 packet-&gt;arp.dhwaddr = packet-&gt;arp.shwaddr;
78 00069 packet-&gt;arp.dipaddr = packet-&gt;arp.sipaddr;
79 00070 <span class="comment">// fill in our information</span>
80 00071 packet-&gt;arp.shwaddr = ArpMyAddr.ethaddr;
81 00072 packet-&gt;arp.sipaddr = <a class="code" href="group__net.html#ga34">HTONL</a>(ArpMyAddr.ipaddr);
82 00073 <span class="comment">// change op to reply</span>
83 00074 packet-&gt;arp.opcode = <a class="code" href="group__net.html#ga2">htons</a>(ARP_OPCODE_REPLY);
84 00075
85 00076 <span class="comment">// in ethernet header</span>
86 00077 packet-&gt;eth.dest = packet-&gt;eth.src;
87 00078 packet-&gt;eth.src = ArpMyAddr.ethaddr;
88 00079
89 00080 <span class="preprocessor"> #ifdef ARP_DEBUG</span>
90 00081 <span class="preprocessor"></span> <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Sending ARP Reply\r\n"</span>);
91 00082 <a class="code" href="group__arp.html#ga7">arpPrintHeader</a>( &amp;packet-&gt;arp );
92 00083 <span class="preprocessor"> #endif</span>
93 00084 <span class="preprocessor"></span>
94 00085 <span class="comment">// send reply!</span>
95 00086 <a class="code" href="group__nic.html#ga1">nicSend</a>(len, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)packet);
96 00087 }
97 00088 }
98 00089
99 <a name="l00090"></a><a class="code" href="group__arp.html#ga3">00090</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga3">arpIpIn</a>(<span class="keyword">struct</span> netEthIpHeader* packet)
100 00091 {
101 00092 int8_t index;
102 00093
103 00094 <span class="comment">// check if sender is already present in arp table</span>
104 00095 index = <a class="code" href="group__arp.html#ga6">arpMatchIp</a>(<a class="code" href="group__net.html#ga34">HTONL</a>(packet-&gt;ip.srcipaddr));
105 00096 <span class="keywordflow">if</span>(index != -1)
106 00097 {
107 00098 <span class="comment">// sender's IP address found, update ARP entry</span>
108 00099 ArpTable[index].ethaddr = packet-&gt;eth.src;
109 00100 <span class="comment">// and we're done</span>
110 00101 <span class="keywordflow">return</span>;
111 00102 }
112 00103
113 00104 <span class="comment">// sender was not present in table,</span>
114 00105 <span class="comment">// must add in empty/expired slot</span>
115 00106 <span class="keywordflow">for</span>(index=0; index&lt;ARP_TABLE_SIZE; index++)
116 00107 {
117 00108 <span class="keywordflow">if</span>(!ArpTable[index].time)
118 00109 {
119 00110 <span class="comment">// write entry</span>
120 00111 ArpTable[index].ethaddr = packet-&gt;eth.src;
121 00112 ArpTable[index].ipaddr = <a class="code" href="group__net.html#ga34">HTONL</a>(packet-&gt;ip.srcipaddr);
122 00113 ArpTable[index].time = ARP_CACHE_TIME_TO_LIVE;
123 00114 <span class="comment">// and we're done</span>
124 00115 <span class="keywordflow">return</span>;
125 00116 }
126 00117 }
127 00118
128 00119 <span class="comment">// no space in table, we give up</span>
129 00120 }
130 00121
131 <a name="l00122"></a><a class="code" href="group__arp.html#ga4">00122</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga4">arpIpOut</a>(<span class="keyword">struct</span> netEthIpHeader* packet, uint32_t phyDstIp)
132 00123 {
133 00124 <span class="keywordtype">int</span> index;
134 00125 <span class="comment">// check if destination is already present in arp table</span>
135 00126 <span class="comment">// use the physical dstIp if it's provided, otherwise the dstIp in packet</span>
136 00127 <span class="keywordflow">if</span>(phyDstIp)
137 00128 index = <a class="code" href="group__arp.html#ga6">arpMatchIp</a>(phyDstIp);
138 00129 <span class="keywordflow">else</span>
139 00130 index = <a class="code" href="group__arp.html#ga6">arpMatchIp</a>(<a class="code" href="group__net.html#ga34">HTONL</a>(packet-&gt;ip.destipaddr));
140 00131 <span class="comment">// fill in ethernet info</span>
141 00132 <span class="keywordflow">if</span>(index != -1)
142 00133 {
143 00134 <span class="comment">// ARP entry present, fill eth address(es)</span>
144 00135 packet-&gt;eth.src = ArpMyAddr.ethaddr;
145 00136 packet-&gt;eth.dest = ArpTable[index].ethaddr;
146 00137 packet-&gt;eth.type = <a class="code" href="group__net.html#ga33">HTONS</a>(ETHTYPE_IP);
147 00138 }
148 00139 <span class="keywordflow">else</span>
149 00140 {
150 00141 <span class="comment">// not in table, must send ARP request</span>
151 00142 packet-&gt;eth.src = ArpMyAddr.ethaddr;
152 00143 <span class="comment">// MUST CHANGE, but for now, send this one broadcast</span>
153 00144 packet-&gt;eth.dest.addr[0] = 0xFF;
154 00145 packet-&gt;eth.dest.addr[1] = 0xFF;
155 00146 packet-&gt;eth.dest.addr[2] = 0xFF;
156 00147 packet-&gt;eth.dest.addr[3] = 0xFF;
157 00148 packet-&gt;eth.dest.addr[4] = 0xFF;
158 00149 packet-&gt;eth.dest.addr[5] = 0xFF;
159 00150 packet-&gt;eth.type = <a class="code" href="group__net.html#ga33">HTONS</a>(ETHTYPE_IP);
160 00151 }
161 00152 }
162 00153
163 <a name="l00154"></a><a class="code" href="group__arp.html#ga5">00154</a> <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga5">arpTimer</a>(<span class="keywordtype">void</span>)
164 00155 {
165 00156 <span class="keywordtype">int</span> index;
166 00157 <span class="comment">// this function meant to be called on a regular time interval</span>
167 00158
168 00159 <span class="comment">// decrement time-to-live for all entries</span>
169 00160 <span class="keywordflow">for</span>(index=0; index&lt;ARP_TABLE_SIZE; index++)
170 00161 {
171 00162 <span class="keywordflow">if</span>(ArpTable[index].time)
172 00163 ArpTable[index].time--;
173 00164 }
174 00165 }
175 00166
176 <a name="l00167"></a><a class="code" href="group__arp.html#ga6">00167</a> <span class="keywordtype">int</span> <a class="code" href="group__arp.html#ga6">arpMatchIp</a>(uint32_t ipaddr)
177 00168 {
178 00169 uint8_t i;
179 00170
180 00171 <span class="comment">// check if IP address is present in arp table</span>
181 00172 <span class="keywordflow">for</span>(i=0; i&lt;ARP_TABLE_SIZE; i++)
182 00173 {
183 00174 <span class="keywordflow">if</span>(ArpTable[i].ipaddr == ipaddr)
184 00175 {
185 00176 <span class="comment">// IP address found</span>
186 00177 <span class="keywordflow">return</span> i;
187 00178 }
188 00179 }
189 00180
190 00181 <span class="comment">// no match</span>
191 00182 <span class="keywordflow">return</span> -1;
192 00183 }
193 00184
194 00185 <span class="preprocessor">#ifdef ARP_DEBUG_PRINT</span>
195 00186 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga7">arpPrintHeader</a>(<span class="keyword">struct</span> netArpHeader* packet)
196 00187 {
197 00188 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"ARP Packet:\r\n"</span>);
198 00189 <span class="comment">//debugPrintHexTable(60, (unsigned char*)&amp;packet);</span>
199 00190 <span class="comment">// print operation type</span>
200 00191 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Operation : "</span>);
201 00192 <span class="keywordflow">if</span>(packet-&gt;opcode == <a class="code" href="group__net.html#ga2">htons</a>(ARP_OPCODE_REQUEST))
202 00193 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"REQUEST"</span>);
203 00194 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(packet-&gt;opcode == <a class="code" href="group__net.html#ga2">htons</a>(ARP_OPCODE_REPLY))
204 00195 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"REPLY"</span>);
205 00196 <span class="keywordflow">else</span>
206 00197 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"UNKNOWN"</span>);
207 00198 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
208 00199 <span class="comment">// print source hardware address</span>
209 00200 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"SrcHwAddr : "</span>); <a class="code" href="group__net.html#ga5">netPrintEthAddr</a>(&amp;packet-&gt;shwaddr); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
210 00201 <span class="comment">// print source protocol address</span>
211 00202 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"SrcProtoAddr: "</span>); <a class="code" href="group__net.html#ga6">netPrintIPAddr</a>(<a class="code" href="group__net.html#ga34">HTONL</a>(packet-&gt;sipaddr)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
212 00203 <span class="comment">// print target hardware address</span>
213 00204 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"DstHwAddr : "</span>); <a class="code" href="group__net.html#ga5">netPrintEthAddr</a>(&amp;packet-&gt;dhwaddr); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
214 00205 <span class="comment">// print target protocol address</span>
215 00206 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"DstProtoAddr: "</span>); <a class="code" href="group__net.html#ga6">netPrintIPAddr</a>(<a class="code" href="group__net.html#ga34">HTONL</a>(packet-&gt;dipaddr)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
216 00207 }
217 00208
218 00209
219 00210 <span class="keywordtype">void</span> <a class="code" href="group__arp.html#ga8">arpPrintTable</a>(<span class="keywordtype">void</span>)
220 00211 {
221 00212 uint8_t i;
222 00213
223 00214 <span class="comment">// print ARP table</span>
224 00215 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Time Eth Address IP Address\r\n"</span>);
225 00216 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"---------------------------------------\r\n"</span>);
226 00217 <span class="keywordflow">for</span>(i=0; i&lt;ARP_TABLE_SIZE; i++)
227 00218 {
228 00219 <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(ArpTable[i].time);
229 00220 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);
230 00221 <a class="code" href="group__net.html#ga5">netPrintEthAddr</a>(&amp;ArpTable[i].ethaddr);
231 00222 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);
232 00223 <a class="code" href="group__net.html#ga6">netPrintIPAddr</a>(ArpTable[i].ipaddr);
233 00224 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
234 00225 }
235 00226 }
236 00227 <span class="preprocessor">#endif</span>
237 </pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:07 2006 for Procyon AVRlib by&nbsp;
238 <a href="http://www.doxygen.org/index.html">
239 <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address>
240 </body>
241 </html>
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3