From ccb682f332e5ad1d9cdfd97a9a3ee12e6d00b898 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 29 Sep 2012 14:13:04 +0000 Subject: [PATCH] Fix problem with ping that prevent ping from going outside local network (Darcy Gong) git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5204 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/ChangeLog | 3 + nuttx/configs/shenzhou/README.txt | 23 +-- nuttx/configs/sim/README.txt | 6 +- nuttx/configs/stm3220g-eval/README.txt | 29 ++-- nuttx/configs/stm3220g-eval/nxwm/defconfig | 14 +- nuttx/configs/stm3240g-eval/README.txt | 29 ++-- nuttx/net/uip/uip_icmpping.c | 161 +++++++++++---------- 7 files changed, 145 insertions(+), 120 deletions(-) diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index ed9962df0f..526c8a3350 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -3450,3 +3450,6 @@ original configuration had too much stuff turned on. Reducing stack sizes, some features, and buffer sizes made the configuration reliable (Reading from the LCD is still disabled). + * net/uip/uip_icmpping.c: Fix problem that prevented ping from + going outside of local network. Submitted by Darcy Gong + diff --git a/nuttx/configs/shenzhou/README.txt b/nuttx/configs/shenzhou/README.txt index fcc39de74d..1f3f254aab 100644 --- a/nuttx/configs/shenzhou/README.txt +++ b/nuttx/configs/shenzhou/README.txt @@ -716,11 +716,12 @@ Where is one of the following: nuttx-code/NxWidgets/UnitTests/README.txt - Here is the quick summary of the build steps: + Here is the quick summary of the build steps (Assuming that all of + the required packages are available in a directory ~/nuttx-code): 1. Intall the nxwm configuration - $ cd ~/nuttx/nuttx-code/tools + $ cd ~/nuttx-code/tools $ ./configure.sh shenzhou/nxwm 2. Make the build context (only) @@ -732,27 +733,27 @@ Where is one of the following: 3. Install the nxwm unit test - $ cd ~/nuttx/nuttx-code/NxWidgets - $ tools/install.sh ~/nuttx/nuttx-code/apps nxwm + $ cd ~/nuttx-code/NxWidgets + $ tools/install.sh ~/nuttx-code/apps nxwm Creating symbolic link - - To ~/nuttx/nuttx-code/NxWidgets/UnitTests/nxwm - - At ~/nuttx/nuttx-code/apps/external + - To ~/nuttx-code/NxWidgets/UnitTests/nxwm + - At ~/nuttx-code/apps/external 4. Build the NxWidgets library - $ cd ~/nuttx/nuttx-code/NxWidgets/libnxwidgets - $ make TOPDIR=~/nuttx/nuttx-code + $ cd ~/nuttx-code/NxWidgets/libnxwidgets + $ make TOPDIR=~/nuttx-code ... 5. Build the NxWM library - $ cd ~/nuttx/nuttx-code/NxWidgets/nxwm - $ make TOPDIR=~/nuttx/nuttx-code + $ cd ~/nuttx-code/NxWidgets/nxwm + $ make TOPDIR=~/nuttx-code ... 6. Built NuttX with the installed unit test as the application - $ cd ~/nuttx/nuttx-code + $ cd ~/nuttx-code $ make NOTE: Reading from the LCD is not currently supported by this diff --git a/nuttx/configs/sim/README.txt b/nuttx/configs/sim/README.txt index 833ec58dc7..b8a921e7f4 100644 --- a/nuttx/configs/sim/README.txt +++ b/nuttx/configs/sim/README.txt @@ -409,15 +409,15 @@ nxwm This is a special configuration setup for the NxWM window manager UnitTest. The NxWM window manager can be found here: - trunk/NxWidgets/nxwm + nuttx-code/NxWidgets/nxwm The NxWM unit test can be found at: - trunk/NxWidgets/UnitTests/nxwm + nuttx-code/NxWidgets/UnitTests/nxwm Documentation for installing the NxWM unit test can be found here: - trunk/NxWidgets/UnitTests/READEM.txt + nuttx-code/NxWidgets/UnitTests/READEM.txt NOTE: There is an issue with running this example under the simulation. In the default configuration, this example will diff --git a/nuttx/configs/stm3220g-eval/README.txt b/nuttx/configs/stm3220g-eval/README.txt index b3b7fd476f..89c6b92330 100644 --- a/nuttx/configs/stm3220g-eval/README.txt +++ b/nuttx/configs/stm3220g-eval/README.txt @@ -947,21 +947,22 @@ Where is one of the following: This is a special configuration setup for the NxWM window manager UnitTest. The NxWM window manager can be found here: - trunk/NxWidgets/nxwm + nuttx-code/NxWidgets/nxwm The NxWM unit test can be found at: - trunk/NxWidgets/UnitTests/nxwm + nuttx-code/NxWidgets/UnitTests/nxwm Documentation for installing the NxWM unit test can be found here: - trunk/NxWidgets/UnitTests/README.txt + nuttx-code/NxWidgets/UnitTests/README.txt - Here is the quick summary of the build steps: + Here is the quick summary of the build steps (Assuming that all of + the required packages are available in a directory ~/nuttx-code): 1. Intall the nxwm configuration - $ cd ~/nuttx/trunk/nuttx/tools + $ cd ~/nuttx-code/nuttx/tools $ ./configure.sh stm3220g-eval/nxwm 2. Make the build context (only) @@ -973,27 +974,27 @@ Where is one of the following: 3. Install the nxwm unit test - $ cd ~/nuttx/trunk/NxWidgets - $ tools/install.sh ~/nuttx/trunk/apps nxwm + $ cd ~/nuttx-code/NxWidgets + $ tools/install.sh ~/nuttx-code/apps nxwm Creating symbolic link - - To ~/nuttx/trunk/NxWidgets/UnitTests/nxwm - - At ~/nuttx/trunk/apps/external + - To ~/nuttx-code/NxWidgets/UnitTests/nxwm + - At ~/nuttx-code/apps/external 4. Build the NxWidgets library - $ cd ~/nuttx/trunk/NxWidgets/libnxwidgets - $ make TOPDIR=~/nuttx/trunk/nuttx + $ cd ~/nuttx-code/NxWidgets/libnxwidgets + $ make TOPDIR=~/nuttx-code/nuttx ... 5. Build the NxWM library - $ cd ~/nuttx/trunk/NxWidgets/nxwm - $ make TOPDIR=~//nuttx/trunk/nuttx + $ cd ~/nuttx-code/NxWidgets/nxwm + $ make TOPDIR=~/nuttx-code/nuttx ... 6. Built NuttX with the installed unit test as the application - $ cd ~/nuttx/trunk/nuttx + $ cd ~/nuttx-code/nuttx $ make ostest: diff --git a/nuttx/configs/stm3220g-eval/nxwm/defconfig b/nuttx/configs/stm3220g-eval/nxwm/defconfig index 7b7028cf84..83c2f48417 100644 --- a/nuttx/configs/stm3220g-eval/nxwm/defconfig +++ b/nuttx/configs/stm3220g-eval/nxwm/defconfig @@ -507,7 +507,7 @@ CONFIG_STMPE811_THRESHX=39 CONFIG_STMPE811_THRESHY=51 # -# USB Device Configuration +# STM32 USB OTG FS Device Configuration # CONFIG_USBDEV=n CONFIG_USBDEV_ISOCHRONOUS=n @@ -518,6 +518,18 @@ CONFIG_USBDEV_MAXPOWER=100 CONFIG_USBDEV_TRACE=n CONFIG_USBDEV_TRACE_NRECORDS=128 +# +# STM32 USB OTG FS Host Configuration +# +CONFIG_USBHOST=n +#CONFIG_STM32_OTGFS_RXFIFO_SIZE +#CONFIG_STM32_OTGFS_NPTXFIFO_SIZE +#CONFIG_STM32_OTGFS_PTXFIFO_SIZE +#CONFIG_STM32_OTGFS_DESCSIZE +CONFIG_STM32_OTGFS_SOFINTR=n +CONFIG_STM32_USBHOST_REGDEBUG=n +CONFIG_STM32_USBHOST_PKTDUMP=n + # # USB Serial Device Configuration # diff --git a/nuttx/configs/stm3240g-eval/README.txt b/nuttx/configs/stm3240g-eval/README.txt index 75ca1ea77f..df98f087d5 100644 --- a/nuttx/configs/stm3240g-eval/README.txt +++ b/nuttx/configs/stm3240g-eval/README.txt @@ -1226,21 +1226,22 @@ Where is one of the following: This is a special configuration setup for the NxWM window manager UnitTest. The NxWM window manager can be found here: - trunk/NxWidgets/nxwm + nuttx-code/NxWidgets/nxwm The NxWM unit test can be found at: - trunk/NxWidgets/UnitTests/nxwm + nuttx-code/NxWidgets/UnitTests/nxwm Documentation for installing the NxWM unit test can be found here: - trunk/NxWidgets/UnitTests/README.txt + nuttx-code/NxWidgets/UnitTests/README.txt - Here is the quick summary of the build steps: + Here is the quick summary of the build steps (Assuming that all of + the required packages are available in a directory ~/nuttx-code): 1. Intall the nxwm configuration - $ cd ~/nuttx/trunk/nuttx/tools + $ cd ~/nuttx-code/nuttx/tools $ ./configure.sh stm3240g-eval/nxwm 2. Make the build context (only) @@ -1252,27 +1253,27 @@ Where is one of the following: 3. Install the nxwm unit test - $ cd ~/nuttx/trunk/NxWidgets - $ tools/install.sh ~/nuttx/trunk/apps nxwm + $ cd ~/nuttx-code/NxWidgets + $ tools/install.sh ~/nuttx-code/apps nxwm Creating symbolic link - - To ~/nuttx/trunk/NxWidgets/UnitTests/nxwm - - At ~/nuttx/trunk/apps/external + - To ~/nuttx-code/NxWidgets/UnitTests/nxwm + - At ~/nuttx-code/apps/external 4. Build the NxWidgets library - $ cd ~/nuttx/trunk/NxWidgets/libnxwidgets - $ make TOPDIR=~/nuttx/trunk/nuttx + $ cd ~/nuttx-code/NxWidgets/libnxwidgets + $ make TOPDIR=~/nuttx-code/nuttx ... 5. Build the NxWM library - $ cd ~/nuttx/trunk/NxWidgets/nxwm - $ make TOPDIR=~//nuttx/trunk/nuttx + $ cd ~/nuttx-code/NxWidgets/nxwm + $ make TOPDIR=~/nuttx-code/nuttx ... 6. Built NuttX with the installed unit test as the application - $ cd ~/nuttx/trunk/nuttx + $ cd ~/nuttx-code/nuttx $ make ostest: diff --git a/nuttx/net/uip/uip_icmpping.c b/nuttx/net/uip/uip_icmpping.c index 356187d099..e3ebf72520 100644 --- a/nuttx/net/uip/uip_icmpping.c +++ b/nuttx/net/uip/uip_icmpping.c @@ -148,122 +148,129 @@ static inline int ping_timeout(struct icmp_ping_s *pstate) ****************************************************************************/ static uint16_t ping_interrupt(struct uip_driver_s *dev, void *conn, - void *pvpriv, uint16_t flags) + void *pvpriv, uint16_t flags) { struct icmp_ping_s *pstate = (struct icmp_ping_s *)pvpriv; uint8_t *ptr; - int failcode = -ETIMEDOUT; int i; nllvdbg("flags: %04x\n", flags); if (pstate) { - /* Check if this device is on the same network as the destination device. */ + /* Check if this is a ICMP ECHO reply. If so, return the sequence + * number to the caller. NOTE: We may not even have sent the + * requested ECHO request; this could have been the delayed ECHO + * response from a previous ping. + */ - if (!uip_ipaddr_maskcmp(pstate->png_addr, dev->d_ipaddr, dev->d_netmask)) + if ((flags & UIP_ECHOREPLY) != 0 && conn != NULL) { - /* Destination address was not on the local network served by this - * device. If a timeout occurs, then the most likely reason is - * that the destination address is not reachable. - */ + struct uip_icmpip_hdr *icmp = (struct uip_icmpip_hdr *)conn; + nlldbg("ECHO reply: id=%d seqno=%d\n", + ntohs(icmp->id), ntohs(icmp->seqno)); - nllvdbg("Not reachable\n"); - failcode = -ENETUNREACH; - } - else - { - /* Check if this is a ICMP ECHO reply. If so, return the sequence - * number to the caller. NOTE: We may not even have sent the - * requested ECHO request; this could have been the delayed ECHO - * response from a previous ping. - */ - - if ((flags & UIP_ECHOREPLY) != 0 && conn != NULL) + if (ntohs(icmp->id) == pstate->png_id) { - struct uip_icmpip_hdr *icmp = (struct uip_icmpip_hdr *)conn; - nlldbg("ECHO reply: id=%d seqno=%d\n", ntohs(icmp->id), ntohs(icmp->seqno)); + /* Consume the ECHOREPLY */ - if (ntohs(icmp->id) == pstate->png_id) - { - /* Consume the ECHOREPLY */ + flags &= ~UIP_ECHOREPLY; + dev->d_len = 0; - flags &= ~UIP_ECHOREPLY; - dev->d_len = 0; + /* Return the result to the caller */ - /* Return the result to the caller */ - - pstate->png_result = OK; - pstate->png_seqno = ntohs(icmp->seqno); - goto end_wait; - } + pstate->png_result = OK; + pstate->png_seqno = ntohs(icmp->seqno); + goto end_wait; } + } - /* Check: - * If the outgoing packet is available (it may have been claimed - * by a sendto interrupt serving a different thread - * -OR- - * If the output buffer currently contains unprocessed incoming - * data. - * -OR- - * If we have alread sent the ECHO request + /* Check: + * If the outgoing packet is available (it may have been claimed + * by a sendto interrupt serving a different thread) + * -OR- + * If the output buffer currently contains unprocessed incoming + * data. + * -OR- + * If we have alread sent the ECHO request + * + * In the first two cases, we will just have to wait for the next + * polling cycle. + */ + + if (dev->d_sndlen <= 0 && /* Packet available */ + (flags & UIP_NEWDATA) == 0 && /* No incoming data */ + !pstate->png_sent) /* Request not sent */ + { + struct uip_icmpip_hdr *picmp = ICMPBUF; + + /* We can send the ECHO request now. * - * In the first two cases, we will just have to wait for the next - * polling cycle. + * Format the ICMP ECHO request packet */ - if (dev->d_sndlen <= 0 && /* Packet available */ - (flags & UIP_NEWDATA) == 0 && /* No incoming data */ - !pstate->png_sent) /* Request not sent */ - { - struct uip_icmpip_hdr *picmp = ICMPBUF; - - /* We can send the ECHO request now. - * - * Format the ICMP ECHO request packet - */ - - picmp->type = ICMP_ECHO_REQUEST; - picmp->icode = 0; + picmp->type = ICMP_ECHO_REQUEST; + picmp->icode = 0; #ifndef CONFIG_NET_IPv6 - picmp->id = htons(pstate->png_id); - picmp->seqno = htons(pstate->png_seqno); + picmp->id = htons(pstate->png_id); + picmp->seqno = htons(pstate->png_seqno); #else # error "IPv6 ECHO Request not implemented" #endif - /* Add some easily verifiable data */ + /* Add some easily verifiable data */ - for (i = 0, ptr = ICMPDAT; i < pstate->png_datlen; i++) - { - *ptr++ = i; - } - - /* Send the ICMP echo request. Note that d_sndlen is set to - * the size of the ICMP payload and does not include the size - * of the ICMP header. - */ - - nlldbg("Send ECHO request: seqno=%d\n", pstate->png_seqno); - - dev->d_sndlen = pstate->png_datlen + 4; - uip_icmpsend(dev, &pstate->png_addr); - pstate->png_sent = true; - return flags; + for (i = 0, ptr = ICMPDAT; i < pstate->png_datlen; i++) + { + *ptr++ = i; } + + /* Send the ICMP echo request. Note that d_sndlen is set to + * the size of the ICMP payload and does not include the size + * of the ICMP header. + */ + + nlldbg("Send ECHO request: seqno=%d\n", pstate->png_seqno); + + dev->d_sndlen = pstate->png_datlen + 4; + uip_icmpsend(dev, &pstate->png_addr); + pstate->png_sent = true; + return flags; } /* Check if the selected timeout has elapsed */ if (ping_timeout(pstate)) { - /* Yes.. report the timeout */ + int failcode; + + /* Check if this device is on the same network as the destination + * device. + */ + + if (!uip_ipaddr_maskcmp(pstate->png_addr, dev->d_ipaddr, dev->d_netmask)) + { + /* Destination address was not on the local network served by this + * device. If a timeout occurs, then the most likely reason is + * that the destination address is not reachable. + */ + + nlldbg("Not reachable\n"); + failcode = -ENETUNREACH; + } + else + { + nlldbg("Ping timeout\n"); + failcode = -ETIMEDOUT; + } + + /* Report the failure */ - nlldbg("Ping timeout\n"); pstate->png_result = failcode; goto end_wait; } /* Continue waiting */ } + return flags; end_wait: