Added functions in uiplib to print a IP address to string and normal

output. Changed uip-debug to use the uiplib functions instead of its
own print functions.
This commit is contained in:
Niclas Finne 2017-11-29 00:32:48 +01:00
parent 032bf31a1d
commit 0731c4f158
4 changed files with 155 additions and 103 deletions

View File

@ -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 <nvt@sics.se>
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
#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);
}
}
}
}
/*---------------------------------------------------------------------------*/

View File

@ -43,13 +43,16 @@
#define UIP_DEBUG_H
#include "net/net-debug.h"
#include "net/ipv6/uip.h"
#include <stdio.h>
#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 */

View File

@ -32,15 +32,27 @@
*
*/
/**
* \file
* Various uIP library functions.
* \author
* Nicolas Tsiftes <nvt@sics.se>
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
#include "net/ipv6/uip.h"
#include "net/ipv6/uiplib.h"
#include "net/ipv6/ip64-addr.h"
#include <string.h>
#include <stdio.h>
#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;
}
/*---------------------------------------------------------------------------*/

View File

@ -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_ */