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; }
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 */ /* 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] = 0x01U; destination_addr[1] = 0x0U; destination_addr[2] = 0x5eU; destination_addr[3] = (fnet_uint8_t)(FNET_IP4_ADDR2(dest_ip_addr) & 0x7fU); destination_addr[4] = (fnet_uint8_t)(FNET_IP4_ADDR3(dest_ip_addr)); destination_addr[5] = (fnet_uint8_t)(FNET_IP4_ADDR4(dest_ip_addr)); /* TBD Use macro. */ } else /* Unicast address. */ { if(fnet_arp_get_mac( (fnet_netif_desc_t) netif, dest_ip_addr, destination_addr) == FNET_FALSE) { fnet_arp_resolve(netif, dest_ip_addr, nb); goto EXIT; } } /* Send Ethernet frame. */ fnet_eth_output(netif, FNET_ETH_TYPE_IP4, destination_addr, nb); EXIT: return; }