tabptr = &arp_table[i];
uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr){  register struct arp_entry *tabptr;  /* Walk through the ARP mapping table and try to find an entry to     update. If none is found, the IP -> MAC address mapping is     inserted in the ARP table. */  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {    tabptr = &arp_table[i];    /* Only check those entries that are actually in use. */    if(tabptr->ipaddr[0] != 0 &&       tabptr->ipaddr[1] != 0) {      /* Check if the source IP address of the incoming packet matches         the IP address in this ARP table entry. */      if(ipaddr[0] == tabptr->ipaddr[0] &&	 ipaddr[1] == tabptr->ipaddr[1]) {	 	/* An old entry found, update this and return. */	memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);	tabptr->time = arptime;	return;      }    }  }  /* If we get here, no existing ARP table entry was found, so we     create one. */  /* First, we try to find an unused entry in the ARP table. */  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {    tabptr = &arp_table[i];    if(tabptr->ipaddr[0] == 0 &&       tabptr->ipaddr[1] == 0) {      break;    }  }  /* If no unused entry is found, we try to find the oldest entry and     throw it away. */  if(i == UIP_ARPTAB_SIZE) {    tmpage = 0;    c = 0;    for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {      tabptr = &arp_table[i];      if(arptime - tabptr->time > tmpage) {	tmpage = arptime - tabptr->time;	c = i;      }    }    i = c;  }  /* Now, i is the ARP table entry which we will fill with the new     information. */  memcpy(tabptr->ipaddr, ipaddr, 4);  memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);  tabptr->time = arptime;}