89 uip_ipaddr_t srcipaddr, destipaddr;
95 #define ARP_HWTYPE_ETH 1
104 {{0xff,0xff,0xff,0xff,0xff,0xff}};
107 static uip_ipaddr_t ipaddr;
110 static uint8_t arptime;
111 static uint8_t tmpage;
113 #define BUF ((struct arp_hdr *)&uip_buf[0])
114 #define IPBUF ((struct ethip_hdr *)&uip_buf[0])
119 #define PRINTF(...) printf(__VA_ARGS__)
134 memset(&arp_table[i].ipaddr, 0, 4);
150 struct arp_entry *tabptr;
154 tabptr = &arp_table[i];
155 if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) &&
157 memset(&tabptr->ipaddr, 0, 4);
165 uip_arp_update(uip_ipaddr_t *ipaddr,
struct uip_eth_addr *ethaddr)
167 register struct arp_entry *tabptr = arp_table;
173 tabptr = &arp_table[i];
176 if(!uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
180 if(uip_ipaddr_cmp(ipaddr, &tabptr->ipaddr)) {
183 memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
184 tabptr->time = arptime;
197 tabptr = &arp_table[i];
198 if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
205 if(i == UIP_ARPTAB_SIZE) {
209 tabptr = &arp_table[i];
210 if(arptime - tabptr->time > tmpage) {
211 tmpage = arptime - tabptr->time;
216 tabptr = &arp_table[i];
222 memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
223 tabptr->time = arptime;
247 if((IPBUF->srcipaddr[0] & uip_netmask[0]) !=
248 (uip_hostaddr[0] & uip_netmask[0])) {
251 if((IPBUF->srcipaddr[1] & uip_netmask[1]) !=
252 (uip_hostaddr[1] & uip_netmask[1])) {
255 uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
287 if(
uip_len <
sizeof(
struct arp_hdr)) {
293 switch(BUF->opcode) {
299 PRINTF(
"uip_arp_arpin: request for %d.%d.%d.%d (we are %d.%d.%d.%d)\n",
300 BUF->dipaddr.u8[0], BUF->dipaddr.u8[1],
301 BUF->dipaddr.u8[2], BUF->dipaddr.u8[3],
302 uip_hostaddr.u8[0], uip_hostaddr.u8[1],
303 uip_hostaddr.u8[2], uip_hostaddr.u8[3]);
304 if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
308 uip_arp_update(&BUF->sipaddr, &BUF->shwaddr);
312 memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
313 memcpy(BUF->shwaddr.addr,
uip_lladdr.addr, 6);
314 memcpy(BUF->ethhdr.src.addr,
uip_lladdr.addr, 6);
315 memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
320 BUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_ARP);
321 uip_len =
sizeof(
struct arp_hdr);
327 if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
328 uip_arp_update(&BUF->sipaddr, &BUF->shwaddr);
366 struct arp_entry *tabptr = arp_table;
376 if(uip_ipaddr_cmp(&IPBUF->destipaddr, &uip_broadcast_addr)) {
377 memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6);
378 }
else if(IPBUF->destipaddr.u8[0] == 224) {
380 IPBUF->ethhdr.dest.addr[0] = 0x01;
381 IPBUF->ethhdr.dest.addr[1] = 0x00;
382 IPBUF->ethhdr.dest.addr[2] = 0x5e;
383 IPBUF->ethhdr.dest.addr[3] = IPBUF->destipaddr.u8[1];
384 IPBUF->ethhdr.dest.addr[4] = IPBUF->destipaddr.u8[2];
385 IPBUF->ethhdr.dest.addr[5] = IPBUF->destipaddr.u8[3];
398 if(uip_ipaddr_cmp(&ipaddr, &tabptr->ipaddr)) {
404 if(i == UIP_ARPTAB_SIZE) {
408 memset(BUF->ethhdr.dest.addr, 0xff, 6);
409 memset(BUF->dhwaddr.addr, 0x00, 6);
410 memcpy(BUF->ethhdr.src.addr,
uip_lladdr.addr, 6);
411 memcpy(BUF->shwaddr.addr,
uip_lladdr.addr, 6);
417 BUF->protocol =
UIP_HTONS(UIP_ETHTYPE_IP);
420 BUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_ARP);
424 uip_len =
sizeof(
struct arp_hdr);
429 memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
431 memcpy(IPBUF->ethhdr.src.addr,
uip_lladdr.addr, 6);
433 IPBUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_IP);