From 6a3405623306b539e063d85d07795e6881b57166 Mon Sep 17 00:00:00 2001 From: "mbbill@gmail.com" Date: Wed, 8 Jun 2011 16:37:10 +0000 Subject: [PATCH] Fixd a bug in ethernetif git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1468 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/net/lwip-1.4.0/src/arch/sys_arch.c | 75 +++++++++++++------ .../net/lwip-1.4.0/src/netif/ethernetif.c | 4 +- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/components/net/lwip-1.4.0/src/arch/sys_arch.c b/components/net/lwip-1.4.0/src/arch/sys_arch.c index 98e54ccefd..83a0f2c2d2 100644 --- a/components/net/lwip-1.4.0/src/arch/sys_arch.c +++ b/components/net/lwip-1.4.0/src/arch/sys_arch.c @@ -107,21 +107,29 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) else { /* convirt msecond to os tick */ - if (timeout < (1000/RT_TICK_PER_SECOND)) t = 1; - else t = timeout / (1000/RT_TICK_PER_SECOND); + if (timeout < (1000/RT_TICK_PER_SECOND)) + t = 1; + else + t = timeout / (1000/RT_TICK_PER_SECOND); } ret = rt_sem_take(*sem, t); - if (ret == -RT_ETIMEOUT) return SYS_ARCH_TIMEOUT; - else if (ret == RT_EOK) ret = 1; + if (ret == -RT_ETIMEOUT) + return SYS_ARCH_TIMEOUT; + else + { + if (ret == RT_EOK) + ret = 1; + } /* get elapse msecond */ tick = rt_tick_get() - tick; /* convert tick to msecond */ tick = tick * (1000/RT_TICK_PER_SECOND); - if (tick == 0) tick = 1; + if (tick == 0) + tick = 1; return tick; } @@ -296,6 +304,10 @@ void sys_mbox_free(sys_mbox_t *mbox) return; } +/** Post a message to an mbox - may not fail + * -> blocks if full, only used from tasks not from ISR + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) */ void sys_mbox_post(sys_mbox_t *mbox, void *msg) { #if SYS_DEBUG @@ -308,8 +320,8 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) } #endif - rt_mb_send(*mbox, (rt_uint32_t)msg); - + if (rt_mb_send(*mbox, (rt_uint32_t)msg) != RT_EOK) + rt_kprintf("TODO: FIX THIS!! mbox overflow"); return; } @@ -325,11 +337,19 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) } #endif - if (rt_mb_send(*mbox, (rt_uint32_t)msg) == RT_EOK) return ERR_OK; + if (rt_mb_send(*mbox, (rt_uint32_t)msg) == RT_EOK) + return ERR_OK; return ERR_MEM; } +/** Wait for a new message to arrive in the mbox + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @param timeout maximum time (in milliseconds) to wait for a message + * @return time (in milliseconds) waited for a message, may be 0 if not waited + or SYS_ARCH_TIMEOUT on timeout + * The returned time has to be accurate to prevent timer jitter! */ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) { rt_err_t ret; @@ -344,14 +364,21 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) else { /* convirt msecond to os tick */ - if (timeout < (1000/RT_TICK_PER_SECOND)) t = 1; - else t = timeout / (1000/RT_TICK_PER_SECOND); + if (timeout < (1000/RT_TICK_PER_SECOND)) + t = 1; + else + t = timeout / (1000/RT_TICK_PER_SECOND); } ret = rt_mb_recv(*mbox, (rt_uint32_t *)msg, t); - if(ret == -RT_ETIMEOUT) return SYS_ARCH_TIMEOUT; - else if (ret == RT_EOK) ret = 1; + if(ret == -RT_ETIMEOUT) + return SYS_ARCH_TIMEOUT; + else + { + if (ret == RT_EOK) + ret = 1; + } #if SYS_DEBUG { @@ -368,19 +395,31 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) /* convert tick to msecond */ tick = tick * (1000/RT_TICK_PER_SECOND); - if (tick == 0) tick = 1; + if (tick == 0) + tick = 1; return tick; } +/** Wait for a new message to arrive in the mbox + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @param timeout maximum time (in milliseconds) to wait for a message + * @return 0 (milliseconds) if a message has been received + * or SYS_MBOX_EMPTY if the mailbox is empty */ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) { int ret; ret = rt_mb_recv(*mbox, (rt_uint32_t *)msg, 0); - if(ret == -RT_ETIMEOUT) return SYS_ARCH_TIMEOUT; - else if (ret == RT_EOK) ret = 1; + if(ret == -RT_ETIMEOUT) + return SYS_ARCH_TIMEOUT; + else + { + if (ret == RT_EOK) + ret = 1; + } #if SYS_DEBUG { @@ -399,9 +438,6 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) /** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */ int sys_mbox_valid(sys_mbox_t *mbox) { - //////////////////// - // to be implemented. - //////////////////// return (int)(*mbox); } #endif @@ -409,9 +445,6 @@ int sys_mbox_valid(sys_mbox_t *mbox) /** Set an mbox invalid so that sys_mbox_valid returns 0 */ void sys_mbox_set_invalid(sys_mbox_t *mbox) { - //////////////////// - // to be implemented. - //////////////////// *mbox = RT_NULL; } #endif diff --git a/components/net/lwip-1.4.0/src/netif/ethernetif.c b/components/net/lwip-1.4.0/src/netif/ethernetif.c index ed757dc4f7..e4051ee351 100644 --- a/components/net/lwip-1.4.0/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.0/src/netif/ethernetif.c @@ -179,7 +179,7 @@ rt_err_t eth_device_init(struct eth_device* dev, const char* name) code to eth_init(). See include/lwip/netif.h line 97 */ eth_dev = dev; if (netif_add(pnetif, IP_ADDR_ANY, IP_ADDR_BROADCAST, IP_ADDR_ANY, dev, - ethernetif_init, ethernet_input) == RT_NULL) + ethernetif_init, tcpip_input) == RT_NULL) { /* failed, unregister device and free netif */ rt_device_unregister(&(dev->parent)); @@ -249,7 +249,7 @@ void eth_rx_thread_entry(void* parameter) if (p != RT_NULL) { /* notify to upper layer */ - ethernet_input(p, device->netif); + tcpip_input(p, device->netif); } else break; } -- GitLab