diff --git a/ChangeLog b/ChangeLog index 255bfce5a3..3c3207b6f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -239,4 +239,4 @@ * Moved urgent data info into device structure. * TCP and ICMP protocols can now be disabled. * Added UDP test in examples/udp - + * Verified/debugged UDP send logic using examples/udp diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index 7acf1be62c..1b74db8090 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -710,6 +710,7 @@ Other memory: * Moved urgent data info into device structure. * TCP and ICMP protocols can now be disabled. * Added UDP test in examples/udp + * Verified/debugged UDP send logic using examples/udp diff --git a/configs/ntosd-dm320/README.txt b/configs/ntosd-dm320/README.txt index 7b98eacba2..5269fe448e 100644 --- a/configs/ntosd-dm320/README.txt +++ b/configs/ntosd-dm320/README.txt @@ -14,11 +14,11 @@ configuration as follows: netconfig ^^^^^^^^^ -The alternative configuration file, netconfig, may be used +This alternative configuration file, netconfig, may be used instead of the default configuration (defconfig). This configuration enables networking using the OSDs DM9000A Ethernet interface. It uses examples/nettest to excercise -the network. +the TCP/IP network. uipconfig ^^^^^^^^^ @@ -30,3 +30,8 @@ These alternative configurations can be selected by (Seleted the default configuration as show above) cp config/ntosd-dm320/uiponfig .config +udpconfig +^^^^^^^^^ +This alternative configuration file, is similar to netconfig +except that is use examples/upd to exercise UDP. + diff --git a/examples/README.txt b/examples/README.txt index 6ef65e924a..0ba7089256 100644 --- a/examples/README.txt +++ b/examples/README.txt @@ -61,3 +61,9 @@ examples/netttest This is a simple network test for verifying client- and server- functionality in a TCP/IP connection. +examples/udp +^^^^^^^^^^^^ + + This is a simple network test for verifying client- and server- + functionality over UDP. + diff --git a/examples/udp/Makefile b/examples/udp/Makefile index 6fec191470..3dcc572138 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -58,7 +58,7 @@ TARG_BIN = lib$(CONFIG_EXAMPLE)$(LIBEXT) HOSTCFLAGS += -DCONFIG_EXAMPLE_UDP_HOST=1 ifeq ($(CONFIG_EXAMPLE_UDP_SERVER),y) HOSTCFLAGS += -DCONFIG_EXAMPLE_UDP_SERVER=1 \ - -DCONFIG_EXAMPLE_UDP_CLIENTIP="$(CONFIG_EXAMPLE_UDP_CLIENTIP)" + -DCONFIG_EXAMPLE_UDP_SERVERIP="$(CONFIG_EXAMPLE_UDP_SERVERIP)" endif HOST_SRCS = host.c diff --git a/examples/udp/udp-client.c b/examples/udp/udp-client.c index 8ea9cffb6f..545a3a6c34 100644 --- a/examples/udp/udp-client.c +++ b/examples/udp/udp-client.c @@ -107,7 +107,7 @@ void send_client(void) message("client: %d. Sending %d bytes\n", offset, SENDSIZE); nbytes = sendto(sockfd, outbuf, SENDSIZE, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in)); - message("client: %d. Sent %d bytes\n", nbytes); + message("client: %d. Sent %d bytes\n", offset, nbytes); if (nbytes < 0) { diff --git a/net/sendto.c b/net/sendto.c index e6f267a694..ba9bac0afd 100644 --- a/net/sendto.c +++ b/net/sendto.c @@ -95,18 +95,19 @@ void sendto_interrupt(struct uip_driver_s *dev, struct uip_udp_conn *conn, uint8 struct sendto_s *pstate = (struct sendto_s *)conn->private; if (pstate) { - /* Check if the connectin was rejected */ + /* Check if the connection was rejected */ if ((flags & (UIP_CLOSE|UIP_ABORT|UIP_TIMEDOUT)) != 0) { + /* Yes.. then terminate with an error */ + pstate->st_sndlen = -ENOTCONN; } else { - /* Copy the user data into d_appdata and send it */ + /* No.. Copy the user data into d_snddata and send it */ - memcpy(dev->d_appdata, pstate->st_buffer, pstate->st_buflen); - uip_send(dev, dev->d_appdata, pstate->st_buflen); + uip_send(dev, pstate->st_buffer, pstate->st_buflen); pstate->st_sndlen = pstate->st_buflen; } @@ -264,7 +265,7 @@ ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, * are ready. */ - save = irqsave(); + save = irqsave(); memset(&state, 0, sizeof(struct sendto_s)); sem_init(&state.st_sem, 0, 0); state.st_buflen = len; @@ -282,7 +283,7 @@ ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, /* Set up the callback in the connection */ - udp_conn = (struct uip_udp_conn *)psock->s_conn; + udp_conn = (struct uip_udp_conn *)psock->s_conn; udp_conn->private = (void*)&state; udp_conn->event = sendto_interrupt; @@ -290,7 +291,7 @@ ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, uip_udpenable(psock->s_conn); - /* Notify the device driver of the availaibilty of TX data */ + /* Notify the device driver of the availabilty of TX data */ netdev_txnotify(&udp_conn->ripaddr); diff --git a/net/uip/uip-send.c b/net/uip/uip-send.c index 93096168a8..c9899db9e3 100644 --- a/net/uip/uip-send.c +++ b/net/uip/uip-send.c @@ -93,9 +93,13 @@ void uip_send(struct uip_driver_s *dev, const void *buf, int len) { + /* Some sanity checks -- note that the actually available length in the + * buffer is considerably less than CONFIG_NET_BUFSIZE. + */ + if (dev && len > 0 && len < CONFIG_NET_BUFSIZE) { + memcpy(dev->d_snddata, buf, len); dev->d_sndlen = len; - memcpy(dev->d_snddata, buf, len ); - } + } } diff --git a/net/uip/uip-udpsend.c b/net/uip/uip-udpsend.c index 8f77f78a26..8936c64bdd 100644 --- a/net/uip/uip-udpsend.c +++ b/net/uip/uip-udpsend.c @@ -95,7 +95,7 @@ void uip_udpsend(struct uip_driver_s *dev, struct uip_udp_conn *conn) { - if (dev->d_sndlen == 0) + if (dev->d_sndlen > 0) { /* The total lenth to send is the size of the application data plus * the IP and UDP headers (and, eventually, the ethernet header) @@ -131,8 +131,8 @@ void uip_udpsend(struct uip_driver_s *dev, struct uip_udp_conn *conn) UDPBUF->ipid[1] = g_ipid & 0xff; UDPBUF->ipoffset[0] = 0; UDPBUF->ipoffset[1] = 0; - UDPBUF->ttl = conn->ttl; - UDPBUF->proto = UIP_PROTO_UDP; + UDPBUF->ttl = conn->ttl; + UDPBUF->proto = UIP_PROTO_UDP; /* Calculate IP checksum. */ @@ -146,20 +146,21 @@ void uip_udpsend(struct uip_driver_s *dev, struct uip_udp_conn *conn) /* Initialize the UDP header */ - UDPBUF->srcport = conn->lport; - UDPBUF->destport = conn->rport; - UDPBUF->udplen = HTONS(dev->d_sndlen + UIP_UDPH_LEN); + UDPBUF->srcport = conn->lport; + UDPBUF->destport = conn->rport; + UDPBUF->udplen = HTONS(dev->d_sndlen + UIP_UDPH_LEN); #ifdef CONFIG_NET_UDP_CHECKSUMS /* Calculate UDP checksum. */ - UDPBUF->udpchksum = ~(uip_udpchksum(dev)); + UDPBUF->udpchksum = 0; + UDPBUF->udpchksum = ~(uip_udpchksum(dev)); if (UDPBUF->udpchksum == 0) { UDPBUF->udpchksum = 0xffff; } #else - UDPBUF->udpchksum = 0; + UDPBUF->udpchksum = 0; #endif vdbg("Outgoing UDP packet length: %d (%d)\n",