00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "global.h"
00016 #include "net.h"
00017 #include "nic.h"
00018 #include "arp.h"
00019
00020 #include "rprintf.h"
00021
00022
00023
00024
00025 struct ArpEntry
00026 {
00027 uint32_t ipaddr;
00028 struct netEthAddr ethaddr;
00029 uint8_t time;
00030 };
00031
00032 struct ArpEntry ArpMyAddr;
00033 struct ArpEntry ArpTable[ARP_TABLE_SIZE];
00034
00035
00036 void arpInit(void)
00037 {
00038 u08 i;
00039
00040 for(i=0; i<ARP_TABLE_SIZE; i++)
00041 {
00042 ArpTable[i].ipaddr = 0;
00043 ArpTable[i].time = 0;
00044 }
00045 }
00046
00047 void arpSetAddress(struct netEthAddr* myeth, uint32_t myip)
00048 {
00049
00050 ArpMyAddr.ethaddr = *myeth;
00051 ArpMyAddr.ipaddr = myip;
00052 }
00053
00054 void arpArpIn(unsigned int len, struct netEthArpHeader* packet)
00055 {
00056 #ifdef ARP_DEBUG
00057 rprintfProgStrM("Received ARP Request\r\n");
00058 arpPrintHeader( &packet->arp );
00059 #endif
00060
00061
00062
00063 if( (packet->arp.dipaddr == HTONL(ArpMyAddr.ipaddr)) &&
00064 (packet->arp.opcode == htons(ARP_OPCODE_REQUEST)) )
00065 {
00066
00067
00068 packet->arp.dhwaddr = packet->arp.shwaddr;
00069 packet->arp.dipaddr = packet->arp.sipaddr;
00070
00071 packet->arp.shwaddr = ArpMyAddr.ethaddr;
00072 packet->arp.sipaddr = HTONL(ArpMyAddr.ipaddr);
00073
00074 packet->arp.opcode = htons(ARP_OPCODE_REPLY);
00075
00076
00077 packet->eth.dest = packet->eth.src;
00078 packet->eth.src = ArpMyAddr.ethaddr;
00079
00080 #ifdef ARP_DEBUG
00081 rprintfProgStrM("Sending ARP Reply\r\n");
00082 arpPrintHeader( &packet->arp );
00083
00084
00085 #endif
00086
00087
00088 nicSend(len, (unsigned char*)packet);
00089 }
00090 }
00091
00092 void arpIpIn(struct netEthIpHeader* packet)
00093 {
00094 int8_t index;
00095
00096
00097 index = arpMatchIp(HTONL(packet->ip.srcipaddr));
00098 if(index != -1)
00099 {
00100
00101 ArpTable[index].ethaddr = packet->eth.src;
00102
00103 return;
00104 }
00105
00106
00107
00108 for(index=0; index<ARP_TABLE_SIZE; index++)
00109 {
00110 if(!ArpTable[index].time)
00111 {
00112
00113 ArpTable[index].ethaddr = packet->eth.src;
00114 ArpTable[index].ipaddr = HTONL(packet->ip.srcipaddr);
00115 ArpTable[index].time = ARP_CACHE_TIME_TO_LIVE;
00116
00117 return;
00118 }
00119 }
00120
00121
00122 }
00123
00124 void arpIpOut(struct netEthIpHeader* packet, uint32_t phyDstIp)
00125 {
00126 int index;
00127
00128
00129 if(phyDstIp)
00130 index = arpMatchIp(phyDstIp);
00131 else
00132 index = arpMatchIp(HTONL(packet->ip.destipaddr));
00133
00134 if(index != -1)
00135 {
00136
00137 packet->eth.src = ArpMyAddr.ethaddr;
00138 packet->eth.dest = ArpTable[index].ethaddr;
00139 packet->eth.type = HTONS(ETHTYPE_IP);
00140 }
00141 else
00142 {
00143
00144 packet->eth.src = ArpMyAddr.ethaddr;
00145
00146 packet->eth.dest.addr[0] = 0xFF;
00147 packet->eth.dest.addr[1] = 0xFF;
00148 packet->eth.dest.addr[2] = 0xFF;
00149 packet->eth.dest.addr[3] = 0xFF;
00150 packet->eth.dest.addr[4] = 0xFF;
00151 packet->eth.dest.addr[5] = 0xFF;
00152 packet->eth.type = HTONS(ETHTYPE_IP);
00153 }
00154 }
00155
00156 void arpTimer(void)
00157 {
00158 int index;
00159
00160
00161
00162 for(index=0; index<ARP_TABLE_SIZE; index++)
00163 {
00164 if(ArpTable[index].time)
00165 ArpTable[index].time--;
00166 }
00167 }
00168
00169 int arpMatchIp(uint32_t ipaddr)
00170 {
00171 uint8_t i;
00172
00173
00174 for(i=0; i<ARP_TABLE_SIZE; i++)
00175 {
00176 if(ArpTable[i].ipaddr == ipaddr)
00177 {
00178
00179 return i;
00180 }
00181 }
00182
00183
00184 return -1;
00185 }
00186
00187 #ifdef ARP_DEBUG_PRINT
00188 void arpPrintHeader(struct netArpHeader* packet)
00189 {
00190 rprintfProgStrM("ARP Packet:\r\n");
00191
00192
00193 rprintfProgStrM("Operation : ");
00194 if(packet->opcode == htons(ARP_OPCODE_REQUEST))
00195 rprintfProgStrM("REQUEST");
00196 else if(packet->opcode == htons(ARP_OPCODE_REPLY))
00197 rprintfProgStrM("REPLY");
00198 else
00199 rprintfProgStrM("UNKNOWN");
00200 rprintfCRLF();
00201
00202 rprintfProgStrM("SrcHwAddr : "); netPrintEthAddr(&packet->shwaddr); rprintfCRLF();
00203
00204 rprintfProgStrM("SrcProtoAddr: "); netPrintIPAddr(HTONL(packet->sipaddr)); rprintfCRLF();
00205
00206 rprintfProgStrM("DstHwAddr : "); netPrintEthAddr(&packet->dhwaddr); rprintfCRLF();
00207
00208 rprintfProgStrM("DstProtoAddr: "); netPrintIPAddr(HTONL(packet->dipaddr)); rprintfCRLF();
00209 }
00210
00211
00212 void arpPrintTable(void)
00213 {
00214 uint8_t i;
00215
00216
00217 rprintfProgStrM("Time Eth Address IP Address\r\n");
00218 rprintfProgStrM("---------------------------------------\r\n");
00219 for(i=0; i<ARP_TABLE_SIZE; i++)
00220 {
00221 rprintfu08(ArpTable[i].time);
00222 rprintfProgStrM(" ");
00223 netPrintEthAddr(&ArpTable[i].ethaddr);
00224 rprintfProgStrM(" ");
00225 netPrintIPAddr(ArpTable[i].ipaddr);
00226 rprintfCRLF();
00227 }
00228 }
00229 #endif