diff --git a/CHANGELOG b/CHANGELOG index b457e9b6..91231db3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -66,6 +66,11 @@ HISTORY * api_lib.c: Use memcpy in netbuf_copy_partial. ++ Bug fixes: + + 2007-03-20 Frédéric Bernon + * tcpip.c: Initialize tcpip's mbox, and verify if initialized in tcpip_input, + tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with + network interfaces. Also fix a compiler warning. 2007-03-20 Kieran Mansley * udp.c: Only try and use pbuf_header() to make space for headers if diff --git a/src/api/tcpip.c b/src/api/tcpip.c index 41ad8ebb..c3457759 100644 --- a/src/api/tcpip.c +++ b/src/api/tcpip.c @@ -48,8 +48,8 @@ #include "lwip/igmp.h" static void (* tcpip_init_done)(void *arg) = NULL; -static void *tcpip_init_done_arg; -static sys_mbox_t mbox; +static void *tcpip_init_done_arg = NULL; +static sys_mbox_t mbox = SYS_MBOX_NULL; #if LWIP_TCP static int tcpip_tcp_timer_active = 0; @@ -138,7 +138,7 @@ ethernet_input(struct pbuf *p, struct netif *netif) etharp_ip_input( netif, p); #endif /* skip Ethernet header */ - pbuf_header(p, -sizeof(struct eth_hdr)); + pbuf_header(p, (s16_t)(-sizeof(struct eth_hdr))); /* pass to IP layer */ ip_input(p, netif); break; @@ -216,17 +216,20 @@ tcpip_input(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; - } + if (mbox != SYS_MBOX_NULL) { + msg = memp_malloc(MEMP_TCPIP_MSG); + if (msg == NULL) { + pbuf_free(p); + return ERR_MEM; + } - msg->type = TCPIP_MSG_INPUT; - msg->msg.inp.p = p; - msg->msg.inp.netif = inp; - sys_mbox_post(mbox, msg); - return ERR_OK; + msg->type = TCPIP_MSG_INPUT; + msg->msg.inp.p = p; + msg->msg.inp.netif = inp; + sys_mbox_post(mbox, msg); + return ERR_OK; + } + return ERR_VAL; } #endif /* ETHARP_TCPIP_INPUT */ @@ -236,17 +239,20 @@ 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; + if (mbox != SYS_MBOX_NULL) { + 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; } - - msg->type = TCPIP_MSG_ETHINPUT; - msg->msg.inp.p = p; - msg->msg.inp.netif = inp; - sys_mbox_post(mbox, msg); - return ERR_OK; + return ERR_VAL; } #endif /* ETHARP_TCPIP_ETHINPUT */ @@ -255,30 +261,37 @@ tcpip_callback(void (*f)(void *ctx), void *ctx) { struct tcpip_msg *msg; - msg = memp_malloc(MEMP_TCPIP_MSG); - if (msg == NULL) { - return ERR_MEM; - } + if (mbox != SYS_MBOX_NULL) { + msg = memp_malloc(MEMP_TCPIP_MSG); + if (msg == NULL) { + return ERR_MEM; + } - msg->type = TCPIP_MSG_CALLBACK; - msg->msg.cb.f = f; - msg->msg.cb.ctx = ctx; - sys_mbox_post(mbox, msg); - return ERR_OK; + msg->type = TCPIP_MSG_CALLBACK; + msg->msg.cb.f = f; + msg->msg.cb.ctx = ctx; + sys_mbox_post(mbox, msg); + return ERR_OK; + } + return ERR_VAL; } err_t tcpip_apimsg(struct api_msg *apimsg) { struct tcpip_msg *msg; - msg = memp_malloc(MEMP_TCPIP_MSG); - if (msg == NULL) { - return ERR_MEM; + + if (mbox != SYS_MBOX_NULL) { + msg = memp_malloc(MEMP_TCPIP_MSG); + if (msg == NULL) { + return ERR_MEM; + } + msg->type = TCPIP_MSG_API; + msg->msg.apimsg = apimsg; + sys_mbox_post(mbox, msg); + return ERR_OK; } - msg->type = TCPIP_MSG_API; - msg->msg.apimsg = apimsg; - sys_mbox_post(mbox, msg); - return ERR_OK; + return ERR_VAL; } void @@ -298,6 +311,3 @@ tcpip_init(void (* initfunc)(void *), void *arg) sys_thread_new(tcpip_thread, NULL, TCPIP_THREAD_PRIO); } - - -