summaryrefslogtreecommitdiff
path: root/nuttx/net/uip/uip-icmpping.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-09-03 16:14:00 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-09-03 16:14:00 +0000
commit18c2739aa6486a0d6dd7f19a8ee36058f1d62674 (patch)
treec586a314141914ba8b9b672a729da373923ee4f0 /nuttx/net/uip/uip-icmpping.c
parent32082a46190ea27f7e958fce73167b3a368d7666 (diff)
downloadpx4-nuttx-18c2739aa6486a0d6dd7f19a8ee36058f1d62674.tar.gz
px4-nuttx-18c2739aa6486a0d6dd7f19a8ee36058f1d62674.tar.bz2
px4-nuttx-18c2739aa6486a0d6dd7f19a8ee36058f1d62674.zip
ping() integrated
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@872 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/net/uip/uip-icmpping.c')
-rw-r--r--nuttx/net/uip/uip-icmpping.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/nuttx/net/uip/uip-icmpping.c b/nuttx/net/uip/uip-icmpping.c
index 5bc9b68b0..3029e2fc2 100644
--- a/nuttx/net/uip/uip-icmpping.c
+++ b/nuttx/net/uip/uip-icmpping.c
@@ -58,7 +58,7 @@
****************************************************************************/
#define ICMPBUF ((struct uip_icmpip_hdr *)&dev->d_buf[UIP_LLH_LEN])
-#define ICMPDAT &dev->d_buf[UIP_LLH_LEN + sizeof(struct uip_icmpip_hdr)]
+#define ICMPDAT (&dev->d_buf[UIP_LLH_LEN + sizeof(struct uip_icmpip_hdr)])
/* Allocate a new ICMP data callback */
@@ -149,6 +149,7 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
{
struct icmp_ping_s *pstate = (struct icmp_ping_s *)pvprivate;
int failcode = -ETIMEDOUT;
+ int i;
nvdbg("flags: %04x\n", flags);
if (pstate)
@@ -162,6 +163,7 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
* that the destination address is not reachable.
*/
+ nvdbg("Not reachable\n");
failcode = -ENETUNREACH;
}
else
@@ -175,8 +177,17 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
if ((flags & UIP_ECHOREPLY) != 0 && conn != NULL)
{
struct uip_icmpip_hdr *icmp = (struct uip_icmpip_hdr *)conn;
+ ndbg("ECHO reply: id=%d seqno=%d\n", ntohs(icmp->id), ntohs(icmp->seqno));
+
if (ntohs(icmp->id) == pstate->png_id)
{
+ /* Consume the ECHOREPLY */
+
+ flags &= ~UIP_ECHOREPLY;
+ dev->d_len = 0;
+
+ /* Return the result to the caller */
+
pstate->png_result = OK;
pstate->png_seqno = ntohs(icmp->seqno);
goto end_wait;
@@ -213,13 +224,19 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
#else
# error "IPv6 ECHO Request not implemented"
#endif
- memset(ICMPDAT, 0, pstate->png_datlen);
+ /* Add some easily verifiable data */
+
+ for (i = 0; i < pstate->png_datlen; i++)
+ {
+ ICMPDAT[i] = 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.
*/
+ ndbg("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;
@@ -233,7 +250,7 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
{
/* Yes.. report the timeout */
- nvdbg("Ping timeout\n");
+ ndbg("Ping timeout\n");
pstate->png_result = failcode;
goto end_wait;
}
@@ -243,6 +260,8 @@ static uint16 ping_interrupt(struct uip_driver_s *dev, void *conn,
return flags;
end_wait:
+ nvdbg("Resuming\n");
+
/* Do not allow any further callbacks */
pstate->png_cb->flags = 0;
@@ -313,6 +332,11 @@ int uip_ping(uip_ipaddr_t addr, uint16 id, uint16 seqno, uint16 datalen, int dse
state.png_cb->flags = UIP_POLL|UIP_ECHOREPLY;
state.png_cb->private = (void*)&state;
state.png_cb->event = ping_interrupt;
+ state.png_result = -EINTR; /* Assume sem-wait interrupted by signal */
+
+ /* Notify the device driver of the availaibilty of TX data */
+
+ netdev_txnotify(&state.png_addr);
/* Wait for either the full round trip transfer to complete or
* for timeout to occur. (1) sem_wait will also terminate if a
@@ -321,7 +345,7 @@ int uip_ping(uip_ipaddr_t addr, uint16 id, uint16 seqno, uint16 datalen, int dse
* re-enabled when the task restarts.
*/
- state.png_result = -EINTR; /* Assume sem-waited interrupt by signal */
+ ndbg("Start time: 0x%08x seqno: %d\n", state.png_time, seqno);
sem_wait(&state.png_sem);
uip_icmpcallbackfree(state.png_cb);
@@ -334,10 +358,12 @@ int uip_ping(uip_ipaddr_t addr, uint16 id, uint16 seqno, uint16 datalen, int dse
if (!state.png_result)
{
+ ndbg("Return seqno=%d\n", state.png_seqno);
return (int)state.png_seqno;
}
else
{
+ ndbg("Return error=%d\n", -state.png_result);
return state.png_result;
}
}