diff --git a/pkg/oonf_api/0001-add-RIOT-support.patch b/pkg/oonf_api/0001-add-RIOT-support.patch index 0c8e94becf..68b3c95b7c 100644 --- a/pkg/oonf_api/0001-add-RIOT-support.patch +++ b/pkg/oonf_api/0001-add-RIOT-support.patch @@ -133,9 +133,8 @@ index dedab2c..1b602ec 100644 +#ifndef RIOT_VERSION #include +#else ++#include +#include "net/af.h" -+#include "inet_ntop.h" -+#include "inet_pton.h" +#define DONT_HAVE_SIN6_SCOPE_ID +#endif diff --git a/sys/Makefile.include b/sys/Makefile.include index f34f4247e2..91ebcbdda0 100644 --- a/sys/Makefile.include +++ b/sys/Makefile.include @@ -10,8 +10,13 @@ ifneq (,$(filter crypto,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/include/crypto endif +ifneq (,$(filter fib,$(USEMODULE))) + USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/include + USEMODULE_INCLUDES += $(RIOTBASE)/sys/net/include # remove as soon as deleted +endif ifneq (,$(filter posix,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/include + USEMODULE_INCLUDES += $(RIOTBASE)/sys/net/include endif ifneq (,$(filter pnet,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/include diff --git a/sys/net/crosslayer/net_help/inet_ntop.c b/sys/net/crosslayer/net_help/inet_ntop.c deleted file mode 100644 index ebc5b04d68..0000000000 --- a/sys/net/crosslayer/net_help/inet_ntop.c +++ /dev/null @@ -1,214 +0,0 @@ -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#include -#include -#include - -#include "inet_ntop.h" - -/* const char * - * inet_ntop4(src, dst, size) - * format an IPv4 address, more or less like inet_ntoa() - * return: - * `dst' (as a const) - * notes: - * (1) uses no statics - * (2) takes a u_char* not an in_addr as input - * author: - * Paul Vixie, 1996. - */ -static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size) -{ - const size_t MIN_SIZE = 16; /* space for 255.255.255.255\0 */ - int n = 0; - char *next = dst; - - if (size < MIN_SIZE) { - return NULL; - } - - do { - unsigned char u = *src++; - - if (u > 99) { - *next++ = '0' + u / 100; - u %= 100; - *next++ = '0' + u / 10; - u %= 10; - } - else if (u > 9) { - *next++ = '0' + u / 10; - u %= 10; - } - - *next++ = '0' + u; - *next++ = '.'; - n++; - } - while (n < 4); - - *--next = 0; - return dst; -} - -/* const char * - * inet_ntop6(src, dst, size) - * convert IPv6 binary address into presentation (printable) format - * author: - * Paul Vixie, 1996. - */ -static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) -{ - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { - int base, len; - } best = { -1, 0}, cur = { -1, 0}; - unsigned int words[IN6ADDRSZ / INT16SZ]; - int i; - const unsigned char *next_src, *src_end; - unsigned int *next_dest; - - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - next_src = src; - src_end = src + IN6ADDRSZ; - next_dest = words; - i = 0; - - do { - unsigned int next_word = (unsigned int) *next_src++; - next_word <<= 8; - next_word |= (unsigned int) *next_src++; - *next_dest++ = next_word; - - if (next_word == 0) { - if (cur.base == -1) { - cur.base = i; - cur.len = 1; - } - else { - cur.len++; - } - } - else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) { - best = cur; - } - - cur.base = -1; - } - } - - i++; - } - while (next_src < src_end); - - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) { - best = cur; - } - } - - if (best.base != -1 && best.len < 2) { - best.base = -1; - } - - /* - * Format the result. - */ - tp = tmp; - - for (i = 0; i < ((int) (IN6ADDRSZ / INT16SZ));) { - /* Are we inside the best run of 0x00's? */ - if (i == best.base) { - *tp++ = ':'; - i += best.len; - continue; - } - - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) { - *tp++ = ':'; - } - - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && - (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src + 12, tp, sizeof tmp - (tp - tmp))) { - return (NULL); - } - - tp += strlen(tp); - break; - } - - tp += snprintf(tp, sizeof tmp - (tp - tmp), "%x", words[i]); - i++; - } - - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) { - *tp++ = ':'; - } - - *tp++ = '\0'; - - /* - * Check for overflow, copy, and we're done. - */ - if ((size_t)(tp - tmp) > size) { - return (NULL); - } - - strcpy(dst, tmp); - return (dst); -} - -/* char * - * inet_ntop(af, src, dst, size) - * convert a network format address to presentation format. - * return: - * pointer to presentation format address (`dst'), or NULL (see errno). - * author: - * Paul Vixie, 1996. - */ -const char *inet_ntop(int af, const void *src, char *dst, size_t size) -{ - switch(af) { - case AF_INET: - return (inet_ntop4(src, dst, size)); - - case AF_INET6: - return (inet_ntop6(src, dst, size)); - - default: - return (NULL); - } - - /* NOTREACHED */ -} diff --git a/sys/net/crosslayer/net_help/inet_pton.c b/sys/net/crosslayer/net_help/inet_pton.c deleted file mode 100644 index 92c35e57dd..0000000000 --- a/sys/net/crosslayer/net_help/inet_pton.c +++ /dev/null @@ -1,239 +0,0 @@ -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#include -#include -#include - -#if defined(MCU_ATMEGA2560) -#include -#endif - -#include "kernel.h" - -#include "inet_pton.h" - -/* int - * inet_pton4(src, dst) - * like inet_aton() but without all the hexadecimal and shorthand. - * return: - * 1 if `src' is a valid dotted quad, else 0. - * notice: - * does not touch `dst' unless it's returning 1. - * author: - * Paul Vixie, 1996. - */ -static int inet_pton4(const char *src, unsigned char *dst) -{ - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - unsigned char tmp[INADDRSZ], *tp; - - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr(digits, ch)) != NULL) { - unsigned int new = *tp * 10 + (unsigned int)(pch - digits); - - if (new > 255) { - return (0); - } - - *tp = new; - - if (!saw_digit) { - if (++octets > 4) { - return (0); - } - - saw_digit = 1; - } - } - else if (ch == '.' && saw_digit) { - if (octets == 4) { - return (0); - } - - *++tp = 0; - saw_digit = 0; - } - else { - return (0); - } - } - - if (octets < 4) { - return (0); - } - - memcpy(dst, tmp, INADDRSZ); - return (1); -} - -static const char XDIGITS_L[] = "0123456789abcdef"; -static const char XDIGITS_U[] = "0123456789ABCDEF"; - -/* int - * inet_pton6(src, dst) - * convert presentation level address to network order binary form. - * return: - * 1 if `src' is a valid [RFC1884 2.2] address, else 0. - * notice: - * (1) does not touch `dst' unless it's returning 1. - * (2) :: in a full address is silently ignored. - * credit: - * inspired by Mark Andrews. - * author: - * Paul Vixie, 1996. - */ -static int inet_pton6(const char *src, unsigned char *dst) -{ - unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp; - const char *curtok; - int ch, saw_xdigit; - unsigned int val; - - memset((tp = tmp), '\0', IN6ADDRSZ); - endp = tp + IN6ADDRSZ; - colonp = NULL; - - /* Leading :: requires some special handling. */ - if (*src == ':') { - if (*++src != ':') { - return (0); - } - } - - curtok = src; - saw_xdigit = 0; - val = 0; - - while ((ch = *src++) != '\0') { - const char *pch; - const char *xdigits; - - if ((pch = strchr((xdigits = XDIGITS_L), ch)) == NULL) { - pch = strchr((xdigits = XDIGITS_U), ch); - } - - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - - if (val > 0xffff) { - return (0); - } - - saw_xdigit = 1; - continue; - } - - if (ch == ':') { - curtok = src; - - if (!saw_xdigit) { - if (colonp) { - return (0); - } - - colonp = tp; - continue; - } - - if (tp + INT16SZ > endp) { - return (0); - } - - *tp++ = (unsigned char)(val >> 8) & 0xff; - *tp++ = (unsigned char) val & 0xff; - saw_xdigit = 0; - val = 0; - continue; - } - - if (ch == '.' && ((tp + INADDRSZ) <= endp) && - inet_pton4(curtok, tp) > 0) { - tp += INADDRSZ; - saw_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - - return (0); - } - - if (saw_xdigit) { - if (tp + INT16SZ > endp) { - return (0); - } - - *tp++ = (unsigned char)(val >> 8) & 0xff; - *tp++ = (unsigned char) val & 0xff; - } - - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const ssize_t n = tp - colonp; - ssize_t i; - - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - - tp = endp; - } - - if (tp != endp) { - return (0); - } - - memcpy(dst, tmp, IN6ADDRSZ); - return (1); -} - -/* int - * inet_pton(af, src, dst) - * convert from presentation format (which usually means ASCII printable) - * to network format (which is usually some kind of binary format). - * return: - * 1 if the address was valid for the specified address family - * 0 if the address wasn't valid (`dst' is untouched in this case) - * -1 if some other error occurred (`dst' is untouched in this case, too) - * author: - * Paul Vixie, 1996. - */ -int inet_pton(int af, const char *src, void *dst) -{ - switch(af) { - case AF_INET: - return (inet_pton4(src, dst)); - - case AF_INET6: - return (inet_pton6(src, dst)); - - default: - return (-1); - } - - /* NOTREACHED */ -} diff --git a/sys/net/include/inet_ntop.h b/sys/net/include/inet_ntop.h deleted file mode 100644 index 537fb913d8..0000000000 --- a/sys/net/include/inet_ntop.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 1996-2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef INET_NTOP_H_ -#define INET_NTOP_H_ -#include -#include "net/af.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef IN6ADDRSZ -#define IN6ADDRSZ 16 -#endif - -#ifndef INT16SZ -#define INT16SZ sizeof(int16_t) -#endif - -#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT) -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#endif - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -const char *inet_ntop(int af, const void *src, char *dst, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* INET_NTOP_H_ */ diff --git a/sys/net/include/inet_pton.h b/sys/net/include/inet_pton.h deleted file mode 100644 index fc62d5a5c1..0000000000 --- a/sys/net/include/inet_pton.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 1996-2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef INET_PTON_H_ -#define INET_PTON_H_ -#include -#include "net/af.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef IN6ADDRSZ -#define IN6ADDRSZ 16 -#endif - -#ifndef INT16SZ -#define INT16SZ sizeof(int16_t) -#endif - -#ifndef INADDRSZ -#define INADDRSZ 4 -#endif - -#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT) -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#endif - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -int inet_pton(int af, const char *src, void *dst); - -#ifdef __cplusplus -} -#endif - -#endif /* INET_PTON_H_ */ diff --git a/sys/posix/include/arpa/inet.h b/sys/posix/include/arpa/inet.h index 91841ea5c1..1b2d5f51c4 100644 --- a/sys/posix/include/arpa/inet.h +++ b/sys/posix/include/arpa/inet.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Freie Universität Berlin + * Copyright (C) 2013-15 Freie Universität Berlin * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level @@ -23,24 +23,54 @@ #ifndef ARPA_INET_H #define ARPA_INET_H +#include #include +#include -#include "net_help.h" -#include "inet_ntop.h" -#include "inet_pton.h" +#include "byteorder.h" +#include "net/af.h" +#include "net/ipv4/addr.h" +#include "net/ipv6/addr.h" +#include "socket_base/socket.h" #ifdef __cplusplus extern "C" { #endif -typedef uint16_t in_port_t; ///< Internet port type -typedef uint32_t in_addr_t; ///< IPv4 address type - -#define INET_ADDRSTRLEN 16 ///< Length of the string form for IPv4. -#define INET6_ADDRSTRLEN 46 ///< Length of the string form for IPv6. +typedef uint16_t in_port_t; /**< Internet port type */ +typedef uint32_t in_addr_t; /**< IPv4 address type */ /** - * IPv4 address structure type. + * @brief Alias to @ref IPV4_ADDR_MAX_STR_LEN + */ +#ifndef INET_ADDRSTRLEN +#define INET_ADDRSTRLEN (IPV4_ADDR_MAX_STR_LEN) +#endif + +/** + * @brief Alias to @ref IPV6_ADDR_MAX_STR_LEN + */ +#ifndef INET6_ADDRSTRLEN +#define INET6_ADDRSTRLEN (IPV6_ADDR_MAX_STR_LEN) +#endif + +/** + * @brief Size in byte of an IPv4 address + */ +#ifndef INADDRSZ +#define INADDRSZ (sizeof(ipv4_addr_t)) +#endif + +/** + * @brief Size in byte of an IPv6 address + */ +#ifndef IN6ADDRSZ +#define IN6ADDRSZ (sizeof(ipv6_addr_t)) +#endif + + +/** + * @brief IPv4 address structure type. */ struct in_addr { in_addr_t s_addr; ///< an IPv4 address @@ -98,6 +128,90 @@ struct in_addr { */ #define ntohs(netshort) NTOHS(netshort) +/** + * @brief Converts an IP address to its string representation + * + * @pre (af == AF_INET) || (af == AF_INET6) + * + * @param[in] af Address family of @p src. Must be @ref AF_INET or @ref AF_INET6. + * @param[in] src An IP address. + * @param[out] dst The resulting string representation. + * @param[in] size Length of @p result. + * + * @return @p dst, on success + * @return NULL, if @p size was smaller than needed + * @return NULL, if @p src or @p dst was NULL + */ +static inline const char *inet_ntop(int af, const void *restrict src, char *restrict dst, + socklen_t size) +{ + switch (af) { +#ifdef MODULE_IPV4_ADDR + case AF_INET: + if (ipv4_addr_to_str(dst, src, (size_t)size) == NULL) { + errno = ENOSPC; + return NULL; + } + break; +#endif +#ifdef MODULE_IPV6_ADDR + case AF_INET6: + if (ipv6_addr_to_str(dst, src, (size_t)size) == NULL) { + errno = ENOSPC; + return NULL; + } + break; +#endif + default: + (void)src; + (void)dst; + (void)size; + errno = EAFNOSUPPORT; + return NULL; + } + return dst; +} + +/** + * @brief Converts an IP address string representation to a byte-represented + * IP address + * + * @pre (af == AF_INET) || (af == AF_INET6) + * + * @param[in] af Address family of @p src. Must be @ref AF_INET or @ref AF_INET6. + * @param[in] src An IP address string representation + * @param[out] dst The resulting byte representation + * + * @return 1, on success. + * @return 0, if @p src was malformed or input pointers were NULL. + * @return -1, if @p af is not supported. + */ +static inline int inet_pton(int af, const char *src, void *dst) +{ + switch (af) { +#ifdef MODULE_IPV4_ADDR + case AF_INET: + if (ipv4_addr_from_str(dst, src) == NULL) { + return 0; + } + break; +#endif +#ifdef MODULE_IPV6_ADDR + case AF_INET6: + if (ipv6_addr_from_str(dst, src) == NULL) { + return 0; + } + break; +#endif + default: + (void)src; + (void)dst; + errno = EAFNOSUPPORT; + return -1; + } + return 1; +} + #ifdef __cplusplus } #endif diff --git a/sys/shell/commands/sc_fib.c b/sys/shell/commands/sc_fib.c index 500abb974b..f5088fba0d 100644 --- a/sys/shell/commands/sc_fib.c +++ b/sys/shell/commands/sc_fib.c @@ -18,12 +18,12 @@ * @} */ +#include #include #include #include #include #include "thread.h" -#include "inet_pton.h" #include "net/af.h" #ifdef MODULE_GNRC_NETIF #include "net/gnrc/netif.h"