aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt7
-rw-r--r--apps/CMakeLists.txt12
-rw-r--r--apps/higet/CMakeLists.txt2
-rw-r--r--apps/http-proxy/CMakeLists.txt5
-rw-r--r--cmake/Modules/BuildMacros.cmake4
-rw-r--r--hicn-light/CMakeLists.txt17
-rw-r--r--hicn-light/src/hicn/CMakeLists.txt5
-rw-r--r--hicn-light/src/hicn/api/CMakeLists.txt51
-rw-r--r--hicn-light/src/hicn/api/api.c1387
-rw-r--r--hicn-light/src/hicn/api/api.h577
-rw-r--r--hicn-light/src/hicn/api/commands.h341
-rw-r--r--hicn-light/src/hicn/api/face.h213
-rw-r--r--hicn-light/src/hicn/api/fib_policy.h39
-rw-r--r--hicn-light/src/hicn/api/ip_address.h228
-rw-r--r--hicn-light/src/hicn/api/token.h39
-rw-r--r--hicn-light/src/hicn/api/types.h40
-rw-r--r--hicn-light/src/hicn/command_line/controller/CMakeLists.txt4
-rw-r--r--hicn-light/src/hicn/command_line/daemon/CMakeLists.txt4
-rw-r--r--lib/CMakeLists.txt3
-rw-r--r--lib/src/CMakeLists.txt6
-rw-r--r--libtransport/CMakeLists.txt7
-rw-r--r--scripts/build-packages.sh4
-rw-r--r--utils/CMakeLists.txt10
23 files changed, 48 insertions, 2957 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 34105c7f7..37d232ea0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -63,7 +63,7 @@ endforeach()
## Static targets
set(LIBHICN hicn)
-set(LIBHICN_LIGHT hicn-light)
+set(HICN_LIGHT hicn-light)
set(HICN_LIGHT_CONTROL hicn-light-control)
set(HICN_LIGHT_DAEMON hicn-light-daemon)
set(HICN_PLUGIN hicn-plugin)
@@ -91,10 +91,13 @@ if (BUILD_HICNEXTRAPLUGIN AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
)
endif()
-## Shared targets
+## Libraries targets
set(LIBHICN_SHARED ${LIBHICN}.shared)
set(LIBTRANSPORT_SHARED ${LIBTRANSPORT}.shared)
+set(LIBHICN_STATIC ${LIBHICN}.static)
+set(LIBTRANSPORT_STATIC ${LIBTRANSPORT}.static)
+
if (NOT WIN32)
add_compile_options(-Wall -Werror)
endif ()
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index f59d58f6e..161555c5b 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -34,16 +34,14 @@ else()
if (ANDROID_API)
find_package(OpenSSL REQUIRED)
find_package(ZLIB REQUIRED)
- set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT})
- list(APPEND DEPENDENCIES
- ${LIBTRANSPORT_LIBRARIES}
- )
+ set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT_STATIC})
else ()
set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT_SHARED})
- list(APPEND DEPENDENCIES
- ${LIBTRANSPORT_LIBRARIES}
- )
endif ()
+
+ list(APPEND DEPENDENCIES
+ ${LIBTRANSPORT_LIBRARIES}
+ )
endif()
set(SUFFIX "")
diff --git a/apps/higet/CMakeLists.txt b/apps/higet/CMakeLists.txt
index 747760f00..d337f2620 100644
--- a/apps/higet/CMakeLists.txt
+++ b/apps/higet/CMakeLists.txt
@@ -34,7 +34,7 @@ list(APPEND APPS_SRC
build_executable(${HIGET}
SOURCES ${APPS_SRC}
LINK_LIBRARIES ${LIBTRANSPORT_LIBRARIES} ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}
- DEPENDS ${LIBTRANSPORT}
+ DEPENDS ${LIBTRANSPORT_LIBRARIES}
COMPONENT ${HICN_APPS}
DEFINITIONS ${COMPILER_DEFINITIONS}
)
diff --git a/apps/http-proxy/CMakeLists.txt b/apps/http-proxy/CMakeLists.txt
index b6ee5e010..dea544510 100644
--- a/apps/http-proxy/CMakeLists.txt
+++ b/apps/http-proxy/CMakeLists.txt
@@ -47,6 +47,7 @@ set(APP_SOURCE_FILES
)
set(LIBHTTP_PROXY hicnhttpproxy)
+set(LIBHTTP_PROXY_STATIC ${LIBHTTP_PROXY}.static)
build_library(${LIBHTTP_PROXY}
STATIC
@@ -58,8 +59,8 @@ build_library(${LIBHTTP_PROXY}
build_executable(${HTTP_PROXY}
SOURCES ${APP_SOURCE_FILES}
- LINK_LIBRARIES ${LIBHTTP_PROXY}
- DEPENDS ${LIBHTTP_PROXY}
+ LINK_LIBRARIES ${LIBHTTP_PROXY_STATIC}
+ DEPENDS ${LIBHTTP_PROXY_STATIC}
COMPONENT ${HICN_APPS}
DEFINITIONS ${COMPILER_DEFINITIONS}
) \ No newline at end of file
diff --git a/cmake/Modules/BuildMacros.cmake b/cmake/Modules/BuildMacros.cmake
index 3e681b425..8125fa7f9 100644
--- a/cmake/Modules/BuildMacros.cmake
+++ b/cmake/Modules/BuildMacros.cmake
@@ -84,9 +84,9 @@ macro(build_library lib)
if(ARG_STATIC)
list(APPEND TARGET_LIBS
- ${lib}
+ ${lib}.static
)
- add_library(${lib} STATIC ${ARG_SOURCES})
+ add_library(${lib}.static STATIC ${ARG_SOURCES})
endif()
if(NOT ARG_COMPONENT)
diff --git a/hicn-light/CMakeLists.txt b/hicn-light/CMakeLists.txt
index 489359baf..5637c1dbb 100644
--- a/hicn-light/CMakeLists.txt
+++ b/hicn-light/CMakeLists.txt
@@ -55,19 +55,18 @@ find_package_wrapper(Libparc REQUIRED)
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
find_package_wrapper(Libhicn REQUIRED)
find_package_wrapper(Libparc REQUIRED)
- set(LIBHICN_LIGHT hicn-light)
- set(HICN_LIGHT_CONTROL hicn-light-control)
- set(HICN_LIGHT_DAEMON hicn-light-daemon)
+ set(HICN_LIGHT hicn-light)
+ set(HICN_LIGHT_CONTROL ${HICN_LIGHT}-control)
+ set(HICN_LIGHT_DAEMON ${HICN_LIGHT}-daemon)
else()
if (ANDROID_API)
- set(HICN_LIBRARIES ${LIBHICN})
+ set(HICN_LIBRARIES ${LIBHICN_STATIC})
list(APPEND DEPENDENCIES
- ${LIBHICN}
+ ${LIBHICN_STATIC}
)
else ()
set(HICN_LIBRARIES ${LIBHICN_SHARED})
list(APPEND DEPENDENCIES
- ${LIBHICN}
${LIBHICN_SHARED}
)
endif ()
@@ -76,11 +75,13 @@ endif()
include( Packaging )
find_package(Threads REQUIRED)
-
find_package(OpenSSL REQUIRED)
+set(LIBHICN_LIGHT hicn-light)
+set(LIBHICN_LIGHT_STATIC ${LIBHICN_LIGHT}.static)
+
set(HICN_LIGHT_LINK_LIBRARIES
- hicn-light
+ ${LIBHICN_LIGHT_STATIC}
${HICN_LIBRARIES}
${LIBPARC_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
diff --git a/hicn-light/src/hicn/CMakeLists.txt b/hicn-light/src/hicn/CMakeLists.txt
index bcef7c9dd..a9861c32d 100644
--- a/hicn-light/src/hicn/CMakeLists.txt
+++ b/hicn-light/src/hicn/CMakeLists.txt
@@ -10,7 +10,6 @@ endif ()
add_subdirectory(config)
add_subdirectory(content_store)
add_subdirectory(core)
-add_subdirectory(api)
add_subdirectory(io)
add_subdirectory(messenger)
add_subdirectory(platforms)
@@ -49,7 +48,7 @@ if (ANDROID_API)
INSTALL_HEADERS ${TO_INSTALL_HEADER_FILES}
LINK_LIBRARIES ${LIBRARIES}
DEPENDS ${DEPENDENCIES}
- COMPONENT ${LIBHICN_LIGHT}
+ COMPONENT ${HICN_LIGHT}
INCLUDE_DIRS ${HICN_LIGHT_INCLUDE_DIRS}
INSTALL_ROOT_DIR hicn
DEFINITIONS ${COMPILER_DEFINITIONS}
@@ -61,7 +60,7 @@ else ()
INSTALL_HEADERS ${TO_INSTALL_HEADER_FILES}
LINK_LIBRARIES ${LIBRARIES}
DEPENDS ${DEPENDENCIES}
- COMPONENT ${LIBHICN_LIGHT}
+ COMPONENT ${HICN_LIGHT}
INCLUDE_DIRS ${HICN_LIGHT_INCLUDE_DIRS}
INSTALL_ROOT_DIR hicn
DEFINITIONS ${COMPILER_DEFINITIONS}
diff --git a/hicn-light/src/hicn/api/CMakeLists.txt b/hicn-light/src/hicn/api/CMakeLists.txt
deleted file mode 100644
index a2be46948..000000000
--- a/hicn-light/src/hicn/api/CMakeLists.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2017-2019 Cisco and/or its affiliates.
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
-
-set(HEADER_FILES
- ${CMAKE_CURRENT_SOURCE_DIR}/api.h
- ${CMAKE_CURRENT_SOURCE_DIR}/commands.h
- ${CMAKE_CURRENT_SOURCE_DIR}/face.h
- ${CMAKE_CURRENT_SOURCE_DIR}/ip_address.h
- ${CMAKE_CURRENT_SOURCE_DIR}/token.h
- ${CMAKE_CURRENT_SOURCE_DIR}/types.h
-)
-
-set(SOURCE_FILES
- ${CMAKE_CURRENT_SOURCE_DIR}/api.c
-)
-
-set(TO_INSTALL_HEADER_FILES
- ${TO_INSTALL_HEADER_FILES}
- ${HEADER_FILES}
- PARENT_SCOPE
-)
-
-if (ANDROID_API)
- build_library(hicn-light-ctrl
- STATIC
- SOURCES ${SOURCE_FILES}
- COMPONENT ${LIBHICN_LIGHT}
- LINK_LIBRARIES ${HICN_LIGHT_LINK_LIBRARIES}
- DEPENDS ${LIBHICN_LIGHT}
- )
-else ()
- build_library(hicn-light-ctrl
- STATIC SHARED
- SOURCES ${SOURCE_FILES}
- COMPONENT ${LIBHICN_LIGHT}
- LINK_LIBRARIES ${HICN_LIGHT_LINK_LIBRARIES}
- DEPENDS ${LIBHICN_LIGHT}
- )
-endif () \ No newline at end of file
diff --git a/hicn-light/src/hicn/api/api.c b/hicn-light/src/hicn/api/api.c
deleted file mode 100644
index e139734f5..000000000
--- a/hicn-light/src/hicn/api/api.c
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * \file api.c
- * \brief Implementation of hICN control library API
- */
-
-#include <assert.h> // assert
-#include <fcntl.h> // fcntl
-#include <math.h> // log2
-#include <string.h> // memmove, strncpy, strcasecmp
-#include <sys/socket.h> // socket
-#include <unistd.h> // close, fcntl
-
-#include <stdio.h> // XXX debug
-
-#ifndef bzero
-#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
-#endif
-
-
-#include <hicn/api/api.h>
-#include <hicn/api/commands.h>
-#include <hicn/api/ip_address.h>
-#include <hicn/api/token.h>
-
-#define PORT 9695
-
-#define LIBHICNCTRL_SUCCESS 1
-#define LIBHICNCTRL_FAILURE -1
-#define LIBHICNCTRL_IS_ERROR(x) (x < 0)
-
-/*
- * list was working with all seq set to 0, but it seems hicnLightControl uses
- * 1, and replies with the same seqno
- */
-#define HICN_CTRL_SEND_SEQ_INIT 1
-#define HICN_CTRL_RECV_SEQ_INIT 1
-
-#define MAX(x, y) ((x > y) ? x : y)
-
-#if 0
-static inline u32 log2(const u32 x) {
- u32 y;
- asm ( "\tbsr %1, %0\n"
- : "=r"(y)
- : "r" (x)
- );
- return y;
-}
-#endif
-
-/**
- * \brief Defines the default size for the allocated data arrays holding the
- * results of API calls.
- *
- * This size should not be too small to avoid wasting memoyy, but also not too
- * big to avoid unnecessary realloc's. Later on this size is doubled at each
- * reallocation.
- */
-#define DEFAULT_SIZE_LOG 3
-
-/**
- * In practise, we want to preserve enough room to store a full packet of
- * average expected size (say a header + N payload elements).
- */
-#define AVG_ELEMENTS (1 << DEFAULT_SIZE_LOG)
-#define AVG_BUFLEN \
- sizeof(hc_msg_header_t) + AVG_ELEMENTS * sizeof(hc_msg_payload_t)
-
-/*
- * We should at least have buffer space allowing to store one processable unit
- * of data, either the header of the maximum possible payload
- */
-#define MIN_BUFLEN MAX(sizeof(hc_msg_header_t), sizeof(hc_msg_payload_t))
-
-static const struct in6_addr loopback_addr = IN6ADDR_LOOPBACK_INIT;
-
-/* /!\ Please update constants in header file upon changes */
-const char *connection_type_str[] = {
-#define _(x) [CONNECTION_TYPE_##x] = STRINGIZE(x),
- foreach_connection_type
-#undef _
-};
-
-#define IS_VALID_CONNECTION_TYPE(x) IS_VALID_ENUM_TYPE(CONNECTION_TYPE, x)
-
-hc_connection_type_t connection_type_from_str(const char *str) {
- if (strcasecmp(str, "TCP") == 0)
- return CONNECTION_TYPE_TCP;
- else if (strcasecmp(str, "UDP") == 0)
- return CONNECTION_TYPE_UDP;
- else if (strcasecmp(str, "HICN") == 0)
- return CONNECTION_TYPE_HICN;
- else
- return CONNECTION_TYPE_UNDEFINED;
-}
-
-/*
- * Mandatory conversions to shield lib user from heterogeneity
- */
-
-#define IS_VALID_LIST_CONNECTIONS_TYPE(x) ((x >= CONN_GRE) && (x <= CONN_HICN))
-
-static const hc_connection_type_t map_from_list_connections_type[] = {
- [CONN_GRE] = CONNECTION_TYPE_UNDEFINED,
- [CONN_TCP] = CONNECTION_TYPE_TCP,
- [CONN_UDP] = CONNECTION_TYPE_UDP,
- [CONN_MULTICAST] = CONNECTION_TYPE_UNDEFINED,
- [CONN_L2] = CONNECTION_TYPE_UNDEFINED,
- [CONN_HICN] = CONNECTION_TYPE_HICN,
-};
-
-typedef enum {
- ENCAP_TCP,
- ENCAP_UDP,
- ENCAP_ETHER,
- ENCAP_LOCAL,
- ENCAP_HICN
-} EncapType;
-
-#define IS_VALID_LIST_LISTENERS_TYPE(x) ((x >= ENCAP_TCP) && (x <= ENCAP_HICN))
-
-static const hc_connection_type_t map_from_encap_type[] = {
- [ENCAP_TCP] = CONNECTION_TYPE_TCP,
- [ENCAP_UDP] = CONNECTION_TYPE_UDP,
- [ENCAP_ETHER] = CONNECTION_TYPE_UNDEFINED,
- [ENCAP_LOCAL] = CONNECTION_TYPE_UNDEFINED,
- [ENCAP_HICN] = CONNECTION_TYPE_HICN,
-};
-
-static const connection_type map_to_connection_type[] = {
- [CONNECTION_TYPE_TCP] = TCP_CONN,
- [CONNECTION_TYPE_UDP] = UDP_CONN,
- [CONNECTION_TYPE_HICN] = HICN_CONN,
-};
-
-static const listener_mode map_to_listener_mode[] = {
- [CONNECTION_TYPE_TCP] = IP_MODE,
- [CONNECTION_TYPE_UDP] = IP_MODE,
- [CONNECTION_TYPE_HICN] = HICN_MODE,
-};
-
-#define IS_VALID_LIST_CONNECTIONS_STATE(x) \
- ((x >= IFACE_UP) && (x <= IFACE_UNKNOWN))
-
-/* /!\ Please update constants in header file upon changes */
-const char *connection_state_str[] = {
-#define _(x) [CONNECTION_STATE_##x] = STRINGIZE(x),
- foreach_connection_state
-#undef _
-};
-
-/*
-#define IS_VALID_CONNECTION_STATE(x) IS_VALID_ENUM_TYPE(CONNECTION_STATE, x)
-
-static const connection_state map_to_connection_state[] = {
- [CONNECTION_STATE_UP] = IFACE_UP,
- [CONNECTION_STATE_DOWN] = IFACE_DOWN,
-};
-
-*/
-
-static const hc_connection_state_t map_from_list_connections_state[] = {
- [IFACE_UP] = CONNECTION_STATE_UP,
- [IFACE_DOWN] = CONNECTION_STATE_DOWN,
- [IFACE_UNKNOWN] = CONNECTION_STATE_UNDEFINED,
-};
-
-#define IS_VALID_ADDR_TYPE(x) ((x >= ADDR_INET) && (x <= ADDR_UNIX))
-
-static const int map_from_addr_type[] = {
- [ADDR_INET] = AF_INET, [ADDR_INET6] = AF_INET6, [ADDR_LINK] = AF_UNSPEC,
- [ADDR_IFACE] = AF_UNSPEC, [ADDR_UNIX] = AF_UNSPEC,
-};
-
-static const address_type map_to_addr_type[] = {
- [AF_INET] = ADDR_INET,
- [AF_INET6] = ADDR_INET6,
-};
-
-/******************************************************************************
- * Message helper types and aliases
- ******************************************************************************/
-
-#define foreach_hc_command \
- _(add_listener) \
- _(add_connection) \
- _(list_connections) \
- _(add_route) \
- _(list_routes) \
- _(remove_connection) \
- _(remove_route) \
- _(cache_store) \
- _(cache_serve) \
- /*_(cache_clear) */ \
- _(set_strategy) \
- _(set_wldr) \
- _(add_punting) \
- _(list_listeners) \
- _(mapme_activator) \
- _(mapme_timing)
-
-typedef header_control_message hc_msg_header_t;
-
-typedef union {
-#define _(x) x##_command x;
- foreach_hc_command
-#undef _
-} hc_msg_payload_t;
-
-typedef struct hc_msg_s {
- hc_msg_header_t hdr;
- hc_msg_payload_t payload;
-} hc_msg_t;
-
-/******************************************************************************
- * Control Data
- ******************************************************************************/
-
-hc_data_t *hc_data_create(size_t in_element_size, size_t out_element_size) {
- hc_data_t *data = malloc(sizeof(hc_data_t));
- if (!data) goto ERR_MALLOC;
-
- /* FIXME Could be NULL thanks to realloc provided size is 0 */
- data->max_size_log = DEFAULT_SIZE_LOG;
- data->in_element_size = in_element_size;
- data->out_element_size = out_element_size;
- data->size = 0;
- data->complete = 0;
- data->command_id = 0; // TODO this could also be a busy mark in the socket
- /* No callback needed in blocking code for instance */
- data->complete_cb = NULL;
-
- data->buffer = malloc((1 << data->max_size_log) * data->out_element_size);
- if (!data->buffer) goto ERR_BUFFER;
-
- return data;
-
-ERR_BUFFER:
- free(data);
-ERR_MALLOC:
- return NULL;
-}
-
-void hc_data_free(hc_data_t *data) {
- if (data->buffer) free(data->buffer);
- free(data);
-}
-
-int hc_data_ensure_available(hc_data_t *data, size_t count) {
- size_t new_size_log =
- (data->size + count - 1 > 0) ? log2(data->size + count - 1) + 1 : 0;
- if (new_size_log > data->max_size_log) {
- data->max_size_log = new_size_log;
- data->buffer =
- realloc(data->buffer, (1 << new_size_log) * data->out_element_size);
- if (!data->buffer) return LIBHICNCTRL_FAILURE;
- }
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_data_push_many(hc_data_t *data, const void *elements, size_t count) {
- if (hc_data_ensure_available(data, count) < 0) return LIBHICNCTRL_FAILURE;
-
- memcpy(data->buffer + data->size * data->out_element_size, elements,
- count * data->out_element_size);
- data->size += count;
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_data_push(hc_data_t *data, const void *element) {
- return hc_data_push_many(data, element, 1);
-}
-
-/**
- *
- * NOTE: This function make sure there is enough room available in the data
- * structure.
- */
-u8 *hc_data_get_next(hc_data_t *data) {
- if (hc_data_ensure_available(data, 1) < 0) return NULL;
-
- return data->buffer + data->size * data->out_element_size;
-}
-
-int hc_data_set_callback(hc_data_t *data, data_callback_t cb, void *cb_data) {
- data->complete_cb = cb;
- data->complete_cb_data = cb_data;
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_data_set_complete(hc_data_t *data) {
- data->complete = true;
- if (data->complete_cb) return data->complete_cb(data, data->complete_cb_data);
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_data_reset(hc_data_t *data) {
- data->size = 0;
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_data_find(hc_data_t *data, const void *element, cmp_t cmp,
- void **found) {
- foreach_type(u8, x, data) {
- if (cmp(x, element) == 0) {
- *found = x;
- return LIBHICNCTRL_SUCCESS;
- }
- };
- *found = NULL; /* this is optional */
- return LIBHICNCTRL_SUCCESS;
-}
-
-/******************************************************************************
- * Control socket
- ******************************************************************************/
-
-/**
- * \brief Parse a connection URL into a sockaddr
- * \param [in] url - URL
- * \param [out] sa - Resulting struct sockaddr, expected zero'ed.
- * \return 0 if parsing succeeded, a negative error value otherwise.
- */
-int hc_sock_parse_url(const char *url, struct sockaddr *sa) {
- /* FIXME URL parsing is currently not implemented */
- assert(!url);
-
- /*
- * A temporary solution is to inspect the sa_family fields of the passed in
- * sockaddr, which defaults to AF_UNSPEC (0) and thus creates an IPv4/TCP
- * connection to localhost.
- */
- switch (sa->sa_family) {
- case AF_UNSPEC:
- case AF_INET: {
- struct sockaddr_in *sai = (struct sockaddr_in *)sa;
- sai->sin_family = AF_INET;
- sai->sin_port = htons(PORT);
- sai->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- break;
- }
- case AF_INET6: {
- struct sockaddr_in6 *sai6 = (struct sockaddr_in6 *)sa;
- sai6->sin6_family = AF_INET6;
- sai6->sin6_port = htons(PORT);
- sai6->sin6_addr = loopback_addr;
- break;
- }
- default:
- return LIBHICNCTRL_FAILURE;
- }
-
- return LIBHICNCTRL_SUCCESS;
-}
-
-hc_sock_t *hc_sock_create_url(const char *url) {
- hc_sock_t *s = malloc(sizeof(hc_sock_t));
- if (!s) goto ERR_MALLOC;
-
- s->url = url ? strdup(url) : NULL;
-
- s->fd = socket(AF_INET, SOCK_STREAM, 0);
- if (s->fd < 0) goto ERR_SOCKET;
-
- if (hc_sock_reset(s) < 0) goto ERR_RESET;
-
- return s;
-
-ERR_RESET:
- close(s->fd);
-ERR_SOCKET:
- free(s);
-ERR_MALLOC:
- return NULL;
-}
-
-hc_sock_t *hc_sock_create(void) { return hc_sock_create_url(NULL); }
-
-void hc_sock_free(hc_sock_t *s) {
- if (s->url) free(s->url);
- close(s->fd);
- free(s);
-}
-
-int hc_sock_set_nonblocking(hc_sock_t *s) {
- return (fcntl(s->fd, F_SETFL, fcntl(s->fd, F_GETFL) | O_NONBLOCK) < 0);
-}
-
-int hc_sock_connect(hc_sock_t *s) {
- struct sockaddr_storage ss = {0};
-
- if (hc_sock_parse_url(s->url, (struct sockaddr *)&ss) < 0) goto ERR_PARSE;
-
- size_t size = ss.ss_family == AF_INET ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6);
- if (connect(s->fd, (struct sockaddr *)&ss, size) <
- 0) // sizeof(struct sockaddr)) < 0)
- goto ERR_CONNECT;
-
- return LIBHICNCTRL_SUCCESS;
-
-ERR_CONNECT:
-ERR_PARSE:
- return LIBHICNCTRL_FAILURE;
-}
-
-int hc_sock_send(hc_sock_t *s, hc_msg_t *msg, size_t msglen) {
- return send(s->fd, msg, msglen, 0);
-}
-
-int hc_sock_get_available(hc_sock_t *s, u8 **buffer, size_t *size) {
- *buffer = s->buf + s->woff;
- *size = RECV_BUFLEN - s->woff;
-
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_sock_recv(hc_sock_t *s, hc_data_t *data) {
- int rc;
-
- /*
- * This condition should be ensured to guarantee correct processing of
- * messages
- */
- assert(RECV_BUFLEN - s->woff > MIN_BUFLEN);
-
- rc = recv(s->fd, s->buf + s->woff, RECV_BUFLEN - s->woff, 0);
- if (rc == 0) {
- printf("connection closed\n");
- return LIBHICNCTRL_FAILURE;
- /* Connection has been closed */
- // XXX
- }
- if (rc < 0) {
- /* Error occurred */
- printf("error occurred\n");
- // XXX check for EWOULDBLOCK;
- // XXX
- return LIBHICNCTRL_FAILURE;
- }
- s->woff += rc;
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_sock_process(hc_sock_t *s, hc_data_t *data,
- int (*parse)(const u8 *src, u8 *dst)) {
- int err = 0;
-
- /* We must have received at least one byte */
- size_t available = s->woff - s->roff;
-
- while (available > 0) {
- if (s->remaining == 0) {
- hc_msg_t *msg = (hc_msg_t *)(s->buf + s->roff);
-
- /* We expect a message header */
- if (available < sizeof(hc_msg_header_t)) break;
-
- /* Sanity checks (might instead raise warnings) */
- // TODO: sync check ?
- assert((msg->hdr.messageType == RESPONSE_LIGHT) ||
- (msg->hdr.messageType == ACK_LIGHT) ||
- (msg->hdr.messageType == NACK_LIGHT));
- // assert(msg->hdr.commandID == data->command_id); // FIXME
- assert(msg->hdr.seqNum == s->recv_seq++);
-
- s->remaining = msg->hdr.length;
- if (s->remaining == 0) {
- /*
- * The protocol expects all sequence number to be reset after
- * each transaction. We reset before running the callback in
- * case it triggers new exchanges.
- */
- s->send_seq = HICN_CTRL_SEND_SEQ_INIT;
- s->recv_seq = HICN_CTRL_RECV_SEQ_INIT;
-
- // TODO : check before even sending ?
- /* Complete message without payload */
- // TODO : is this correct ? no error code ?
- hc_data_set_complete(data);
- }
-
- available -= sizeof(hc_msg_header_t);
- s->roff += sizeof(hc_msg_header_t);
- } else {
- /* We expect the complete payload, or at least a chunk of it */
- size_t num_chunks = available / data->in_element_size;
- if (num_chunks == 0) break;
- if (num_chunks > s->remaining) num_chunks = s->remaining;
-
- if (!parse) {
- hc_data_push_many(data, s->buf + s->roff, num_chunks);
- } else {
- int rc;
- rc = hc_data_ensure_available(data, num_chunks);
- if (rc < 0) return LIBHICNCTRL_FAILURE;
- for (int i = 0; i < num_chunks; i++) {
- u8 *dst = hc_data_get_next(data);
- if (!dst) return LIBHICNCTRL_FAILURE;
-
- rc = parse(s->buf + s->roff + i * data->in_element_size, dst);
- if (rc < 0) err = -1; /* FIXME we let the loop complete (?) */
- data->size++;
- }
- }
-
- s->remaining -= num_chunks;
- if (s->remaining == 0) {
- /*
- * The protocol expects all sequence number to be reset after
- * each transaction. We reset before running the callback in
- * case it triggers new exchanges.
- */
- s->send_seq = HICN_CTRL_SEND_SEQ_INIT;
- s->recv_seq = HICN_CTRL_RECV_SEQ_INIT;
-
- hc_data_set_complete(data);
- }
-
- available -= num_chunks * data->in_element_size;
- s->roff += num_chunks * data->in_element_size;
- }
- }
-
- /* Make sure there is enough remaining space in the buffer */
- if (RECV_BUFLEN - s->woff < AVG_BUFLEN) {
- /*
- * There should be no overlap provided a sufficiently large BUFLEN, but
- * who knows.
- */
- memmove(s->buf, s->buf + s->roff, s->woff - s->roff);
- s->woff -= s->roff;
- s->roff = 0;
- }
-
- return err;
-}
-
-int hc_sock_reset(hc_sock_t *s) {
- s->roff = s->woff = 0;
- s->send_seq = HICN_CTRL_SEND_SEQ_INIT;
- s->recv_seq = HICN_CTRL_RECV_SEQ_INIT;
- s->remaining = 0;
- return LIBHICNCTRL_SUCCESS;
-}
-
-/******************************************************************************
- * Command-specific structures and functions
- ******************************************************************************/
-
-typedef int (*HC_PARSE)(const u8 *, u8 *);
-
-typedef struct {
- hc_action_t cmd;
- command_id cmd_id;
- size_t size_in;
- size_t size_out;
- HC_PARSE parse;
-} hc_command_params_t;
-
-int hc_execute_command(hc_sock_t *s, hc_msg_t *msg, size_t msg_len,
- hc_command_params_t *params, hc_data_t **pdata) {
- /* Sanity check */
- switch (params->cmd) {
- case ACTION_CREATE:
- assert(params->size_in != 0); /* payload repeated */
- assert(params->size_out == 0);
- assert(params->parse == NULL);
- break;
- case ACTION_DELETE:
- assert(params->size_in != 0); /* payload repeated */
- assert(params->size_out == 0);
- assert(params->parse == NULL);
- break;
- case ACTION_LIST:
- assert(params->size_in != 0);
- assert(params->size_out != 0);
- assert(params->parse != NULL);
- break;
- case ACTION_SET:
- assert(params->size_in != 0);
- assert(params->size_out == 0);
- assert(params->parse == NULL);
- break;
- default:
- return LIBHICNCTRL_FAILURE;
- }
-
- hc_sock_reset(s);
-
- /* XXX data will at least store the result (complete) */
- hc_data_t *data = hc_data_create(params->size_in, params->size_out);
- if (!data) goto ERR_DATA;
-
- hc_sock_send(s, msg, msg_len);
- while (!data->complete) {
- if (hc_sock_recv(s, data) < 0) break;
- // XXX XXX XXX Process data with no resut !!!! XXX XXX XXX
- // XXX just return code
- // we are receiving the exact same message we have sent with a ACK
- // or NACK instead of the command !
- if (hc_sock_process(s, data, params->parse) < 0) {
- // ERROR PROCESSING... RESET ? XXX
- goto ERR_PROCESS;
- }
- }
-
- if (pdata) *pdata = data;
-
- return LIBHICNCTRL_SUCCESS;
-
-ERR_PROCESS:
- free(data);
-ERR_DATA:
- return LIBHICNCTRL_FAILURE;
-}
-
-/* /!\ Please update constants in header file upon changes */
-size_t hc_url_snprintf(char *s, size_t size, int family,
- ip_address_t *ip_address, u16 port) {
- char *cur = s;
- int rc;
-
- /* Other address are currently not supported */
- assert(IS_VALID_FAMILY(family));
-
- rc = snprintf(cur, s + size - cur, "inet%c://",
- (family == AF_INET) ? '4' : '6');
- if (rc < 0) return rc;
- cur += rc;
- if (size != 0 && cur >= s + size) return cur - s;
-
- rc = ip_address_snprintf(cur, s + size - cur, ip_address, family);
- if (rc < 0) return rc;
- cur += rc;
- if (size != 0 && cur >= s + size) return cur - s;
-
- rc = snprintf(cur, s + size - cur, ":");
- if (rc < 0) return rc;
- cur += rc;
- if (size != 0 && cur >= s + size) return cur - s;
-
- rc = snprintf(cur, s + size - cur, "%d", port);
- if (rc < 0) return rc;
- cur += rc;
- if (size != 0 && cur >= s + size) return cur - s;
-
- return cur - s;
-}
-
-/*----------------------------------------------------------------------------*
- * Listeners
- *----------------------------------------------------------------------------*/
-
-int hc_parse_listener(void *in, hc_listener_t *listener) {
- list_listeners_command *cmd = (list_listeners_command *)in;
-
- if (!IS_VALID_LIST_LISTENERS_TYPE(cmd->encapType)) return LIBHICNCTRL_FAILURE;
-
- hc_connection_type_t type = map_from_encap_type[cmd->encapType];
- if (type == CONNECTION_TYPE_UNDEFINED) return LIBHICNCTRL_FAILURE;
-
- if (!IS_VALID_ADDR_TYPE(cmd->addressType)) return LIBHICNCTRL_FAILURE;
-
- int family = map_from_addr_type[cmd->addressType];
- if (!IS_VALID_FAMILY(family)) return LIBHICNCTRL_FAILURE;
-
- *listener = (hc_listener_t){
- .conn_id = cmd->connid,
- .type = type,
- .family = family,
- .local_addr = UNION_CAST(cmd->address, ip_address_t),
- .local_port = ntohs(cmd->port),
- };
- bzero(listener->name, NAME_LEN);
- return LIBHICNCTRL_SUCCESS;
-}
-
-typedef struct {
- header_control_message hdr;
- add_listener_command payload;
-} hc_msg_listener_add_t;
-
-int hc_listener_create(hc_sock_t *s, hc_listener_t *listener) {
- if (!IS_VALID_FAMILY(listener->family)) return LIBHICNCTRL_FAILURE;
-
- if (!IS_VALID_CONNECTION_TYPE(listener->type)) return LIBHICNCTRL_FAILURE;
-
- hc_msg_listener_add_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = ADD_LISTENER,
- .length = 1,
- .seqNum = s->send_seq,
- },
- .payload = {
- .address =
- {
- .ipv6 = listener->local_addr.v6.as_in6addr,
- },
- .port = htons(listener->local_port),
- .addressType = (u8)map_to_addr_type[listener->family],
- .listenerMode = (u8)map_to_listener_mode[listener->type],
- .connectionType = (u8)map_to_connection_type[listener->type],
- }};
- strncpy(msg.payload.symbolic, listener->name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_CREATE,
- .cmd_id = ADD_LISTENER,
- .size_in = sizeof(add_listener_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
-} hc_msg_listener_list_t;
-
-int hc_listener_list(hc_sock_t *s, hc_data_t **pdata) {
- hc_msg_listener_list_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = LIST_LISTENERS,
- .length = 0,
- .seqNum = s->send_seq,
- },
- };
-
- hc_command_params_t params = {
- .cmd = ACTION_LIST,
- .cmd_id = LIST_LISTENERS,
- .size_in = sizeof(list_listeners_command),
- .size_out = sizeof(hc_listener_t),
- .parse = (HC_PARSE)hc_parse_listener,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, pdata);
-}
-
-int hc_listener_cmp(const hc_listener_t *l1, const hc_listener_t *l2) {
- return ((l1->type == l2->type) && (l1->family == l2->family) &&
- (memcmp(&l1->local_addr, &l2->local_addr, sizeof(ip_address_t))) &&
- (l1->local_port == l2->local_port))
- ? LIBHICNCTRL_SUCCESS
- : LIBHICNCTRL_FAILURE;
-}
-
-/* /!\ Please update constants in header file upon changes */
-size_t hc_listener_snprintf(char *s, size_t size, hc_listener_t *listener) {
- char local[MAXSZ_HC_URL];
- int rc;
-
- rc = hc_url_snprintf(local, MAXSZ_HC_URL, listener->family,
- &listener->local_addr, listener->local_port);
- if (rc < 0) return rc;
-
- return snprintf(s, size, "%s %s", local, connection_type_str[listener->type]);
-}
-
-/*----------------------------------------------------------------------------*
- * Connections
- *----------------------------------------------------------------------------*/
-
-int hc_parse_connection(void *in, hc_connection_t *connection) {
- list_connections_command *cmd = (list_connections_command *)in;
-
- if (!IS_VALID_LIST_CONNECTIONS_TYPE(cmd->connectionData.connectionType))
- return LIBHICNCTRL_FAILURE;
-
- hc_connection_type_t type =
- map_from_list_connections_type[cmd->connectionData.connectionType];
- if (type == CONNECTION_TYPE_UNDEFINED) return LIBHICNCTRL_FAILURE;
-
- if (!IS_VALID_LIST_CONNECTIONS_STATE(cmd->state)) return LIBHICNCTRL_FAILURE;
-
- hc_connection_state_t state = map_from_list_connections_state[cmd->state];
- if (state == CONNECTION_STATE_UNDEFINED) return LIBHICNCTRL_FAILURE;
-
- if (!IS_VALID_ADDR_TYPE(cmd->connectionData.ipType))
- return LIBHICNCTRL_FAILURE;
-
- int family = map_from_addr_type[cmd->connectionData.ipType];
- if (!IS_VALID_FAMILY(family)) return LIBHICNCTRL_FAILURE;
-
- *connection = (hc_connection_t){
- .id = cmd->connid,
- .type = type,
- .family = family,
- .local_addr = UNION_CAST(cmd->connectionData.localIp, ip_address_t),
- .local_port = ntohs(cmd->connectionData.localPort),
- .remote_addr = UNION_CAST(cmd->connectionData.remoteIp, ip_address_t),
- .remote_port = ntohs(cmd->connectionData.remotePort),
- .admin_state = cmd->connectionData.admin_state,
- .state = state,
- };
- strncpy(connection->name, cmd->connectionData.symbolic, NAME_LEN);
- return LIBHICNCTRL_SUCCESS;
-}
-
-typedef struct {
- header_control_message hdr;
- add_connection_command payload;
-} hc_msg_connection_add_t;
-
-int hc_connection_create(hc_sock_t *s, hc_connection_t *connection) {
- if (!IS_VALID_FAMILY(connection->family)) return LIBHICNCTRL_FAILURE;
-
- if (!IS_VALID_CONNECTION_TYPE(connection->type)) return LIBHICNCTRL_FAILURE;
-
- /* TODO assert both local and remote have the right family */
-
- hc_msg_connection_add_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = ADD_CONNECTION,
- .length = 1,
- .seqNum = s->send_seq,
- },
- .payload = {
- /* we use IPv6 which is the longest address */
- .remoteIp.ipv6 = connection->remote_addr.v6.as_in6addr,
- .localIp.ipv6 = connection->local_addr.v6.as_in6addr,
- .remotePort = htons(connection->remote_port),
- .localPort = htons(connection->local_port),
- .ipType = (u8)map_to_addr_type[connection->family],
- .admin_state = connection->admin_state,
- .connectionType = (u8)map_to_connection_type[connection->type],
- }};
- strncpy(msg.payload.symbolic, connection->name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_CREATE,
- .cmd_id = ADD_CONNECTION,
- .size_in = sizeof(add_connection_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
- remove_connection_command payload;
-} hc_msg_connection_remove_t;
-
-int hc_connection_delete(hc_sock_t *s, hc_connection_t *connection) {
- hc_msg_connection_remove_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = REMOVE_CONNECTION,
- .length = 1,
- .seqNum = s->send_seq,
- },
- };
- strncpy(msg.payload.symbolicOrConnid, connection->name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_DELETE,
- .cmd_id = REMOVE_CONNECTION,
- .size_in = sizeof(remove_connection_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
- connection_set_admin_state_command payload;
-} hc_msg_connection_set_admin_state_t;
-
-int hc_connection_set_admin_state(hc_sock_t *s, const char *conn_id_or_name,
- hc_connection_state_t admin_state) {
- hc_msg_connection_set_admin_state_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = CONNECTION_SET_ADMIN_STATE,
- .length = 1,
- .seqNum = s->send_seq,
- },
- .payload =
- {
- .admin_state = admin_state,
- },
- };
- strncpy(msg.payload.symbolicOrConnid, conn_id_or_name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_SET,
- .cmd_id = CONNECTION_SET_ADMIN_STATE,
- .size_in = sizeof(connection_set_admin_state_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
-} hc_msg_connection_list_t;
-
-int hc_connection_list(hc_sock_t *s, hc_data_t **pdata) {
- hc_msg_connection_list_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = LIST_CONNECTIONS,
- .length = 0,
- .seqNum = s->send_seq,
- },
- };
-
- hc_command_params_t params = {
- .cmd = ACTION_LIST,
- .cmd_id = LIST_CONNECTIONS,
- .size_in = sizeof(list_connections_command),
- .size_out = sizeof(hc_connection_t),
- .parse = (HC_PARSE)hc_parse_connection,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, pdata);
-}
-
-/* /!\ Please update constants in header file upon changes */
-size_t hc_connection_snprintf(char *s, size_t size,
- hc_connection_t *connection) {
- char local[MAXSZ_HC_URL];
- char remote[MAXSZ_HC_URL];
- int rc;
-
- // assert(connection->connection_state)
-
- rc = hc_url_snprintf(local, MAXSZ_HC_URL, connection->family,
- &connection->local_addr, connection->local_port);
- if (rc < 0) return rc;
- rc = hc_url_snprintf(remote, MAXSZ_HC_URL, connection->family,
- &connection->remote_addr, connection->remote_port);
- if (rc < 0) return rc;
-
- return snprintf(s, size, "%s %s %s %s",
- connection_state_str[connection->state], local, remote,
- connection_type_str[connection->type]);
-}
-
-/*----------------------------------------------------------------------------*
- * Routes
- *----------------------------------------------------------------------------*/
-
-int hc_parse_route(void *in, hc_route_t *route) {
- list_routes_command *cmd = (list_routes_command *)in;
-
- if (!IS_VALID_ADDR_TYPE(cmd->addressType)) return LIBHICNCTRL_FAILURE;
-
- int family = map_from_addr_type[cmd->addressType];
- if (!IS_VALID_FAMILY(family)) return LIBHICNCTRL_FAILURE;
-
- *route = (hc_route_t){
- .conn_id = cmd->connid,
- .family = family,
- .remote_addr = UNION_CAST(cmd->address, ip_address_t),
- .len = cmd->len,
- .cost = cmd->cost,
- };
- bzero(route->conn_name, NAME_LEN);
- return LIBHICNCTRL_SUCCESS;
-}
-
-typedef struct {
- header_control_message hdr;
- add_route_command payload;
-} hc_msg_route_add_t;
-
-int hc_route_create(hc_sock_t *s, hc_route_t *route) {
- if (!IS_VALID_FAMILY(route->family)) return LIBHICNCTRL_FAILURE;
-
- hc_msg_route_add_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = ADD_ROUTE,
- .length = 1,
- .seqNum = s->send_seq,
- },
- .payload = {
- /* we use IPv6 which is the longest address */
- .address.ipv6 = route->remote_addr.v6.as_in6addr,
- .cost = route->cost,
- .addressType = (u8)map_to_addr_type[route->family],
- .len = route->len,
- }};
- strncpy(msg.payload.symbolicOrConnid, route->conn_name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_CREATE,
- .cmd_id = ADD_ROUTE,
- .size_in = sizeof(add_route_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
- remove_route_command payload;
-} hc_msg_route_remove_t;
-
-int hc_route_delete(hc_sock_t *s, hc_route_t *route) {
- if (!IS_VALID_FAMILY(route->family)) return LIBHICNCTRL_FAILURE;
-
- hc_msg_route_remove_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = REMOVE_ROUTE,
- .length = 1,
- .seqNum = s->send_seq,
- },
- .payload = {
- /* we use IPv6 which is the longest address */
- .address.ipv6 = route->remote_addr.v6.as_in6addr,
- .addressType = (u8)map_to_addr_type[route->family],
- .len = route->len,
- }};
- strncpy(msg.payload.symbolicOrConnid, route->conn_name, NAME_LEN);
-
- hc_command_params_t params = {
- .cmd = ACTION_DELETE,
- .cmd_id = REMOVE_ROUTE,
- .size_in = sizeof(remove_route_command),
- .size_out = 0,
- .parse = NULL,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, NULL);
-}
-
-typedef struct {
- header_control_message hdr;
-} hc_msg_route_list_t;
-
-int hc_route_list(hc_sock_t *s, hc_data_t **pdata) {
- hc_msg_route_list_t msg = {
- .hdr =
- {
- .messageType = REQUEST_LIGHT,
- .commandID = LIST_ROUTES,
- .length = 0,
- .seqNum = s->send_seq,
- },
- };
-
- hc_command_params_t params = {
- .cmd = ACTION_LIST,
- .cmd_id = LIST_ROUTES,
- .size_in = sizeof(list_routes_command),
- .size_out = sizeof(hc_route_t),
- .parse = (HC_PARSE)hc_parse_route,
- };
-
- return hc_execute_command(s, (hc_msg_t *)&msg, sizeof(msg), &params, pdata);
-}
-
-/* /!\ Please update constants in header file upon changes */
-size_t hc_route_snprintf(char *s, size_t size, hc_route_t *route) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------*
- * Face
- *----------------------------------------------------------------------------*/
-
-int hc_face_to_listener(const hc_face_t *face, hc_listener_t *listener) {
- const face_t *f = &face->face;
-
- switch (f->type) {
- case FACE_TYPE_HICN_LISTENER:
- break;
- case FACE_TYPE_TCP_LISTENER:
- break;
- case FACE_TYPE_UDP_LISTENER:
- break;
- default:
- return LIBHICNCTRL_FAILURE;
- }
- return LIBHICNCTRL_FAILURE; /* Not implemented */
-}
-
-int hc_face_to_connection(const hc_face_t *face, hc_connection_t *connection) {
- const face_t *f = &face->face;
-
- switch (f->type) {
- case FACE_TYPE_HICN:
- /* FIXME truncations, collisions, ... */
- *connection = (hc_connection_t){
- .type = CONNECTION_TYPE_HICN,
- .family = f->hicn.family,
- .local_addr = f->hicn.local_addr,
- .local_port = 0,
- .remote_addr = f->hicn.remote_addr,
- .remote_port = 0,
- };
- snprintf(connection->name, NAME_LEN, "%s", f->hicn.netdevice.name);
- break;
- case FACE_TYPE_TCP:
- *connection = (hc_connection_t){
- .type = CONNECTION_TYPE_TCP,
- .family = f->hicn.family,
- .local_addr = f->tunnel.local_addr,
- .local_port = f->tunnel.local_port,
- .remote_addr = f->tunnel.remote_addr,
- .remote_port = f->tunnel.remote_port,
- };
-#ifdef __APPLE__
- snprintf(connection->name, NAME_LEN, "tcp%d", arc4random() & 0xFF);
-#else
- snprintf(connection->name, NAME_LEN, "tcp%ld", random() & 0xFF);
-#endif
- break;
- case FACE_TYPE_UDP:
- *connection = (hc_connection_t){
- .type = CONNECTION_TYPE_UDP,
- .family = AF_INET,
- .local_addr = f->tunnel.local_addr,
- .local_port = f->tunnel.local_port,
- .remote_addr = f->tunnel.remote_addr,
- .remote_port = f->tunnel.remote_port,
- };
-#ifdef __APPLE__
- snprintf(connection->name, NAME_LEN, "udp%d", arc4random() & 0xFF);
-#else
- snprintf(connection->name, NAME_LEN, "udp%ld", random() & 0xFF);
-#endif
- printf("Created f %s !\n", connection->name);
- break;
- default:
- return LIBHICNCTRL_FAILURE;
- }
-
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_connection_to_face(const hc_connection_t *connection, hc_face_t *face) {
- switch (connection->type) {
- case CONNECTION_TYPE_TCP:
- *face = (hc_face_t){
- .id = connection->id,
- .face =
- {
- .type = FACE_TYPE_TCP,
- .tunnel =
- {
- .family = connection->family,
- .local_addr = connection->local_addr,
- .local_port = connection->local_port,
- .remote_addr = connection->remote_addr,
- .remote_port = connection->remote_port,
- },
- },
- };
- break;
- case CONNECTION_TYPE_UDP:
- *face = (hc_face_t){
- .id = connection->id,
- .face =
- {
- .type = FACE_TYPE_UDP,
- .tunnel =
- {
- .family = connection->family,
- .local_addr = connection->local_addr,
- .local_port = connection->local_port,
- .remote_addr = connection->remote_addr,
- .remote_port = connection->remote_port,
- },
- },
- };
- break;
- case CONNECTION_TYPE_HICN:
- *face = (hc_face_t){
- .id = connection->id,
- .face =
- {
- .type = FACE_TYPE_HICN,
- .hicn =
- {
- .family = connection->family,
- .netdevice.index = NETDEVICE_UNDEFINED_INDEX, // XXX
- .local_addr = connection->local_addr,
- .remote_addr = connection->remote_addr,
- },
- },
- };
- break;
- default:
- return LIBHICNCTRL_FAILURE;
- }
- strncpy(face->name, connection->name, NAME_LEN);
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_connection_to_local_listener(const hc_connection_t *connection,
- hc_listener_t *listener) {
- *listener = (hc_listener_t){
- .conn_id = ~0,
- .type = connection->type,
- .family = connection->family,
- .local_addr = connection->local_addr,
- .local_port = connection->local_port,
- };
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_face_create(hc_sock_t *s, hc_face_t *face) {
- hc_connection_t connection;
- hc_data_t *listeners;
- hc_listener_t listener;
- hc_listener_t *found;
-
- switch (face->face.type) {
- case FACE_TYPE_HICN:
- case FACE_TYPE_TCP:
- case FACE_TYPE_UDP:
- if (hc_face_to_connection(face, &connection) < 0)
- return LIBHICNCTRL_FAILURE;
-
- /* Ensure we have a corresponding local listener */
- if (hc_connection_to_local_listener(&connection, &listener) < 0)
- return LIBHICNCTRL_FAILURE;
-
- /* We might cache results for faster future lookups (at least to
- * test existence) */
- if (hc_listener_list(s, &listeners) < 0) return LIBHICNCTRL_FAILURE;
-
- /* Test */
- if (hc_data_find(listeners, &listener, (cmp_t)hc_listener_cmp,
- (void **)&found) < 0)
- return LIBHICNCTRL_FAILURE;
-
- hc_data_free(listeners);
-
- if (!found) {
- /* We need to create the listener if it does not exists */
- if (hc_listener_create(s, &listener) < 0) return LIBHICNCTRL_FAILURE;
- }
-
- if (hc_connection_create(s, &connection) < 0) return LIBHICNCTRL_FAILURE;
-
- break;
-
- case FACE_TYPE_HICN_LISTENER:
- case FACE_TYPE_TCP_LISTENER:
- case FACE_TYPE_UDP_LISTENER:
- if (hc_face_to_listener(face, &listener) < 0) return LIBHICNCTRL_FAILURE;
- if (hc_listener_create(s, &listener) < 0) return LIBHICNCTRL_FAILURE;
- return LIBHICNCTRL_FAILURE;
- break;
- default:
- return LIBHICNCTRL_FAILURE;
- };
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_face_delete(hc_sock_t *s, hc_face_t *face) {
- /* We currently do not delete the listener */
- hc_connection_t connection;
- if (hc_face_to_connection(face, &connection) < 0) return LIBHICNCTRL_FAILURE;
- return hc_connection_delete(s, &connection);
-}
-
-int hc_face_list(hc_sock_t *s, hc_data_t **pdata) {
- hc_data_t *connection_data;
- hc_face_t face;
-
- if (hc_connection_list(s, &connection_data) < 0) return LIBHICNCTRL_FAILURE;
-
- hc_data_t *face_data =
- hc_data_create(sizeof(hc_connection_t), sizeof(hc_face_t));
- foreach_connection(c, connection_data) {
- if (hc_connection_to_face(c, &face) < 0) goto ERR;
- hc_data_push(face_data, &face);
- }
-
- *pdata = face_data;
- hc_data_free(connection_data);
- return LIBHICNCTRL_SUCCESS;
-
-ERR:
- hc_data_free(connection_data);
- return LIBHICNCTRL_FAILURE;
-}
-
-int hc_face_set_admin_state(hc_sock_t *s, const char *conn_id_or_name,
- hc_connection_state_t admin_state) {
- return hc_connection_set_admin_state(s, conn_id_or_name, admin_state);
-}
-
-/* /!\ Please update constants in header file upon changes */
-size_t hc_face_snprintf(char *s, size_t size, hc_face_t *face) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------*
- * Cache
- *----------------------------------------------------------------------------*/
-
-int hc_cache_set_store(hc_sock_t *s, int enabled) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_cache_set_serve(hc_sock_t *s, int enabled) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-/*----------------------------------------------------------------------------*
- * Punting
- *----------------------------------------------------------------------------*/
-
-int hc_punting_create(hc_sock_t *s /* XXX */) { return LIBHICNCTRL_SUCCESS; }
-
-/*----------------------------------------------------------------------------*
- * Strategy
- *----------------------------------------------------------------------------*/
-
-// per prefix
-int hc_strategy_set(hc_sock_t *s /* XXX */) { return LIBHICNCTRL_SUCCESS; }
-
-/*----------------------------------------------------------------------------*
- * FIB
- *----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*
- * PIT
- *----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*
- * WLDR
- *----------------------------------------------------------------------------*/
-
-// per connection
-int hc_wldr_set(hc_sock_t *s /* XXX */) { return LIBHICNCTRL_SUCCESS; }
-
-/*----------------------------------------------------------------------------*
- * MAP-Me
- *----------------------------------------------------------------------------*/
-
-int hc_mapme_set(hc_sock_t *s, int enabled) { return LIBHICNCTRL_SUCCESS; }
-
-int hc_mapme_set_discovery(hc_sock_t *s, int enabled) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_mapme_set_timescale(hc_sock_t *s, double timescale) {
- return LIBHICNCTRL_SUCCESS;
-}
-
-int hc_mapme_set_retx(hc_sock_t *s, double timescale) {
- return LIBHICNCTRL_SUCCESS;
-}
diff --git a/hicn-light/src/hicn/api/api.h b/hicn-light/src/hicn/api/api.h
deleted file mode 100644
index ba07fa7ed..000000000
--- a/hicn-light/src/hicn/api/api.h
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * \file api.h
- * \brief hICN control library API
- */
-
-#ifndef HICNTRL_API
-#define HICNTRL_API
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include <hicn/api/face.h>
-
-/**
- * This allows to selectively define convenience types to avoid any collision
- * when using the library in conjunction with other frameworks including similar
- * defines
- */
-#ifdef _HICNTRL_NO_DEFS
-#define _HICNTRL_NO_DEF_TYPES
-#define _HICNTRL_NO_DEF_IPADDR
-#define _HICNTRL_NO_DEF_UNIONCAST
-#endif
-
-#ifndef _HICNTRL_NO_DEF_TYPES
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
-typedef uint64_t u64;
-#endif /* _HICNTRL_NO_DEF_TYPES */
-
-#ifndef _HICNTRL_NO_DEF_IPADDR
-#include <hicn/api/ip_address.h>
-#endif /* _HICNTRL_NO_DEF_IPADDR */
-
-#ifndef _HICNTRL_NO_DEF_UNIONCAST
-/* Helper for avoiding warnings about type-punning */
-#define UNION_CAST(x, destType) \
- (((union { \
- __typeof__(x) a; \
- destType b; \
- })x) \
- .b)
-#endif /* _HICNTRL_NO_DEF_UNIONCAST */
-
-/******************************************************************************
- * Message helper types and aliases
- ******************************************************************************/
-
-#define foreach_command \
- _(UNDEFINED) \
- _(CREATE) \
- _(DELETE) \
- _(LIST) \
- _(SET) \
- _(N)
-
-typedef enum {
-#define _(x) ACTION_##x,
- foreach_command
-#undef _
-} hc_action_t;
-
-/**
- * \brief hICN control message header
- */
-typedef struct hc_msg_s hc_msg_t;
-
-/******************************************************************************
- * Control Data
- ******************************************************************************/
-
-struct hc_data_s;
-typedef int (*data_callback_t)(struct hc_data_s *, void *);
-
-/**
- * \brief Holds the results of an hICN control request
- */
-typedef struct hc_data_s {
- size_t size;
- size_t max_size_log;
- size_t in_element_size;
- size_t out_element_size;
- u8 command_id; /**< Expected message type (should give element size) */
- u8 *buffer;
- bool complete;
-
- /* Callbacks */
- data_callback_t
- complete_cb; // XXX int (*complete_cb)(struct hc_data_s * data);
- void *complete_cb_data;
-} hc_data_t;
-
-/**
- * Create a structure holding the results of an hICN control request.
- * \result The newly create data structure.
- */
-hc_data_t *hc_data_create(size_t in_element_size, size_t out_element_size);
-
-/**
- * Free a structure holding the results of an hICN control request.
- * \param [in] data - The data structure to free.
- */
-void hc_data_free(hc_data_t *data);
-
-/**
- * \brief Adds many new results at the end of the data structure, eventually
- * allocating buffer space for it.
- * \param [in] data - The data structure to which to add elements.
- * \param [in] elements - The array of elements to add.
- * \param [in] count - The number of elements to add.
- * \return Error code
- *
- * NOTE: The size of the element should match the one declared at structure
- * initialization.
- */
-int hc_data_push_many(hc_data_t *data, const void *elements, size_t count);
-
-/**
- * \brief Adds a new result at the end of the data structure, eventually
- * allocating buffer space for it.
- * \param [in] data - The data structure to which to add an element.
- * \param [in] element - The element to add
- * \return Error code
- *
- * NOTE: The size of the element should match the one declared at structure
- * initialization.
- */
-int hc_data_push(hc_data_t *data, const void *element);
-
-/**
- * \brief Configure a callback (along with private data) to be called upon
- * completion of a request
- * \param [in] data - hICN control data
- * \param [in] cb - Callback function
- * \param [in] cb_data - Callback private data
- */
-int hc_data_set_callback(hc_data_t *data, data_callback_t cb, void *cb_data);
-
-/**
- * \brief Mark the data structure as complete.
- * \param [in] data - The data structure to which to add an element.
- * \return The error code resulting from callback execution if any. 0 is
- * returned if the callback executed successfully, or if no callback were
- * defined.
- */
-int hc_data_set_complete(hc_data_t *data);
-
-/**
- * \brief Reset the data structure holding control data
- * \param [in] data - hICN control data
- * \return Error code
- */
-int hc_data_reset(hc_data_t *data);
-
-/**
- * \brief Find en element in the data structure
- * \param [in] data - The data structure in which to find
- * \param [in] element - The element to find
- * \param [in] cmp - The element compare function
- * \param [out] found - A pointer to the element, or NULL if not found.
- * \return Error code
- */
-int hc_data_find(hc_data_t *data, const void *element, cmp_t cmp, void **found);
-
-/******************************************************************************
- * Control socket
- ******************************************************************************/
-
-/* This should be at least equal to the maximum packet size */
-#define RECV_BUFLEN 8192
-
-/**
- * \brief Holds the state of an hICN control socket
- */
-typedef struct {
- char *url;
- int fd;
- u32 seq;
-
- /* Partial receive buffer */
- u8 buf[RECV_BUFLEN];
- size_t roff; /**< Read offset */
- size_t woff; /**< Write offset */
-
- /*
- * Because received messages are potentially unbounded in size, we might not
- * guarantee that we can store a full packet before processing it. We must
- * implement a very simple state machine remembering the current parsing
- * status in order to partially process the packet.
- */
- size_t remaining;
- u32 send_id;
- u32 send_seq;
- u32 recv_seq;
-} hc_sock_t;
-
-/**
- * \brief Create an hICN control socket using the specified URL.
- * \param [in] url - The URL to connect to.
- * \return an hICN control socket
- */
-hc_sock_t *hc_sock_create_url(const char *url);
-
-/**
- * \brief Create an hICN control socket using the default connection type.
- * \return an hICN control socket
- */
-hc_sock_t *hc_sock_create(void);
-
-/**
- * \brief Frees an hICN control socket
- */
-void hc_sock_free(hc_sock_t *s);
-
-/**
- * \brief Sets the socket as non-blocking
- * \return Error code
- */
-int hc_sock_set_nonblocking(hc_sock_t *s);
-
-/**
- * \brief Connect the socket
- * \return Error code
- */
-int hc_sock_connect(hc_sock_t *s);
-
-/**
- * \brief Return the offset and size of available buffer space
- * \param [in] sock - hICN control socket
- * \param [out] buffer - Offset in buffer
- * \param [out] size - Remaining size
- * \return Error code
- */
-int hc_sock_get_available(hc_sock_t *s, u8 **buffer, size_t *size);
-
-/**
- * \brief Write/read iexchance on the control socket (internal helper function)
- * \param [in] sock - hICN control socket
- * \param [in] msg - Message to send
- * \param [in] msglen - Length of the message to send
- * \return Error code
- */
-int hc_sock_send(hc_sock_t *s, hc_msg_t *msg, size_t msglen);
-
-/**
- * \brief Helper for reading socket contents
- * \param [in] sock - hICN control socket
- * \param [in] data - Result data buffer
- * \param [in] parse - Parse function to convert remote types into lib native
- * types, or NULL not to perform any translation.
- * \return Error code
- */
-int hc_sock_recv(hc_sock_t *s, hc_data_t *data);
-
-/**
- * \brief Processing data received by socket
- * \param [in] sock - hICN control socket
- * \param [in] data - Result data buffer
- * \param [in] parse - Parse function to convert remote types into lib native
- * types, or NULL not to perform any translation.
- * \return Error code
- */
-int hc_sock_process(hc_sock_t *s, hc_data_t *data,
- int (*parse)(const u8 *src, u8 *dst));
-
-/**
- * \brief Reset the state of the sock (eg. to handle a reconnecton)
- * \param [in] sock - hICN control socket
- * \return Error code
- */
-int hc_sock_reset(hc_sock_t *s);
-
-/******************************************************************************
- * Command-specific structures and functions
- ******************************************************************************/
-
-/*
- * The following definitions are organized by sections each dealing with a
- * specific object being manipulated. All follow a similar structure.
- *
- * TYPE DEFINITIONS AND ALIASES
- *
- * We redefine command struct:
- * - for uniformization
- * - to use enum instead of type specifiers more appropriate for packet format
- * - to use more flexible types such as for manipulating IP addresses
- * - host endianness
- * - more intuitive field name, ordering, consistency, and hierarchy removal
- * - to have command types in between add/list/... commands
- *
- * COMMAND IMPLEMENTATION
- *
- * All commands return information in a common format
- *
- * TODO describe + explain for commands with only return code.
- *
- * RETURN DATA FIXME
- *
- * \param [out] pdata - Pointer to the structure storing the results of the call
- * (NULL if no data has been received). If the pointer is NULL, no result will
- * be stored and only the error code will be exposed to the caller. It is
- * expected that the caller frees this structure using hc_data_free() after
- * usage.
- * \see hc_data_free.
- *
- * PARSING
- *
- * While this is not made mandatory by the library, the returned data can be
- * converted to the library's own data structures as described before.
- *
- * ITERATORS
- *
- * Macros are defined to facilitate iteration on the returned data structures.
- */
-
-#ifndef SPACES
-#define SPACES(x) x
-#endif
-#ifndef SPACE
-#define SPACE SPACES(1)
-#endif
-#ifndef NULLTERM
-#define NULLTERM 1
-#endif
-
-#define NAME_LEN 16 /* NULL-terminated right ? */
-#define MAXSZ_HC_NAME_ NAME_LEN
-#define MAXSZ_HC_NAME MAXSZ_HC_NAME_ + NULLTERM
-
-#define MAXSZ_HC_ID_ 10 /* Number of digits for MAX_INT */
-#define MAXSZ_HC_ID MAXSZ_HC_ID_ + NULLTERM
-
-#define MAXSZ_HC_PROTO_ 8 /* inetX:// */
-#define MAXSZ_HC_PROTO MAXSZ_HC_PROTO_ + NULLTERM
-
-#define MAXSZ_HC_URL4_ MAXSZ_HC_PROTO_ + MAXSZ_IP4_ADDRESS_ + MAXSZ_PORT_
-#define MAXSZ_HC_URL6_ MAXSZ_HC_PROTO_ + MAXSZ_IP6_ADDRESS_ + MAXSZ_PORT_
-#define MAXSZ_HC_URL_ MAXSZ_HC_URL6_
-#define MAXSZ_HC_URL4 MAXSZ_HC_URL4_ + NULLTERM
-#define MAXSZ_HC_URL6 MAXSZ_HC_URL6_ + NULLTERM
-#define MAXSZ_HC_URL MAXSZ_HC_URL_ + NULLTERM
-
-size_t hc_url_snprintf(char *s, size_t size, int family,
- ip_address_t *ip_address, u16 port);
-
-#define foreach_type(TYPE, VAR, data) \
- for (TYPE *VAR = (TYPE *)data->buffer; \
- VAR < (TYPE *)(data->buffer + data->size * data->out_element_size); \
- VAR++)
-
-/**
- * New type is defined to reconciliate different enum for add and list.
- * Also, values not implemented have been removed for clarity.
- */
-#define foreach_connection_type \
- _(UNDEFINED) \
- _(TCP) \
- _(UDP) \
- _(HICN) \
- _(N)
-
-typedef enum {
-#define _(x) CONNECTION_TYPE_##x,
- foreach_connection_type
-#undef _
-} hc_connection_type_t;
-
-#define MAXSZ_HC_CONNECTION_TYPE_ 9
-#define MAXSZ_HC_CONNECTION_TYPE MAXSZ_HC_CONNECTION_TYPE_ + NULLTERM
-
-extern const char *connection_type_str[];
-
-hc_connection_type_t connection_type_from_str(const char *str);
-
-#define foreach_connection_state \
- _(UNDEFINED) \
- _(UP) \
- _(DOWN) \
- _(N)
-
-typedef enum {
-#define _(x) CONNECTION_STATE_##x,
- foreach_connection_state
-#undef _
-} hc_connection_state_t;
-
-#define MAXSZ_HC_CONNECTION_STATE_ 9
-#define MAXSZ_HC_CONNECTION_STATE MAXSZ_HC_CONNECTION_STATE_ + NULLTERM
-
-extern const char *connection_state_str[];
-
-typedef int (*HC_PARSE)(const u8 *, u8 *);
-
-/*----------------------------------------------------------------------------*
- * Listeners
- *----------------------------------------------------------------------------*/
-
-typedef struct {
- char name[NAME_LEN]; /* K.w */ // XXX clarify what used for
- u32 conn_id; /* Kr. */
- hc_connection_type_t type; /* .rw */
- int family; /* .rw */
- ip_address_t local_addr; /* .rw */
- u16 local_port; /* .rw */
-} hc_listener_t;
-
-int hc_parse_listener(void *in, hc_listener_t *listener);
-
-int hc_listener_create(hc_sock_t *s, hc_listener_t *listener);
-// XXX int hc_listener_delete(hc_sock_t * s, hc_listener_t * listener);
-int hc_listener_list(hc_sock_t *s, hc_data_t **pdata);
-
-#define foreach_listener(VAR, data) foreach_type(hc_listener_t, VAR, data)
-
-#define MAXSZ_HC_LISTENER_ MAXSZ_HC_URL_ + SPACE + MAXSZ_HC_CONNECTION_TYPE_
-#define MAXSZ_HC_LISTENER MAXSZ_HC_LISTENER_ + NULLTERM
-
-int hc_listener_cmp(const hc_listener_t *l1, const hc_listener_t *l2);
-
-size_t hc_listener_snprintf(char *s, size_t size, hc_listener_t *listener);
-
-/*----------------------------------------------------------------------------*
- * Connections
- *----------------------------------------------------------------------------*/
-
-typedef struct {
- u32 id; /* Kr. */
- char name[NAME_LEN]; /* K.w */
- hc_connection_type_t type; /* .rw */
- int family; /* .rw */
- ip_address_t local_addr; /* .rw */
- u16 local_port; /* .rw */
- ip_address_t remote_addr; /* .rw */
- u16 remote_port; /* .rw */
- hc_connection_state_t admin_state; /* .rw */
- hc_connection_state_t state; /* .r. */
-} hc_connection_t;
-
-int hc_parse_connection(void *in, hc_connection_t *connection);
-
-int hc_connection_create(hc_sock_t *s, hc_connection_t *connection);
-int hc_connection_delete(hc_sock_t *s, hc_connection_t *connection);
-/*
-int hc_connection_remove_by_id(hc_sock_t * s, char * name);
-int hc_connection_remove_by_name(hc_sock_t * s, char * name);
-*/
-#ifdef WITH_POLICY
-int hc_connection_set_state(hc_sock_t *s, const char *conn_id_or_name,
- face_state_t state);
-#endif /* WITH_POLICY */
-int hc_connection_list(hc_sock_t *s, hc_data_t **pdata);
-
-#define foreach_connection(VAR, data) foreach_type(hc_connection_t, VAR, data)
-
-#define MAXSZ_HC_CONNECTION_ \
- MAXSZ_HC_CONNECTION_STATE_ + 2 * MAXSZ_HC_URL_ + MAXSZ_HC_CONNECTION_TYPE_ + \
- SPACES(3)
-#define MAXSZ_HC_CONNECTION MAXSZ_HC_CONNECTION_ + NULLTERM
-
-size_t hc_connection_snprintf(char *s, size_t size,
- hc_connection_t *connection);
-
-/*----------------------------------------------------------------------------*
- * Routes
- *----------------------------------------------------------------------------*/
-
-typedef struct {
- u8 conn_id; /* Kr. */
- char conn_name[NAME_LEN]; /* K.w */
- int family; /* Krw */
- ip_address_t remote_addr; /* krw */
- u8 len; /* krw */
- u16 cost; /* .rw */
-} hc_route_t;
-
-int hc_parse_route(void *in, hc_route_t *route);
-
-int hc_route_create(hc_sock_t *s, hc_route_t *route);
-int hc_route_delete(hc_sock_t *s, hc_route_t *route);
-int hc_route_list(hc_sock_t *s, hc_data_t **pdata);
-
-#define foreach_route(VAR, data) foreach_type(hc_route_t, VAR, data)
-
-#define MAXSZ_HC_ROUTE_ 0
-#define MAXSZ_HC_ROUTE MAXSZ_HC_ROUTE_ + NULLTERM
-
-size_t hc_route_snprintf(char *s, size_t size, hc_route_t *route);
-
-/*----------------------------------------------------------------------------*
- * Faces
- *
- * A face is an abstraction introduced by the control library to abstract the
- * forwarder implementation details. It encompasses connections and listeners
- * and ensures the right dependencies are enforced, eg that we always have a
- * listener when a connection is created.
- *
- *----------------------------------------------------------------------------*/
-
-typedef struct {
- u32 id;
- char name[NAME_LEN];
- face_t face; // or embed ?
- // face_id_t parent; /* Pointer from connection to listener */
-} hc_face_t;
-
-int hc_face_create(hc_sock_t *s, hc_face_t *face);
-int hc_face_delete(hc_sock_t *s, hc_face_t *face);
-int hc_face_list(hc_sock_t *s, hc_data_t **pdata);
-
-#define foreach_face(VAR, data) foreach_type(hc_face_t, VAR, data)
-
-#define MAXSZ_HC_FACE_ 0
-#define MAXSZ_HC_FACE MAXSZ_HC_FACE_ + NULLTERM
-
-size_t hc_face_snprintf(char *s, size_t size, hc_face_t *face);
-
-/*----------------------------------------------------------------------------*
- * Cache
- *----------------------------------------------------------------------------*/
-
-int hc_cache_set_store(hc_sock_t *s, int enabled);
-int hc_cache_set_serve(hc_sock_t *s, int enabled);
-
-/*----------------------------------------------------------------------------*
- * Punting
- *----------------------------------------------------------------------------*/
-
-int hc_punting_create(hc_sock_t *s /* XXX */);
-
-/*----------------------------------------------------------------------------*
- * Strategy
- *----------------------------------------------------------------------------*/
-
-// per prefix
-int hc_strategy_set(hc_sock_t *s /* XXX */);
-
-/*----------------------------------------------------------------------------*
- * FIB
- *----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*
- * PIT
- *----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*
- * WLDR
- *----------------------------------------------------------------------------*/
-
-// per connection
-int hc_wldr_set(hc_sock_t *s /* XXX */);
-
-/*----------------------------------------------------------------------------*
- * MAP-Me
- *----------------------------------------------------------------------------*/
-
-int hc_mapme_set(hc_sock_t *s, int enabled);
-int hc_mapme_set_discovery(hc_sock_t *s, int enabled);
-int hc_mapme_set_timescale(hc_sock_t *s, double timescale);
-int hc_mapme_set_retx(hc_sock_t *s, double timescale);
-
-#endif /* HICNTRL_API */
diff --git a/hicn-light/src/hicn/api/commands.h b/hicn-light/src/hicn/api/commands.h
deleted file mode 100644
index 236a75a33..000000000
--- a/hicn-light/src/hicn/api/commands.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file commands.h
- * @brief All hicn-light commands: 14 in total.
- *
- * Header and payload in binary format.
- */
-
-#ifndef commands_h
-#define commands_h
-
-#ifndef _WIN32
-#include <netinet/in.h>
-#include <sys/socket.h>
-#endif
-
-#include <stdint.h>
-#include <stdlib.h>
-
-typedef struct in6_addr ipv6_addr_t;
-typedef uint32_t ipv4_addr_t;
-
-union commandAddr {
- ipv4_addr_t ipv4;
- ipv6_addr_t ipv6;
-};
-
-typedef enum {
- REQUEST_LIGHT = 0xc0, // this is a command
- RESPONSE_LIGHT,
- ACK_LIGHT,
- NACK_LIGHT,
- LAST_MSG_TYPE_VALUE
-} message_type;
-
-typedef enum {
- ADD_LISTENER = 0,
- ADD_CONNECTION,
- LIST_CONNECTIONS,
- ADD_ROUTE,
- LIST_ROUTES,
- REMOVE_CONNECTION,
- REMOVE_ROUTE,
- CACHE_STORE,
- CACHE_SERVE,
- CACHE_CLEAR,
- SET_STRATEGY,
- SET_WLDR,
- ADD_PUNTING,
- LIST_LISTENERS,
- MAPME_ENABLE,
- MAPME_DISCOVERY,
- MAPME_TIMESCALE,
- MAPME_RETX,
- CONNECTION_SET_ADMIN_STATE,
- LAST_COMMAND_VALUE
-} command_id;
-
-typedef enum {
- ADDR_INET = 1,
- ADDR_INET6,
- ADDR_LINK,
- ADDR_IFACE,
- ADDR_UNIX /* PF_UNIX */
-} address_type;
-
-typedef enum {
- UDP_CONN,
- TCP_CONN,
- GRE_CONN, // not implemented
- HICN_CONN
-} connection_type;
-
-typedef enum { ACTIVATE_ON, ACTIVATE_OFF } activate_type;
-
-//========== HEADER ==========
-
-typedef struct {
- uint8_t messageType;
- uint8_t commandID;
- uint16_t length; // tells the number of structures in the payload
- uint32_t seqNum;
-} header_control_message;
-// for the moment has to be at least 8 bytes
-
-// SIZE=8
-
-//========== [00] ADD LISTENER ==========
-
-typedef enum { ETHER_MODE, IP_MODE, HICN_MODE } listener_mode;
-
-typedef struct {
- char symbolic[16];
- // char interfaceName[16];
- union commandAddr address;
- uint16_t port;
- // uint16_t etherType;
- uint8_t addressType;
- uint8_t listenerMode;
- uint8_t connectionType;
-} add_listener_command;
-
-// SIZE=40
-
-//========== [01] ADD CONNECTION ==========
-
-typedef struct {
- char symbolic[16];
- union commandAddr remoteIp;
- union commandAddr localIp;
- uint16_t remotePort;
- uint16_t localPort;
- uint8_t ipType;
- uint8_t connectionType;
- uint8_t admin_state;
-} add_connection_command;
-
-// SIZE=56
-
-//========== [02] LIST CONNECTIONS ==========
-
-typedef enum {
- CONN_GRE,
- CONN_TCP,
- CONN_UDP,
- CONN_MULTICAST,
- CONN_L2,
- CONN_HICN
-} list_connections_type;
-
-typedef enum {
- IFACE_UP = 0,
- IFACE_DOWN = 1,
- IFACE_UNKNOWN = 2 // not used actually
-} connection_state;
-
-typedef struct {
- add_connection_command connectionData;
- uint32_t connid;
- uint8_t state;
-} list_connections_command;
-
-// SIZE=64
-
-//========== [03] ADD ROUTE ==========
-
-typedef struct {
- char symbolicOrConnid[16];
- union commandAddr address;
- uint16_t cost;
- uint8_t addressType;
- uint8_t len;
-} add_route_command;
-
-// SIZE=36
-
-//========== [04] LIST ROUTE ==========
-
-typedef struct {
- union commandAddr address;
- uint32_t connid;
- uint16_t cost;
- uint8_t addressType;
- uint8_t len;
-} list_routes_command;
-
-// SIZE=24
-
-//========== [05] REMOVE CONNECTION ==========
-
-typedef struct {
- char symbolicOrConnid[16];
-} remove_connection_command;
-
-// SIZE=16
-
-//========== [06] REMOVE ROUTE ==========
-
-typedef struct {
- char symbolicOrConnid[16];
- union commandAddr address;
- uint8_t addressType;
- uint8_t len;
-} remove_route_command;
-
-// SIZE=36
-
-//========== [07] CACHE STORE ==========
-
-typedef struct {
- uint8_t activate;
-} cache_store_command;
-
-// SIZE=1
-
-//========== [08] CACHE SERVE ==========
-
-typedef struct {
- uint8_t activate;
-} cache_serve_command;
-
-// SIZE=1
-
-//========== [09] SET STRATEGY ==========
-
-typedef enum {
- SET_STRATEGY_LOADBALANCER,
- SET_STRATEGY_RANDOM,
- SET_STRATEGY_RANDOM_PER_DASH_SEGMENT,
- SET_STRATEGY_LOADBALANCER_WITH_DELAY,
- SET_STRATEGY_LOADBALANCER_BY_RATE,
- SET_STRATEGY_LOADBALANCER_BEST_ROUTE,
- LAST_STRATEGY_VALUE
-} strategy_type;
-
-typedef struct {
- union commandAddr address;
- uint8_t strategyType;
- uint8_t addressType;
- uint8_t len;
-} set_strategy_command;
-
-// SIZE=20
-
-//========== [11] SET WLDR ==========
-
-typedef struct {
- char symbolicOrConnid[16];
- uint8_t activate;
-} set_wldr_command;
-
-// SIZE=17
-
-//========== [12] ADD PUNTING ==========
-
-typedef struct {
- char symbolicOrConnid[16];
- union commandAddr address;
- uint8_t addressType;
- uint8_t len;
-} add_punting_command;
-
-// SIZE=36
-
-//========== [13] LIST LISTENER ==========
-
-typedef struct {
- union commandAddr address;
- uint32_t connid;
- uint16_t port;
- uint8_t addressType;
- uint8_t encapType;
-} list_listeners_command;
-
-// SIZE=24
-
-//========== [14] MAPME ==========
-
-// (enable/discovery/timescale/retx)
-
-typedef struct {
- uint8_t activate;
-} mapme_activator_command;
-
-// SIZE=1
-
-typedef struct {
- uint32_t timePeriod;
-} mapme_timing_command;
-
-// SIZE=1
-
-typedef struct {
- char symbolicOrConnid[16];
- uint8_t admin_state;
-} connection_set_admin_state_command;
-
-//===== size of commands ======
-// REMINDER: when a new_command is added, the following switch has to be
-// updated.
-static inline int payloadLengthDaemon(command_id id) {
- switch (id) {
- case ADD_LISTENER:
- return sizeof(add_listener_command);
- case ADD_CONNECTION:
- return sizeof(add_connection_command);
- case LIST_CONNECTIONS:
- return 0; // list connections: payload always 0
- case ADD_ROUTE:
- return sizeof(add_route_command);
- case LIST_ROUTES:
- return 0; // list routes: payload always 0
- case REMOVE_CONNECTION:
- return sizeof(remove_connection_command);
- case REMOVE_ROUTE:
- return sizeof(remove_route_command);
- case CACHE_STORE:
- return sizeof(cache_store_command);
- case CACHE_SERVE:
- return sizeof(cache_serve_command);
- case CACHE_CLEAR:
- return 0; // cache clear
- case SET_STRATEGY:
- return sizeof(set_strategy_command);
- case SET_WLDR:
- return sizeof(set_wldr_command);
- case ADD_PUNTING:
- return sizeof(add_punting_command);
- case LIST_LISTENERS:
- return 0; // list listeners: payload always 0
- case MAPME_ENABLE:
- return sizeof(mapme_activator_command);
- case MAPME_DISCOVERY:
- return sizeof(mapme_activator_command);
- case MAPME_TIMESCALE:
- return sizeof(mapme_timing_command);
- case MAPME_RETX:
- return sizeof(mapme_timing_command);
- case CONNECTION_SET_ADMIN_STATE:
- return sizeof(connection_set_admin_state_command);
- case LAST_COMMAND_VALUE:
- return 0;
- default:
- return 0;
- }
-}
-#endif
diff --git a/hicn-light/src/hicn/api/face.h b/hicn-light/src/hicn/api/face.h
deleted file mode 100644
index 6caf8b9f7..000000000
--- a/hicn-light/src/hicn/api/face.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * \file face.h
- * \brief Face abstraction
- */
-#ifndef HICN_FACE_H
-#define HICN_FACE_H
-
-#ifndef SPACES
-#define SPACES(x) x
-#endif
-#ifndef SPACE
-#define SPACE 1
-#endif
-#ifndef NULLTERM
-#define NULLTERM 1
-#endif
-
-#include <hicn/api/ip_address.h>
-#include <hicn/api/types.h>
-
-/* Netdevice type */
-
-#include <net/if.h> // IFNAMSIZ
-
-#define foreach_netdevice_type \
- _(UNDEFINED) \
- _(WIRED) \
- _(WIFI) \
- _(CELLULAR) \
- _(VPN) \
- _(N)
-
-#define MAXSZ_NETDEVICE_TYPE_ 9
-#define MAXSZ_NETDEVICE_TYPE MAXSZ_NETDEVICE_TYPE_ + NULLTERM
-
-typedef enum {
-#define _(x) x,
- foreach_netdevice_type
-#undef _
-} netdevice_type_t;
-
-extern const char* netdevice_type_str[];
-
-/* Netdevice */
-
-typedef struct {
- u32 index;
- char name[IFNAMSIZ];
-} netdevice_t;
-
-#define NETDEVICE_UNDEFINED_INDEX 0
-
-/* Face state */
-
-#define foreach_face_state \
- _(UNDEFINED) \
- _(PENDING_UP) \
- _(UP) \
- _(PENDING_DOWN) \
- _(DOWN) \
- _(ERROR) \
- _(N)
-
-#define MAXSZ_FACE_STATE_ 12
-#define MAXSZ_FACE_STATE MAXSZ_FACE_STATE_ + 1
-
-typedef enum {
-#define _(x) FACE_STATE_##x,
- foreach_face_state
-#undef _
-} face_state_t;
-
-extern const char* face_state_str[];
-
-/* Face type */
-
-#define foreach_face_type \
- _(UNDEFINED) \
- _(HICN) \
- _(HICN_LISTENER) \
- _(TCP) \
- _(TCP_LISTENER) \
- _(UDP) \
- _(UDP_LISTENER) \
- _(N)
-
-#define MAXSZ_FACE_TYPE_ 13
-#define MAXSZ_FACE_TYPE MAXSZ_FACE_TYPE_ + 1
-
-typedef enum {
-#define _(x) FACE_TYPE_##x,
- foreach_face_type
-#undef _
-} face_type_t;
-
-extern const char* face_type_str[];
-
-#define MAXSZ_FACE_ MAXSZ_FACE_TYPE_ + 2 * MAXSZ_IP_ADDRESS + 2 * MAXSZ_PORT + 9
-#define MAXSZ_FACE MAXSZ_FACE_ + 1
-
-/* Face tag */
-
-/**
- * \brief Tags associated to faces, useful to implement policies.
- *
- * NOTE
- * - These tags should be shared with the forwarder, and might in fact be
- * defined in a common library.
- * - We start with a very simple implementation where all tags are not
- * categorized and stored within the same bitfield.
- */
-#define foreach_face_tag \
- _(UNDEFINED) \
- /* Connection type */ \
- _(WIRED) \
- _(WIFI) \
- _(LTE) \
- _(VPN) \
- /* Connection security */ \
- _(TRUSTED_NETWORK) \
- _(UNTRUSTED_NETWORK) \
- _(N)
-
-#define MAXSZ_FACE_TAG_ 17
-#define MAXSZ_FACE_TAG MAXSZ_FACE_TAG_ + 1
-
-typedef enum {
-#define _(x) FACE_TAG_##x,
- foreach_face_tag
-#undef _
-} face_tag_t;
-
-extern const char* face_tag_str[];
-
-typedef int face_tags_t;
-
-static inline void face_tags_add(face_tags_t* tags, face_tag_t tag) {
- *tags |= tag;
-}
-
-static inline void face_tags_remove(face_tags_t* tags, face_tag_t tag) {
- *tags &= ~tag;
-}
-
-static inline int face_tags_has(face_tags_t tags, face_tag_t tag) {
- return tags & tag;
-}
-
-#define FACE_TAGS_EMPTY 0
-
-/* Face */
-
-typedef struct {
- face_type_t type;
- union {
- struct {
- int family;
- netdevice_t netdevice;
- ip_address_t local_addr;
- ip_address_t remote_addr;
- } hicn;
- struct {
- int family;
- ip_address_t local_addr;
- u16 local_port;
- ip_address_t remote_addr;
- u16 remote_port;
- } tunnel;
- };
- int tags; /**< \see face_tag_t */
-} face_t;
-
-int face_initialize(face_t* face);
-int face_initialize_udp(face_t* face, const ip_address_t* local_addr,
- u16 local_port, const ip_address_t* remote_addr,
- u16 remote_port, int family);
-face_t* face_initialize_udp_sa(face_t* face, const struct sockaddr* local_addr,
- const struct sockaddr* remote_addr);
-
-face_t* face_create();
-face_t* face_create_udp(const ip_address_t* local_addr, u16 local_port,
- const ip_address_t* remote_addr, u16 remote_port,
- int family);
-face_t* face_create_udp_sa(const struct sockaddr* local_addr,
- const struct sockaddr* remote_addr);
-
-int face_finalize(face_t* face);
-
-void face_free(face_t* face);
-
-typedef bool (*face_cmp_t)(const face_t* f1, const face_t* f2);
-
-bool face_cmp(const face_t* f1, const face_t* f2);
-hash_t face_hash(const face_t* face);
-
-size_t face_snprintf(char* s, size_t size, const face_t* face);
-
-#endif /* HICN_FACE_H */
diff --git a/hicn-light/src/hicn/api/fib_policy.h b/hicn-light/src/hicn/api/fib_policy.h
deleted file mode 100644
index f5f82295d..000000000
--- a/hicn-light/src/hicn/api/fib_policy.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * \file fib_policy.h
- * \brief FIB policy description to be stored in FIB entries.
- */
-#ifndef HICN_FIB_POLICY_H
-#define HICN_FIB_POLICY_H
-
-#include <hicn/api/face.h>
-
-typedef struct {
- face_tags_t allow;
- face_tags_t prohibit;
- face_tags_t prefer;
- face_tags_t avoid;
-} fib_policy_t;
-
-static const fib_policy_t FIB_POLICY_NONE = {
- .allow = FACE_TAGS_EMPTY,
- .prohibit = FACE_TAGS_EMPTY,
- .prefer = FACE_TAGS_EMPTY,
- .avoid = FACE_TAGS_EMPTY,
-};
-
-#endif /* HICN_FIB_POLICY_H */
diff --git a/hicn-light/src/hicn/api/ip_address.h b/hicn-light/src/hicn/api/ip_address.h
deleted file mode 100644
index f44fb1bc3..000000000
--- a/hicn-light/src/hicn/api/ip_address.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * \file ip_address.h
- * \brief IP address type support
- */
-#ifndef IP_ADDRESS_H
-#define IP_ADDRESS_H
-
-#include <arpa/inet.h> // inet_ntop
-#ifdef __APPLE__
-#include <libkern/OSByteOrder.h>
-#define __bswap_constant_32(x) OSSwapInt32(x)
-#include <machine/endian.h>
-#else
-#include <endian.h>
-#ifdef __ANDROID__
-#include <byteswap.h>
-#endif
-#endif
-#include <errno.h>
-#include <netdb.h> // struct addrinfo
-#include <netinet/in.h> // INET*_ADDRSTRLEN, IN*ADDR_LOOPBACK
-#include <stdlib.h>
-#include <string.h> // memset
-
-#include <hicn/api/types.h>
-
-#define bytes_to_bits(x) (x * 8)
-#define IPV6_ADDR_LEN 16 /* bytes */
-#define IPV4_ADDR_LEN 4 /* bytes */
-#define IPV6_ADDR_LEN_BITS bytes_to_bits(IPV6_ADDR_LEN)
-#define IPV4_ADDR_LEN_BITS bytes_to_bits(IPV4_ADDR_LEN)
-
-#define IP_MAX_ADDR_LEN IPV6_ADDR_LEN
-
-#define DUMMY_PORT 1234
-
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
-typedef uint64_t u64;
-
-typedef union {
- union {
- struct in_addr as_inaddr;
- u8 as_u8[4];
- u16 as_u16[2];
- u32 as_u32;
- } v4;
- union {
- struct in6_addr as_in6addr;
- u8 as_u8[16];
- u16 as_u16[8];
- u32 as_u32[4];
- u64 as_u64[2];
- } v6;
- u8 buffer[IP_MAX_ADDR_LEN];
- u8 as_u8[IP_MAX_ADDR_LEN];
- u16 as_u16[IP_MAX_ADDR_LEN >> 1];
- u32 as_u32[IP_MAX_ADDR_LEN >> 2];
- u64 as_u64[IP_MAX_ADDR_LEN >> 3];
-} ip_address_t;
-
-#define MAXSZ_IP4_ADDRESS_ INET_ADDRSTRLEN - 1
-#define MAXSZ_IP6_ADDRESS_ INET6_ADDRSTRLEN - 1
-#define MAXSZ_IP_ADDRESS_ MAXSZ_IP6_ADDRESS_
-#define MAXSZ_IP4_ADDRESS MAXSZ_IP4_ADDRESS_ + 1
-#define MAXSZ_IP6_ADDRESS MAXSZ_IP6_ADDRESS_ + 1
-#define MAXSZ_IP_ADDRESS MAXSZ_IP_ADDRESS_ + 1
-
-/* No htonl() with const */
-static const ip_address_t IPV4_LOOPBACK = {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#ifdef __ANDROID__
- .v4.as_inaddr.s_addr = bswap_32(INADDR_LOOPBACK),
-#else
- .v4.as_inaddr.s_addr = __bswap_constant_32(INADDR_LOOPBACK),
-#endif
-#else
- .v4.as_inaddr.s_addr = INADDR_LOOPBACK,
-#endif
-};
-
-static const ip_address_t IPV6_LOOPBACK = {
- .v6.as_in6addr = IN6ADDR_LOOPBACK_INIT,
-};
-
-#define MAX_PORT 1 << (8 * sizeof(u16))
-#define IS_VALID_PORT(x) ((x > 0) && (x < MAX_PORT))
-
-#define MAXSZ_PORT_ 5
-#define MAXSZ_PORT MAXSZ_PORT_ + 1
-
-#define IS_VALID_FAMILY(x) ((x == AF_INET) || (x == AF_INET6))
-
-static inline int ip_address_get_family(const char *ip_address) {
- struct addrinfo hint, *res = NULL;
- int rc;
-
- memset(&hint, '\0', sizeof hint);
-
- hint.ai_family = PF_UNSPEC;
- hint.ai_flags = AI_NUMERICHOST;
-
- rc = getaddrinfo(ip_address, NULL, &hint, &res);
- if (rc) {
- return -1;
- }
- rc = res->ai_family;
- freeaddrinfo(res);
- return rc;
-}
-
-static inline int ip_address_len(const ip_address_t *ip_address, int family) {
- return (family == AF_INET6) ? IPV6_ADDR_LEN
- : (family == AF_INET) ? IPV4_ADDR_LEN : 0;
-}
-
-static inline int ip_address_ntop(const ip_address_t *ip_address, char *dst,
- const size_t len, int family) {
- const char *s = inet_ntop(family, ip_address->buffer, dst, len);
- return (s ? 1 : -1);
-}
-
-/*
- * Parse ip addresses in presentation format, or prefixes (in bits, separated by
- * a slash)
- */
-static inline int ip_address_pton(const char *ip_address_str,
- ip_address_t *ip_address) {
- int pton_fd;
-#ifdef IP_ADDRESS_PREFIX
- char *p;
- char *eptr;
- u32 dst_len;
-#endif /* IP_ADDRESS_PREFIX */
- char *addr = strdup(ip_address_str);
- int family;
-
-#ifdef IP_ADDRESS_PREFIX
- p = strchr(addr, '/');
- if (!p) {
- dst_len = 0; // until we get the ip address family
- } else {
- dst_len = strtoul(p + 1, &eptr, 10);
- *p = 0;
- }
-#endif /* IP_ADDRESS_PREFIX */
-
- family = ip_address_get_family(addr);
-
- switch (family) {
- case AF_INET6:
-#ifdef IP_ADDRESS_PREFIX
- if (dst_len > IPV6_ADDR_LEN_BITS) goto ERR;
-#endif /* IP_ADDRESS_PREFIX */
- pton_fd = inet_pton(AF_INET6, addr, &ip_address->buffer);
- break;
- case AF_INET:
-#ifdef IP_ADDRESS_PREFIX
- if (dst_len > IPV4_ADDR_LEN_BITS) goto ERR;
-#endif /* IP_ADDRESS_PREFIX */
- pton_fd = inet_pton(AF_INET, addr, &ip_address->buffer);
- break;
- default:
- goto ERR;
- }
-
- // 0 = not in presentation format
- // < 0 = other error (use perror)
- if (pton_fd <= 0) {
- goto ERR;
- }
-
- return 1;
-ERR:
- free(addr);
- return -1;
-}
-
-static inline int ip_address_snprintf(char *s, size_t size,
- const ip_address_t *ip_address,
- int family) {
- size_t len = family == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
- const char *rc = inet_ntop(family, ip_address->buffer, s, len);
- return rc ? strlen(rc) : -1;
-}
-
-static inline int ip_address_to_sockaddr(const ip_address_t *ip_address,
- struct sockaddr *sockaddr_address,
- int family) {
- struct sockaddr_in6 *tmp6 = (struct sockaddr_in6 *)sockaddr_address;
- struct sockaddr_in *tmp4 = (struct sockaddr_in *)sockaddr_address;
-
- switch (family) {
- case AF_INET6:
- tmp6->sin6_family = AF_INET6;
- tmp6->sin6_port = DUMMY_PORT;
- tmp6->sin6_scope_id = 0;
- memcpy(&tmp6->sin6_addr, ip_address->buffer, IPV6_ADDR_LEN);
- break;
- case AF_INET:
- tmp4->sin_family = AF_INET;
- tmp4->sin_port = DUMMY_PORT;
- memcpy(&tmp4->sin_addr, ip_address->buffer, IPV4_ADDR_LEN);
- break;
- default:
- return -1;
- }
-
- return 1;
-}
-
-#endif /* IP_ADDRESS_H */
diff --git a/hicn-light/src/hicn/api/token.h b/hicn-light/src/hicn/api/token.h
deleted file mode 100644
index 0c5541ba8..000000000
--- a/hicn-light/src/hicn/api/token.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Token concatenation */
-
-/*
- * Concatenate preprocessor tokens A and B without expanding macro definitions
- * (however, if invoked from a macro, macro arguments are expanded).
- */
-#define PPCAT_NX(A, B) A##B
-
-/*
- * Concatenate preprocessor tokens A and B after macro-expanding them.
- */
-#define PPCAT(A, B) PPCAT_NX(A, B)
-
-/* Token stringification */
-
-/*
- * Turn A into a string literal without expanding macro definitions
- * (however, if invoked from a macro, macro arguments are expanded).
- */
-#define STRINGIZE_NX(A) #A
-
-/*
- * Turn A into a string literal after macro-expanding it.
- */
-#define STRINGIZE(A) STRINGIZE_NX(A)
diff --git a/hicn-light/src/hicn/api/types.h b/hicn-light/src/hicn/api/types.h
deleted file mode 100644
index 1efab5e77..000000000
--- a/hicn-light/src/hicn/api/types.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef TYPES
-#define TYPES
-
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
-typedef uint64_t u64;
-
-/* Helper for avoiding warnings about type-punning */
-#define UNION_CAST(x, destType) \
- (((union { \
- __typeof__(x) a; \
- destType b; \
- })x) \
- .b)
-
-typedef unsigned int hash_t;
-
-typedef int (*cmp_t)(const void *, const void *);
-
-/* Enums */
-
-#define IS_VALID_ENUM_TYPE(NAME, x) ((x > NAME##_UNDEFINED) && (x < NAME##_N))
-
-#endif /* TYPES */
diff --git a/hicn-light/src/hicn/command_line/controller/CMakeLists.txt b/hicn-light/src/hicn/command_line/controller/CMakeLists.txt
index 5fd38a7bc..c0a584dae 100644
--- a/hicn-light/src/hicn/command_line/controller/CMakeLists.txt
+++ b/hicn-light/src/hicn/command_line/controller/CMakeLists.txt
@@ -18,6 +18,6 @@ list(APPEND CONTROLLER_SRC
build_executable(${HICN_LIGHT_CONTROL}
SOURCES ${CONTROLLER_SRC}
LINK_LIBRARIES ${HICN_LIGHT_LINK_LIBRARIES}
- DEPENDS ${LIBHICN_LIGHT}
- COMPONENT ${LIBHICN_LIGHT}
+ DEPENDS ${LIBHICN_LIGHT_STATIC}
+ COMPONENT ${HICN_LIGHT}
)
diff --git a/hicn-light/src/hicn/command_line/daemon/CMakeLists.txt b/hicn-light/src/hicn/command_line/daemon/CMakeLists.txt
index 8c0df2901..ca8c02ef0 100644
--- a/hicn-light/src/hicn/command_line/daemon/CMakeLists.txt
+++ b/hicn-light/src/hicn/command_line/daemon/CMakeLists.txt
@@ -18,6 +18,6 @@ list(APPEND DAEMON_SRC
build_executable(${HICN_LIGHT_DAEMON}
SOURCES ${DAEMON_SRC}
LINK_LIBRARIES ${HICN_LIGHT_LINK_LIBRARIES}
- DEPENDS ${LIBHICN_LIGHT}
- COMPONENT ${LIBHICN_LIGHT}
+ DEPENDS ${LIBHICN_LIGHT_STATIC}
+ COMPONENT ${HICN_LIGHT}
) \ No newline at end of file
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 512bcb619..51aeccb2a 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -27,7 +27,8 @@ if (NOT CMAKE_BUILD_TYPE)
endif()
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
- set(LIBHICN hicn)
+ set(LIBHICN hicn)
+ set(LIBHICN_STATIC ${LIBHICN}.static)
endif()
include (Packaging)
diff --git a/lib/src/CMakeLists.txt b/lib/src/CMakeLists.txt
index 29fc5d865..d62ac7e8f 100644
--- a/lib/src/CMakeLists.txt
+++ b/lib/src/CMakeLists.txt
@@ -78,16 +78,16 @@ else ()
LINK_LIBRARIES ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}
)
endif ()
-add_custom_command(TARGET hicn PRE_BUILD
+add_custom_command(TARGET ${LIBHICN_STATIC} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_BINARY_DIR}/hicn
)
-add_custom_command(TARGET hicn POST_BUILD
+add_custom_command(TARGET ${LIBHICN_STATIC} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/hicn/
COMMAND ${CMAKE_COMMAND} -E copy ${LIBHICN_HEADER_FILES} ${PROJECT_BINARY_DIR}/hicn/
)
-add_custom_command(TARGET hicn POST_BUILD
+add_custom_command(TARGET ${LIBHICN_STATIC} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/hicn/protocol
COMMAND ${CMAKE_COMMAND} -E copy ${LIBHICN_HEADER_FILES_PROTOCOL} ${PROJECT_BINARY_DIR}/hicn/protocol
)
diff --git a/libtransport/CMakeLists.txt b/libtransport/CMakeLists.txt
index d70a837b9..4ae46bb9a 100644
--- a/libtransport/CMakeLists.txt
+++ b/libtransport/CMakeLists.txt
@@ -81,16 +81,17 @@ if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
find_package_wrapper(HicnBinaryApi REQUIRED)
endif()
set(LIBTRANSPORT hicntransport)
+ set(LIBTRANSPORT_SHARED ${LIBTRANSPORT}.shared)
+ set(LIBTRANSPORT_STATIC ${LIBTRANSPORT}.static)
else()
if (ANDROID_API)
- set(HICN_LIBRARIES ${LIBHICN})
+ set(HICN_LIBRARIES ${LIBHICN_STATIC})
list(APPEND DEPENDENCIES
- ${LIBHICN}
+ ${LIBHICN_STATIC}
)
else ()
set(HICN_LIBRARIES ${LIBHICN_SHARED})
list(APPEND DEPENDENCIES
- ${LIBHICN}
${LIBHICN_SHARED}
)
endif ()
diff --git a/scripts/build-packages.sh b/scripts/build-packages.sh
index cc48900c2..b02572ca2 100644
--- a/scripts/build-packages.sh
+++ b/scripts/build-packages.sh
@@ -29,7 +29,7 @@ VPP_VERSION_RPM="19.04.1-release.x86_64"
BUILD_TOOLS_UBUNTU="build-essential doxygen"
LIBSSL_LIBEVENT_UBUNTU="libevent-dev libssl-dev"
-DEPS_UBUNTU="libparc-dev libasio-dev libcurl4-openssl-dev vpp-dev=${VPP_VERSION_DEB} libvppinfra=${VPP_VERSION_DEB} libvppinfra-dev=${VPP_VERSION_DEB} vpp-plugin-core=${VPP_VERSION_DEB}"
+DEPS_UBUNTU="libparc-dev libasio-dev libcurl4-openssl-dev vpp=${VPP_VERSION_DEB} vpp-dev=${VPP_VERSION_DEB} libvppinfra=${VPP_VERSION_DEB} libvppinfra-dev=${VPP_VERSION_DEB} vpp-plugin-core=${VPP_VERSION_DEB}"
# BUILD_TOOLS_GROUP_CENTOS="'Development Tools'"
DEPS_CENTOS="vpp-devel-${VPP_VERSION_RPM} vpp-lib-${VPP_VERSION_RPM} libparc-devel libcurl-devel asio-devel centos-release-scl devtoolset-7"
@@ -42,7 +42,7 @@ install_cmake() {
fi
cat /etc/resolv.conf
-``
+
CMAKE_INSTALL_SCRIPT_URL="https://cmake.org/files/v3.8/cmake-3.8.0-Linux-x86_64.sh"
CMAKE_INSTALL_SCRIPT="/tmp/install_cmake.sh"
curl ${CMAKE_INSTALL_SCRIPT_URL} > ${CMAKE_INSTALL_SCRIPT}
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 2f7b3bb12..ad81427e7 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -35,9 +35,11 @@ if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
set(HICN_UTILS hicn-utils)
else()
if (ANDROID_API)
- set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT})
+ set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT_STATIC})
+ set(DEPENDENCIES ${LIBTRANSPORT_STATIC})
else ()
set(LIBTRANSPORT_LIBRARIES ${LIBTRANSPORT_SHARED})
+ set(DEPENDENCIES ${LIBTRANSPORT_SHARED})
endif ()
endif()
@@ -60,7 +62,7 @@ include(Packaging)
build_executable(hiperf
SOURCES src/hiperf.cc
LINK_LIBRARIES ${LIBTRANSPORT_LIBRARIES} ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}
- DEPENDS ${LIBTRANSPORT}
+ DEPENDS ${DEPENDENCIES}
COMPONENT ${HICN_UTILS}
DEFINITIONS ${COMPILER_DEFINITIONS}
)
@@ -68,7 +70,7 @@ build_executable(hiperf
build_executable(hicn-ping-server
SOURCES src/ping_server.cc
LINK_LIBRARIES ${LIBTRANSPORT_LIBRARIES} ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}
- DEPENDS ${LIBTRANSPORT}
+ DEPENDS ${DEPENDENCIES}
COMPONENT ${HICN_UTILS}
DEFINITIONS ${COMPILER_DEFINITIONS}
)
@@ -76,7 +78,7 @@ build_executable(hicn-ping-server
build_executable(hicn-ping-client
SOURCES src/ping_client.cc
LINK_LIBRARIES ${LIBTRANSPORT_LIBRARIES} ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}
- DEPENDS ${LIBTRANSPORT}
+ DEPENDS ${DEPENDENCIES}
COMPONENT ${HICN_UTILS}
DEFINITIONS ${COMPILER_DEFINITIONS}
)