opt.h, ip_frag.h, tcpip.h, tcpip.c, ethernetif.c: add new configuration option named ETHARP_TCPIP_ETHINPUT, which enable the new tcpip_ethinput. Allow to do ARP processing for incoming packets inside tcpip_thread (protecting ARP layer against concurrent access). You can also disable old code using tcp_input with new define ETHARP_TCPIP_INPUT set to 0. Older ports have to use tcpip_ethinput.

This commit is contained in:
fbernon
2007-03-06 14:18:02 +00:00
parent 7115975212
commit ed07d481d6
6 changed files with 175 additions and 60 deletions

View File

@@ -237,36 +237,44 @@ ethernetif_input(struct netif *netif)
ethhdr = p->payload;
switch (htons(ethhdr->type)) {
#if ETHARP_TCPIP_ETHINPUT
/* IP or ARP packet? */
case ETHTYPE_IP:
case ETHTYPE_ARP:
/* full packet send to tcpip_thread to process */
pnetif->input( p, pnetif);
break;
#else /* ETHARP_TCPIP_ETHINPUT */
#if ETHARP_TCPIP_INPUT
/* IP packet? */
case ETHTYPE_IP:
#if 0
/* CSi disabled ARP table update on ingress IP packets.
This seems to work but needs thorough testing. */
#if ETHARP_TRUST_IP_MAC
/* update ARP table */
etharp_ip_input(netif, p);
#endif
#endif /* ETHARP_TRUST_IP_MAC */
/* skip Ethernet header */
pbuf_header(p, -sizeof(struct eth_hdr));
/* pass to network layer */
netif->input(p, netif);
break;
case ETHTYPE_ARP:
/* pass p to ARP module */
etharp_arp_input(netif, ethernetif->ethaddr, p);
break;
default:
pbuf_free(p);
p = NULL;
break;
}
}
/* ARP packet? */
case ETHTYPE_ARP:
/* pass p to ARP module */
etharp_arp_input(netif, ethernetif->ethaddr, p);
break;
#endif /* ETHARP_TCPIP_INPUT */
#endif /* ETHARP_TCPIP_ETHINPUT */
static void
arp_timer(void *arg)
{
etharp_tmr();
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
default:
pbuf_free(p);
p = NULL;
break;
}
}
/*
@@ -317,10 +325,6 @@ ethernetif_init(struct netif *netif)
low_level_init(netif);
etharp_init();
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
return ERR_OK;
}