Example #1
0
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;
}
Example #2
0
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;
}