diff --git a/components/net/lwip/src/core/netif.c b/components/net/lwip/src/core/netif.c index 48c69bcde9783614d5f06852bcf62d5f72d505a1..df6b6faf38fec706171a422615a3f7509fcd97be 100644 --- a/components/net/lwip/src/core/netif.c +++ b/components/net/lwip/src/core/netif.c @@ -471,6 +471,9 @@ void netif_set_status_callback(struct netif *netif, void (* status_callback)(str */ void netif_set_link_up(struct netif *netif ) { + /* not notify link up anymore */ + if (netif->flags & NETIF_FLAG_LINK_UP) return; + netif->flags |= NETIF_FLAG_LINK_UP; #if LWIP_DHCP diff --git a/components/net/lwip/src/include/lwip/netifapi.h b/components/net/lwip/src/include/lwip/netifapi.h index 4145dd740ade0c476663a84042852e766b4fe1f1..a9f63651c642f020354ae581170261f09202397a 100644 --- a/components/net/lwip/src/include/lwip/netifapi.h +++ b/components/net/lwip/src/include/lwip/netifapi.h @@ -96,6 +96,9 @@ err_t netifapi_netif_common ( struct netif *netif, #define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) #define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) +#define netifapi_netif_set_link_up(n) netifapi_netif_common(n, netif_set_link_up, NULL) +#define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL) + #ifdef __cplusplus } #endif diff --git a/components/net/lwip/src/include/netif/ethernetif.h b/components/net/lwip/src/include/netif/ethernetif.h index 2681de560595fd7c3fb5a54403ac53021ce8bb39..87b38497d8698092898c1125751a748f3fe1449a 100644 --- a/components/net/lwip/src/include/netif/ethernetif.h +++ b/components/net/lwip/src/include/netif/ethernetif.h @@ -16,12 +16,17 @@ struct eth_device struct netif *netif; struct rt_semaphore tx_ack; + rt_uint16_t link_changed; + rt_uint16_t link_status; + /* eth device interface */ struct pbuf* (*eth_rx)(rt_device_t dev); rt_err_t (*eth_tx)(rt_device_t dev, struct pbuf* p); }; +rt_err_t eth_rx_ready(struct eth_device* dev); rt_err_t eth_device_ready(struct eth_device* dev); +rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up); rt_err_t eth_device_init(struct eth_device* dev, const char* name); diff --git a/components/net/lwip/src/lwipopts.h b/components/net/lwip/src/lwipopts.h index c02c6650880e0165e2bf04c7b1e7c3788a72d558..a706d386abf5caf236db2f63eb6cbc954756d04d 100644 --- a/components/net/lwip/src/lwipopts.h +++ b/components/net/lwip/src/lwipopts.h @@ -178,13 +178,13 @@ #define TCP_QUEUE_OOSEQ 1 /* TCP Maximum segment size. */ -#define TCP_MSS 1024 +#define TCP_MSS 1460 /* TCP sender buffer space (bytes). */ #ifdef RT_LWIP_TCP_SND_BUF #define TCP_SND_BUF RT_LWIP_TCP_SND_BUF #else -#define TCP_SND_BUF 2048 +#define TCP_SND_BUF (TCP_MSS * 2) #endif /* TCP sender buffer space (pbufs). This must be at least = 2 * @@ -198,9 +198,9 @@ /* TCP receive window. */ #ifdef RT_LWIP_TCP_WND -#define TCP_WND RT_LWIP_TCP_WND +#define TCP_WND RT_LWIP_TCP_WND #else -#define TCP_WND 1500 +#define TCP_WND (TCP_MSS * 2) #endif /* Maximum number of retransmissions of data segments. */ diff --git a/components/net/lwip/src/netif/ethernetif.c b/components/net/lwip/src/netif/ethernetif.c index 0eab86a36e77265502c9cdb4ca46667add922dd3..76660b04e7b80b226eb7a76d669616b17d87acf2 100644 --- a/components/net/lwip/src/netif/ethernetif.c +++ b/components/net/lwip/src/netif/ethernetif.c @@ -188,6 +188,23 @@ void eth_rx_thread_entry(void* parameter) { struct pbuf *p; + /* check link status */ + if (device->link_changed) + { + int status; + rt_uint32_t level; + + level = rt_hw_interrupt_disable(); + status = device->link_status; + device->link_changed = 0x00; + rt_hw_interrupt_enable(level); + + if (status) + netifapi_netif_set_link_up(device->netif); + else + netifapi_netif_set_link_down(device->netif); + } + /* receive all of buffer */ while (1) { @@ -219,6 +236,24 @@ rt_err_t eth_device_ready(struct eth_device* dev) return eth_rx_ready(dev); } +rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up) +{ + rt_uint32_t level; + + RT_ASSERT(dev != RT_NULL); + + level = rt_hw_interrupt_disable(); + dev->link_changed = 0x01; + if (up == RT_TRUE) + dev->link_status = 0x01; + else + dev->link_status = 0x00; + rt_hw_interrupt_enable(level); + + /* post message to ethernet thread */ + return rt_mb_send(ð_rx_thread_mb, (rt_uint32_t)dev); +} + rt_err_t eth_system_device_init() { rt_err_t result = RT_EOK;