static void ethernetif_input( void * pvParameters ) { struct ethernetif *ethernetif; struct eth_hdr *ethhdr; struct pbuf *p; for( ;; ) { do { ethernetif = s_pxNetIf->state; /* move received packet into a new pbuf */ p = low_level_input( s_pxNetIf ); if( p == NULL ) { /* No packet could be read. Wait a for an interrupt to tell us there is more data available. */ vEMACWaitForInput(); } } while( p == NULL ); /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; #if LINK_STATS lwip_stats.link.recv++; #endif /* LINK_STATS */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP packet? */ case ETHTYPE_IP: /* update ARP table */ etharp_ip_input(s_pxNetIf, p); /* skip Ethernet header */ pbuf_header(p, (s16_t)-sizeof(struct eth_hdr)); /* pass to network layer */ s_pxNetIf->input(p, s_pxNetIf); break; case ETHTYPE_ARP: /* pass p to ARP module */ etharp_arp_input(s_pxNetIf, ethernetif->ethaddr, p); break; default: pbuf_free(p); p = NULL; break; } } }
/** * This function should be called when a packet is ready to be read * from the interface. It uses the function low_level_input() that * should handle the actual reception of bytes from the network * interface. Then the type of the received packet is determined and * the appropriate input function is called. * * @param netif the lwip network interface structure for this ethernetif */ static void ethernetif_input( void* notused ) //ethernetif_input(struct netif *netif) { (void)notused; // MakingThings struct ethernetif *ethernetif; struct eth_hdr *ethhdr; struct pbuf *p; for( ;; ) { do { // ethernetif = netif->state; ethernetif = xNetIf->state; // MakingThings /* move received packet into a new pbuf */ p = low_level_input(xNetIf); // MakingThings /* no packet could be read, silently ignore this */ // if (p == NULL) return; // MakingThings if( p == NULL ) { /* No packet could be read. Wait a for an interrupt to tell us there is more data available. */ vEMACWaitForInput(); } } while( p == NULL ); /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: #if PPPOE_SUPPORT /* PPPoE packet? */ case ETHTYPE_PPPOEDISC: case ETHTYPE_PPPOE: #endif /* PPPOE_SUPPORT */ /* full packet send to tcpip_thread to process */ //if (netif->input(p, netif)!=ERR_OK) if (xNetIf->input(p, xNetIf)!=ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); pbuf_free(p); p = NULL; } break; default: pbuf_free(p); p = NULL; break; } } }
/** * This function should be called when a packet is ready to be read * from the interface. It uses the function low_level_input() that * should handle the actual reception of bytes from the network * interface. Then the type of the received packet is determined and * the appropriate input function is called. * * @param netif the lwip network interface structure for this ethernetif */ static void ethernetif_input( void * pvParameters ) { struct ethernetif *ethernetif; struct eth_hdr *ethhdr; struct pbuf *p; for( ;; ) { do { ethernetif = s_pxNetIf->state; /* move received packet into a new pbuf */ p = low_level_input( s_pxNetIf ); if( p == NULL ) { /* No packet could be read. Wait a for an interrupt to tell us there is more data available. */ vEMACWaitForInput(); } } while( p == NULL ); /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; #if LINK_STATS lwip_stats.link.recv++; #endif /* LINK_STATS */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP packet? */ case ETHTYPE_IP: /* full packet send to tcpip_thread to process */ if (s_pxNetIf->input(p, s_pxNetIf) != ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); pbuf_free(p); p = NULL; } break; case ETHTYPE_ARP: #if ETHARP_TRUST_IP_MAC etharp_ip_input(s_pxNetIf, p); #endif /* pass p to ARP module */ etharp_arp_input(s_pxNetIf, ethernetif->ethaddr, p); break; default: pbuf_free(p); p = NULL; break; } } }