/************************************************************************ * NAME: fnet_eth_change_addr_notify * * DESCRIPTION: This function is called on IP address change. * It issues a gratuitous ARP request. *************************************************************************/ void fnet_eth_change_addr_notify(fnet_netif_t *netif) { #if FNET_CFG_IP4 fnet_printf("ETH - Change IP4 to: %x\n", netif->ip4_addr.address); if(netif->ip4_addr.address) fnet_arp_request(netif, netif->ip4_addr.address); /* Gratuitous ARP request.*/ #else FNET_COMP_UNUSED_ARG(netif); #endif /* FNET_CFG_IP4 */ }
/************************************************************************ * NAME: fnet_arp_send_request * * DESCRIPTION: Public function. Sends ARP request. *************************************************************************/ void fnet_arp_send_request( fnet_netif_desc_t netif_desc, fnet_ip4_addr_t ip_addr ) { fnet_netif_t *netif = (fnet_netif_t *)netif_desc; fnet_arp_if_t *arpif; if(netif) { arpif = netif->arp_if_ptr; if(arpif) { fnet_isr_lock(); fnet_arp_request(netif, ip_addr); fnet_isr_unlock(); } } }
/************************************************************************ * NAME: fnet_arp_resolve * * DESCRIPTION: This function finds the first unused or the oldest * ARP table entry and makes a new entry * to prepare it for an ARP reply. *************************************************************************/ void fnet_arp_resolve(fnet_netif_t *netif, fnet_ip4_addr_t ipaddr, fnet_netbuf_t *nb) { fnet_arp_if_t *arpif = netif->arp_if_ptr; fnet_index_t i; fnet_arp_entry_t *entry; fnet_isr_lock(); for (i = 0U; i < FNET_CFG_ARP_TABLE_SIZE; i++) { if (ipaddr == arpif->arp_table[i].prot_addr) { break; } } /* If no unused entry is found, create it. */ if (i == FNET_CFG_ARP_TABLE_SIZE) { entry = fnet_arp_add_entry(netif, ipaddr, fnet_eth_null_addr); } else { entry = &arpif->arp_table[i]; } if (entry->hold) { fnet_netbuf_free_chain(entry->hold); entry->hold = NULL; } if ((i == FNET_CFG_ARP_TABLE_SIZE) || ((entry->hold) && (((fnet_timer_ticks() - entry->hold_time) * FNET_TIMER_PERIOD_MS) > 1000U)) || (!entry->hold)) { entry->hold_time = fnet_timer_ticks(); entry->hold = nb; fnet_arp_request(netif, ipaddr); } else { entry->hold = nb; } fnet_isr_unlock(); }
/************************************************************************ * NAME: fnet_arp_resolve * * DESCRIPTION: This function finds the first unused or the oldest * ARP table entry and makes a new entry * to prepare it for an ARP reply. *************************************************************************/ void fnet_arp_resolve( fnet_netif_t *netif, fnet_ip4_addr_t ipaddr, fnet_netbuf_t *nb ) { fnet_arp_if_t *arpif = &(((fnet_eth_if_t *)(netif->if_ptr))->arp_if); //PFI int i; fnet_arp_entry_t *entry; for (i = 0; i < FNET_ARP_TABLE_SIZE; i++) { if(ipaddr == arpif->arp_table[i].prot_addr) { break; } } /* If no unused entry is found, create it. */ if(i == FNET_ARP_TABLE_SIZE) entry = fnet_arp_add_entry(netif, ipaddr, fnet_eth_null_addr); else entry = &arpif->arp_table[i]; if(entry->hold) { fnet_netbuf_free_chain(entry->hold); } if((i == FNET_ARP_TABLE_SIZE)|| ((entry->hold)&&(((fnet_timer_ticks()-entry->hold_time)*FNET_TIMER_PERIOD_MS)>1000))|| (!entry->hold)) { entry->hold_time = fnet_timer_ticks(); entry->hold = nb; fnet_arp_request(netif, ipaddr); } else entry->hold = nb; }