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

@@ -37,6 +37,8 @@
#include "lwip/memp.h"
#include "lwip/pbuf.h"
#include "netif/etharp.h"
#include "lwip/ip.h"
#include "lwip/ip_frag.h"
#include "lwip/udp.h"
@@ -61,7 +63,7 @@ tcpip_tcp_timer(void *arg)
/* timer still needed? */
if (tcp_active_pcbs || tcp_tw_pcbs) {
/* restart timer */
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
sys_timeout( TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
} else {
/* disable timer */
tcpip_tcp_timer_active = 0;
@@ -76,7 +78,7 @@ tcp_timer_needed(void)
if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
/* enable and start timer */
tcpip_tcp_timer_active = 1;
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
sys_timeout( TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
}
}
#endif /* !NO_SYS */
@@ -88,18 +90,67 @@ ip_timer(void *data)
{
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: ip_reass_tmr()\n"));
ip_reass_tmr();
sys_timeout(1000, ip_timer, NULL);
sys_timeout( IP_TMR_INTERVAL, ip_timer, NULL);
}
#endif
static void
arp_timer(void *arg)
{
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: etharp_tmr()\n"));
etharp_tmr();
sys_timeout( ARP_TMR_INTERVAL, arp_timer, NULL);
}
#if ETHARP_TCPIP_ETHINPUT
static void
ethernet_input(struct pbuf *p, struct netif *netif)
{
struct eth_hdr* ethhdr;
/* points to packet payload, which starts with an Ethernet header */
ethhdr = p->payload;
#if LINK_STATS
lwip_stats.link.recv++;
#endif /* LINK_STATS */
switch (htons(ethhdr->type)) {
/* IP packet? */
case ETHTYPE_IP:
#if ETHARP_TRUST_IP_MAC
/* update ARP table */
etharp_ip_input( netif, p);
#endif
/* skip Ethernet header */
pbuf_header(p, -sizeof(struct eth_hdr));
/* pass to IP layer */
ip_input(p, netif);
break;
case ETHTYPE_ARP:
/* pass p to ARP module */
etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p);
break;
default:
pbuf_free(p);
p = NULL;
break;
}
}
#endif /* ETHARP_TCPIP_ETHINPUT */
static void
tcpip_thread(void *arg)
{
struct tcpip_msg *msg;
#if IP_REASSEMBLY
sys_timeout(1000, ip_timer, NULL);
sys_timeout( IP_TMR_INTERVAL, ip_timer, NULL);
#endif
sys_timeout( ARP_TMR_INTERVAL, arp_timer, NULL);
if (tcpip_init_done != NULL) {
tcpip_init_done(tcpip_init_done_arg);
}
@@ -111,10 +162,21 @@ tcpip_thread(void *arg)
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
api_msg_input(msg->msg.apimsg);
break;
#if ETHARP_TCPIP_INPUT
case TCPIP_MSG_INPUT:
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p\n", (void *)msg));
ip_input(msg->msg.inp.p, msg->msg.inp.netif);
break;
#endif /* ETHARP_TCPIP_INPUT */
#if ETHARP_TCPIP_ETHINPUT
case TCPIP_MSG_ETHINPUT:
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: Ethernet packet %p\n", (void *)msg));
ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
break;
#endif /* ETHARP_TCPIP_ETHINPUT */
case TCPIP_MSG_CALLBACK:
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
msg->msg.cb.f(msg->msg.cb.ctx);
@@ -126,6 +188,7 @@ tcpip_thread(void *arg)
}
}
#if ETHARP_TCPIP_INPUT
err_t
tcpip_input(struct pbuf *p, struct netif *inp)
{
@@ -143,6 +206,27 @@ tcpip_input(struct pbuf *p, struct netif *inp)
sys_mbox_post(mbox, msg);
return ERR_OK;
}
#endif /* ETHARP_TCPIP_INPUT */
#if ETHARP_TCPIP_ETHINPUT
err_t
tcpip_ethinput(struct pbuf *p, struct netif *inp)
{
struct tcpip_msg *msg;
msg = memp_malloc(MEMP_TCPIP_MSG);
if (msg == NULL) {
pbuf_free(p);
return ERR_MEM;
}
msg->type = TCPIP_MSG_ETHINPUT;
msg->msg.inp.p = p;
msg->msg.inp.netif = inp;
sys_mbox_post(mbox, msg);
return ERR_OK;
}
#endif /* ETHARP_TCPIP_ETHINPUT */
err_t
tcpip_callback(void (*f)(void *ctx), void *ctx)