uint8_t ethernet_handle_packet() { /* receive packet */ uint16_t packet_size = hal_receive_packet(ethernet_rx_buffer,sizeof(ethernet_rx_buffer)); if(packet_size < 1) { return 0; } /* get ethernet header */ struct ethernet_header * header = (struct ethernet_header*)ethernet_rx_buffer; /* remove ethernet header from packet for upper layers */ packet_size -= sizeof(*header); uint8_t * data = (uint8_t*)(header+1); /* redirect packet to the proper upper layer */ uint8_t ret=1; switch(header->type) { case HTON16(ETHERNET_TYPE_IP): ret = ip_handle_packet((struct ip_header*)data,packet_size,(const ethernet_address*)&header->src); break; case HTON16(ETHERNET_TYPE_ARP): ret = arp_handle_packet((struct arp_header*)data,packet_size); break; default: return 0; } ethernet_stats.rx_packets++; return ret; }
uint8_t handle_ethernet_packet() { uint16_t packet_size = 0; packet_size = Enc28j60PacketReceive(sizeof(ethernet_buffer), ethernet_buffer); if (packet_size == 0){ return 0; } // char buffer[30]; // sprintf(buffer, "ETH packet length: %" PRIu16, packet_size); // DBG_DYNAMIC(buffer); struct ethernet_header * header = (struct ethernet_header*)ethernet_buffer; packet_size -=sizeof(*header); uint8_t* data = (uint8_t*)(header +1); uint8_t ret=1; switch(header->type) { case HTON16(ETHERNET_TYPE_IP): //DBG_STATIC("Recieved IP packet."); //IP handle packet ret = ip_handle_packet((struct ip_header*)data,packet_size,(const ethernet_address*)&header->src); break; case HTON16(ETHERNET_TYPE_ARP): //DBG_STATIC("Recieved ARP packet."); //ARP handle packet ret = arp_handle_packet((struct arp_header*)data,packet_size); // if(ret){ // DBG_STATIC("ARP packet successfully handled."); // } else { // DBG_STATIC("ARP packet FAILURE.") // } break; default: return 0; } ethernet_stats.rx_packets++; return ret; }