58 #include "lib/assert.h" 92 #define ARP_HWTYPE_ETH 1 101 {{0xff,0xff,0xff,0xff,0xff,0xff}};
109 static uint8_t arptime;
110 static uint8_t tmpage;
112 #define BUF ((struct arp_hdr *)&uip_buf[0]) 113 #define IPBUF ((struct ethip_hdr *)&uip_buf[0]) 120 #define PRINTF(...) printf(__VA_ARGS__) 136 memset(&arp_table[i].ipaddr, 0, 4);
152 struct arp_entry *tabptr;
157 tabptr = &arp_table[i];
158 if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) &&
160 memset(&tabptr->ipaddr, 0, 4);
170 register struct arp_entry *tabptr = arp_table;
176 tabptr = &arp_table[i];
179 if(!uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
183 if(uip_ipaddr_cmp(ipaddr, &tabptr->ipaddr)) {
186 memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
187 tabptr->time = timestamp;
200 tabptr = &arp_table[i];
201 if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
208 if(i == UIP_ARPTAB_SIZE) {
212 tabptr = &arp_table[i];
213 if ((tabptr->time != 0) && (arptime - tabptr->time > tmpage)) {
214 tmpage = arptime - tabptr->time;
219 tabptr = &arp_table[i];
225 memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
226 tabptr->time = timestamp;
250 if((IPBUF->srcipaddr[0] & uip_netmask[0]) !=
251 (uip_hostaddr[0] & uip_netmask[0])) {
254 if((IPBUF->srcipaddr[1] & uip_netmask[1]) !=
255 (uip_hostaddr[1] & uip_netmask[1])) {
258 uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
290 if(
uip_len <
sizeof(
struct arp_hdr)) {
296 switch(BUF->opcode) {
302 PRINTF(
"uip_arp_arpin: request for %d.%d.%d.%d (we are %d.%d.%d.%d)\n",
303 BUF->dipaddr.u8[0], BUF->dipaddr.u8[1],
304 BUF->dipaddr.u8[2], BUF->dipaddr.u8[3],
305 uip_hostaddr.u8[0], uip_hostaddr.u8[1],
306 uip_hostaddr.u8[2], uip_hostaddr.u8[3]);
307 if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
311 uip_arp_update(&BUF->sipaddr, &BUF->shwaddr, arptime);
315 memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
316 memcpy(BUF->shwaddr.addr, uip_lladdr.addr, 6);
317 memcpy(BUF->ethhdr.src.addr, uip_lladdr.addr, 6);
318 memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
323 BUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_ARP);
324 uip_len =
sizeof(
struct arp_hdr);
330 if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
331 uip_arp_update(&BUF->sipaddr, &BUF->shwaddr, arptime);
369 struct arp_entry *tabptr = arp_table;
379 if(uip_ipaddr_cmp(&IPBUF->destipaddr, &uip_broadcast_addr)) {
380 memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6);
381 }
else if(IPBUF->destipaddr.u8[0] == 224) {
383 IPBUF->ethhdr.dest.addr[0] = 0x01;
384 IPBUF->ethhdr.dest.addr[1] = 0x00;
385 IPBUF->ethhdr.dest.addr[2] = 0x5e;
386 IPBUF->ethhdr.dest.addr[3] = IPBUF->destipaddr.u8[1];
387 IPBUF->ethhdr.dest.addr[4] = IPBUF->destipaddr.u8[2];
388 IPBUF->ethhdr.dest.addr[5] = IPBUF->destipaddr.u8[3];
401 if(uip_ipaddr_cmp(&ipaddr, &tabptr->ipaddr)) {
407 if(i == UIP_ARPTAB_SIZE) {
411 memset(BUF->ethhdr.dest.addr, 0xff, 6);
412 memset(BUF->dhwaddr.addr, 0x00, 6);
413 memcpy(BUF->ethhdr.src.addr, uip_lladdr.addr, 6);
414 memcpy(BUF->shwaddr.addr, uip_lladdr.addr, 6);
420 BUF->protocol =
UIP_HTONS(UIP_ETHTYPE_IP);
423 BUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_ARP);
427 uip_len =
sizeof(
struct arp_hdr);
432 memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
434 memcpy(IPBUF->ethhdr.src.addr, uip_lladdr.addr, 6);
436 IPBUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_IP);
446 if (uip_ipaddr_cmp(ripaddr, &uip_broadcast_addr)) {
448 return UIP_ARP_BROADCAST;
449 }
else if(ripaddr->u8[0] == 224) {
451 return UIP_ARP_MCAST;
456 ripaddr = &uip_draddr;
460 if (uip_ipaddr_cmp(ripaddr, &arp_table[i].ipaddr)) {
461 return UIP_ARP_BASE + i;
475 ripaddr = &uip_draddr;
483 memset(BUF->ethhdr.dest.addr, 0xff, 6);
484 memset(BUF->dhwaddr.addr, 0x00, 6);
485 memcpy(BUF->ethhdr.src.addr, uip_lladdr.addr, 6);
486 memcpy(BUF->shwaddr.addr, uip_lladdr.addr, 6);
492 BUF->protocol =
UIP_HTONS(UIP_ETHTYPE_IP);
495 BUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_ARP);
498 uip_len =
sizeof(
struct arp_hdr);
505 void uip_arp_fill_mac(uint8_t arpid)
507 assert(arpid != UIP_ARP_NONE);
512 case UIP_ARP_BROADCAST:
513 memset(IPBUF->ethhdr.dest.addr, 0xFF, 6);
517 IPBUF->ethhdr.dest.addr[0] = 0x01;
518 IPBUF->ethhdr.dest.addr[1] = 0x00;
519 IPBUF->ethhdr.dest.addr[2] = 0x5e;
520 IPBUF->ethhdr.dest.addr[3] = IPBUF->destipaddr.u8[1];
521 IPBUF->ethhdr.dest.addr[4] = IPBUF->destipaddr.u8[2];
522 IPBUF->ethhdr.dest.addr[5] = IPBUF->destipaddr.u8[3];
526 memcpy(IPBUF->ethhdr.dest.addr, arp_table[arpid - UIP_ARP_BASE].ethaddr.addr, 6);
529 memcpy(IPBUF->ethhdr.src.addr, uip_lladdr.addr, 6);
530 IPBUF->ethhdr.type =
UIP_HTONS(UIP_ETHTYPE_IP);
536 uip_arp_update(ipaddr, ethaddr, 0);
#define uip_ipaddr_maskcmp(addr1, addr2, mask)
#define uip_ipaddr_copy(dest, src)