/************************************************************************ * NAME: fnet_arp_get_mac * * DESCRIPTION: Gets MAC address of valid ARP cache entry. *************************************************************************/ fnet_bool_t fnet_arp_get_mac( fnet_netif_desc_t netif_desc, fnet_ip4_addr_t ip_addr, fnet_mac_addr_t mac_addr) { fnet_netif_t *netif = (fnet_netif_t *)netif_desc; fnet_arp_if_t *arpif; fnet_mac_addr_t *macaddr_p; fnet_bool_t result = FNET_FALSE; if(netif) { arpif = netif->arp_if_ptr; if(arpif) { fnet_isr_lock(); macaddr_p = fnet_arp_lookup(netif, ip_addr); if(macaddr_p) { if(mac_addr) { fnet_memcpy (mac_addr, *macaddr_p, sizeof(fnet_mac_addr_t)); } result = FNET_TRUE; } fnet_isr_unlock(); } } return result; }
void fnet_eth_output_ip4(fnet_netif_t *netif, fnet_ip4_addr_t dest_ip_addr, fnet_netbuf_t* nb) { fnet_mac_addr_t destination_addr; /* 48-bit destination address */ fnet_mac_addr_t * dest_ptr; /* Construct Ethernet header. Start with looking up deciding which * MAC address to use as a destination address. Broadcasts and * multicasts are special, all other addresses are looked up in the * ARP table. */ if(fnet_ip_addr_is_broadcast (dest_ip_addr, netif)) { fnet_memcpy (destination_addr, fnet_eth_broadcast, sizeof(fnet_mac_addr_t)); } else if(FNET_IP4_ADDR_IS_MULTICAST(dest_ip_addr)) { /* Hash IP multicast address to MAC address. */ destination_addr[0] = 0x01; destination_addr[1] = 0x0; destination_addr[2] = 0x5e; destination_addr[3] = (unsigned char)(FNET_IP4_ADDR2(dest_ip_addr)& 0x7f); destination_addr[4] = (unsigned char)(FNET_IP4_ADDR3(dest_ip_addr)); destination_addr[5] = (unsigned char)(FNET_IP4_ADDR4(dest_ip_addr)); //TBD Use macro } else /* Unicast address. */ { if((dest_ptr = fnet_arp_lookup(netif, dest_ip_addr))!=0) { fnet_memcpy (destination_addr, *dest_ptr, sizeof(fnet_mac_addr_t)); } else { fnet_arp_resolve(netif, dest_ip_addr, nb); goto EXIT; } } /* Send Ethernet frame. */ ((fnet_eth_if_t *)(netif->if_ptr))->output(netif, FNET_ETH_TYPE_IP4, destination_addr, nb); EXIT: return; }