From cad1c37fb358fa28104ed27b68f282ed23d73622 Mon Sep 17 00:00:00 2001 From: Valentin Sawadski Date: Fri, 18 Sep 2015 14:53:57 +0200 Subject: [PATCH 1/2] Better prints of ::FFFF: prefixed IPv4-mapped addresses IPv4-mapped Address [1] are now printed accoriding to the text representation mixed IPv4 and IPv6 networks as specified in [2] [1] https://tools.ietf.org/html/rfc6890#page-14 [2] https://tools.ietf.org/html/rfc3513#page-5 --- core/net/ip/ip64-addr.h | 14 ++++++++++++++ core/net/ip/uip-debug.c | 43 ++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/core/net/ip/ip64-addr.h b/core/net/ip/ip64-addr.h index 4cf80a9b9..3027d846a 100644 --- a/core/net/ip/ip64-addr.h +++ b/core/net/ip/ip64-addr.h @@ -34,6 +34,20 @@ #include "net/ip/uip.h" + +/** + * \brief Is IPv4-mapped Address + * + * See https://tools.ietf.org/html/rfc6890#page-14 + */ +#define ip64_addr_is_ipv4_mapped_addr(a) \ + ((((a)->u16[0]) == 0) && \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 0xFFFF)) + void ip64_addr_copy4(uip_ip4addr_t *dest, const uip_ip4addr_t *src); void ip64_addr_copy6(uip_ip6addr_t *dest, const uip_ip6addr_t *src); diff --git a/core/net/ip/uip-debug.c b/core/net/ip/uip-debug.c index 93e7edfe7..aee023169 100644 --- a/core/net/ip/uip-debug.c +++ b/core/net/ip/uip-debug.c @@ -38,6 +38,7 @@ */ #include "net/ip/uip-debug.h" +#include "net/ip/ip64-addr.h" /*---------------------------------------------------------------------------*/ void @@ -53,20 +54,36 @@ uip_debug_ipaddr_print(const uip_ipaddr_t *addr) return; } #if NETSTACK_CONF_WITH_IPV6 - 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("::"); + if(ip64_addr_is_ipv4_mapped_addr(addr)) { + /* Printing IPv4-mapped addresses is done according to RFC 3513 [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/rfc3513#page-5 */ + 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); } - } else { - if(f > 0) { - f = -1; - } else if(i > 0) { - PRINTA(":"); - } - PRINTA("%x", a); - } + } } #else /* NETSTACK_CONF_WITH_IPV6 */ PRINTA("%u.%u.%u.%u", addr->u8[0], addr->u8[1], addr->u8[2], addr->u8[3]); From 5b818d5a3914d06365a9169d2a6bd5eea8a22ac1 Mon Sep 17 00:00:00 2001 From: Valentin Sawadski Date: Wed, 23 Sep 2015 09:25:31 +0200 Subject: [PATCH 2/2] Fixed formatting of documentation --- core/net/ip/uip-debug.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/net/ip/uip-debug.c b/core/net/ip/uip-debug.c index aee023169..ab3ba0765 100644 --- a/core/net/ip/uip-debug.c +++ b/core/net/ip/uip-debug.c @@ -55,18 +55,20 @@ uip_debug_ipaddr_print(const uip_ipaddr_t *addr) } #if NETSTACK_CONF_WITH_IPV6 if(ip64_addr_is_ipv4_mapped_addr(addr)) { - /* Printing IPv4-mapped addresses is done according to RFC 3513 [1] - * - * An alternative form that is sometimes more - * convenient when dealing with a mixed environment + /* + * Printing IPv4-mapped addresses is done according to RFC 3513 [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). + * IPv4 representation)." * - * [1] https://tools.ietf.org/html/rfc3513#page-5 */ + * [1] https://tools.ietf.org/html/rfc3513#page-5 + */ 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) {