summaryrefslogtreecommitdiff
path: root/apps/netutils/uiplib
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-03-19 21:04:13 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-03-19 21:04:13 +0000
commit7cc856ea2f1808e98387ea66537ecbc6c3de2f88 (patch)
tree673b6eef191373f0607e5b9a9f79ad390e9bb970 /apps/netutils/uiplib
parent7267882ebd0a6aa79cf88b7f42675804eaff1bcf (diff)
downloadnuttx-7cc856ea2f1808e98387ea66537ecbc6c3de2f88.tar.gz
nuttx-7cc856ea2f1808e98387ea66537ecbc6c3de2f88.tar.bz2
nuttx-7cc856ea2f1808e98387ea66537ecbc6c3de2f88.zip
Move nuttx/netutils to apps/netutils
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3401 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/netutils/uiplib')
-rw-r--r--apps/netutils/uiplib/Makefile103
-rw-r--r--apps/netutils/uiplib/uip_gethostaddr.c106
-rw-r--r--apps/netutils/uiplib/uip_getmacaddr.c104
-rwxr-xr-xapps/netutils/uiplib/uip_ipmsfilter.c116
-rw-r--r--apps/netutils/uiplib/uip_parsehttpurl.c149
-rw-r--r--apps/netutils/uiplib/uip_server.c184
-rw-r--r--apps/netutils/uiplib/uip_setdraddr.c117
-rw-r--r--apps/netutils/uiplib/uip_sethostaddr.c117
-rw-r--r--apps/netutils/uiplib/uip_setmacaddr.c114
-rw-r--r--apps/netutils/uiplib/uip_setnetmask.c116
-rw-r--r--apps/netutils/uiplib/uiplib.c95
11 files changed, 1321 insertions, 0 deletions
diff --git a/apps/netutils/uiplib/Makefile b/apps/netutils/uiplib/Makefile
new file mode 100644
index 000000000..ef6c65156
--- /dev/null
+++ b/apps/netutils/uiplib/Makefile
@@ -0,0 +1,103 @@
+############################################################################
+# apps/netutils/uiplib/Makefile
+#
+# Copyright (C) 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+
+-include $(TOPDIR)/.config
+-include $(TOPDIR)/Make.defs
+include $(APPDIR)/Make.defs
+
+# UIP Library
+
+ASRCS =
+CSRCS = uiplib.c uip_sethostaddr.c uip_gethostaddr.c uip_setdraddr.c \
+ uip_setnetmask.c uip_parsehttpurl.c uip_server.c
+
+# No MAC address support for SLIP (Ethernet only)
+
+ifneq ($(CONFIG_NET_SLIP),y)
+CSRCS += uip_setmacaddr.c uip_getmacaddr.c
+endif
+
+# IGMP support
+
+ifeq ($(CONFIG_NET_IGMP),y)
+CSRCS += uip_ipmsfilter.c
+endif
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) \
+ $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/netutils/uiplib/uip_gethostaddr.c b/apps/netutils/uiplib/uip_gethostaddr.c
new file mode 100644
index 000000000..0de639d6c
--- /dev/null
+++ b/apps/netutils/uiplib/uip_gethostaddr.c
@@ -0,0 +1,106 @@
+/****************************************************************************
+ * netutils/uiplib/uip_gethostaddr.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_gethostaddr
+ *
+ * Description:
+ * Get the network driver IP address
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * ipaddr The location to return the IP address
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+int uip_gethostaddr(const char *ifname, struct in6_addr *addr)
+#else
+int uip_gethostaddr(const char *ifname, struct in_addr *addr)
+#endif
+{
+ int ret = ERROR;
+ if (ifname && addr)
+ {
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+ ret = ioctl(sockfd, SIOCGIFADDR, (unsigned long)&req);
+ if (!ret)
+ {
+#ifdef CONFIG_NET_IPv6
+#error "req.ifr_addr.s_addr not big enough for IPv6 address"
+ memcpy(addr, &req.ifr_addr, sizeof(struct in6_addr));
+#else
+ memcpy(addr, &req.ifr_addr, sizeof(struct in_addr));
+#endif
+ }
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uip_getmacaddr.c b/apps/netutils/uiplib/uip_getmacaddr.c
new file mode 100644
index 000000000..c99bc7a7d
--- /dev/null
+++ b/apps/netutils/uiplib/uip_getmacaddr.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * netutils/uiplib/uip_getmacaddr.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_getmacaddr
+ *
+ * Description:
+ * Get the network driver IP address
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * macaddr The location to return the MAC address
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+int uip_getmacaddr(const char *ifname, uint8_t *macaddr)
+{
+ int ret = ERROR;
+ if (ifname && macaddr)
+ {
+ /* Get a socket (only so that we get access to the INET subsystem) */
+
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+ memset (&req, 0, sizeof(struct ifreq));
+
+ /* Put the driver name into the request */
+
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Perform the ioctl to get the MAC address */
+
+ ret = ioctl(sockfd, SIOCGIFHWADDR, (unsigned long)&req);
+ if (!ret)
+ {
+ /* Return the MAC address */
+
+ memcpy(macaddr, &req.ifr_hwaddr.sa_data, IFHWADDRLEN);
+ }
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uip_ipmsfilter.c b/apps/netutils/uiplib/uip_ipmsfilter.c
new file mode 100755
index 000000000..ccae4a680
--- /dev/null
+++ b/apps/netutils/uiplib/uip_ipmsfilter.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * netutils/uiplib/uip_setmultiaddr.c
+ *
+ * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <netinet/in.h>
+#include <sys/sockio.h>
+
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/ipmsfilter.h>
+
+#ifdef CONFIG_NET_IGMP
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ipmsfilter
+ *
+ * Description:
+ * Add or remove an IP address from a multicast filter set.
+ *
+ * Parameters:
+ * ifname The name of the interface to use, size must less than IMSFNAMSIZ
+ * multiaddr Multicast group address to add/remove (network byte order)
+ * fmode MCAST_INCLUDE: Add multicast address
+ * MCAST_EXCLUDE: Remove multicast address
+ *
+ * Return:
+ * 0 on sucess; Negated errno on failure
+ *
+ ****************************************************************************/
+
+int ipmsfilter(FAR const char *ifname, FAR const struct in_addr *multiaddr,
+ uint32_t fmode)
+{
+ int ret = ERROR;
+
+ nvdbg("ifname: %s muliaddr: %08x fmode: %ld\n", ifname, *multiaddr, fmode);
+ if (ifname && multiaddr)
+ {
+ /* Get a socket (only so that we get access to the INET subsystem) */
+
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ip_msfilter imsf;
+
+ /* Put the driver name into the request */
+
+ strncpy(imsf.imsf_name, ifname, IMSFNAMSIZ);
+
+ /* Put the new address into the request */
+
+ imsf.imsf_multiaddr.s_addr = multiaddr->s_addr;
+
+ /* Perforom the ioctl to set the MAC address */
+
+ imsf.imsf_fmode = fmode;
+ ret = ioctl(sockfd, SIOCSIPMSFILTER, (unsigned long)&imsf);
+ close(sockfd);
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET_IGM */
diff --git a/apps/netutils/uiplib/uip_parsehttpurl.c b/apps/netutils/uiplib/uip_parsehttpurl.c
new file mode 100644
index 000000000..bda5502b7
--- /dev/null
+++ b/apps/netutils/uiplib/uip_parsehttpurl.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * netutils/uiplib/uip_parsehttpurl.c
+ *
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ *****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Private Data
+ *****************************************************************************/
+
+const char g_http[] = "http://";
+#define HTTPLEN 7
+
+/****************************************************************************
+ * Public Functions
+ *****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_parsehttpurl
+ ****************************************************************************/
+
+int uip_parsehttpurl(const char *url, uint16_t *port,
+ char *hostname, int hostlen,
+ char *filename, int namelen)
+{
+ const char *src = url;
+ char *dest;
+ int bytesleft;
+ int ret = OK;
+
+ /* A valid HTTP URL must begin with http:// if it does not, we will assume
+ * that it is a file name only, but still return an error. wget() depends
+ * on this strange behavior.
+ */
+
+ if (strncmp(src, g_http, HTTPLEN) != 0)
+ {
+ ret = -EINVAL;
+ }
+ else
+ {
+ /* Skip over the http:// */
+
+ src += HTTPLEN;
+
+ /* Concatenate the hostname following http:// and up to the termnator */
+
+ dest = hostname;
+ bytesleft = hostlen;
+ while (*src != '\0' && *src != '/' && *src != ' ' && *src != ':')
+ {
+ /* Make sure that there is space for another character in the hostname.
+ * (reserving space for the null terminator)
+ */
+
+ if (bytesleft > 1)
+ {
+ *dest++ = *src++;
+ bytesleft--;
+ }
+ else
+ {
+ ret = -E2BIG;
+ }
+ }
+ *dest = '\0';
+
+ /* Check if the hostname is following by a port number */
+
+ if (*src == ':')
+ {
+ uint16_t accum = 0;
+ src++; /* Skip over the colon */
+
+ while (*src >= '0' && *src <= '9')
+ {
+ accum = 10*accum + *src - '0';
+ src++;
+ }
+ *port = accum;
+ }
+ }
+
+ /* The rest of the line is the file name */
+
+ if (*src == '\0' || *src == ' ')
+ {
+ ret = -ENOENT;
+ }
+
+ /* Make sure the file name starts with exactly one '/' */
+
+ dest = filename;
+ bytesleft = namelen;
+ while (*src == '/')
+ {
+ src++;
+ }
+ *dest++ = '/';
+ bytesleft--;
+
+ /* The copy the rest of the file name to the user buffer */
+
+ strncpy(dest, src, namelen);
+ filename[namelen-1] = '\0';
+ return ret;
+}
+
diff --git a/apps/netutils/uiplib/uip_server.c b/apps/netutils/uiplib/uip_server.c
new file mode 100644
index 000000000..f58f063de
--- /dev/null
+++ b/apps/netutils/uiplib/uip_server.c
@@ -0,0 +1,184 @@
+/****************************************************************************
+ * netutils/uiplib/uip_server.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name Gregory Nutt nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <errno.h>
+#include <debug.h>
+#include <netinet/in.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_server
+ *
+ * Description:
+ * Implement basic server logic
+ *
+ * Parameters:
+ * portno The port to listen on (in network byte order)
+ * handler The entrypoint of the task to spawn when a new connection is
+ * accepted.
+ * stacksize The stack size needed by the spawned task
+ *
+ * Return:
+ * Does not return unless an error occurs.
+ *
+ ****************************************************************************/
+
+void uip_server(uint16_t portno, pthread_startroutine_t handler, int stacksize)
+{
+ struct sockaddr_in myaddr;
+#ifdef CONFIG_NET_HAVE_SOLINGER
+ struct linger ling;
+#endif
+ pthread_t child;
+ pthread_attr_t attr;
+ socklen_t addrlen;
+ int listensd;
+ int acceptsd;
+#ifdef CONFIG_NET_HAVE_REUSEADDR
+ int optval;
+#endif
+
+ /* Create a new TCP socket to use to listen for connections */
+
+ listensd = socket(PF_INET, SOCK_STREAM, 0);
+ if (listensd < 0)
+ {
+ ndbg("socket failure: %d\n", errno);
+ return;
+ }
+
+ /* Set socket to reuse address */
+
+#ifdef CONFIG_NET_HAVE_REUSEADDR
+ optval = 1;
+ if (setsockopt(listensd, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, sizeof(int)) < 0)
+ {
+ ndbg("setsockopt SO_REUSEADDR failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+#endif
+
+ /* Bind the socket to a local address */
+
+ myaddr.sin_family = AF_INET;
+ myaddr.sin_port = portno;
+ myaddr.sin_addr.s_addr = INADDR_ANY;
+
+ if (bind(listensd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) < 0)
+ {
+ ndbg("bind failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+
+ /* Listen for connections on the bound TCP socket */
+
+ if (listen(listensd, 5) < 0)
+ {
+ ndbg("listen failure %d\n", errno);
+ goto errout_with_socket;
+ }
+
+ /* Begin accepting connections */
+
+ nvdbg("Accepting connections on port %d\n", ntohs(portno));
+ for (;;)
+ {
+ addrlen = sizeof(struct sockaddr_in);
+ acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen);
+ if (acceptsd < 0)
+ {
+ ndbg("accept failure: %d\n", errno);
+ break;;
+ }
+ nvdbg("Connection accepted -- spawning sd=%d\n", acceptsd);
+
+ /* Configure to "linger" until all data is sent when the socket is closed */
+
+#ifdef CONFIG_NET_HAVE_SOLINGER
+ ling.l_onoff = 1;
+ ling.l_linger = 30; /* timeout is seconds */
+ if (setsockopt(acceptsd, SOL_SOCKET, SO_LINGER, &ling, sizeof(struct linger)) < 0)
+ {
+ close(acceptsd);
+ ndbg("setsockopt SO_LINGER failure: %d\n", errno);
+ break;;
+ }
+#endif
+
+ /* Create a thread to handle the connection. The socket descriptor is
+ * provided in as the single argument to the new thread.
+ */
+
+ (void)pthread_attr_init(&attr);
+ (void)pthread_attr_setstacksize(&attr, stacksize);
+
+ if (pthread_create(&child, &attr, handler, (void*)acceptsd) != 0)
+ {
+ close(acceptsd);
+ ndbg("create_create failed\n");
+ break;
+ }
+
+ /* We don't care when/how the child thread exits so detach from it now
+ * in order to avoid memory leaks.
+ */
+
+ (void)pthread_detach(child);
+ }
+
+errout_with_socket:
+ close(listensd);
+}
diff --git a/apps/netutils/uiplib/uip_setdraddr.c b/apps/netutils/uiplib/uip_setdraddr.c
new file mode 100644
index 000000000..79eac5b97
--- /dev/null
+++ b/apps/netutils/uiplib/uip_setdraddr.c
@@ -0,0 +1,117 @@
+/****************************************************************************
+ * netutils/uiplib/uip_setdraddr.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_setdraddr
+ *
+ * Description:
+ * Set the default router IP address
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * ipaddr The address to set
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+int uip_setdraddr(const char *ifname, const struct in6_addr *addr)
+#else
+int uip_setdraddr(const char *ifname, const struct in_addr *addr)
+#endif
+{
+ int ret = ERROR;
+ if (ifname && addr)
+ {
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+#ifdef CONFIG_NET_IPv6
+ struct sockaddr_in6 *inaddr;
+#else
+ struct sockaddr_in *inaddr;
+#endif
+ /* Add the device name to the request */
+
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Add the INET address to the request */
+
+#ifdef CONFIG_NET_IPv6
+#error "req.ifr_addr.s_addr not big enough for IPv6 address"
+ inaddr = (struct sockaddr_in6 *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET6;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin6_addr, addr, sizeof(struct in6_addr));
+#else
+ inaddr = (struct sockaddr_in *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin_addr, addr, sizeof(struct in_addr));
+#endif
+ ret = ioctl(sockfd, SIOCSIFDSTADDR, (unsigned long)&req);
+ close(sockfd);
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uip_sethostaddr.c b/apps/netutils/uiplib/uip_sethostaddr.c
new file mode 100644
index 000000000..ccc7526b9
--- /dev/null
+++ b/apps/netutils/uiplib/uip_sethostaddr.c
@@ -0,0 +1,117 @@
+/****************************************************************************
+ * netutils/uiplib/uip_sethostaddr.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_sethostaddr
+ *
+ * Description:
+ * Set the network driver IP address
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * ipaddr The address to set
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+int uip_sethostaddr(const char *ifname, const struct in6_addr *addr)
+#else
+int uip_sethostaddr(const char *ifname, const struct in_addr *addr)
+#endif
+{
+ int ret = ERROR;
+ if (ifname && addr)
+ {
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+#ifdef CONFIG_NET_IPv6
+ struct sockaddr_in6 *inaddr;
+#else
+ struct sockaddr_in *inaddr;
+#endif
+ /* Add the device name to the request */
+
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Add the INET address to the request */
+
+#ifdef CONFIG_NET_IPv6
+#error "req.ifr_addr.s_addr not big enough for IPv6 address"
+ inaddr = (struct sockaddr_in6 *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET6;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin6_addr, addr, sizeof(struct in6_addr));
+#else
+ inaddr = (struct sockaddr_in *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin_addr, addr, sizeof(struct in_addr));
+#endif
+ ret = ioctl(sockfd, SIOCSIFADDR, (unsigned long)&req);
+ close(sockfd);
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uip_setmacaddr.c b/apps/netutils/uiplib/uip_setmacaddr.c
new file mode 100644
index 000000000..28188b7f8
--- /dev/null
+++ b/apps/netutils/uiplib/uip_setmacaddr.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * netutils/uiplib/uip_setmacaddr.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+# define AF_INETX AF_INET6
+#else
+# define AF_INETX AF_INET
+#endif
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_setmacaddr
+ *
+ * Description:
+ * Set the network driver MAC address
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * macaddr MAC address to set, size must be IFHWADDRLEN
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+int uip_setmacaddr(const char *ifname, const uint8_t *macaddr)
+{
+ int ret = ERROR;
+ if (ifname && macaddr)
+ {
+ /* Get a socket (only so that we get access to the INET subsystem) */
+
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+
+ /* Put the driver name into the request */
+
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Put the new MAC address into the request */
+
+ req.ifr_hwaddr.sa_family = AF_INETX;
+ memcpy(&req.ifr_hwaddr.sa_data, macaddr, IFHWADDRLEN);
+
+ /* Perforom the ioctl to set the MAC address */
+
+ ret = ioctl(sockfd, SIOCSIFHWADDR, (unsigned long)&req);
+ close(sockfd);
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uip_setnetmask.c b/apps/netutils/uiplib/uip_setnetmask.c
new file mode 100644
index 000000000..2cdc38474
--- /dev/null
+++ b/apps/netutils/uiplib/uip_setnetmask.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * netutils/uiplib/uip_setnetmask.c
+ *
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: uip_setnetmask
+ *
+ * Description:
+ * Set the netmask
+ *
+ * Parameters:
+ * ifname The name of the interface to use
+ * ipaddr The address to set
+ *
+ * Return:
+ * 0 on sucess; -1 on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_IPv6
+int uip_setnetmask(const char *ifname, const struct in6_addr *addr)
+#else
+int uip_setnetmask(const char *ifname, const struct in_addr *addr)
+#endif
+{
+ int ret = ERROR;
+ if (ifname && addr)
+ {
+ int sockfd = socket(PF_INET, UIPLIB_SOCK_IOCTL, 0);
+ if (sockfd >= 0)
+ {
+ struct ifreq req;
+#ifdef CONFIG_NET_IPv6
+ struct sockaddr_in6 *inaddr;
+#else
+ struct sockaddr_in *inaddr;
+#endif
+ /* Add the device name to the request */
+
+ strncpy(req.ifr_name, ifname, IFNAMSIZ);
+
+ /* Add the INET address to the request */
+
+#ifdef CONFIG_NET_IPv6
+#error "req.ifr_addr.s_addr not big enough for IPv6 address"
+ inaddr = (struct sockaddr_in6 *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET6;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin6_addr, addr, sizeof(struct in6_addr));
+#else
+ inaddr = (struct sockaddr_in *)&req.ifr_addr;
+ inaddr->sin_family = AF_INET;
+ inaddr->sin_port = 0;
+ memcpy(&inaddr->sin_addr, addr, sizeof(struct in_addr));
+#endif
+ ret = ioctl(sockfd, SIOCSIFNETMASK, (unsigned long)&req);
+ close(sockfd);
+ }
+ }
+ return ret;
+}
+
+#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/apps/netutils/uiplib/uiplib.c b/apps/netutils/uiplib/uiplib.c
new file mode 100644
index 000000000..99f716f5c
--- /dev/null
+++ b/apps/netutils/uiplib/uiplib.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * netutils/uiplib/uiplib.c
+ * Various uIP library functions.
+ *
+ * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Based on uIP which also has a BSD style license:
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ * Copyright (c) 2004, Adam Dunkels and the Swedish Institute of
+ * Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include <net/uip/uip.h>
+#include <apps/netutils/uiplib.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+bool uiplib_ipaddrconv(const char *addrstr, uint8_t *ipaddr)
+{
+ unsigned char tmp;
+ char c;
+ unsigned char i;
+ unsigned char j;
+
+ tmp = 0;
+
+ for (i = 0; i < 4; ++i)
+ {
+ j = 0;
+ do
+ {
+ c = *addrstr;
+ ++j;
+ if (j > 4)
+ {
+ return false;
+ }
+ if (c == '.' || c == 0)
+ {
+ *ipaddr = tmp;
+ ++ipaddr;
+ tmp = 0;
+ }
+ else if(c >= '0' && c <= '9')
+ {
+ tmp = (tmp * 10) + (c - '0');
+ }
+ else
+ {
+ return false;
+ }
+ ++addrstr;
+ }
+ while(c != '.' && c != 0);
+ }
+ return true;
+}