diff --git a/os/net/ipv6/uip-debug.c b/os/net/ipv6/uip-debug.c deleted file mode 100755 index f83f0ee5b..000000000 --- a/os/net/ipv6/uip-debug.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2010, 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. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. - * - */ - -/** - * \file - * A set of debugging tools for the IP stack - * \author - * Nicolas Tsiftes - * Niclas Finne - * Joakim Eriksson - */ - -#include "net/ipv6/uip-debug.h" -#include "net/ipv6/ip64-addr.h" - -/*---------------------------------------------------------------------------*/ -void -uip_debug_ipaddr_print(const uip_ipaddr_t *addr) -{ - uint16_t a; - unsigned int i; - int f; - - if(addr == NULL) { - PRINTA("(NULL IP addr)"); - return; - } - - if(ip64_addr_is_ipv4_mapped_addr(addr)) { - /* - * Printing IPv4-mapped addresses is done according to RFC 4291 [1] - * - * "An alternative form that is sometimes more - * convenient when dealing with a mixed environment - * of IPv4 and IPv6 nodes is x:x:x:x:x:x:d.d.d.d, - * where the 'x's are the hexadecimal values of the - * six high-order 16-bit pieces of the address, and - * the 'd's are the decimal values of the four - * low-order 8-bit pieces of the address (standard - * IPv4 representation)." - * - * [1] https://tools.ietf.org/html/rfc4291#page-4 - */ - PRINTA("::FFFF:%u.%u.%u.%u", addr->u8[12], addr->u8[13], addr->u8[14], addr->u8[15]); - } else { - for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) { - a = (addr->u8[i] << 8) + addr->u8[i + 1]; - if(a == 0 && f >= 0) { - if(f++ == 0) { - PRINTA("::"); - } - } else { - if(f > 0) { - f = -1; - } else if(i > 0) { - PRINTA(":"); - } - PRINTA("%x", a); - } - } - } -} -/*---------------------------------------------------------------------------*/ diff --git a/os/net/ipv6/uip-debug.h b/os/net/ipv6/uip-debug.h index 267a36aca..6ebbf0aaa 100644 --- a/os/net/ipv6/uip-debug.h +++ b/os/net/ipv6/uip-debug.h @@ -43,13 +43,16 @@ #define UIP_DEBUG_H #include "net/net-debug.h" -#include "net/ipv6/uip.h" -#include +#include "net/ipv6/uiplib.h" -void uip_debug_ipaddr_print(const uip_ipaddr_t *addr); +static inline void +uip_debug_ipaddr_print(const uip_ipaddr_t *addr) +{ + uiplib_ipaddr_print(addr); +} #if (DEBUG) & DEBUG_PRINT -#define PRINT6ADDR(addr) uip_debug_ipaddr_print(addr) +#define PRINT6ADDR(addr) uiplib_ipaddr_print(addr) #else #define PRINT6ADDR(addr) #endif /* (DEBUG) & DEBUG_PRINT */ diff --git a/os/net/ipv6/uiplib.c b/os/net/ipv6/uiplib.c index 4cc9179eb..693626c87 100644 --- a/os/net/ipv6/uiplib.c +++ b/os/net/ipv6/uiplib.c @@ -32,15 +32,27 @@ * */ +/** + * \file + * Various uIP library functions. + * \author + * Nicolas Tsiftes + * Niclas Finne + * Joakim Eriksson + */ #include "net/ipv6/uip.h" #include "net/ipv6/uiplib.h" +#include "net/ipv6/ip64-addr.h" #include +#include -#define DEBUG DEBUG_NONE -#include "net/ipv6/uip-debug.h" +/* Log configuration */ +#include "sys/log.h" +#define LOG_MODULE "uiplib" +#define LOG_LEVEL LOG_LEVEL_NONE -/*-----------------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ #if NETSTACK_CONF_WITH_IPV6 int uiplib_ip6addrconv(const char *addrstr, uip_ip6addr_t *ipaddr) @@ -81,19 +93,19 @@ uiplib_ip6addrconv(const char *addrstr, uip_ip6addr_t *ipaddr) } else if(c >= 'A' && c <= 'F') { tmp = c - 'A' + 10; } else { - PRINTF("uiplib: illegal char: '%c'\n", c); + LOG_ERR("illegal char: '%c'\n", c); return 0; } value = (value << 4) + (tmp & 0xf); } } if(c != '\0' && c != ']' && c != '/') { - PRINTF("uiplib: too large address\n"); + LOG_ERR("too large address\n"); return 0; } if(len < sizeof(uip_ip6addr_t)) { if(zero < 0) { - PRINTF("uiplib: too short address\n"); + LOG_ERR("too short address\n"); return 0; } memmove(&ipaddr->u8[zero + sizeof(uip_ip6addr_t) - len], @@ -104,7 +116,7 @@ uiplib_ip6addrconv(const char *addrstr, uip_ip6addr_t *ipaddr) return 1; } #endif /* NETSTACK_CONF_WITH_IPV6 */ -/*-----------------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ /* Parse a IPv4-address from a string. Returns the number of characters read * for the address. */ int @@ -138,6 +150,109 @@ uiplib_ip4addrconv(const char *addrstr, uip_ip4addr_t *ipaddr) } while(c != '.' && c != 0 && c != ' '); } - return charsread-1; + return charsread - 1; } -/*-----------------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +void +uiplib_ipaddr_print(const uip_ipaddr_t *addr) +{ + uint16_t a; + unsigned int i; + int f; + + if(addr == NULL) { + printf("(NULL IP addr)"); + return; + } + + if(ip64_addr_is_ipv4_mapped_addr(addr)) { + /* + * Printing IPv4-mapped addresses is done according to RFC 4291 [1] + * + * "An alternative form that is sometimes more + * convenient when dealing with a mixed environment + * of IPv4 and IPv6 nodes is x:x:x:x:x:x:d.d.d.d, + * where the 'x's are the hexadecimal values of the + * six high-order 16-bit pieces of the address, and + * the 'd's are the decimal values of the four + * low-order 8-bit pieces of the address (standard + * IPv4 representation)." + * + * [1] https://tools.ietf.org/html/rfc4291#page-4 + */ + printf("::FFFF:%u.%u.%u.%u", addr->u8[12], addr->u8[13], addr->u8[14], addr->u8[15]); + } else { + for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) { + a = (addr->u8[i] << 8) + addr->u8[i + 1]; + if(a == 0 && f >= 0) { + if(f++ == 0) { + printf("::"); + } + } else { + if(f > 0) { + f = -1; + } else if(i > 0) { + printf(":"); + } + printf("%x", a); + } + } + } +} +/*---------------------------------------------------------------------------*/ +int +uiplib_ipaddr_snprint(char *buf, size_t size, const uip_ipaddr_t *addr) +{ + uint16_t a; + unsigned int i; + int f, n; + + if(size == 0) { + return 0; + } + + if(addr == NULL) { + n = snprintf(buf, size - 1, "(NULL IP addr)"); + + } else if(ip64_addr_is_ipv4_mapped_addr(addr)) { + /* + * Printing IPv4-mapped addresses is done according to RFC 4291 [1] + * + * "An alternative form that is sometimes more + * convenient when dealing with a mixed environment + * of IPv4 and IPv6 nodes is x:x:x:x:x:x:d.d.d.d, + * where the 'x's are the hexadecimal values of the + * six high-order 16-bit pieces of the address, and + * the 'd's are the decimal values of the four + * low-order 8-bit pieces of the address (standard + * IPv4 representation)." + * + * [1] https://tools.ietf.org/html/rfc4291#page-4 + */ + n = snprintf(buf, size - 1, "::FFFF:%u.%u.%u.%u", addr->u8[12], + addr->u8[13], addr->u8[14], addr->u8[15]); + } else { + for(n = 0, i = 0, f = 0; i < sizeof(uip_ipaddr_t) && n < size - 1; i += 2) { + a = (addr->u8[i] << 8) + addr->u8[i + 1]; + if(a == 0 && f >= 0) { + if(f++ == 0) { + buf[n++] = ':'; + buf[n++] = ':'; + } + } else { + if(f > 0) { + f = -1; + } else if(i > 0) { + buf[n++] = ':'; + } + n += snprintf(&buf[n], size - n - 1, "%x", a); + } + } + } + + if(n >= size - 1) { + buf[size - 1] = '\0'; + } + return n; +} +/*---------------------------------------------------------------------------*/ diff --git a/os/net/ipv6/uiplib.h b/os/net/ipv6/uiplib.h index aa23435e0..6b0d4ac84 100644 --- a/os/net/ipv6/uiplib.h +++ b/os/net/ipv6/uiplib.h @@ -77,4 +77,28 @@ CCIF int uiplib_ip4addrconv(const char *addrstr, uip_ip4addr_t *addr); CCIF int uiplib_ip6addrconv(const char *addrstr, uip_ip6addr_t *addr); /** @} */ +/** + * \addtogroup uiplib + * @{ + */ + +/** + * Print an IP address using printf(). + * + * \param addr A pointer to a uip_ipaddr_t that will be printed with printf(). + */ +void uiplib_ipaddr_print(const uip_ipaddr_t *addr); + +/** + * Write at most size - 1 characters of the IP address to the output string. + * The output is always null-terminated, unless size is 0. + * + * \param buffer A pointer to an output string with at least size bytes. + * \param size The max number of characters to write to the output string. + * \param addr A pointer to a uip_ipaddr_t that will be printed with printf(). + */ +int uiplib_ipaddr_snprint(char *buffer, size_t size, const uip_ipaddr_t *addr); + +/** @} */ + #endif /* UIPLIB_H_ */