From 29061e9885d963db30c43b90ad737701d045bf40 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 15 May 2018 12:04:39 -0700 Subject: [PATCH] Rework uiplib_ipaddr_snprint, and use it from logging module and shell --- os/net/ipv6/uiplib.c | 101 +++++++++++++------------------------- os/net/ipv6/uiplib.h | 20 ++++---- os/services/shell/shell.c | 33 ++----------- os/sys/log.c | 33 ++----------- 4 files changed, 51 insertions(+), 136 deletions(-) diff --git a/os/net/ipv6/uiplib.c b/os/net/ipv6/uiplib.c index afe6de42b..b83bfe05c 100644 --- a/os/net/ipv6/uiplib.c +++ b/os/net/ipv6/uiplib.c @@ -3,17 +3,17 @@ * 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. + * 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. + * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -25,7 +25,7 @@ * 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. + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is part of the uIP TCP/IP stack and the Contiki operating system. * @@ -117,7 +117,7 @@ uiplib_ip6addrconv(const char *addrstr, uip_ip6addr_t *ipaddr) } #endif /* NETSTACK_CONF_WITH_IPV6 */ /*---------------------------------------------------------------------------*/ -/* Parse a IPv4-address from a string. Returns the number of characters read +/* Parse a IPv4-address from a string. Returns the number of characters read * for the address. */ int uiplib_ip4addrconv(const char *addrstr, uip_ip4addr_t *ipaddr) @@ -156,48 +156,9 @@ uiplib_ip4addrconv(const char *addrstr, uip_ip4addr_t *ipaddr) 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); - } - } - } + char buf[40]; + uiplib_ipaddr_snprint(buf, sizeof(buf), addr); + printf("%s", buf); } /*---------------------------------------------------------------------------*/ int @@ -205,15 +166,16 @@ uiplib_ipaddr_snprint(char *buf, size_t size, const uip_ipaddr_t *addr) { uint16_t a; unsigned int i; - int f, n; + int f; + int n = 0; if(size == 0) { return 0; } if(addr == NULL) { - n = snprintf(buf, size - 1, "(NULL IP addr)"); - + n = snprintf(buf, size, "(NULL IP addr)"); + return n; } else if(ip64_addr_is_ipv4_mapped_addr(addr)) { /* * Printing IPv4-mapped addresses is done according to RFC 4291 [1] @@ -229,32 +191,35 @@ uiplib_ipaddr_snprint(char *buf, size_t size, const uip_ipaddr_t *addr) * * [1] https://tools.ietf.org/html/rfc4291#page-4 */ - n = snprintf(buf, size - 1, "::FFFF:%u.%u.%u.%u", addr->u8[12], + n = snprintf(buf, size, "::FFFF:%u.%u.%u.%u", addr->u8[12], addr->u8[13], addr->u8[14], addr->u8[15]); + return n; } else { - for(n = 0, i = 0, f = 0; i < sizeof(uip_ipaddr_t) && n < size - 1; i += 2) { + 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) { - buf[n++] = ':'; - buf[n++] = ':'; + n += snprintf(buf+n, size-n, "::"); + if(n >= size) { + return n; + } } } else { if(f > 0) { f = -1; } else if(i > 0) { - buf[n++] = ':'; + n += snprintf(buf+n, size-n, ":"); + if(n >= size) { + return n; + } + } + n += snprintf(buf+n, size-n, "%x", a); + if(n >= size) { + return n; } - n += snprintf(&buf[n], size - n - 1, "%x", a); } } } - - /* - * Make sure the output string is always null-terminated. - */ - buf[MIN(n, size - 1)] = '\0'; - return n; } /*---------------------------------------------------------------------------*/ diff --git a/os/net/ipv6/uiplib.h b/os/net/ipv6/uiplib.h index 6a122033e..a09ae9671 100644 --- a/os/net/ipv6/uiplib.h +++ b/os/net/ipv6/uiplib.h @@ -1,19 +1,19 @@ /* * Copyright (c) 2002, Adam Dunkels. - * All rights reserved. + * 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. + * 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. + * 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. + * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -25,7 +25,7 @@ * 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. + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is part of the Contiki desktop environment for the C64. * @@ -65,7 +65,7 @@ * the numerical representation of the address. * * \retval 0 If the IP address could not be parsed. - * \retval Non-zero If the IP address was parsed. + * \retval Non-zero If the IP address was parsed. */ #if NETSTACK_CONF_WITH_IPV6 #define uiplib_ipaddrconv uiplib_ip6addrconv diff --git a/os/services/shell/shell.c b/os/services/shell/shell.c index 1e344dc1a..6788e5235 100644 --- a/os/services/shell/shell.c +++ b/os/services/shell/shell.c @@ -50,40 +50,15 @@ #include "shell-commands.h" #include "net/ipv6/uip.h" #include "net/ipv6/ip64-addr.h" +#include "net/ipv6/uiplib.h" /*---------------------------------------------------------------------------*/ void shell_output_6addr(shell_output_func output, const uip_ipaddr_t *ipaddr) { - uint16_t a; - unsigned int i; - int f; - - if(ipaddr == NULL) { - SHELL_OUTPUT(output, "(NULL IP addr)"); - return; - } - - if(ip64_addr_is_ipv4_mapped_addr(ipaddr)) { - /* Printing IPv4-mapped addresses is done according to RFC 4291 */ - SHELL_OUTPUT(output, "::FFFF:%u.%u.%u.%u", ipaddr->u8[12], ipaddr->u8[13], ipaddr->u8[14], ipaddr->u8[15]); - } else { - for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) { - a = (ipaddr->u8[i] << 8) + ipaddr->u8[i + 1]; - if(a == 0 && f >= 0) { - if(f++ == 0) { - SHELL_OUTPUT(output, "::"); - } - } else { - if(f > 0) { - f = -1; - } else if(i > 0) { - SHELL_OUTPUT(output, ":"); - } - SHELL_OUTPUT(output, "%x", a); - } - } - } + char buf[40]; + uiplib_ipaddr_snprint(buf, sizeof(buf), ipaddr); + SHELL_OUTPUT(output, "%s", buf); } /*---------------------------------------------------------------------------*/ void diff --git a/os/sys/log.c b/os/sys/log.c index 05613e5c6..c237bd097 100644 --- a/os/sys/log.c +++ b/os/sys/log.c @@ -50,6 +50,7 @@ #include "sys/log.h" #include "net/ipv6/ip64-addr.h" +#include "net/ipv6/uiplib.h" int curr_log_level_rpl = LOG_CONF_LEVEL_RPL; int curr_log_level_tcpip = LOG_CONF_LEVEL_TCPIP; @@ -84,35 +85,9 @@ struct log_module all_modules[] = { void log_6addr(const uip_ipaddr_t *ipaddr) { - uint16_t a; - unsigned int i; - int f; - - if(ipaddr == NULL) { - LOG_OUTPUT("(NULL IP addr)"); - return; - } - - if(ip64_addr_is_ipv4_mapped_addr(ipaddr)) { - /* Printing IPv4-mapped addresses is done according to RFC 4291 */ - LOG_OUTPUT("::FFFF:%u.%u.%u.%u", ipaddr->u8[12], ipaddr->u8[13], ipaddr->u8[14], ipaddr->u8[15]); - } else { - for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) { - a = (ipaddr->u8[i] << 8) + ipaddr->u8[i + 1]; - if(a == 0 && f >= 0) { - if(f++ == 0) { - LOG_OUTPUT("::"); - } - } else { - if(f > 0) { - f = -1; - } else if(i > 0) { - LOG_OUTPUT(":"); - } - LOG_OUTPUT("%x", a); - } - } - } + char buf[40]; + uiplib_ipaddr_snprint(buf, sizeof(buf), ipaddr); + LOG_OUTPUT("%s", buf); } /*---------------------------------------------------------------------------*/ void