From 012da8d41806ae98adab8cb4e88e52c2e675ab4f Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Wed, 5 Feb 2014 20:01:41 +0100 Subject: [PATCH 1/3] add RIOT support --- Makefile | 29 ++++++++++++++ external/regex/Makefile | 4 ++ src-api/common/Makefile | 3 ++ src-api/common/autobuf.c | 6 +++ src-api/common/common_types.h | 5 +++ src-api/common/daemonize.c | 2 +- src-api/common/netaddr.c | 74 +++++++++++++++++++++--------------- src-api/common/netaddr.h | 22 +++++++---- src-api/rfc5444/Makefile | 3 ++ src-api/rfc5444/rfc5444_api_config.h | 51 +++++++++++++++++++++++++ src-api/rfc5444/rfc5444_print.c | 5 +++ 11 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 Makefile create mode 100644 external/regex/Makefile create mode 100644 src-api/common/Makefile create mode 100644 src-api/rfc5444/Makefile create mode 100644 src-api/rfc5444/rfc5444_api_config.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cf66baa --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +# +# to use oonf_api in your RIOT project, +# add the following to your Makefile: +# +# export OONFBASE = /path/to/this/directory +# EXTERNAL_MODULES += $(OONFBASE) +# +# this provides the following modules: +# oonf_common - avl tree, list, netaddr, regex, string functions +# oonf_rfc5444 - packetBB implementation, requires oonf_common + +ifneq (,$(filter oonf_common,$(USEMODULE))) + DIRS += src-api/common +endif +ifneq (,$(filter oonf_rfc5444,$(USEMODULE))) + DIRS += src-api/rfc5444 +endif +ifneq (,$(filter oonf_cunit,$(USEMODULE))) + DIRS += tests/cunit +endif +ifneq (,$(filter oonf_regex,$(USEMODULE))) + DIRS += external/regex +endif + +all: + mkdir -p $(BINDIR) + @for i in $(DIRS) ; do $(MAKE) -C $$i || exit 1; done ; + +clean: diff --git a/external/regex/Makefile b/external/regex/Makefile new file mode 100644 index 0000000..3bc1ce1 --- /dev/null +++ b/external/regex/Makefile @@ -0,0 +1,4 @@ +MODULE:=oonf_$(shell basename $(CURDIR)) +INCLUDES += $(CURDIR)/.. + +include $(RIOTBASE)/Makefile.base diff --git a/src-api/common/Makefile b/src-api/common/Makefile new file mode 100644 index 0000000..5e0046d --- /dev/null +++ b/src-api/common/Makefile @@ -0,0 +1,3 @@ +MODULE:=oonf_$(shell basename $(CURDIR)) + +include $(RIOTBASE)/Makefile.base diff --git a/src-api/common/autobuf.c b/src-api/common/autobuf.c index 77c519b..e09c0c9 100644 --- a/src-api/common/autobuf.c +++ b/src-api/common/autobuf.c @@ -51,6 +51,12 @@ #include #endif +#ifdef RIOT_VERSION +int getpagesize(void) { + return 512; +} +#endif + #include "common/autobuf.h" /** diff --git a/src-api/common/common_types.h b/src-api/common/common_types.h index c90cf46..54ce281 100644 --- a/src-api/common/common_types.h +++ b/src-api/common/common_types.h @@ -77,6 +77,11 @@ #define PRINTF_SIZE_T_HEX_SPECIFIER "Ix" #define PRINTF_SSIZE_T_SPECIFIER "Id" #define PRINTF_PTRDIFF_T_SPECIFIER "Id" +#elif defined(RIOT_VERSION) + #define PRINTF_SIZE_T_SPECIFIER "d" + #define PRINTF_SIZE_T_HEX_SPECIFIER "x" + #define PRINTF_SSIZE_T_SPECIFIER "d" + #define PRINTF_PTRDIFF_T_SPECIFIER "d" #elif defined(__GNUC__) #define PRINTF_SIZE_T_SPECIFIER "zu" #define PRINTF_SIZE_T_HEX_SPECIFIER "zx" diff --git a/src-api/common/daemonize.c b/src-api/common/daemonize.c index 103c88f..6ea603d 100644 --- a/src-api/common/daemonize.c +++ b/src-api/common/daemonize.c @@ -48,7 +48,7 @@ #include "common/common_types.h" #include "common/daemonize.h" -#ifndef WIN32 +#if (!defined(_WIN32)) && (!defined(RIOT_VERSION)) /** * Prepare the start of a daemon. Fork into background, * but keep stdin/out/err open and a pipe connected to diff --git a/src-api/common/netaddr.c b/src-api/common/netaddr.c index dedab2c..fdc3e82 100644 --- a/src-api/common/netaddr.c +++ b/src-api/common/netaddr.c @@ -43,7 +43,14 @@ #include #include #include +#ifndef RIOT_VERSION #include +#else +#include "net_help.h" +#include "inet_ntop.h" +#include "inet_pton.h" +#define DONT_HAVE_SIN6_SCOPE_ID +#endif #include "common/common_types.h" #include "common/string.h" @@ -175,12 +182,12 @@ netaddr_to_binary(void *dst, const struct netaddr *src, size_t len) { int netaddr_from_socket(struct netaddr *dst, const union netaddr_socket *src) { memset(dst->_addr, 0, sizeof(dst->_addr)); - if (src->std.sa_family == AF_INET) { + if (src->std.sin6_family == AF_INET) { /* ipv4 */ - memcpy(dst->_addr, &src->v4.sin_addr, 4); + memcpy(dst->_addr, &src->v4.sin6_addr, 4); dst->_prefix_len = 32; } - else if (src->std.sa_family == AF_INET6){ + else if (src->std.sin6_family == AF_INET6){ /* ipv6 */ memcpy(dst->_addr, &src->v6.sin6_addr, 16); dst->_prefix_len = 128; @@ -190,7 +197,7 @@ netaddr_from_socket(struct netaddr *dst, const union netaddr_socket *src) { dst->_type = AF_UNSPEC; return -1; } - dst->_type = (uint8_t)src->std.sa_family; + dst->_type = (uint8_t)src->std.sin6_family; return 0; } @@ -204,12 +211,12 @@ netaddr_from_socket(struct netaddr *dst, const union netaddr_socket *src) { int netaddr_to_socket(union netaddr_socket *dst, const struct netaddr *src) { /* copy address type */ - dst->std.sa_family = src->_type; + dst->std.sin6_family = src->_type; switch (src->_type) { case AF_INET: /* ipv4 */ - memcpy(&dst->v4.sin_addr, src->_addr, 4); + memcpy(&dst->v4.sin6_addr, src->_addr, 4); break; case AF_INET6: /* ipv6 */ @@ -221,7 +228,7 @@ netaddr_to_socket(union netaddr_socket *dst, const struct netaddr *src) { } /* copy address type */ - dst->std.sa_family= src->_type; + dst->std.sin6_family= src->_type; return 0; } @@ -319,14 +326,16 @@ netaddr_socket_init(union netaddr_socket *combined, const struct netaddr *addr, switch (addr->_type) { case AF_INET: /* ipv4 */ - memcpy(&combined->v4.sin_addr, addr->_addr, 4); - combined->v4.sin_port = htons(port); + memcpy(&combined->v4.sin6_addr, addr->_addr, 4); + combined->v4.sin6_port = HTONS(port); break; case AF_INET6: /* ipv6 */ memcpy(&combined->v6.sin6_addr, addr->_addr, 16); - combined->v6.sin6_port = htons(port); + combined->v6.sin6_port = HTONS(port); +#ifndef DONT_HAVE_SIN6_SCOPE_ID combined->v6.sin6_scope_id = if_index; +#endif break; default: /* unknown address type */ @@ -334,7 +343,7 @@ netaddr_socket_init(union netaddr_socket *combined, const struct netaddr *addr, } /* copy address type */ - combined->std.sa_family = addr->_type; + combined->std.sin6_family = addr->_type; return 0; } @@ -344,11 +353,11 @@ netaddr_socket_init(union netaddr_socket *combined, const struct netaddr *addr, */ uint16_t netaddr_socket_get_port(const union netaddr_socket *sock) { - switch (sock->std.sa_family) { + switch (sock->std.sin6_family) { case AF_INET: - return ntohs(sock->v4.sin_port); + return NTOHS(sock->v4.sin6_port); case AF_INET6: - return ntohs(sock->v6.sin6_port); + return NTOHS(sock->v6.sin6_port); default: return 0; } @@ -555,28 +564,31 @@ const char * netaddr_socket_to_string(struct netaddr_str *dst, const union netaddr_socket *src) { struct netaddr_str buf; - if (src->std.sa_family == AF_INET) { + if (src->std.sin6_family == AF_INET) { snprintf(dst->buf, sizeof(*dst), "%s:%d", - inet_ntop(AF_INET, &src->v4.sin_addr, buf.buf, sizeof(buf)), - ntohs(src->v4.sin_port)); + inet_ntop(AF_INET, &src->v4.sin6_addr, buf.buf, sizeof(buf)), + NTOHS(src->v4.sin6_port)); } - else if (src->std.sa_family == AF_INET6) { + else if (src->std.sin6_family == AF_INET6) { +#ifndef DONT_HAVE_SIN6_SCOPE_ID if (src->v6.sin6_scope_id) { char scope_buf[IF_NAMESIZE]; snprintf(dst->buf, sizeof(*dst), "[%s]:%d%%%s", inet_ntop(AF_INET6, &src->v6.sin6_addr, buf.buf, sizeof(buf)), - ntohs(src->v6.sin6_port), + NTOHS(src->v6.sin6_port), if_indextoname(src->v6.sin6_scope_id, scope_buf)); } - else { + else +#endif + { snprintf(dst->buf, sizeof(*dst), "[%s]:%d", inet_ntop(AF_INET6, &src->v6.sin6_addr, buf.buf, sizeof(buf)), - ntohs(src->v6.sin6_port)); + NTOHS(src->v6.sin6_port)); } } else { - snprintf(dst->buf, sizeof(*dst), "\"Unknown socket type: %d\"", src->std.sa_family); + snprintf(dst->buf, sizeof(*dst), "\"Unknown socket type: %d\"", src->std.sin6_family); } return dst->buf; @@ -622,13 +634,13 @@ int netaddr_cmp_to_socket(const struct netaddr *a1, const union netaddr_socket *a2) { int result = 0; - result = (int)a1->_type - (int)a2->std.sa_family; + result = (int)a1->_type - (int)a2->std.sin6_family; if (result) { return result; } if (a1->_type == AF_INET) { - result = memcmp(a1->_addr, &a2->v4.sin_addr, 4); + result = memcmp(a1->_addr, &a2->v4.sin6_addr, 4); } else if (a1->_type == AF_INET6) { /* ipv6 */ @@ -741,20 +753,20 @@ const char * inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { if (af == AF_INET) { - struct sockaddr_in in; + sockaddr6_t in; memset(&in, 0, sizeof(in)); in.sin_family = AF_INET; - memcpy(&in.sin_addr, src, sizeof(struct in_addr)); - getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), + memcpy(&in.sin6_addr, src, sizeof(struct in_addr)); + getnameinfo((sockaddr6_t *)&in, sizeof(sockaddr6_t), dst, cnt, NULL, 0, NI_NUMERICHOST); return dst; } else if (af == AF_INET6) { - struct sockaddr_in6 in; + sockaddr6_t in; memset(&in, 0, sizeof(in)); in.sin6_family = AF_INET6; memcpy(&in.sin6_addr, src, sizeof(struct in_addr6)); - getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in6), + getnameinfo((sockaddr6_t *)&in, sizeof(sockaddr6_t), dst, cnt, NULL, 0, NI_NUMERICHOST); return dst; } @@ -795,7 +807,7 @@ inet_pton(int af, const char *src, void *dst) sock = (union netaddr_socket *)res->ai_addr; if (af == AF_INET) { - memcpy(dst, &sock->v4.sin_addr, 4); + memcpy(dst, &sock->v4.sin6_addr, 4); } else { memcpy(dst, &sock->v6.sin6_addr, 16); @@ -928,7 +940,7 @@ _subnetmask_to_prefixlen(const char *src) { } /* transform into host byte order */ - v4 = ntohl(v4); + v4 = NTOHL(v4); shift = 0xffffffff; for (len = 31; len >= 0; len--) { diff --git a/src-api/common/netaddr.h b/src-api/common/netaddr.h index 78fd5b4..cfba7a9 100644 --- a/src-api/common/netaddr.h +++ b/src-api/common/netaddr.h @@ -43,18 +43,26 @@ #define NETADDR_H_ -#ifndef _WIN32 +#if (!defined(_WIN32)) && (!defined(RIOT_VERSION)) #include #include #include #include -#else +#endif + +#ifdef _WIN32 #include #include #define IF_NAMESIZE 16 #endif +#ifdef RIOT_VERSION +#include "socket_base/socket.h" +#define INET_ADDRSTRLEN (16) +#define INET6_ADDRSTRLEN (48) +#endif + #include #include @@ -97,10 +105,10 @@ struct netaddr { * to all variants without casting and compiler warnings. */ union netaddr_socket { - struct sockaddr_in v4; - struct sockaddr_in6 v6; - struct sockaddr std; - struct sockaddr_storage storage; + sockaddr6_t v4; + sockaddr6_t v6; + sockaddr6_t std; + sockaddr6_t storage; }; /** @@ -337,7 +345,7 @@ netaddr_set_prefix_length(struct netaddr *n, uint8_t prefix_len) { */ static INLINE sa_family_t netaddr_socket_get_addressfamily(const union netaddr_socket *s) { - return s->std.sa_family; + return s->std.sin6_family; } #endif /* NETADDR_H_ */ diff --git a/src-api/rfc5444/Makefile b/src-api/rfc5444/Makefile new file mode 100644 index 0000000..5e0046d --- /dev/null +++ b/src-api/rfc5444/Makefile @@ -0,0 +1,3 @@ +MODULE:=oonf_$(shell basename $(CURDIR)) + +include $(RIOTBASE)/Makefile.base diff --git a/src-api/rfc5444/rfc5444_api_config.h b/src-api/rfc5444/rfc5444_api_config.h new file mode 100644 index 0000000..9bf6622 --- /dev/null +++ b/src-api/rfc5444/rfc5444_api_config.h @@ -0,0 +1,51 @@ + +/* + * The olsr.org Optimized Link-State Routing daemon(olsrd) + * Copyright (c) 2004-2012, the olsr.org team - see HISTORY file + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of olsr.org, olsrd 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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. + * + * Visit http://www.olsr.org for more information. + * + * If you find this software useful feel free to make a donation + * to the project. For more information see the website or contact + * the copyright holders. + * + */ + +#ifndef RFC5444_API_CONFIG_H_ +#define RFC5444_API_CONFIG_H_ + +#define DISALLOW_CONSUMER_CONTEXT_DROP false +#define WRITER_STATE_MACHINE true +#define DEBUG_CLEANUP true +#define DO_ADDR_COMPRESSION true +#define CLEAR_ADDRESS_POSTFIX false + +#endif /* RFC5444_API_CONFIG_H_ */ diff --git a/src-api/rfc5444/rfc5444_print.c b/src-api/rfc5444/rfc5444_print.c index 4b3e04d..6b52f72 100644 --- a/src-api/rfc5444/rfc5444_print.c +++ b/src-api/rfc5444/rfc5444_print.c @@ -41,8 +41,13 @@ #include #include #include +#ifdef RIOT_VERSION +#include "socket_base/socket.h" +#include "inet_ntop.h" +#else #include #include +#endif #include "common/netaddr.h" #include "rfc5444/rfc5444_reader.h" -- 1.8.3.2