aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/CMakeLists.txt1
-rw-r--r--cmake/Modules/FindVpp.cmake9
-rw-r--r--ctrl/libhicnctrl/examples/Makefile20
-rw-r--r--ctrl/libhicnctrl/examples/create_face.c134
-rw-r--r--ctrl/sysrepo-plugins/CMakeLists.txt8
-rw-r--r--ctrl/sysrepo-plugins/cmake/FindHicnLight.cmake6
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h2
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c23
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c2
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c86
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h1
-rw-r--r--hicn-light/src/hicn/socket/ops_linux.c20
-rw-r--r--hicn-plugin/CMakeLists.txt31
-rw-r--r--hicn-plugin/src/cli.c93
-rw-r--r--hicn-plugin/src/faces/app/face_app_cli.c13
-rw-r--r--hicn-plugin/src/faces/app/face_prod.c35
-rw-r--r--hicn-plugin/src/faces/app/face_prod.h4
-rw-r--r--hicn-plugin/src/faces/app/face_prod_node.c24
-rw-r--r--hicn-plugin/src/hicn.api59
-rw-r--r--hicn-plugin/src/hicn_api.c91
-rw-r--r--hicn-plugin/src/hicn_api_test.c154
-rw-r--r--hicn-plugin/src/punt.c83
-rw-r--r--hicn-plugin/src/punt.h23
-rw-r--r--hicn-plugin/src/route.c74
-rw-r--r--hicn-plugin/src/route.h12
-rw-r--r--hicn-plugin/src/strategies/strategy_mw_cli.c14
-rw-r--r--lib/includes/hicn/compat.h12
-rw-r--r--lib/includes/hicn/util/ip_address.h17
-rw-r--r--lib/src/compat.c28
-rw-r--r--lib/src/name.c2
-rw-r--r--lib/src/util/ip_address.c4
-rw-r--r--libtransport/CMakeLists.txt2
-rw-r--r--libtransport/src/hicn/transport/core/content_object.cc6
-rw-r--r--libtransport/src/hicn/transport/core/content_object.h4
-rw-r--r--libtransport/src/hicn/transport/core/forwarder_interface.h8
-rw-r--r--libtransport/src/hicn/transport/core/hicn_binary_api.c48
-rw-r--r--libtransport/src/hicn/transport/core/hicn_binary_api.h6
-rw-r--r--libtransport/src/hicn/transport/core/interest.cc6
-rw-r--r--libtransport/src/hicn/transport/core/interest.h4
-rw-r--r--libtransport/src/hicn/transport/core/packet.h4
-rw-r--r--libtransport/src/hicn/transport/core/portal.h5
-rw-r--r--libtransport/src/hicn/transport/core/prefix.cc48
-rw-r--r--libtransport/src/hicn/transport/core/prefix.h4
-rw-r--r--libtransport/src/hicn/transport/core/raw_socket_interface.cc3
-rw-r--r--libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc33
-rw-r--r--libtransport/src/hicn/transport/utils/verifier.cc2
-rw-r--r--scripts/build-sysrepo.sh10
-rw-r--r--utils/CMakeLists.txt1
48 files changed, 714 insertions, 565 deletions
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index e9f1e07de..9f4e753bb 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -46,6 +46,7 @@ endif()
set(SUFFIX "")
if (${LIBTRANSPORT_LIBRARIES} MATCHES ".*-memif.*")
set(SUFFIX "-memif")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-unresolved-symbols=ignore-in-shared-libs")
endif()
set(HICN_APPS "${HICN_APPS}${SUFFIX}")
diff --git a/cmake/Modules/FindVpp.cmake b/cmake/Modules/FindVpp.cmake
index 7d8d16d13..d29f37339 100644
--- a/cmake/Modules/FindVpp.cmake
+++ b/cmake/Modules/FindVpp.cmake
@@ -46,6 +46,13 @@ find_library(VPP_LIBRARY_INFRA
DOC "Find the Vpp infra library"
)
+find_library(VPP_LIBRARY_VNET
+ NAMES vnet
+ HINTS ${VPP_SEARCH_PATH_LIST}
+ PATH_SUFFIXES lib lib64
+ DOC "Find the Vpp vnet library"
+)
+
find_library(VPP_LIBRARY_VATPLUGIN
NAMES vatplugin
HINTS ${VPP_SEARCH_PATH_LIST}
@@ -67,7 +74,7 @@ find_library(VPP_LIBRARY_VPPAPICLIENT
DOC "Find the Vpp vlib library"
)
-set(VPP_LIBRARIES ${VPP_LIBRARY_MEMORYCLIENT} ${VPP_LIBRARY_SVM} ${VPP_LIBRARY_INFRA} ${VPP_LIBRARY_VATPLUGIN} ${VPP_LIBRARY_VLIB})
+set(VPP_LIBRARIES ${VPP_LIBRARY_MEMORYCLIENT} ${VPP_LIBRARY_SVM} ${VPP_LIBRARY_INFRA} ${VPP_LIBRARY_VATPLUGIN} ${VPP_LIBRARY_VLIB} ${VPP_LIBRARY_VNET})
set(VPP_INCLUDE_DIRS ${VPP_INCLUDE_DIR} ${VPP_INCLUDE_DIR}/vpp_plugins)
include(FindPackageHandleStandardArgs)
diff --git a/ctrl/libhicnctrl/examples/Makefile b/ctrl/libhicnctrl/examples/Makefile
new file mode 100644
index 000000000..a6c6f0570
--- /dev/null
+++ b/ctrl/libhicnctrl/examples/Makefile
@@ -0,0 +1,20 @@
+EXEC = $(shell basename $$(pwd))
+CC = gcc
+
+CFLAGS = -std=gnu11 -O3 -Wall -Wextra -Wpedantic -Wstrict-aliasing -DWITH_POLICY=1
+LDFLAGS = -lhicn -lhicnctrl
+
+SRC = $(wildcard *.c)
+EXEC = $(SRC:.c=)
+
+all: $(EXEC)
+
+${EXEC}: $(SRC)
+ $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS)
+
+.PHONY: clean mrproper
+
+clean:
+ @rm -rf $(EXEC)
+
+mrproper: clean
diff --git a/ctrl/libhicnctrl/examples/create_face.c b/ctrl/libhicnctrl/examples/create_face.c
new file mode 100644
index 000000000..270ceeab9
--- /dev/null
+++ b/ctrl/libhicnctrl/examples/create_face.c
@@ -0,0 +1,134 @@
+/*
+ * 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 examples/create_face.c
+ * \brief libhicnctrl sample code : IPV4/UDP face creation
+ *
+ * NOTES:
+ * - This sample code is IPv4 only
+ */
+
+#include <stdlib.h>
+#include <sys/types.h> // getifaddrs
+#include <ifaddrs.h> // getifaddrs
+#include <stdio.h>
+#include <string.h> /* for strncpy */
+#include <sys/socket.h> // socket
+#include <sys/ioctl.h> // ioctl
+#include <unistd.h>
+
+#include <hicn/ctrl.h>
+#include <hicn/util/log.h>
+
+int get_local_info(char * if_name, ip_address_t * local_ip) {
+ struct ifaddrs *addrs;
+ struct ifreq ifr = {
+ .ifr_addr.sa_family = AF_INET,
+ };
+ int ret = -1;
+
+ int fd = socket(AF_INET, SOCK_DGRAM, 0);
+
+ getifaddrs(&addrs);
+
+ for (struct ifaddrs * tmp = addrs; tmp; tmp = tmp->ifa_next) {
+ if (!tmp->ifa_addr || tmp->ifa_addr->sa_family != AF_PACKET)
+ continue;
+ if (strcmp(tmp->ifa_name, "lo") == 0)
+ continue;
+ snprintf(if_name, IFNAMSIZ, "%s", tmp->ifa_name);
+
+ snprintf(ifr.ifr_name, IFNAMSIZ, "%s", tmp->ifa_name);
+ if (ioctl(fd, SIOCGIFADDR, &ifr) == 1) {
+ perror("ioctl");
+ continue;
+ }
+
+ local_ip->v4.as_inaddr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
+
+ ret = 0;
+ break;
+ }
+
+ freeifaddrs(addrs);
+ close(fd);
+ return ret;
+}
+
+int main() {
+ char remote_ip_str[INET_ADDRSTRLEN] = "1.1.1.1";
+
+ ip_address_t local_ip;
+ ip_address_t remote_ip;
+ char if_name[IFNAMSIZ];
+
+ /* Retrieving local info */
+
+ if (get_local_info(if_name, &local_ip) < 0) {
+ DEBUG("Error getting local information");
+ return -1;
+ }
+
+ char local_ip_str[MAXSZ_IP_ADDRESS];
+ ip_address_snprintf(local_ip_str, MAXSZ_IP_ADDRESS, &local_ip, AF_INET);
+ DEBUG("Local information :");
+ DEBUG(" - Interface name : %s", if_name);
+ DEBUG(" - IP address : %s", local_ip_str);
+
+ if (ip_address_pton (remote_ip_str, &remote_ip) < 0){
+ DEBUG("Error parsing remote IP address");
+ return -1;
+ }
+
+ /* Filling face information */
+ hc_face_t face = {
+ .face = {
+ .type = FACE_TYPE_UDP,
+ .local_addr = local_ip,
+ .remote_addr = remote_ip,
+ .local_port = 6000,
+ .remote_port = 6000,
+ },
+ };
+ if (netdevice_set_name(&face.face.netdevice, if_name) < 0) {
+ DEBUG("Error setting face netdevice name");
+ return -1;
+ }
+
+ /* Connecting to socket and creating face */
+
+ hc_sock_t * socket = hc_sock_create();
+ if (!socket){
+ DEBUG("Error creating libhicnctrl socket");
+ return -1;
+ }
+
+ if (hc_sock_connect(socket) < 0){
+ DEBUG("Error connecting to forwarder");
+ return -1;
+ }
+
+ if (hc_face_create(socket, &face) < 0){
+ DEBUG("Error creating face");
+ return -1;
+ }
+
+ DEBUG("Face created successfully");
+
+ hc_sock_free(socket);
+
+ return 0;
+}
diff --git a/ctrl/sysrepo-plugins/CMakeLists.txt b/ctrl/sysrepo-plugins/CMakeLists.txt
index 91726161f..cd7c0a16c 100644
--- a/ctrl/sysrepo-plugins/CMakeLists.txt
+++ b/ctrl/sysrepo-plugins/CMakeLists.txt
@@ -33,8 +33,12 @@ set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2")
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
# add subdirectories
-add_subdirectory(hicn-plugin)
-add_subdirectory(hicn-light)
+if (BUILD_HICNPLUGIN AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+ add_subdirectory(hicn-plugin)
+endif ()
+if (BUILD_HICNLIGHT AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+ add_subdirectory(hicn-light)
+endif ()
include(Packaging)
include(Packager)
make_packages()
diff --git a/ctrl/sysrepo-plugins/cmake/FindHicnLight.cmake b/ctrl/sysrepo-plugins/cmake/FindHicnLight.cmake
index bce3265fa..7883b09dd 100644
--- a/ctrl/sysrepo-plugins/cmake/FindHicnLight.cmake
+++ b/ctrl/sysrepo-plugins/cmake/FindHicnLight.cmake
@@ -18,15 +18,15 @@ set(HICNLIGHT_SEARCH_PATH_LIST
/usr
)
-find_path(HICNLIGHT_INCLUDE_DIR hicn/api/api.h
+find_path(HICNLIGHT_INCLUDE_DIR hicn/ctrl/api.h
HINTS ${HICNLIGHT_SEARCH_PATH_LIST}
PATH_SUFFIXES include
DOC "Find the hicn plugin includes"
)
-find_library(HICNLIGHT_LIBRARY NAMES libhicn-light-ctrl.so
+find_library(HICNLIGHT_LIBRARY NAMES libhicnctrl.so
HINTS ${HICNLIGHT_SEARCH_PATH_LIST}
- PATH_SUFFIXES lib
+ PATH_SUFFIXES lib/x86_64-linux-gnu/
DOC "Find the hicn light lib"
)
diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h
index adb7737aa..100023564 100644
--- a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h
+++ b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h
@@ -20,7 +20,7 @@
#include <sysrepo/values.h>
-#include <hicn/api/api.h>
+#include <hicn/ctrl/api.h>
#ifndef HICN_THIS_FUNC
#ifdef __FUNCTION__
diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c b/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c
index 7cfb8363a..6f8ece08c 100644
--- a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c
+++ b/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c
@@ -33,24 +33,22 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
size_t *output_cnt, void *private_ctx) {
SRP_LOG_DBG_MSG("hicn face ip add received successfully");
-
hc_face_t face;
-
if(strcmp(input[0].data.string_val,"-1")){
struct sockaddr_in sa;
// store this IP address in sa:
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
- face.face.hicn.family=AF_INET;
- face.face.hicn.local_addr.v4.as_inaddr=sa.sin_addr;
+ face.face.family=AF_INET;
+ face.face.local_addr.v4.as_inaddr=sa.sin_addr;
}else if(strcmp(input[1].data.string_val,"-1")){
struct in6_addr *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
- face.face.hicn.family=AF_INET6;
- face.face.hicn.local_addr.v6.as_in6addr = *dst;
+ face.face.family=AF_INET6;
+ face.face.local_addr.v6.as_in6addr = *dst;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -62,16 +60,16 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
// store this IP address in sa:
inet_pton(AF_INET, input[2].data.string_val, &(sa.sin_addr));
- face.face.hicn.family=AF_INET;
- face.face.hicn.remote_addr.v4.as_inaddr=sa.sin_addr;
+ face.face.family=AF_INET;
+ face.face.remote_addr.v4.as_inaddr=sa.sin_addr;
}else if(strcmp(input[3].data.string_val,"-1")){
struct in6_addr *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[3].data.string_val, dst);
- face.face.hicn.family=AF_INET6;
- face.face.hicn.remote_addr.v6.as_in6addr = *dst;
+ face.face.family=AF_INET6;
+ face.face.remote_addr.v6.as_in6addr = *dst;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -80,11 +78,10 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
// strncpy(face.face.hicn.netdevice.name,"ens39"); // Can we work only with Idx number ?
- face.face.hicn.netdevice.index = input[4].data.uint32_val; // This is the idx number of interface
+ face.face.netdevice.index = input[4].data.uint32_val; // This is the idx number of interface
face.id=0;//can be empty
- face.face.tags=0;//can be empty
strcpy(face.name,"hicn_face");
face.face.type=1;
@@ -203,4 +200,4 @@ error:
sr_plugin_cleanup_cb(session, hsocket);
return rc;
-} \ No newline at end of file
+}
diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c
index f02605895..0498527cb 100644
--- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c
+++ b/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c
@@ -302,7 +302,7 @@ static i32 ietf_interface_name2index(const char *name, u32* if_index)
dump = vapi_alloc_sw_interface_dump(g_vapi_ctx_instance);
dump->payload.name_filter_valid = true;
- memcpy(dump->payload.name_filter, name, sizeof(dump->payload.name_filter));
+ memcpy(&dump->payload.name_filter, name, sizeof(dump->payload.name_filter));
while (VAPI_EAGAIN == (rv = vapi_sw_interface_dump(g_vapi_ctx_instance, dump, ietf_sw_interface_dump_cb, &dctx)))
;
diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c
index b49839c53..4bf266ff5 100644
--- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c
+++ b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c
@@ -28,7 +28,7 @@
/* Hicn headers */
#include <vapi/hicn.api.vapi.h>
-#include <hicn/api/ip_address.h>
+#include <hicn/util/ip_address.h>
#include "../hicn_plugin.h"
#include "../hicn_vpp_comm.h"
#include "hicn_model.h"
@@ -485,18 +485,6 @@ static int hicn_node_params_set_cb(sr_session_ctx_t *session, const char *xpath,
new_val->data.int32_val);
msg->payload.cs_reserved_app = new_val->data.int32_val;
} else if (!strcmp(new_val->xpath,
- "/hicn:hicn-conf/params/pit_dflt_lifetime_sec")) {
- SRP_LOG_DBG("A change detected in '%s', op=%d",
- new_val ? new_val->xpath : old_val->xpath,
- new_val->data.decimal64_val);
- msg->payload.pit_dflt_lifetime_sec = new_val->data.decimal64_val;
- } else if (!strcmp(new_val->xpath,
- "/hicn:hicn-conf/params/pit_min_lifetime_sec")) {
- SRP_LOG_DBG("A change detected in '%s', op=%d",
- new_val ? new_val->xpath : old_val->xpath,
- new_val->data.decimal64_val);
- msg->payload.pit_min_lifetime_sec = new_val->data.decimal64_val;
- } else if (!strcmp(new_val->xpath,
"/hicn:hicn-conf/params/pit_max_lifetime_sec")) {
SRP_LOG_DBG("A change detected in '%s', op=%d",
new_val ? new_val->xpath : old_val->xpath,
@@ -675,16 +663,16 @@ static int hicn_route_get_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,B32);
-
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -693,7 +681,7 @@ static int hicn_route_get_cb(const char *xpath, const sr_val_t *input,
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
vapi_msg_hicn_api_route_get_hton(msg);
params_send(msg,resp);
@@ -727,23 +715,23 @@ static int hicn_route_nhops_add_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,4);
-
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
return SR_ERR_OPERATION_FAILED;
}
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
msg->payload.face_ids[0] = input[3].data.uint32_val;
msg->payload.face_ids[1] = input[4].data.uint32_val;
msg->payload.face_ids[2] = input[5].data.uint32_val;
@@ -784,7 +772,8 @@ static int hicn_route_del_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,B32);
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
@@ -792,8 +781,8 @@ static int hicn_route_del_cb(const char *xpath, const sr_val_t *input,
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -801,7 +790,7 @@ static int hicn_route_del_cb(const char *xpath, const sr_val_t *input,
}
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
vapi_msg_hicn_api_route_del_hton(msg);
params_send(msg,resp);
@@ -869,7 +858,8 @@ static int hicn_punting_add_cb(const char *xpath, const sr_val_t *input,
// store this IP address in sa:
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,B32);
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
@@ -877,15 +867,15 @@ static int hicn_punting_add_cb(const char *xpath, const sr_val_t *input,
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp =(unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
return SR_ERR_OPERATION_FAILED;
}
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
msg->payload.swif = input[3].data.uint32_val;
@@ -924,7 +914,8 @@ static int hicn_route_nhops_del_cb(const char *xpath, const sr_val_t *input,
// store this IP address in sa:
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,B32);
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
@@ -932,8 +923,8 @@ static int hicn_route_nhops_del_cb(const char *xpath, const sr_val_t *input,
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -941,7 +932,7 @@ static int hicn_route_nhops_del_cb(const char *xpath, const sr_val_t *input,
}
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
msg->payload.faceid = input[3].data.uint32_val;
vapi_msg_hicn_api_route_nhop_del_hton(msg);
@@ -979,7 +970,8 @@ static int hicn_punting_del_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.prefix[0],tmp,B32);
+ memcpy(&msg->payload.prefix.address.un.ip4[0],tmp,B32);
+ msg->payload.prefix.address.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
@@ -987,8 +979,8 @@ static int hicn_punting_del_cb(const char *xpath, const sr_val_t *input,
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.prefix[0],tmp,B64);
- memcpy(&msg->payload.prefix[1],tmp+B64,B64);
+ memcpy(&msg->payload.prefix.address.un.ip6[0],tmp,B128);
+ msg->payload.prefix.address.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -996,7 +988,7 @@ static int hicn_punting_del_cb(const char *xpath, const sr_val_t *input,
}
- msg->payload.len = input[2].data.uint8_val;
+ msg->payload.prefix.len = input[2].data.uint8_val;
msg->payload.swif = input[3].data.uint32_val;
vapi_msg_hicn_api_punting_del_hton(msg);
@@ -1061,15 +1053,16 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *) &sa.sin_addr.s_addr;
- memcpy(&msg->payload.local_addr[0],tmp,B32);
+ memcpy(&msg->payload.local_addr.un.ip4[0],tmp,B32);
+ msg->payload.local_addr.af = ADDRESS_IP4;
}else if(strcmp(input[1].data.string_val,"-1")){
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[1].data.string_val, dst);
unsigned char * tmp = (unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.local_addr[0],tmp,B64);
- memcpy(&msg->payload.local_addr[1],tmp+B64,B64);
+ memcpy(&msg->payload.local_addr.un.ip6[0],tmp,B128);
+ msg->payload.local_addr.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -1081,7 +1074,8 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
struct sockaddr_in sa;
inet_pton(AF_INET, input[2].data.string_val, &(sa.sin_addr));
unsigned char * tmp = (unsigned char *)&sa.sin_addr.s_addr;
- memcpy(&msg->payload.remote_addr[0],tmp,B32);
+ memcpy(&msg->payload.remote_addr.un.ip4[0],tmp,B32);
+ msg->payload.remote_addr.af = ADDRESS_IP4;
}else if(strcmp(input[3].data.string_val,"-1")){
@@ -1089,8 +1083,8 @@ static int hicn_face_ip_add_cb(const char *xpath, const sr_val_t *input,
void *dst = malloc(sizeof(struct in6_addr));
inet_pton(AF_INET6, input[3].data.string_val, dst);
unsigned char * tmp =(unsigned char *) ((struct in6_addr *)dst)->s6_addr;
- memcpy(&msg->payload.remote_addr[0],tmp,B64);
- memcpy(&msg->payload.remote_addr[1],tmp+B64,B64);
+ memcpy(&msg->payload.remote_addr.un.ip6[0],tmp,B128);
+ msg->payload.remote_addr.af = ADDRESS_IP6;
}else{
SRP_LOG_DBG_MSG("Invalid local IP address");
@@ -1452,4 +1446,4 @@ error:
SRP_LOG_ERR_MSG("Error by initialization of the hicn plugin.");
sr_plugin_cleanup_cb(session, &g_vapi_ctx_instance);
return rc;
-} \ No newline at end of file
+}
diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h
index 6cb5d2710..02317d5d6 100644
--- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h
+++ b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h
@@ -21,6 +21,7 @@
#define MEM_ALIGN 4096
#define B32 4
#define B64 8
+#define B128 16
// Number of locks is equal to number of nodes in hicn-state
// It is a coarse grain approach later can be changed to fine grained
diff --git a/hicn-light/src/hicn/socket/ops_linux.c b/hicn-light/src/hicn/socket/ops_linux.c
index af41f400f..96636039f 100644
--- a/hicn-light/src/hicn/socket/ops_linux.c
+++ b/hicn-light/src/hicn/socket/ops_linux.c
@@ -619,7 +619,7 @@ int _nl_set_ip_addr(uint32_t interface_id, ip_prefix_t *prefix) {
.payload.ifa_index = interface_id};
/* Set attributes = length/type/value */
- struct rtattr ifa_address = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)),
+ struct rtattr ifa_address = {RTA_LENGTH(ip_address_len(prefix->family)),
IFA_ADDRESS};
struct iovec iov[] = {
{&msg, sizeof(msg)},
@@ -987,13 +987,13 @@ int _nl_del_lo_route(const ip_prefix_t *prefix) {
/* Set attribute = length/type/value */
uint32_t one = 1;
- struct rtattr a_dst = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)), RTA_DST};
+ struct rtattr a_dst = {RTA_LENGTH(ip_address_len(prefix->family)), RTA_DST};
struct rtattr a_ifid_lo = {RTA_LENGTH(sizeof(uint32_t)), RTA_OIF};
struct iovec iov[] = {
{&msg, sizeof(msg)},
/* Ip address */
{&a_dst, sizeof(a_dst)},
- {(void *)&prefix->address.buffer, ip_address_len(&prefix->address, prefix->family)},
+ {(void *)&prefix->address.buffer, ip_address_len(prefix->family)},
/* Interface id */
{&a_ifid_lo, sizeof(a_ifid_lo)},
{&one, sizeof(one)}};
@@ -1149,7 +1149,7 @@ int _nl_add_neigh_proxy(const ip_prefix_t *prefix,
};
/* Message attributes = length/type/value */
- struct rtattr a_dst = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)), NDA_DST};
+ struct rtattr a_dst = {RTA_LENGTH(ip_address_len(prefix->family)), NDA_DST};
/* Iovec describing the packets */
struct iovec iov[] = {
@@ -1226,7 +1226,7 @@ int _nl_add_in_route_table(const ip_prefix_t *prefix,
};
/* Message attributes = length/type/value */
- struct rtattr a_dst = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)), RTA_DST};
+ struct rtattr a_dst = {RTA_LENGTH(ip_address_len(prefix->family)), RTA_DST};
struct rtattr a_oif = {RTA_LENGTH(sizeof(uint32_t)), RTA_OIF};
/* Iovec describing the packets */
@@ -1234,7 +1234,7 @@ int _nl_add_in_route_table(const ip_prefix_t *prefix,
{&msg, sizeof(msg)},
/* Destination prefix / ip address */
{&a_dst, sizeof(a_dst)},
- {(void *)&prefix->address.buffer, ip_address_len(&prefix->address, prefix->family)},
+ {(void *)&prefix->address.buffer, ip_address_len(prefix->family)},
/* Output interface */
{&a_oif, sizeof(a_oif)},
{(void *)&interface_id, sizeof(uint32_t)},
@@ -1328,7 +1328,7 @@ int _nl_add_prio_rule(const ip_prefix_t *prefix, uint8_t address_family,
if (prefix) {
/* Message attributes = length/type/value */
- struct rtattr a_src = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)), FRA_SRC};
+ struct rtattr a_src = {RTA_LENGTH(ip_address_len(prefix->family)), FRA_SRC};
struct rtattr a_prio = {RTA_LENGTH(sizeof(uint32_t)), FRA_PRIORITY};
/* Iovec describing the packets */
@@ -1336,7 +1336,7 @@ int _nl_add_prio_rule(const ip_prefix_t *prefix, uint8_t address_family,
{&msg, sizeof(msg)},
/* Source prefix / prefix */
{&a_src, sizeof(a_src)},
- {(void *)&prefix->address.buffer, ip_address_len(&prefix->address, prefix->family)},
+ {(void *)&prefix->address.buffer, ip_address_len(prefix->family)},
/* Priority */
{&a_prio, sizeof(a_prio)},
{(void *)&priority, sizeof(uint32_t)},
@@ -1429,7 +1429,7 @@ int _nl_del_prio_rule(const ip_prefix_t *prefix, uint8_t address_family,
/* Message attributes = length/type/value */
if (prefix) {
- struct rtattr a_src = {RTA_LENGTH(ip_address_len(&prefix->address, prefix->family)), FRA_SRC};
+ struct rtattr a_src = {RTA_LENGTH(ip_address_len(prefix->family)), FRA_SRC};
struct rtattr a_prio = {RTA_LENGTH(sizeof(uint32_t)), FRA_PRIORITY};
/* Iovec describing the packets */
@@ -1437,7 +1437,7 @@ int _nl_del_prio_rule(const ip_prefix_t *prefix, uint8_t address_family,
{&msg, sizeof(msg)},
/* Source prefix / prefix */
{&a_src, sizeof(a_src)},
- {(void *)&prefix->address.buffer, ip_address_len(&prefix->address, prefix->family)},
+ {(void *)&prefix->address.buffer, ip_address_len(prefix->family)},
/* Priority */
{&a_prio, sizeof(a_prio)},
{(void *)&priority, sizeof(uint32_t)},
diff --git a/hicn-plugin/CMakeLists.txt b/hicn-plugin/CMakeLists.txt
index 8425a5cf3..56c8055ee 100644
--- a/hicn-plugin/CMakeLists.txt
+++ b/hicn-plugin/CMakeLists.txt
@@ -215,42 +215,51 @@ elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DCLIB_DEBUG -fPIC -fstack-protector-all)
endif()
-execute_process(COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/hicn)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/hicn)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/vnet/ip)
# These files are missing from vpp binary distribution
execute_process(
COMMAND
bash -c
- "if [ ! -e ${CMAKE_BINARY_DIR}/vapi_json_parser.py ]; then
- curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_json_parser.py?h=stable/1908 -o ${CMAKE_BINARY_DIR}/vapi_json_parser.py;
+ "if [ ! -e ${CMAKE_CURRENT_BINARY_DIR}/vapi_json_parser.py ]; then
+ curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_json_parser.py?h=stable/1908 -o ${CMAKE_CURRENT_BINARY_DIR}/vapi_json_parser.py;
fi;"
)
execute_process(
COMMAND
bash -c
- "if [ ! -e ${CMAKE_BINARY_DIR}/vapi_c_gen.py ]; then
- curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_c_gen.py?h=stable/1908 -o ${CMAKE_BINARY_DIR}/vapi_c_gen.py;
+ "if [ ! -e ${CMAKE_CURRENT_BINARY_DIR}/vapi_c_gen.py ]; then
+ curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_c_gen.py?h=stable/1908 -o ${CMAKE_CURRENT_BINARY_DIR}/vapi_c_gen.py;
fi;"
)
execute_process(
COMMAND
bash -c
- "if [ ! -e ${CMAKE_BINARY_DIR}/vapi_cpp_gen.py ]; then
- curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_cpp_gen.py?h=stable/1908 -o ${CMAKE_BINARY_DIR}/vapi_cpp_gen.py;
+ "if [ ! -e ${CMAKE_CURRENT_BINARY_DIR}/vapi_cpp_gen.py ]; then
+ curl https://git.fd.io/vpp/plain/src/vpp-api/vapi/vapi_cpp_gen.py?h=stable/1908 -o ${CMAKE_CURRENT_BINARY_DIR}/vapi_cpp_gen.py;
+ fi;"
+)
+
+execute_process(
+ COMMAND
+ bash -c
+ "if [ ! -e ${CMAKE_CURRENT_BINARY_DIR}/vnet/ip/ip_types.api ]; then
+ curl https://git.fd.io/vpp/plain/src/vnet/ip/ip_types.api?h=stable/1908 -o ${CMAKE_CURRENT_BINARY_DIR}/vnet/ip/ip_types.api;
fi;"
)
add_custom_command(
- COMMAND chmod +x ${CMAKE_BINARY_DIR}/vapi_json_parser.py ${CMAKE_BINARY_DIR}/vapi_c_gen.py ${CMAKE_BINARY_DIR}/vapi_cpp_gen.py
+ COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/vapi_json_parser.py ${CMAKE_CURRENT_BINARY_DIR}/vapi_c_gen.py ${CMAKE_CURRENT_BINARY_DIR}/vapi_cpp_gen.py
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.h
- COMMAND ${VPP_HOME}/bin/vppapigen --input ${CMAKE_CURRENT_SOURCE_DIR}/src/hicn.api --output ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.h
+ COMMAND ${VPP_HOME}/bin/vppapigen --includedir ${CMAKE_CURRENT_BINARY_DIR} --input ${CMAKE_CURRENT_SOURCE_DIR}/src/hicn.api --output ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/hicn.api
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
COMMAND ${VPP_HOME}/bin/vppapigen JSON --input ${CMAKE_CURRENT_SOURCE_DIR}/src/hicn.api --output ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.vapi.h
- COMMAND ${CMAKE_BINARY_DIR}/vapi_c_gen.py ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/vapi_c_gen.py ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.vapi.hpp
- COMMAND ${CMAKE_BINARY_DIR}/vapi_cpp_gen.py ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/vapi_cpp_gen.py ${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins/hicn/hicn.api.json
)
include_directories(SYSTEM)
diff --git a/hicn-plugin/src/cli.c b/hicn-plugin/src/cli.c
index bd789acad..c8d8b5bf6 100644
--- a/hicn-plugin/src/cli.c
+++ b/hicn-plugin/src/cli.c
@@ -21,6 +21,7 @@
#include <vnet/udp/udp.h> // port registration
#include <vnet/ip/ip6_packet.h> // ip46_address_t
#include <vnet/ip/format.h>
+#include <vnet/fib/fib_types.h>
#include "hicn.h"
#include "infra.h"
@@ -416,10 +417,11 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
int rv = HICN_ERROR_NONE;
int addpfx = -1;
- ip46_address_t prefix;
+ ip46_address_t address;
hicn_face_id_t faceid = HICN_FACE_NULL;
u32 strategy_id;
u8 plen = 0;
+ fib_prefix_t prefix;
/* Get a line of input. */
unformat_input_t _line_input, *line_input = &_line_input;
@@ -443,7 +445,7 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
else if (addpfx != -1
&& unformat (line_input, "prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &address, IP46_TYPE_ANY, &plen))
{;
}
else if (addpfx <= 1 && unformat (line_input, "face %u", &faceid))
@@ -458,16 +460,18 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
}
+ fib_prefix_from_ip46_addr(&address, &prefix);
+ prefix.fp_len=plen;
/* Check parse */
if (addpfx <= 1
- && ((ip46_address_is_zero (&prefix)) || faceid == HICN_FACE_NULL))
+ && ((ip46_address_is_zero (&prefix.fp_addr)) || faceid == HICN_FACE_NULL))
{
cl_err =
clib_error_return (0, "Please specify prefix and a valid faceid...");
goto done;
}
/* Check parse */
- if ((ip46_address_is_zero (&prefix))
+ if ((ip46_address_is_zero (&prefix.fp_addr))
|| (addpfx == 2 && hicn_dpo_strategy_id_is_valid (strategy_id)))
{
cl_err = clib_error_return (0,
@@ -476,18 +480,18 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
if (addpfx == 0)
{
- if (ip46_address_is_zero (&prefix))
+ if (ip46_address_is_zero (&prefix.fp_addr))
{
cl_err = clib_error_return (0, "Please specify prefix");
goto done;
}
if (faceid == HICN_FACE_NULL)
{
- rv = hicn_route_del (&prefix, plen);
+ rv = hicn_route_del (&prefix);
}
else
{
- rv = hicn_route_del_nhop (&prefix, plen, faceid);
+ rv = hicn_route_del_nhop (&prefix, faceid);
}
cl_err =
(rv == HICN_ERROR_NONE) ? NULL : clib_error_return (0,
@@ -497,10 +501,10 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
else if (addpfx == 1)
{
- rv = hicn_route_add (&faceid, 1, &prefix, plen);
+ rv = hicn_route_add (&faceid, 1, &prefix);
if (rv == HICN_ERROR_ROUTE_ALREADY_EXISTS)
{
- rv = hicn_route_add_nhops (&faceid, 1, &prefix, plen);
+ rv = hicn_route_add_nhops (&faceid, 1, &prefix);
}
cl_err =
(rv == HICN_ERROR_NONE) ? NULL : clib_error_return (0,
@@ -509,7 +513,7 @@ hicn_cli_fib_set_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
else if (addpfx == 2)
{
- rv = hicn_route_set_strategy (&prefix, plen, strategy_id);
+ rv = hicn_route_set_strategy (&prefix, strategy_id);
cl_err =
(rv == HICN_ERROR_NONE) ? NULL : clib_error_return (0,
get_error_string
@@ -526,13 +530,14 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
{
hicn_mgmt_punting_op_e punting_op = HICN_MGMT_PUNTING_OP_NONE;
unsigned int subnet_mask = 0;
- ip46_address_t prefix;
+ ip46_address_t address;
u32 sw_if_index = ~0;
int ret = 0;
vnet_main_t *vnm = NULL;
u8 type = HICN_PUNT_IP_TYPE;
u32 src_port = 0, dst_port = 0;
vnm = vnet_get_main ();
+ fib_prefix_t prefix;
unformat_input_t _line_input, *line_input = &_line_input;
if (!unformat_user (main_input, unformat_line_input, line_input))
@@ -555,7 +560,7 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
else if (unformat
(line_input, "prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &subnet_mask))
+ &address, IP46_TYPE_ANY, &subnet_mask))
{;
}
else if (unformat (line_input, "type ip"))
@@ -584,14 +589,16 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
}
}
+ fib_prefix_from_ip46_addr(&address, &prefix);
+ prefix.fp_len = subnet_mask;
if (punting_op == HICN_MGMT_PUNTING_OP_CREATE
- && (ip46_address_is_zero (&prefix) || sw_if_index == ~0))
+ && (ip46_address_is_zero (&prefix.fp_addr) || sw_if_index == ~0))
{
return (clib_error_return
(0, "Please specify valid prefix and interface"));
}
else if ((punting_op == HICN_MGMT_PUNTING_OP_DELETE) &&
- ip46_address_is_zero (&prefix))
+ ip46_address_is_zero (&prefix.fp_addr))
{
return (clib_error_return
(0, "Please specify valid prefix and optionally an interface"));
@@ -609,7 +616,7 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
{
if (src_port != 0 && dst_port != 0)
ret =
- hicn_punt_interest_data_for_udp (vm, &prefix, subnet_mask,
+ hicn_punt_interest_data_for_udp (vm, &prefix,
sw_if_index, type,
clib_host_to_net_u16
(src_port),
@@ -623,8 +630,7 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
else
{
ret =
- hicn_punt_interest_data_for_ip (vm, &prefix, subnet_mask,
- sw_if_index, type, NO_L2);
+ hicn_punt_interest_data_for_ip (vm, &prefix, sw_if_index, type, NO_L2);
}
}
break;
@@ -632,7 +638,7 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
{
if (sw_if_index != ~0)
{
- ip46_address_is_ip4 (&prefix) ?
+ ip46_address_is_ip4 (&prefix.fp_addr) ?
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm,
sw_if_index,
0) :
@@ -640,14 +646,13 @@ hicn_cli_punting_command_fn (vlib_main_t * vm, unformat_input_t * main_input,
sw_if_index,
0);
}
- else if (!(ip46_address_is_zero (&prefix)))
+ else if (!(ip46_address_is_zero (&prefix.fp_addr)))
{
- ret = ip46_address_is_ip4 (&prefix) ?
- hicn_punt_remove_ip4_address (vm, &(prefix.ip4), subnet_mask, 1,
+ ret = ip46_address_is_ip4 (&prefix.fp_addr) ?
+ hicn_punt_remove_ip4_address (vm, &prefix, 1,
sw_if_index,
0, NO_L2) :
- hicn_punt_remove_ip6_address (vm, (ip6_address_t *) & prefix,
- subnet_mask, 1, sw_if_index, 0,
+ hicn_punt_remove_ip6_address (vm, &prefix, 1, sw_if_index, 0,
NO_L2);
}
}
@@ -671,14 +676,15 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
{
hicn_main_t *sm = &hicn_main;
hicnpg_main_t *hpgm = &hicnpg_main;
- ip46_address_t src_addr, hicn_name;
+ ip46_address_t src_addr;
+ fib_prefix_t prefix;
vnet_main_t *vnm = vnet_get_main ();
u32 sw_if_index = ~0;
u16 lifetime = 4000;
int rv = VNET_API_ERROR_UNIMPLEMENTED;
u32 max_seq = ~0;
u32 n_flows = ~0;
- u32 mask = 0;
+ u16 mask = 0;
u32 n_ifaces = 1;
u32 hicn_underneath = ~0;
@@ -711,8 +717,8 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
;
}
else if (unformat (line_input, "name %U/%d",
- unformat_ip46_address, &hicn_name, IP46_TYPE_ANY,
- &mask))
+ unformat_ip46_address, &prefix.fp_addr, IP46_TYPE_ANY,
+ &prefix.fp_len))
{
;
}
@@ -738,6 +744,7 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
}
}
hpgm->interest_lifetime = lifetime;
+ mask = prefix.fp_len;
if (sw_if_index == ~0)
{
@@ -771,8 +778,9 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
* Register punting on src address generated by pg and data punting
* on the name
*/
- if (ip46_address_is_ip4 (&src_addr) && ip46_address_is_ip4 (&hicn_name))
+ if (ip46_address_is_ip4 (&src_addr) && ip46_address_is_ip4 (&prefix.fp_addr))
{
+ prefix.fp_proto = FIB_PROTOCOL_IP4;
/* Add data node to the vpp graph */
u32 next_hit_node = vlib_node_add_next (vm,
hicn_punt_glb.
@@ -793,11 +801,11 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
/* Add a session to the table */
hicn_punt_add_vnetssn (&ipv4, &ipv4_src,
- &hicn_name, mask,
+ &prefix,
next_hit_node, sw_if_index, base_offset);
hicn_punt_add_vnetssn (&ipv4, &ipv4_src,
- &hicn_name, mask,
+ &prefix,
next_hit_node, sw_if_index, base_offset);
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm, sw_if_index,
@@ -809,8 +817,9 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
}
else if (!ip46_address_is_ip4 (&src_addr)
- && !ip46_address_is_ip4 (&hicn_name))
+ && !ip46_address_is_ip4 (&prefix.fp_addr))
{
+ prefix.fp_proto = FIB_PROTOCOL_IP6;
/* Add node to the vpp graph */
u32 next_hit_node = vlib_node_add_next (vm,
hicn_punt_glb.hicn_node_info.
@@ -831,11 +840,11 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
/* Add a session to the table */
hicn_punt_add_vnetssn (&ipv6, &ipv6_src,
- &hicn_name, mask,
+ &prefix,
next_hit_node, sw_if_index, base_offset);
hicn_punt_add_vnetssn (&ipv6, &ipv6_src,
- &hicn_name, mask,
+ &prefix,
next_hit_node, sw_if_index, base_offset);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, sw_if_index,
@@ -854,7 +863,7 @@ hicn_cli_pgen_client_set_command_fn (vlib_main_t * vm,
hpgm->pgen_clt_src_addr = src_addr;
- hpgm->pgen_clt_hicn_name = hicn_name;
+ hpgm->pgen_clt_hicn_name = prefix.fp_addr;
hpgm->max_seq_number = max_seq;
hpgm->n_flows = n_flows;
hpgm->n_ifaces = n_ifaces;
@@ -890,7 +899,7 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
int rv = HICN_ERROR_NONE;
hicnpg_server_main_t *pg_main = &hicnpg_server_main;
hicn_main_t *sm = &hicn_main;
- ip46_address_t hicn_name;
+ fib_prefix_t prefix;
u32 subnet_mask;
int payload_size = 0;
u32 sw_if_index = ~0;
@@ -912,8 +921,8 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
hicn_underneath = 1;
}
if (unformat (line_input, "name %U/%d",
- unformat_ip46_address, &hicn_name, IP46_TYPE_ANY,
- &subnet_mask))
+ unformat_ip46_address, &prefix.fp_addr, IP46_TYPE_ANY,
+ &prefix.fp_len))
{;
}
else if (unformat (line_input, "size %d", &payload_size))
@@ -940,6 +949,8 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
}
}
}
+ prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+ subnet_mask = prefix.fp_len;
/* Attach our packet-gen node for ip4 udp local traffic */
if (payload_size == 0 || sw_if_index == ~0)
{
@@ -980,7 +991,7 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
base_offset = NO_L2;
use_current_data = HICN_CLASSIFY_CURRENT_DATA_FLAG;
}
- if (ip46_address_is_ip4 (&hicn_name))
+ if (ip46_address_is_ip4 (&prefix.fp_addr))
{
/* Add node to the vpp graph */
u32 next_hit_node = vlib_node_add_next (vm,
@@ -999,8 +1010,7 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
/* Add a session to the table */
hicn_punt_add_vnetssn (&ipv4, &ipv4_dst,
- (ip46_address_t *) & (hicn_name.ip4),
- subnet_mask, next_hit_node, sw_if_index,
+ &prefix, next_hit_node, sw_if_index,
base_offset);
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm, sw_if_index,
@@ -1026,8 +1036,7 @@ hicn_cli_pgen_server_set_command_fn (vlib_main_t * vm,
/* Add a session to the table */
hicn_punt_add_vnetssn (&ipv6, &ipv6_dst,
- (ip46_address_t *) & (hicn_name.ip6),
- subnet_mask, next_hit_node, sw_if_index,
+ &prefix, next_hit_node, sw_if_index,
base_offset);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, sw_if_index,
diff --git a/hicn-plugin/src/faces/app/face_app_cli.c b/hicn-plugin/src/faces/app/face_app_cli.c
index d55e990de..200f813cb 100644
--- a/hicn-plugin/src/faces/app/face_app_cli.c
+++ b/hicn-plugin/src/faces/app/face_app_cli.c
@@ -34,14 +34,14 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm,
vlib_cli_command_t * cmd)
{
vnet_main_t *vnm = vnet_get_main ();
- ip46_address_t prefix;
+ fib_prefix_t prefix;
hicn_face_id_t face_id = HICN_FACE_NULL;
u32 cs_reserved = HICN_PARAM_FACE_DFT_CS_RESERVED;
int ret = HICN_ERROR_NONE;
int sw_if;
int face_op = HICN_FACE_NONE;
int prod = 0;
- int len;
+
/* Get a line of input. */
unformat_input_t _line_input, *line_input = &_line_input;
@@ -71,7 +71,7 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm,
else
if (unformat
(line_input, "prod prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &len))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{
prod = 1;
}
@@ -114,14 +114,11 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm,
ip4_address_t cons_addr4;
ip6_address_t cons_addr6;
- hicn_prefix_t name_prefix = {
- .name = prefix,
- .len = len,
- };
if (prod)
{
+ prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
rv =
- hicn_face_prod_add (&name_prefix, sw_if, &cs_reserved,
+ hicn_face_prod_add (&prefix, sw_if, &cs_reserved,
&prod_addr, &face_id);
if (rv == HICN_ERROR_NONE)
{
diff --git a/hicn-plugin/src/faces/app/face_prod.c b/hicn-plugin/src/faces/app/face_prod.c
index bbcc7fa6e..6c12e6d33 100644
--- a/hicn-plugin/src/faces/app/face_prod.c
+++ b/hicn-plugin/src/faces/app/face_prod.c
@@ -29,7 +29,7 @@ hicn_face_prod_state_t *face_state_vec;
u32 *face_state_pool;
static int
-hicn_app_state_create (u32 swif, hicn_prefix_t * prefix)
+hicn_app_state_create (u32 swif, fib_prefix_t * prefix)
{
/* Make sure that the pool is not empty */
pool_validate_index (face_state_pool, 0);
@@ -54,14 +54,14 @@ hicn_app_state_create (u32 swif, hicn_prefix_t * prefix)
/* Create the appif and store in the vector */
vec_validate (face_state_vec, swif);
clib_memcpy (&(face_state_vec[swif].prefix), prefix,
- sizeof (hicn_prefix_t));
+ sizeof (fib_prefix_t));
/* Set as busy the element in the vector */
pool_get (face_state_pool, swif_app);
*swif_app = swif;
int ret = HICN_ERROR_NONE;
- if (ip46_address_is_ip4 (&(prefix->name)))
+ if (ip46_address_is_ip4 (&(prefix->fp_addr)))
{
ret =
vnet_feature_enable_disable ("ip4-unicast", "hicn-face-prod-input",
@@ -86,7 +86,7 @@ hicn_app_state_del (u32 swif)
u32 *temp;
u32 *swif_app = NULL;
u8 found = 0;
- ip46_address_t *prefix_addr;
+ fib_prefix_t *prefix;
/* *INDENT-OFF* */
pool_foreach (temp, face_state_pool,{
if (*temp == swif)
@@ -98,12 +98,12 @@ hicn_app_state_del (u32 swif)
);
/* *INDENT-ON* */
- prefix_addr = &(face_state_vec[swif].prefix.name);
+ prefix = &(face_state_vec[swif].prefix);
if (!found)
return HICN_ERROR_APPFACE_NOT_FOUND;
int ret = HICN_ERROR_NONE;
- if (ip46_address_is_ip4 (prefix_addr))
+ if (ip46_address_is_ip4 (&prefix->fp_addr))
{
ret =
vnet_feature_enable_disable ("ip4-unicast", "hicn-face-prod-input",
@@ -123,7 +123,7 @@ hicn_app_state_del (u32 swif)
}
int
-hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
+hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
ip46_address_t * prod_addr, hicn_face_id_t * faceid)
{
vlib_main_t *vm = vlib_get_main ();
@@ -146,12 +146,12 @@ hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
vnet_sw_interface_set_flags (vnm, sw_if, if_flags);
u8 *s0;
- s0 = format (0, "Prefix %U/%u", format_ip6_address,
- &prefix->name, prefix->len);
+ s0 = format (0, "Prefix %U", format_fib_prefix,
+ prefix);
vlib_cli_output (vm, "Received request for %s, swif %d\n", s0, sw_if);
- if (ip46_address_is_zero (&prefix->name))
+ if (ip46_address_is_zero (&prefix->fp_addr))
{
return HICN_ERROR_APPFACE_PROD_PREFIX_NULL;
}
@@ -159,16 +159,16 @@ hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
* Check if a producer face is already existing for the same prefix
* and sw_if
*/
- if (ip46_address_is_ip4 (&prefix->name))
+ if (ip46_address_is_ip4 (&prefix->fp_addr))
{
face =
- hicn_face_ip4_get (&(prefix->name.ip4), sw_if,
+ hicn_face_ip4_get (&(prefix->fp_addr.ip4), sw_if,
&hicn_face_ip_remote_hashtb);
}
else
{
face =
- hicn_face_ip6_get (&(prefix->name.ip6), sw_if,
+ hicn_face_ip6_get (&(prefix->fp_addr.ip6), sw_if,
&hicn_face_ip_remote_hashtb);
if (face != NULL)
return HICN_ERROR_FACE_ALREADY_CREATED;
@@ -202,7 +202,7 @@ hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
else
{
/* Otherwise create the face */
- if (ip46_address_is_ip4 (&prefix->name))
+ if (ip46_address_is_ip4 (&prefix->fp_addr))
{
/*
* Otherwise retrieve an ip address to assign as a
@@ -226,7 +226,7 @@ hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
ip6_address_t remote_app_ip6;
get_two_ip6_addresses (&local_app_ip6, &remote_app_ip6);
u8 *s0;
- s0 = format (0, "Prefix %U", format_ip6_address, &local_app_ip6);
+ s0 = format (0, "%U", format_ip6_address, &local_app_ip6);
vlib_cli_output (vm, "Setting ip address %s\n", s0);
@@ -264,7 +264,7 @@ hicn_face_prod_add (hicn_prefix_t * prefix, u32 sw_if, u32 * cs_reserved,
&& hicn_face_prod_set_lru_max (*faceid, cs_reserved) == HICN_ERROR_NONE)
{
hicn_app_state_create (sw_if, prefix);
- ret = hicn_route_add (faceid, 1, &(prefix->name), prefix->len);
+ ret = hicn_route_add (faceid, 1, prefix);
}
*prod_addr = local_app_ip;
@@ -294,8 +294,7 @@ hicn_face_prod_del (hicn_face_id_t face_id)
prod_face->policy.max = 0;
/* Remove the face from the fib */
- hicn_route_del_nhop (&(face_state_vec[face->shared.sw_if].prefix.name),
- (face_state_vec[face->shared.sw_if].prefix.len),
+ hicn_route_del_nhop (&(face_state_vec[face->shared.sw_if].prefix),
face_id);
int ret = hicn_face_ip_del (face_id);
diff --git a/hicn-plugin/src/faces/app/face_prod.h b/hicn-plugin/src/faces/app/face_prod.h
index 89b74680b..74c62c3bb 100644
--- a/hicn-plugin/src/faces/app/face_prod.h
+++ b/hicn-plugin/src/faces/app/face_prod.h
@@ -49,7 +49,7 @@
*/
typedef struct
{
- hicn_prefix_t prefix;
+ fib_prefix_t prefix;
} hicn_face_prod_state_t;
extern hicn_face_prod_state_t *face_state_vec;
@@ -77,7 +77,7 @@ typedef struct __attribute__ ((packed)) hicn_face_prod_t_
* send data to the producer face
*/
int
-hicn_face_prod_add (hicn_prefix_t * prefix, u32 swif, u32 * cs_reserved,
+hicn_face_prod_add (fib_prefix_t * prefix, u32 swif, u32 * cs_reserved,
ip46_address_t * prod_addr, hicn_face_id_t * faceid);
/**
diff --git a/hicn-plugin/src/faces/app/face_prod_node.c b/hicn-plugin/src/faces/app/face_prod_node.c
index a9fbfa7bf..c92585624 100644
--- a/hicn-plugin/src/faces/app/face_prod_node.c
+++ b/hicn-plugin/src/faces/app/face_prod_node.c
@@ -70,17 +70,17 @@ format_face_prod_input_trace (u8 * s, va_list * args)
}
static_always_inline int
-match_ip4_name (u32 * name, hicn_prefix_t * prefix)
+match_ip4_name (u32 * name, fib_prefix_t * prefix)
{
u32 xor = 0;
- xor = *name & prefix->name.ip4.data_u32;
+ xor = *name & prefix->fp_addr.ip4.data_u32;
- return xor == prefix->name.ip4.data_u32;
+ return xor == prefix->fp_addr.ip4.data_u32;
}
static_always_inline int
-match_ip6_name (u32x4 * name, hicn_prefix_t * prefix)
+match_ip6_name (u32x4 * name, fib_prefix_t * prefix)
{
union
{
@@ -93,32 +93,32 @@ match_ip6_name (u32x4 * name, hicn_prefix_t * prefix)
if (U32X4_ALIGNED (name))
{ //SSE can't handle unaligned data
xor_sum.as_u32x4 = *((u32x4 *) name) &
- UNION_CAST (prefix->name.ip6.as_u64[0], u32x4);
+ UNION_CAST (prefix->fp_addr.ip6.as_u64[0], u32x4);
}
else
#endif /* CLIB_HAVE_VEC128 */
{
- xor_sum.as_u64[0] = ((u64 *) name)[0] & prefix->name.ip6.as_u64[0];
- xor_sum.as_u64[1] = ((u64 *) name)[1] & prefix->name.ip6.as_u64[1];
+ xor_sum.as_u64[0] = ((u64 *) name)[0] & prefix->fp_addr.ip6.as_u64[0];
+ xor_sum.as_u64[1] = ((u64 *) name)[1] & prefix->fp_addr.ip6.as_u64[1];
}
- return (xor_sum.as_u64[0] == prefix->name.ip6.as_u64[0]) &&
- (xor_sum.as_u64[1] == prefix->name.ip6.as_u64[1]);
+ return (xor_sum.as_u64[0] == prefix->fp_addr.ip6.as_u64[0]) &&
+ (xor_sum.as_u64[1] == prefix->fp_addr.ip6.as_u64[1]);
}
static_always_inline u32
hicn_face_prod_next_from_data_hdr (vlib_node_runtime_t * node,
- vlib_buffer_t * b, hicn_prefix_t * prefix)
+ vlib_buffer_t * b, fib_prefix_t * prefix)
{
u8 *ptr = vlib_buffer_get_current (b);
u8 v = *ptr & 0xf0;
int match_res = 1;
- if (PREDICT_TRUE (v == 0x40 && ip46_address_is_ip4 (&prefix->name)))
+ if (PREDICT_TRUE (v == 0x40 && ip46_address_is_ip4 (&prefix->fp_addr)))
{
match_res = match_ip4_name ((u32 *) & (ptr[12]), prefix);
}
- else if (PREDICT_TRUE (v == 0x60 && !ip46_address_is_ip4 (&prefix->name)))
+ else if (PREDICT_TRUE (v == 0x60 && !ip46_address_is_ip4 (&prefix->fp_addr)))
{
match_res = match_ip6_name ((u32x4 *) & (ptr[8]), prefix);
}
diff --git a/hicn-plugin/src/hicn.api b/hicn-plugin/src/hicn.api
index da14a9faf..4f3047b0a 100644
--- a/hicn-plugin/src/hicn.api
+++ b/hicn-plugin/src/hicn.api
@@ -13,6 +13,9 @@
* limitations under the License.
*/
+option version = "5.1.0";
+import "vnet/ip/ip_types.api";
+
define hicn_api_node_params_set
{
/* Client identifier, set from api_main.my_client_index */
@@ -157,10 +160,10 @@ define hicn_api_face_ip_add
u32 context;
/* IP local address */
- u64 local_addr[2];
+ vl_api_address_t local_addr;
/* IP remote address */
- u64 remote_addr[2];
+ vl_api_address_t remote_addr;
/* IPv4 local port number */
u32 swif;
@@ -264,10 +267,10 @@ define hicn_api_face_ip_params_get_reply
u32 faceid;
/* IP local address */
- u64 local_addr[2];
+ vl_api_address_t local_addr;
/* IP remote address */
- u64 remote_addr[2];
+ vl_api_address_t remote_addr;
/* VPP interface (index) associated with the face */
u32 swif;
@@ -285,13 +288,10 @@ define hicn_api_route_nhops_add
u32 context;
/* Prefix to be added to the FIB */
- u64 prefix[2];
-
- /* Length of the prefix */
- u8 len;
+ vl_api_prefix_t prefix;
/* A Face ID to the next hop forwarder for the specified prefix */
- u32 face_ids[7];
+ u32 face_ids[5];
/* Number of face to add */
u8 n_faces;
@@ -315,10 +315,7 @@ define hicn_api_route_del
u32 context;
/* Prefix to be added to the FIB */
- u64 prefix[2];
-
- /* Length of the prefix */
- u8 len;
+ vl_api_prefix_t prefix;
};
define hicn_api_route_del_reply
@@ -339,10 +336,7 @@ define hicn_api_route_nhop_del
u32 context;
/* Prefix to be added to the FIB */
- u64 prefix[2];
-
- /* Length of the prefix */
- u8 len;
+ vl_api_prefix_t prefix;
/* Specific next-hop to be removed */
u32 faceid;
@@ -366,10 +360,7 @@ define hicn_api_route_get
u32 context;
/* Route prefix */
- u64 prefix[2];
-
- /* Prefix len */
- u8 len;
+ vl_api_prefix_t prefix;
};
define hicn_api_route_get_reply
@@ -402,10 +393,7 @@ define hicn_api_routes_details
u32 context;
/* Route prefix */
- u64 prefix[2];
-
- /* Prefix len */
- u8 len;
+ vl_api_prefix_t prefix;
/* List of faces pointing to the next hops */
u32 faceids[5];
@@ -492,10 +480,7 @@ define hicn_api_punting_add
u32 context;
/* Prefix to match */
- u64 prefix[2];
-
- /* Subnet */
- u8 len;
+ vl_api_prefix_t prefix;
/* Interface id */
u32 swif;
@@ -519,10 +504,7 @@ define hicn_api_punting_del
u32 context;
/* Prefix to match */
- u64 prefix[2];
-
- /* Subnet */
- u8 len;
+ vl_api_prefix_t prefix;
/* Interface id */
u32 swif;
@@ -546,10 +528,7 @@ define hicn_api_register_prod_app
u64 context;
/* Prefix to match */
- u64 prefix[2];
-
- /* Subnet */
- u8 len;
+ vl_api_prefix_t prefix;
/* sw_if id */
u32 swif;
@@ -570,7 +549,7 @@ define hicn_api_register_prod_app_reply
u32 cs_reserved;
/* Prod address (ipv4 or ipv6) */
- u64 prod_addr[2];
+ vl_api_address_t prod_addr;
/* Return value: new Face ID, ~0 means no Face was created */
u32 faceid;
@@ -597,10 +576,10 @@ define hicn_api_register_cons_app_reply
i32 retval;
/* Ip4 address */
- u32 src_addr4;
+ vl_api_address_t src_addr4;
/* Ip6 address */
- u64 src_addr6[2];
+ vl_api_address_t src_addr6;
/* Return value: new Face ID, ~0 means no Face was created */
u32 faceid;
diff --git a/hicn-plugin/src/hicn_api.c b/hicn-plugin/src/hicn_api.c
index f8933206d..5f195b6da 100644
--- a/hicn-plugin/src/hicn_api.c
+++ b/hicn-plugin/src/hicn_api.c
@@ -22,6 +22,7 @@
#include <vlibapi/api.h>
#include <vlibmemory/api.h>
#include <vnet/dpo/load_balance.h>
+#include <vnet/ip/ip_types_api.h>
#include "hicn.h"
#include "faces/ip/face_ip.h"
@@ -187,14 +188,8 @@ vl_api_hicn_api_face_ip_add_t_handler (vl_api_hicn_api_face_ip_add_t * mp)
hicn_face_id_t faceid = HICN_FACE_NULL;
ip46_address_t local_addr;
ip46_address_t remote_addr;
- local_addr.as_u64[0] =
- clib_net_to_host_u64 (((u64 *) (&mp->local_addr))[0]);
- local_addr.as_u64[1] =
- clib_net_to_host_u64 (((u64 *) (&mp->local_addr))[1]);
- remote_addr.as_u64[0] =
- clib_net_to_host_u64 (((u64 *) (&mp->remote_addr))[0]);
- remote_addr.as_u64[1] =
- clib_net_to_host_u64 (((u64 *) (&mp->remote_addr))[1]);
+ ip_address_decode(&mp->local_addr, &local_addr);
+ ip_address_decode(&mp->remote_addr, &remote_addr);
u32 sw_if = clib_net_to_host_u32 (mp->swif);
@@ -371,11 +366,9 @@ vl_api_hicn_api_route_nhops_add_t_handler (vl_api_hicn_api_route_nhops_add_t
hicn_main_t *sm = &hicn_main;
- ip46_address_t prefix;
- prefix.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
- u8 len = mp->len;
u8 n_faces = mp->n_faces;
for (int i = 0; i < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; i++)
@@ -389,11 +382,11 @@ vl_api_hicn_api_route_nhops_add_t_handler (vl_api_hicn_api_route_nhops_add_t
}
if (rv == HICN_ERROR_NONE)
{
- rv = hicn_route_add (face_ids, n_faces, &prefix, len);
+ rv = hicn_route_add (face_ids, n_faces, &prefix);
if (rv == HICN_ERROR_ROUTE_ALREADY_EXISTS)
{
- rv = hicn_route_add_nhops (face_ids, n_faces, &prefix, len);
+ rv = hicn_route_add_nhops (face_ids, n_faces, &prefix);
}
}
REPLY_MACRO (VL_API_HICN_API_ROUTE_NHOPS_ADD_REPLY /* , rmp, mp, rv */ );
@@ -408,12 +401,10 @@ static void vl_api_hicn_api_route_del_t_handler
hicn_main_t *sm = &hicn_main;
- ip46_address_t prefix;
- prefix.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
- u8 len = mp->len;
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
- rv = hicn_route_del (&prefix, len);
+ rv = hicn_route_del (&prefix);
REPLY_MACRO (VL_API_HICN_API_ROUTE_DEL_REPLY /* , rmp, mp, rv */ );
}
@@ -426,14 +417,12 @@ static void vl_api_hicn_api_route_nhop_del_t_handler
hicn_main_t *sm = &hicn_main;
- ip46_address_t prefix;
- prefix.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
- u8 len = mp->len;
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
hicn_face_id_t faceid = clib_net_to_host_u32 (mp->faceid);
- rv = hicn_route_del_nhop (&prefix, len, faceid);
+ rv = hicn_route_del_nhop (&prefix, faceid);
REPLY_MACRO (VL_API_HICN_API_ROUTE_NHOP_DEL_REPLY /* , rmp, mp, rv */ );
}
@@ -446,16 +435,14 @@ static void vl_api_hicn_api_route_get_t_handler
hicn_main_t *sm = &hicn_main;
- ip46_address_t prefix;
- prefix.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
- u8 len = mp->len;
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
const dpo_id_t *hicn_dpo_id;
const hicn_dpo_vft_t *hicn_dpo_vft;
hicn_dpo_ctx_t *hicn_dpo_ctx;
u32 fib_index;
- rv = hicn_route_get_dpo (&prefix, len, &hicn_dpo_id, &fib_index);
+ rv = hicn_route_get_dpo (&prefix, &hicn_dpo_id, &fib_index);
/* *INDENT-OFF* */
REPLY_MACRO2 (VL_API_HICN_API_ROUTE_GET_REPLY, (
@@ -487,8 +474,7 @@ send_route_details (vl_api_registration_t * reg,
mp->_vl_msg_id = htons (VL_API_HICN_API_ROUTES_DETAILS + hm->msg_id_base);
mp->context = context;
- clib_memcpy (&mp->prefix, &pfx->fp_addr, sizeof (ip46_address_t));
- mp->len = pfx->fp_len;
+ clib_memcpy (&mp->prefix, &pfx, sizeof (fib_prefix_t));
mp->nfaces = 0;
const dpo_id_t *hicn_dpo_id;
@@ -497,7 +483,7 @@ send_route_details (vl_api_registration_t * reg,
u32 fib_index;
int rv =
- hicn_route_get_dpo (&pfx->fp_addr, pfx->fp_len, &hicn_dpo_id, &fib_index);
+ hicn_route_get_dpo (pfx, &hicn_dpo_id, &fib_index);
if (rv == HICN_ERROR_NONE)
{
@@ -660,14 +646,12 @@ static void vl_api_hicn_api_punting_add_t_handler
hicn_main_t *sm = &hicn_main;
- ip46_address_t prefix;
- prefix.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
- u8 subnet_mask = mp->len;
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
u32 swif = clib_net_to_host_u32 (mp->swif);
rv =
- hicn_punt_interest_data_for_ip (vm, &prefix, subnet_mask, swif, 0, NO_L2);
+ hicn_punt_interest_data_for_ip (vm, &prefix, swif, 0, NO_L2);
REPLY_MACRO (VL_API_HICN_API_PUNTING_ADD_REPLY /* , rmp, mp, rv */ );
}
@@ -695,10 +679,8 @@ static void vl_api_hicn_api_register_prod_app_t_handler
hicn_main_t *sm = &hicn_main;
- hicn_prefix_t prefix;
- prefix.name.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[0]);
- prefix.name.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->prefix))[1]);
- prefix.len = mp->len;
+ fib_prefix_t prefix;
+ ip_prefix_decode(&mp->prefix, &prefix);
u32 swif = clib_net_to_host_u32 (mp->swif);
u32 cs_reserved = clib_net_to_host_u32 (mp->cs_reserved);
u32 faceid;
@@ -710,8 +692,7 @@ static void vl_api_hicn_api_register_prod_app_t_handler
/* *INDENT-OFF* */
REPLY_MACRO2 (VL_API_HICN_API_REGISTER_PROD_APP_REPLY, (
{
- rmp->prod_addr[0] = prod_addr.as_u64[0];
- rmp->prod_addr[1] = prod_addr.as_u64[1];
+ ip_address_encode(&prod_addr, IP46_TYPE_ANY, &rmp->prod_addr);
rmp->cs_reserved = clib_net_to_host_u32(cs_reserved);
rmp->faceid = clib_net_to_host_u32(faceid);
}));
@@ -725,23 +706,19 @@ static void vl_api_hicn_api_register_cons_app_t_handler
int rv = HICN_ERROR_NONE;
hicn_main_t *sm = &hicn_main;
- ip4_address_t src_addr4;
- ip6_address_t src_addr6;
- src_addr4.as_u32 = (u32) 0;
- src_addr6.as_u64[0] = (u64) 0;
- src_addr6.as_u64[1] = (u64) 1;
+ ip46_address_t src_addr4 = ip46_address_initializer;
+ ip46_address_t src_addr6 = ip46_address_initializer;
u32 swif = clib_net_to_host_u32 (mp->swif);
u32 faceid;
- rv = hicn_face_cons_add (&src_addr4, &src_addr6, swif, &faceid);
+ rv = hicn_face_cons_add (&src_addr4.ip4, &src_addr6.ip6, swif, &faceid);
/* *INDENT-OFF* */
REPLY_MACRO2 (VL_API_HICN_API_REGISTER_CONS_APP_REPLY, (
{
- rmp->src_addr4 = clib_net_to_host_u32(src_addr4.as_u32);
- rmp->src_addr6[0] = clib_net_to_host_u64(src_addr6.as_u64[0]);
- rmp->src_addr6[1] = clib_net_to_host_u64(src_addr6.as_u64[1]);
+ ip_address_encode(&src_addr4, IP46_TYPE_ANY, &rmp->src_addr4);
+ ip_address_encode(&src_addr6, IP46_TYPE_ANY, &rmp->src_addr6);
rmp->faceid = clib_net_to_host_u32(faceid);
}));
/* *INDENT-ON* */
@@ -820,14 +797,8 @@ hicn_face_api_entry_params_serialize (hicn_face_id_t faceid,
if (face != NULL && face->shared.face_type == hicn_face_ip_type)
{
hicn_face_ip_t *face_ip = (hicn_face_ip_t *) face->data;
- reply->local_addr[0] =
- clib_host_to_net_u64 (face_ip->local_addr.as_u64[0]);
- reply->local_addr[1] =
- clib_host_to_net_u64 (face_ip->local_addr.as_u64[1]);
- reply->remote_addr[0] =
- clib_host_to_net_u64 (face_ip->remote_addr.as_u64[0]);
- reply->remote_addr[1] =
- clib_host_to_net_u64 (face_ip->remote_addr.as_u64[1]);
+ ip_address_encode(&face_ip->local_addr, IP46_TYPE_ANY, &reply->local_addr);
+ ip_address_encode(&face_ip->remote_addr, IP46_TYPE_ANY, &reply->remote_addr);
reply->swif = clib_host_to_net_u32 (face->shared.sw_if);
reply->flags = clib_host_to_net_u32 (face->shared.flags);
reply->faceid = clib_host_to_net_u32 (faceid);
diff --git a/hicn-plugin/src/hicn_api_test.c b/hicn-plugin/src/hicn_api_test.c
index 8cd4ece36..c29aa4a21 100644
--- a/hicn-plugin/src/hicn_api_test.c
+++ b/hicn-plugin/src/hicn_api_test.c
@@ -23,6 +23,7 @@
#include <vnet/ip/ip4_packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vnet/ip/format.h>
+#include <vnet/ip/ip_types_api.h>
#define __plugin_msg_base hicn_test_main.msg_id_base
#include <vlibapi/vat_helper_macros.h>
@@ -83,6 +84,70 @@ unformat_ip46_address (unformat_input_t * input, va_list * args)
return 0;
}
+/* static ip46_type_t */
+/* ip_address_union_decode (const vl_api_address_union_t *in, */
+/* vl_api_address_family_t af, */
+/* ip46_address_t *out) */
+/* { */
+/* ip46_type_t type; */
+
+/* switch (clib_net_to_host_u32 (af)) */
+/* { */
+/* case ADDRESS_IP4: */
+/* clib_memset (out, 0, sizeof (*out)); */
+/* clib_memcpy (&out->ip4, &in->ip4, sizeof (out->ip4)); */
+/* type = IP46_TYPE_IP4; */
+/* break; */
+/* case ADDRESS_IP6: */
+/* clib_memcpy (&out->ip6, &in->ip6, sizeof (out->ip6)); */
+/* type = IP46_TYPE_IP6; */
+/* break; */
+/* default: */
+/* ASSERT (!"Unkown address family in API address type"); */
+/* type = IP46_TYPE_ANY; */
+/* break; */
+/* } */
+
+/* return type; */
+/* } */
+
+/* static void */
+/* ip_address_union_encode (const ip46_address_t * in, */
+/* vl_api_address_family_t af, */
+/* vl_api_address_union_t * out) */
+/* { */
+/* if (ADDRESS_IP6 == clib_net_to_host_u32 (af)) */
+/* memcpy (out->ip6.address, &in->ip6, sizeof (out->ip6)); */
+/* else */
+/* memcpy (out->ip4.address, &in->ip4, sizeof (out->ip4)); */
+/* } */
+
+/* ip46_type_t ip_address_decode (const vl_api_address_t *in, ip46_address_t *out) */
+/* { */
+/* return (ip_address_union_decode (&in->un, in->af, out)); */
+/* } */
+
+/* void ip_address_encode (const ip46_address_t *in, ip46_type_t type, */
+/* vl_api_address_t *out) */
+/* { */
+/* switch (type) */
+/* { */
+/* case IP46_TYPE_IP4: */
+/* out->af = clib_net_to_host_u32 (ADDRESS_IP4); */
+/* break; */
+/* case IP46_TYPE_IP6: */
+/* out->af = clib_net_to_host_u32 (ADDRESS_IP6); */
+/* break; */
+/* case IP46_TYPE_ANY: */
+/* if (ip46_address_is_ip4 (in)) */
+/* out->af = clib_net_to_host_u32 (ADDRESS_IP4); */
+/* else */
+/* out->af = clib_net_to_host_u32 (ADDRESS_IP6); */
+/* break; */
+/* } */
+/* ip_address_union_encode (in, out->af, &out->un); */
+/* } */
+
/////////////////////////////////////////////////////
#define HICN_FACE_NULL ~0
@@ -137,8 +202,8 @@ _(HICN_API_FACE_IP_PARAMS_GET_REPLY, hicn_api_face_ip_params_get_reply) \
_(HICN_API_ROUTE_GET_REPLY, hicn_api_route_get_reply) \
_(HICN_API_ROUTES_DETAILS, hicn_api_routes_details) \
_(HICN_API_ROUTE_DEL_REPLY, hicn_api_route_del_reply) \
-_(HICN_API_ROUTE_NHOP_DEL_REPLY, hicn_api_route_nhop_del_reply) \
-_(HICN_API_STRATEGIES_GET_REPLY, hicn_api_strategies_get_reply) \
+_(HICN_API_ROUTE_NHOP_DEL_REPLY, hicn_api_route_nhop_del_reply) \
+_(HICN_API_STRATEGIES_GET_REPLY, hicn_api_strategies_get_reply) \
_(HICN_API_STRATEGY_GET_REPLY, hicn_api_strategy_get_reply) \
_(HICN_API_REGISTER_PROD_APP_REPLY, hicn_api_register_prod_app_reply) \
_(HICN_API_REGISTER_CONS_APP_REPLY, hicn_api_register_cons_app_reply)
@@ -359,10 +424,8 @@ api_hicn_api_face_ip_add (vat_main_t * vam)
}
/* Construct the API message */
M (HICN_API_FACE_IP_ADD, mp);
- mp->local_addr[0] = clib_host_to_net_u64 (local_addr.as_u64[0]);
- mp->local_addr[1] = clib_host_to_net_u64 (local_addr.as_u64[1]);
- mp->remote_addr[0] = clib_host_to_net_u64 (remote_addr.as_u64[0]);
- mp->remote_addr[1] = clib_host_to_net_u64 (remote_addr.as_u64[1]);
+ ip_address_decode (&mp->local_addr, &local_addr);
+ ip_address_decode (&mp->remote_addr, &remote_addr);
mp->swif = clib_host_to_net_u32 (sw_if);
/* send it... */
@@ -497,10 +560,8 @@ static void
return;
}
vec_reset_length (sbuf);
- local_addr.as_u64[0] = clib_net_to_host_u64 (rmp->local_addr[0]);
- local_addr.as_u64[1] = clib_net_to_host_u64 (rmp->local_addr[1]);
- remote_addr.as_u64[0] = clib_net_to_host_u64 (rmp->remote_addr[0]);
- remote_addr.as_u64[1] = clib_net_to_host_u64 (rmp->remote_addr[1]);
+ ip_address_decode(&rmp->local_addr, &local_addr);
+ ip_address_decode(&rmp->remote_addr, &remote_addr);
sbuf =
format (0, "local_addr %U remote_addr %U", format_ip46_address,
&local_addr, 0 /*IP46_ANY_TYPE */ , format_ip46_address,
@@ -578,14 +639,13 @@ api_hicn_api_route_get (vat_main_t * vam)
unformat_input_t *input = vam->input;
vl_api_hicn_api_route_get_t *mp;
- ip46_address_t prefix;
- u8 plen;
+ fib_prefix_t prefix;
int ret;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{;
}
else
@@ -595,16 +655,14 @@ api_hicn_api_route_get (vat_main_t * vam)
}
/* Check parse */
- if (((prefix.as_u64[0] == 0) && (prefix.as_u64[1] == 0)) || (plen == 0))
+ if (((prefix.fp_addr.as_u64[0] == 0) && (prefix.fp_addr.as_u64[1] == 0)) || (prefix.fp_len == 0))
{
clib_warning ("Please specify a valid prefix...");
return 1;
}
//Construct the API message
M (HICN_API_ROUTE_GET, mp);
- mp->prefix[0] = clib_host_to_net_u64 (((u64 *) & prefix)[0]);
- mp->prefix[1] = clib_host_to_net_u64 (((u64 *) & prefix)[1]);
- mp->len = plen;
+ ip_prefix_encode(&prefix, &mp->prefix);
//send it...
S (mp);
@@ -701,14 +759,15 @@ static void
(vl_api_hicn_api_routes_details_t * mp)
{
vat_main_t *vam = hicn_test_main.vat_main;
-
+ fib_prefix_t prefix;
u32 faceid;
u8 *sbuf = 0;
vec_reset_length (sbuf);
+ ip_prefix_decode(&mp->prefix, &prefix);
sbuf =
- format (sbuf, "Prefix: %U/%u\n", format_ip46_address, &mp->prefix, 0,
- mp->len);
+ format (sbuf, "Prefix: %U/%u\n", format_ip46_address, &prefix.fp_addr, 0,
+ prefix.fp_len);
sbuf = format (sbuf, "Faces: \n");
for (int i = 0; i < mp->nfaces; i++)
@@ -727,8 +786,7 @@ api_hicn_api_route_nhops_add (vat_main_t * vam)
unformat_input_t *input = vam->input;
vl_api_hicn_api_route_nhops_add_t *mp;
- ip46_address_t prefix;
- u8 plen;
+ fib_prefix_t prefix;
u32 faceid = 0;
int ret;
@@ -736,7 +794,7 @@ api_hicn_api_route_nhops_add (vat_main_t * vam)
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "add prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{;
}
else if (unformat (input, "face %d", &faceid))
@@ -749,7 +807,7 @@ api_hicn_api_route_nhops_add (vat_main_t * vam)
}
/* Check parse */
- if (((prefix.as_u64[0] == 0) && (prefix.as_u64[1] == 0)) || (plen == 0)
+ if (((prefix.fp_addr.as_u64[0] == 0) && (prefix.fp_addr.as_u64[1] == 0)) || (prefix.fp_len == 0)
|| (faceid == 0))
{
clib_warning ("Please specify prefix and faceid...");
@@ -757,9 +815,7 @@ api_hicn_api_route_nhops_add (vat_main_t * vam)
}
/* Construct the API message */
M (HICN_API_ROUTE_NHOPS_ADD, mp);
- mp->prefix[0] = clib_host_to_net_u64 (((u64 *) & prefix)[0]);
- mp->prefix[1] = clib_host_to_net_u64 (((u64 *) & prefix)[1]);
- mp->len = plen;
+ ip_prefix_encode(&prefix, &mp->prefix);
mp->face_ids[0] = clib_host_to_net_u32 (faceid);
mp->n_faces = 1;
@@ -779,14 +835,13 @@ api_hicn_api_route_del (vat_main_t * vam)
unformat_input_t *input = vam->input;
vl_api_hicn_api_route_del_t *mp;
- ip46_address_t prefix;
- u8 plen;
+ fib_prefix_t prefix;
int ret;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{;
}
else
@@ -796,16 +851,14 @@ api_hicn_api_route_del (vat_main_t * vam)
}
/* Check parse */
- if (((prefix.as_u64[0] == 0) && (prefix.as_u64[1] == 0)) || (plen == 0))
+ if (((prefix.fp_addr.as_u64[0] == 0) && (prefix.fp_addr.as_u64[1] == 0)) || (prefix.fp_len == 0))
{
clib_warning ("Please specify prefix...");
return 1;
}
/* Construct the API message */
M (HICN_API_ROUTE_DEL, mp);
- mp->prefix[0] = clib_host_to_net_u64 (((u64 *) & prefix)[0]);
- mp->prefix[1] = clib_host_to_net_u64 (((u64 *) & prefix)[1]);
- mp->len = plen;
+ ip_prefix_encode(&prefix, &mp->prefix);
/* send it... */
S (mp);
@@ -823,14 +876,13 @@ api_hicn_api_route_nhop_del (vat_main_t * vam)
unformat_input_t *input = vam->input;
vl_api_hicn_api_route_nhop_del_t *mp;
- ip46_address_t prefix;
- u8 plen;
+ fib_prefix_t prefix;
int faceid = 0, ret;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "del prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{;
}
else if (unformat (input, "face %d", &faceid))
@@ -843,7 +895,7 @@ api_hicn_api_route_nhop_del (vat_main_t * vam)
}
/* Check parse */
- if (((prefix.as_u64[0] == 0) && (prefix.as_u64[1] == 0)) || (plen == 0)
+ if (((prefix.fp_addr.as_u64[0] == 0) && (prefix.fp_addr.as_u64[1] == 0)) || (prefix.fp_len == 0)
|| (faceid == HICN_FACE_NULL))
{
clib_warning ("Please specify prefix and faceid...");
@@ -851,9 +903,7 @@ api_hicn_api_route_nhop_del (vat_main_t * vam)
}
/* Construct the API message */
M (HICN_API_ROUTE_NHOP_DEL, mp);
- mp->prefix[0] = clib_host_to_net_u64 (((u64 *) & prefix)[0]);
- mp->prefix[1] = clib_host_to_net_u64 (((u64 *) & prefix)[1]);
- mp->len = plen;
+ ip_prefix_encode(&prefix, &mp->prefix);
mp->faceid = clib_host_to_net_u32 (faceid);
@@ -989,15 +1039,14 @@ api_hicn_api_register_prod_app (vat_main_t * vam)
{
unformat_input_t *input = vam->input;
vl_api_hicn_api_register_prod_app_t *mp;
- ip46_address_t prefix;
- int plen;
+ fib_prefix_t prefix;
u32 swif = ~0;
int ret;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "prefix %U/%d", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
{;
}
else if (unformat (input, "id %d", &swif))
@@ -1010,16 +1059,14 @@ api_hicn_api_register_prod_app (vat_main_t * vam)
}
/* Check parse */
- if (((prefix.as_u64[0] == 0) && (prefix.as_u64[1] == 0)) || (plen == 0))
+ if (((prefix.fp_addr.as_u64[0] == 0) && (prefix.fp_addr.as_u64[1] == 0)) || (prefix.fp_len == 0))
{
clib_warning ("Please specify prefix...");
return 1;
}
/* Construct the API message */
M (HICN_API_REGISTER_PROD_APP, mp);
- mp->prefix[0] = clib_host_to_net_u64 (prefix.as_u64[0]);
- mp->prefix[1] = clib_host_to_net_u64 (prefix.as_u64[1]);
- mp->len = (u8) plen;
+ ip_prefix_encode(&prefix, &mp->prefix);
mp->swif = clib_host_to_net_u32 (swif);
@@ -1094,17 +1141,16 @@ static void
fformat (vam->ofp, " (API call error: %d)\n", vam->retval);
return;
}
- ip4_address_t src_addr4;
- src_addr4.as_u32 = clib_net_to_host_u32 (mp->src_addr4);
- ip6_address_t src_addr6;
- src_addr6.as_u64[0] = clib_net_to_host_u64 (mp->src_addr6[0]);
- src_addr6.as_u64[1] = clib_net_to_host_u64 (mp->src_addr6[1]);
+ ip46_address_t src_addr4 = ip46_address_initializer;
+ ip46_address_t src_addr6 = ip46_address_initializer;
+ ip_address_decode(&mp->src_addr4, &src_addr4);
+ ip_address_decode(&mp->src_addr6, &src_addr6);
fformat (vam->ofp,
"ip4 address %U\n"
"ip6 address :%U\n"
"appif id :%d\n",
- format_ip4_address, &src_addr4, format_ip6_address, &src_addr6);
+ format_ip46_address, IP46_TYPE_ANY, &src_addr4, format_ip46_address, IP46_TYPE_ANY, &src_addr6);
}
/*
diff --git a/hicn-plugin/src/punt.c b/hicn-plugin/src/punt.c
index 68c0bafb9..fe1ca495f 100644
--- a/hicn-plugin/src/punt.c
+++ b/hicn-plugin/src/punt.c
@@ -25,6 +25,7 @@
#include <vnet/ip/ip4_packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vnet/ethernet/packet.h>
+#include <vnet/fib/fib_types.h>
#include <vlib/global_funcs.h>
#include <hicn/hicn.h>
@@ -457,15 +458,15 @@ _hicn_punt_add_del_vnetssn (ip_version_t * ip, u8 punt_id, u8 mask,
*/
int
hicn_punt_add_del_vnetssn (ip_version_t * ip, field_t * field,
- ip46_address_t * v46_address, u8 mask,
+ fib_prefix_t * prefix,
u32 next_hit_index, u32 intfc, u8 base_offset,
int is_add)
{
- return _hicn_punt_add_del_vnetssn (ip, field->punt_id, mask, next_hit_index,
+ return _hicn_punt_add_del_vnetssn (ip, field->punt_id, prefix->fp_len, next_hit_index,
intfc, base_offset, is_add, field,
- ip46_address_is_ip4 (v46_address) ?
- v46_address->ip4.as_u8 : v46_address->
- ip6.as_u8, NULL);
+ ip46_address_is_ip4 (&prefix->fp_addr) ?
+ prefix->fp_addr.ip4.as_u8 :
+ prefix->fp_addr.ip6.as_u8, NULL);
}
@@ -477,24 +478,24 @@ hicn_punt_add_del_vnetssn (ip_version_t * ip, field_t * field,
*/
int
hicn_punt_add_del_vnetssn_udp (ip_version_t * outer, ip_version_t * inner,
- field_t * field, ip46_address_t * v46_address,
- u8 mask, u32 next_hit_index, u32 intfc,
+ field_t * field, fib_prefix_t * prefix,
+ u32 next_hit_index, u32 intfc,
u8 base_offset, u8 protocol, u16 sport,
u16 dport, int is_add)
{
- return _hicn_punt_add_del_vnetssn (outer, field->punt_id, mask,
+ return _hicn_punt_add_del_vnetssn (outer, field->punt_id, prefix->fp_len,
next_hit_index, intfc, base_offset,
is_add, outer->protocol_field, &protocol,
outer->udp_sport, &sport,
outer->udp_dport, &dport, field,
- v46_address->as_u8, NULL);
+ prefix->fp_addr.as_u8, NULL);
}
-#define hicn_punt_add_vnetssn_udp(outer, inner, field, addr, mask, index, intfc, offset, protocol, sport, dport) \
- (hicn_punt_add_del_vnetssn_udp(outer, inner, field, addr, mask, index, intfc, offset, protocol, sport, dport, OP_ADD))
+#define hicn_punt_add_vnetssn_udp(outer, inner, field, prefix, index, intfc, offset, protocol, sport, dport) \
+ (hicn_punt_add_del_vnetssn_udp(outer, inner, field, prefix, index, intfc, offset, protocol, sport, dport, OP_ADD))
-#define hicn_punt_del_vnetssn_udp(outer, inner, field, addr, mask, index, intfc, offset, protocol, sport, dport) \
- (hicn_punt_add_del_vnetssn_udp(outer, inner, field, addr, mask, index, intfc, offset, protocol, sport, dport, OP_DEL))
+#define hicn_punt_del_vnetssn_udp(outer, inner, field, prefix, index, intfc, offset, protocol, sport, dport) \
+ (hicn_punt_add_del_vnetssn_udp(outer, inner, field, prefix, index, intfc, offset, protocol, sport, dport, OP_DEL))
/*
* Enable the table on a given interface considering the table type
@@ -518,24 +519,22 @@ hicn_punt_enable_disable_vnet_ip4_table_on_intf (vlib_main_t * vm,
* not base_offset ???
*/
int
-hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
- u8 mask, int skip, u32 sw_if_index,
+hicn_punt_remove_ip4_address (vlib_main_t * vm, fib_prefix_t * prefix,
+ int skip, u32 sw_if_index,
int is_enable, u8 with_l2)
{
vnet_classify_main_t *cm = &vnet_classify_main;
vnet_classify_table_t *vnet_table = NULL;
-
+ u8 mask = prefix->fp_len;
u32 table_index = ~0;
u32 base_offset = (with_l2 ? ETH_L2 : NO_L2);
- ip46_address_t addr46;
- ip46_address_set_ip4 (&addr46, addr);
- hicn_punt_del_vnetssn (&ipv4, &ipv4_src, &addr46, mask,
+ hicn_punt_del_vnetssn (&ipv4, &ipv4_src, prefix,
hicn_punt_glb.next_hit_data_ipv4, sw_if_index,
ETH_L2);
- hicn_punt_del_vnetssn (&ipv4, &ipv4_dst, &addr46, mask,
+ hicn_punt_del_vnetssn (&ipv4, &ipv4_dst, prefix,
hicn_punt_glb.next_hit_interest_ipv4, sw_if_index,
ETH_L2);
@@ -560,22 +559,22 @@ hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
}
int
-hicn_punt_remove_ip6_address (vlib_main_t * vm, ip6_address_t * addr,
- u8 mask, int skip, u32 sw_if_index,
+hicn_punt_remove_ip6_address (vlib_main_t * vm, fib_prefix_t * prefix,
+ int skip, u32 sw_if_index,
int is_enable, u8 with_l2)
{
vnet_classify_main_t *cm = &vnet_classify_main;
vnet_classify_table_t *vnet_table = NULL;
-
+ u8 mask = prefix->fp_len;
u32 table_index = ~0;
u32 base_offset = (with_l2 ? ETH_L2 : NO_L2);
- hicn_punt_del_vnetssn (&ipv6, &ipv6_src, (ip46_address_t *) addr, mask,
+ hicn_punt_del_vnetssn (&ipv6, &ipv6_src, prefix,
hicn_punt_glb.next_hit_data_ipv6, sw_if_index,
ETH_L2);
- hicn_punt_del_vnetssn (&ipv6, &ipv6_dst, (ip46_address_t *) addr, mask,
+ hicn_punt_del_vnetssn (&ipv6, &ipv6_dst, prefix,
hicn_punt_glb.next_hit_interest_ipv6, sw_if_index,
ETH_L2);
@@ -762,7 +761,7 @@ hicn_punt_init (vlib_main_t * vm)
u32
hicn_punt_interest_data_for_udp (vlib_main_t * vm,
- ip46_address_t * prefix, u8 mask,
+ fib_prefix_t * prefix,
u32 swif, u8 punt_type, u16 sport, u16 dport,
u8 with_l2)
{
@@ -773,12 +772,13 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
with_l2 ? HICN_CLASSIFY_NO_CURRENT_DATA_FLAG :
HICN_CLASSIFY_CURRENT_DATA_FLAG;
u8 base_offset = with_l2 ? ETH_L2 : NO_L2;
+ u16 mask = prefix->fp_len;
if (punt_type != HICN_PUNT_IP_TYPE && punt_type != HICN_PUNT_UDP4_TYPE
&& punt_type != HICN_PUNT_UDP6_TYPE)
return HICN_ERROR_PUNT_INVAL;
- if (ip46_address_is_ip4 (prefix))
+ if (ip46_address_is_ip4 (&prefix->fp_addr))
{
if (mask > IPV4_ADDR_LEN_BITS)
return HICN_ERROR_PUNT_INVAL;
@@ -802,13 +802,13 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn_udp (&ipv44, &ipv4, &udp44_src,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_data_udp4,
swif, base_offset, IPPROTO_UDP, sport,
dport);
hicn_punt_add_vnetssn_udp (&ipv44, &ipv4, &udp44_dst,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_interest_udp4,
swif, base_offset, IPPROTO_UDP, sport,
dport);
@@ -836,13 +836,13 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn_udp (&ipv64, &ipv4, &udp64_src,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_data_udp6,
swif, base_offset, IPPROTO_UDP, sport,
dport);
hicn_punt_add_vnetssn_udp (&ipv64, &ipv4, &udp64_dst,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_interest_udp6,
swif, base_offset, IPPROTO_UDP, sport,
dport);
@@ -875,11 +875,11 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_src,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_data_udp4,
swif, base_offset, IPPROTO_UDP, sport,
dport);
- hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_dst, prefix, mask,
+ hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_dst, prefix,
hicn_punt_glb.next_hit_interest_udp4,
swif, base_offset, IPPROTO_UDP, sport,
dport);
@@ -908,11 +908,11 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_src,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_data_udp6,
swif, base_offset, IPPROTO_UDP, sport,
dport);
- hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_dst, prefix, mask,
+ hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_dst, prefix,
hicn_punt_glb.next_hit_interest_udp6,
swif, base_offset, IPPROTO_UDP, sport,
dport);
@@ -929,7 +929,7 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
u32
hicn_punt_interest_data_for_ip (vlib_main_t * vm,
- ip46_address_t * prefix, u8 mask,
+ fib_prefix_t * prefix,
u32 swif, u8 punt_type, u8 with_l2)
{
int skip = 1;
@@ -939,12 +939,13 @@ hicn_punt_interest_data_for_ip (vlib_main_t * vm,
with_l2 ? HICN_CLASSIFY_NO_CURRENT_DATA_FLAG :
HICN_CLASSIFY_CURRENT_DATA_FLAG;
u8 base_offset = with_l2 ? ETH_L2 : NO_L2;
+ u16 mask = prefix->fp_len;
if (punt_type != HICN_PUNT_IP_TYPE && punt_type != HICN_PUNT_UDP4_TYPE
&& punt_type != HICN_PUNT_UDP6_TYPE)
return HICN_ERROR_PUNT_INVAL;
- if (ip46_address_is_ip4 (prefix))
+ if (ip46_address_is_ip4 (&prefix->fp_addr))
{
if (mask > IPV4_ADDR_LEN_BITS)
return HICN_ERROR_PUNT_INVAL;
@@ -966,11 +967,11 @@ hicn_punt_interest_data_for_ip (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn (&ipv4, &ipv4_src,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_data_ipv4, swif,
base_offset);
hicn_punt_add_vnetssn (&ipv4, &ipv4_dst,
- prefix, mask,
+ prefix,
hicn_punt_glb.next_hit_interest_ipv4, swif,
base_offset);
@@ -1004,10 +1005,10 @@ hicn_punt_interest_data_for_ip (vlib_main_t * vm,
* subnet mask
*/
hicn_punt_add_vnetssn (&ipv6, &ipv6_src, prefix,
- mask, hicn_punt_glb.next_hit_data_ipv6, swif,
+ hicn_punt_glb.next_hit_data_ipv6, swif,
base_offset);
hicn_punt_add_vnetssn (&ipv6, &ipv6_dst, prefix,
- mask, hicn_punt_glb.next_hit_interest_ipv6,
+ hicn_punt_glb.next_hit_interest_ipv6,
swif, base_offset);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, swif,
diff --git a/hicn-plugin/src/punt.h b/hicn-plugin/src/punt.h
index 3e6900064..5e1126445 100644
--- a/hicn-plugin/src/punt.h
+++ b/hicn-plugin/src/punt.h
@@ -17,6 +17,7 @@
#define __HICN_PUNT_H__
#include <vppinfra/error.h>
+#include <vnet/fib/fib_types.h>
#include <hicn/hicn.h>
#define HICN_CLASSIFY_TABLE_MEMORY_SIZE (2*1024*1024) // 2MB allocated for the classification table
@@ -294,17 +295,17 @@ hicn_punt_enable_disable_vnet_ip6_table_on_intf (vlib_main_t * vm,
u32 sw_if_index,
int is_enable);
u32 hicn_punt_interest_data_for_udp (vlib_main_t * vm,
- ip46_address_t * prefix, u8 mask,
+ fib_prefix_t * prefix,
u32 swif, u8 punt_type, u16 sport,
u16 dport, u8 with_l2);
u32 hicn_punt_interest_data_for_ip (vlib_main_t * vm,
- ip46_address_t * prefix, u8 mask,
+ fib_prefix_t * prefix,
u32 swif, u8 type, u8 with_l2);
-int hicn_punt_remove_ip6_address (vlib_main_t * vm, ip6_address_t * addr,
- u8 mask, int skip, u32 swif, int is_enable,
+int hicn_punt_remove_ip6_address (vlib_main_t * vm, fib_prefix_t * prefix,
+ int skip, u32 swif, int is_enable,
u8 with_l2);
-int hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
- u8 mask, int skip, u32 swif, int is_enable,
+int hicn_punt_remove_ip4_address (vlib_main_t * vm, fib_prefix_t * prefix,
+ int skip, u32 swif, int is_enable,
u8 with_l2);
void hicn_punt_init (vlib_main_t * vm);
@@ -321,15 +322,15 @@ hicn_punt_add_del_vnettbl (ip_version_t * ip, field_t * field, u8 mask, u32
int
hicn_punt_add_del_vnetssn (ip_version_t * ip, field_t * field,
- ip46_address_t * v46_address, u8 mask,
+ fib_prefix_t * prefix,
u32 next_hit_index, u32 intfc, u8 base_offset,
int is_add);
-#define hicn_punt_add_vnetssn(ip, field, addr, mask, index, intfc, offset) \
- (hicn_punt_add_del_vnetssn(ip, field, addr, mask, index, intfc, offset, OP_ADD))
+#define hicn_punt_add_vnetssn(ip, field, addr, index, intfc, offset) \
+ (hicn_punt_add_del_vnetssn(ip, field, addr, index, intfc, offset, OP_ADD))
-#define hicn_punt_del_vnetssn(ip, field, addr, mask, index, intfc, offset) \
- (hicn_punt_add_del_vnetssn(ip, field, addr, mask, index, intfc, offset, OP_DEL))
+#define hicn_punt_del_vnetssn(ip, field, addr, index, intfc, offset) \
+ (hicn_punt_add_del_vnetssn(ip, field, addr, index, intfc, offset, OP_DEL))
#endif /* // __HICN_PUNT_H__ */
diff --git a/hicn-plugin/src/route.c b/hicn-plugin/src/route.c
index 11302aba4..3581fe490 100644
--- a/hicn-plugin/src/route.c
+++ b/hicn-plugin/src/route.c
@@ -28,29 +28,24 @@
#include "strategies/dpo_mw.h"
int
-hicn_route_get_dpo (const ip46_address_t * prefix, u8 plen,
+hicn_route_get_dpo (const fib_prefix_t * prefix,
const dpo_id_t ** hicn_dpo, u32 * fib_index)
{
- fib_prefix_t fib_pfx;
+ //fib_prefix_t fib_pfx;
const dpo_id_t *load_balance_dpo_id;
const dpo_id_t *former_dpo_id;
int found = 0, ret = HICN_ERROR_ROUTE_NOT_FOUND;
fib_node_index_t fib_entry_index;
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
-
-
/* Check if the route already exist in the fib */
/*
* ASSUMPTION: we use table 0 which is the default table and it is
* already existing and locked
*/
- *fib_index = fib_table_find_or_create_and_lock (fib_pfx.fp_proto,
+ *fib_index = fib_table_find_or_create_and_lock (prefix->fp_proto,
HICN_FIB_TABLE,
FIB_SOURCE_PLUGIN_HI);
- fib_entry_index = fib_table_lookup_exact_match (*fib_index, &fib_pfx);
+ fib_entry_index = fib_table_lookup_exact_match (*fib_index, prefix);
if (fib_entry_index != FIB_NODE_INDEX_INVALID)
{
@@ -86,7 +81,7 @@ hicn_route_get_dpo (const ip46_address_t * prefix, u8 plen,
* Remove the lock from the table. We keep one lock per route, not
* per dpo
*/
- fib_table_unlock (*fib_index, fib_pfx.fp_proto, FIB_SOURCE_PLUGIN_HI);
+ fib_table_unlock (*fib_index, prefix->fp_proto, FIB_SOURCE_PLUGIN_HI);
return ret;
}
@@ -94,10 +89,8 @@ hicn_route_get_dpo (const ip46_address_t * prefix, u8 plen,
/* Add a new route for a name prefix */
int
hicn_route_add (hicn_face_id_t * face_id, u32 len,
- const ip46_address_t * prefix, u8 plen)
+ const fib_prefix_t * prefix)
{
-
- fib_prefix_t fib_pfx;
dpo_id_t dpo = DPO_INVALID;
const dpo_id_t *hicn_dpo_id;
int ret = HICN_ERROR_NONE;
@@ -135,15 +128,10 @@ hicn_route_add (hicn_face_id_t * face_id, u32 len,
}
}
- ret = hicn_route_get_dpo (prefix, plen, &hicn_dpo_id, &fib_index);
+ ret = hicn_route_get_dpo (prefix, &hicn_dpo_id, &fib_index);
if (ret == HICN_ERROR_ROUTE_NOT_FOUND)
{
- /* The Fib entry does not exist */
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
-
dpo_id_t nhops[HICN_PARAM_FIB_ENTRY_NHOPS_MAX];
for (int i = 0; i < n_face_dpo; i++)
{
@@ -151,7 +139,7 @@ hicn_route_add (hicn_face_id_t * face_id, u32 len,
}
ret =
- default_dpo.hicn_dpo_create (fib_pfx.fp_proto, nhops, n_face_dpo,
+ default_dpo.hicn_dpo_create (prefix->fp_proto, nhops, n_face_dpo,
&dpo_idx);
if (ret)
@@ -165,7 +153,7 @@ hicn_route_add (hicn_face_id_t * face_id, u32 len,
*/
dpo_set (&dpo,
default_dpo.hicn_dpo_get_type (),
- (ip46_address_is_ip4 (prefix) ? DPO_PROTO_IP4 : DPO_PROTO_IP6),
+ (ip46_address_is_ip4 (&prefix->fp_addr) ? DPO_PROTO_IP4 : DPO_PROTO_IP6),
dpo_idx);
/* Here is where we create the "via" like route */
@@ -176,13 +164,13 @@ hicn_route_add (hicn_face_id_t * face_id, u32 len,
*/
fib_node_index_t new_fib_node_index =
fib_table_entry_special_dpo_add (fib_index,
- &fib_pfx,
+ prefix,
FIB_SOURCE_PLUGIN_HI,
FIB_ENTRY_FLAG_EXCLUSIVE,
&dpo);
/* We added a route, therefore add one lock to the table */
- fib_table_lock (fib_index, fib_pfx.fp_proto, FIB_SOURCE_PLUGIN_HI);
+ fib_table_lock (fib_index, prefix->fp_proto, FIB_SOURCE_PLUGIN_HI);
dpo_unlock (&dpo);
ret =
@@ -206,7 +194,7 @@ hicn_route_add (hicn_face_id_t * face_id, u32 len,
int
hicn_route_add_nhops (hicn_face_id_t * face_id, u32 len,
- const ip46_address_t * prefix, u8 plen)
+ const fib_prefix_t * prefix)
{
const dpo_id_t *hicn_dpo_id;
int ret = HICN_ERROR_NONE;
@@ -244,7 +232,7 @@ hicn_route_add_nhops (hicn_face_id_t * face_id, u32 len,
}
}
- ret = hicn_route_get_dpo (prefix, plen, &hicn_dpo_id, &fib_index);
+ ret = hicn_route_get_dpo (prefix, &hicn_dpo_id, &fib_index);
if (ret == HICN_ERROR_NONE)
{
@@ -260,50 +248,40 @@ hicn_route_add_nhops (hicn_face_id_t * face_id, u32 len,
}
int
-hicn_route_del (ip46_address_t * prefix, u8 plen)
+hicn_route_del (fib_prefix_t * prefix)
{
- fib_prefix_t fib_pfx;
const dpo_id_t *hicn_dpo_id;
int ret = HICN_ERROR_NONE;
u32 fib_index;
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
-
/* Remove the fib entry only if the dpo is of type hicn */
- ret = hicn_route_get_dpo (prefix, plen, &hicn_dpo_id, &fib_index);
+ ret = hicn_route_get_dpo (prefix, &hicn_dpo_id, &fib_index);
if (ret == HICN_ERROR_NONE)
{
- fib_table_entry_special_remove (HICN_FIB_TABLE, &fib_pfx,
+ fib_table_entry_special_remove (HICN_FIB_TABLE, prefix,
FIB_SOURCE_PLUGIN_HI);
/*
* Remove the lock from the table. We keep one lock per route
*/
- fib_table_unlock (fib_index, fib_pfx.fp_proto, FIB_SOURCE_PLUGIN_HI);
+ fib_table_unlock (fib_index, prefix->fp_proto, FIB_SOURCE_PLUGIN_HI);
}
//Remember to remove the lock from the table when removing the entry
return ret;
}
int
-hicn_route_del_nhop (ip46_address_t * prefix, u8 plen, hicn_face_id_t face_id)
+hicn_route_del_nhop (fib_prefix_t * prefix, hicn_face_id_t face_id)
{
-
- fib_prefix_t fib_pfx;
const dpo_id_t *hicn_dpo_id;
int ret;
u32 vft_id;
const hicn_dpo_vft_t *dpo_vft;
u32 fib_index;
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
- ret = hicn_route_get_dpo (prefix, plen, &hicn_dpo_id, &fib_index);
+ ret = hicn_route_get_dpo (prefix, &hicn_dpo_id, &fib_index);
/* Check if the dpo is an hicn_dpo_t */
if (ret == HICN_ERROR_NONE)
@@ -311,16 +289,15 @@ hicn_route_del_nhop (ip46_address_t * prefix, u8 plen, hicn_face_id_t face_id)
vft_id = hicn_dpo_get_vft_id (hicn_dpo_id);
dpo_vft = hicn_dpo_get_vft (vft_id);
return dpo_vft->hicn_dpo_del_nh (face_id, hicn_dpo_id->dpoi_index,
- &fib_pfx);
+ prefix);
}
//Remember to remove the lock from the table when removing the entry
return ret;
}
int
-hicn_route_set_strategy (ip46_address_t * prefix, u8 plen, u8 strategy_id)
+hicn_route_set_strategy (fib_prefix_t * prefix, u8 strategy_id)
{
- fib_prefix_t fib_pfx;
const dpo_id_t *hicn_dpo_id;
dpo_id_t new_dpo_id = DPO_INVALID;
int ret;
@@ -331,11 +308,8 @@ hicn_route_set_strategy (ip46_address_t * prefix, u8 plen, u8 strategy_id)
u32 fib_index;
u32 old_vft_id;
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
- ret = hicn_route_get_dpo (prefix, plen, &hicn_dpo_id, &fib_index);
+ ret = hicn_route_get_dpo (prefix, &hicn_dpo_id, &fib_index);
if (ret == HICN_ERROR_NONE)
{
@@ -358,7 +332,7 @@ hicn_route_set_strategy (ip46_address_t * prefix, u8 plen, u8 strategy_id)
/* the value we got when we registered */
dpo_set (&new_dpo_id,
new_dpo_vft->hicn_dpo_get_type (),
- (ip46_address_is_ip4 (prefix) ? DPO_PROTO_IP4 :
+ (ip46_address_is_ip4 (&prefix->fp_addr) ? DPO_PROTO_IP4 :
DPO_PROTO_IP6), new_hicn_dpo_idx);
/* Here is where we create the "via" like route */
@@ -369,7 +343,7 @@ hicn_route_set_strategy (ip46_address_t * prefix, u8 plen, u8 strategy_id)
*/
fib_node_index_t new_fib_node_index =
fib_table_entry_special_dpo_update (fib_index,
- &fib_pfx,
+ prefix,
FIB_SOURCE_PLUGIN_HI,
FIB_ENTRY_FLAG_EXCLUSIVE,
&new_dpo_id);
diff --git a/hicn-plugin/src/route.h b/hicn-plugin/src/route.h
index be15b9906..f6e32d8e0 100644
--- a/hicn-plugin/src/route.h
+++ b/hicn-plugin/src/route.h
@@ -25,7 +25,7 @@
* Retrieve the hicn dpo corresponding to a hicn prefix
*/
int
-hicn_route_get_dpo (const ip46_address_t * prefix, u8 plen,
+hicn_route_get_dpo (const fib_prefix_t * prefix,
const dpo_id_t ** hicn_dpo, u32 * fib_index);
/*
@@ -33,24 +33,24 @@ hicn_route_get_dpo (const ip46_address_t * prefix, u8 plen,
*/
int
hicn_route_add (hicn_face_id_t * face_id, u32 len,
- const ip46_address_t * prefix, u8 plen);
+ const fib_prefix_t * prefix);
/*
* Add new next hops for a prefix route
*/
int
hicn_route_add_nhops (hicn_face_id_t * face_id, u32 len,
- const ip46_address_t * prefix, u8 plen);
+ const fib_prefix_t * prefix);
/* Remove a route for a name prefix */
-int hicn_route_del (ip46_address_t * prefix, u8 plen);
+int hicn_route_del (fib_prefix_t * prefix);
/* Remove a next hop route for a name prefix */
-int hicn_route_del_nhop (ip46_address_t * prefix, u8 plen, u32 face_id);
+int hicn_route_del_nhop (fib_prefix_t * prefix, u32 face_id);
/* Remove a next hop route for a name prefix */
int
-hicn_route_set_strategy (ip46_address_t * prefix, u8 plen, u32 strategy_id);
+hicn_route_set_strategy (fib_prefix_t * prefix, u32 strategy_id);
#endif /* //__HICN_ROUTE__ */
diff --git a/hicn-plugin/src/strategies/strategy_mw_cli.c b/hicn-plugin/src/strategies/strategy_mw_cli.c
index 689bce470..50d4d21f0 100644
--- a/hicn-plugin/src/strategies/strategy_mw_cli.c
+++ b/hicn-plugin/src/strategies/strategy_mw_cli.c
@@ -32,11 +32,10 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm,
{
clib_error_t *cl_err = 0;
int ret = HICN_ERROR_NONE;
- ip46_address_t prefix;
+ fib_prefix_t prefix;
hicn_face_id_t faceid = HICN_FACE_NULL;
u32 fib_index;
u32 weight = HICN_PARAM_FIB_ENTRY_NHOP_WGHT_DFLT;
- u32 plen = 0;
hicn_dpo_ctx_t *hicn_dpo_ctx;
const dpo_id_t *hicn_dpo_id;
u32 vft_id;
@@ -49,7 +48,7 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm,
while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (line_input, "prefix %U/%u", unformat_ip46_address,
- &prefix, IP46_TYPE_ANY, &plen))
+ &prefix.fp_addr, IP46_TYPE_ANY, &prefix.fp_len))
;
else if (unformat (line_input, "face %u", &faceid))
;
@@ -73,18 +72,15 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm,
goto done;
}
- if (((ip46_address_is_zero (&prefix)) || faceid == HICN_FACE_NULL))
+ if (((ip46_address_is_zero (&prefix.fp_addr)) || faceid == HICN_FACE_NULL))
{
cl_err =
clib_error_return (0, "Please specify prefix and a valid faceid...");
goto done;
}
- fib_prefix_t fib_pfx;
- fib_prefix_from_ip46_addr (&prefix, &fib_pfx);
- fib_pfx.fp_len = plen;
-
- ret = hicn_route_get_dpo (&prefix, plen, &hicn_dpo_id, &fib_index);
+ prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+ ret = hicn_route_get_dpo (&prefix, &hicn_dpo_id, &fib_index);
if (ret == HICN_ERROR_NONE)
{
diff --git a/lib/includes/hicn/compat.h b/lib/includes/hicn/compat.h
index b31d01a0d..2796983c6 100644
--- a/lib/includes/hicn/compat.h
+++ b/lib/includes/hicn/compat.h
@@ -234,7 +234,7 @@ int hicn_packet_get_payload (hicn_format_t format,
*/
int hicn_packet_get_locator (hicn_format_t format,
const hicn_header_t * packet,
- ip_prefix_t * prefix, bool is_interest);
+ ip_address_t * prefix, bool is_interest);
/**
* @brief Sets the locator of an interest / data packet
@@ -246,7 +246,7 @@ int hicn_packet_get_locator (hicn_format_t format,
* @return hICN error code
*/
int hicn_packet_set_locator (hicn_format_t format, hicn_header_t * packet,
- const ip_prefix_t * prefix,
+ const ip_address_t * prefix,
bool is_interest);
/**
@@ -396,9 +396,9 @@ int hicn_interest_set_name (hicn_format_t format, hicn_header_t * interest,
const hicn_name_t * name);
int hicn_interest_get_locator (hicn_format_t format,
const hicn_header_t * interest,
- ip_prefix_t * prefix);
+ ip_address_t * prefix);
int hicn_interest_set_locator (hicn_format_t format, hicn_header_t * interest,
- const ip_prefix_t * prefix);
+ const ip_address_t * prefix);
int hicn_interest_compare (const hicn_header_t * interest_1,
const hicn_header_t * interest_2);
int hicn_interest_set_lifetime (hicn_header_t * interest, u32 lifetime);
@@ -425,9 +425,9 @@ int hicn_data_get_name (hicn_format_t format, const hicn_header_t * data,
int hicn_data_set_name (hicn_format_t format, hicn_header_t * data,
const hicn_name_t * name);
int hicn_data_get_locator (hicn_format_t format, const hicn_header_t * data,
- ip_prefix_t * prefix);
+ ip_address_t * prefix);
int hicn_data_set_locator (hicn_format_t format, hicn_header_t * data,
- const ip_prefix_t * prefix);
+ const ip_address_t * prefix);
int hicn_data_compare (const hicn_header_t * data_1,
const hicn_header_t * data_2);
int hicn_data_get_expiry_time (const hicn_header_t * data, u32 * expiry_time);
diff --git a/lib/includes/hicn/util/ip_address.h b/lib/includes/hicn/util/ip_address.h
index 542e6e4c6..e39d08585 100644
--- a/lib/includes/hicn/util/ip_address.h
+++ b/lib/includes/hicn/util/ip_address.h
@@ -65,12 +65,15 @@
#define DUMMY_PORT 1234
typedef union {
- union {
- struct in_addr as_inaddr;
- u8 as_u8[4];
- u16 as_u16[2];
- u32 as_u32;
- } v4;
+ struct {
+ u32 pad[3];
+ 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];
@@ -121,7 +124,7 @@ extern const ip_address_t IP_ADDRESS_EMPTY;
/* IP address */
int ip_address_get_family (const char * ip_address);
-int ip_address_len (const ip_address_t * ip_address, int family);
+int ip_address_len (int family);
int ip_address_ntop (const ip_address_t * ip_address, char *dst,
const size_t len, int family);
int ip_address_pton (const char *ip_address_str, ip_address_t * ip_address);
diff --git a/lib/src/compat.c b/lib/src/compat.c
index 68f761ac0..8ec4c83e8 100644
--- a/lib/src/compat.c
+++ b/lib/src/compat.c
@@ -321,7 +321,7 @@ hicn_packet_get_payload (hicn_format_t format, const hicn_header_t * h,
int
hicn_packet_get_locator (hicn_format_t format, const hicn_header_t * h,
- ip_prefix_t * prefix, bool is_interest)
+ ip_address_t * address, bool is_interest)
{
const void *locator;
int is_ipv4 = (format & HFO_INET);
@@ -330,28 +330,24 @@ hicn_packet_get_locator (hicn_format_t format, const hicn_header_t * h,
if (is_ipv4)
{
locator = is_interest ? &h->v4.ip.saddr : &h->v4.ip.daddr;
- prefix->family = AF_INET;
- prefix->len = IPV4_ADDR_LEN_BITS;
}
else if (is_ipv6)
{
locator = is_interest ? &h->v6.ip.saddr : &h->v6.ip.daddr;
- prefix->family = AF_INET6;
- prefix->len = IPV6_ADDR_LEN_BITS;
}
else
{
return HICN_LIB_ERROR_NOT_IMPLEMENTED;
}
- memcpy (prefix->address.buffer, locator, ip_address_len(&prefix->address, prefix->family));
+ memcpy (address->as_u8, locator, is_ipv4 ? IPV4_ADDR_LEN : IPV6_ADDR_LEN);
return HICN_LIB_ERROR_NONE;
}
int
hicn_packet_set_locator (hicn_format_t format, hicn_header_t * h,
- const ip_prefix_t * prefix, bool is_interest)
+ const ip_address_t * address, bool is_interest)
{
void *locator;
int is_ipv4 = (format & HFO_INET);
@@ -370,7 +366,7 @@ hicn_packet_set_locator (hicn_format_t format, hicn_header_t * h,
return HICN_LIB_ERROR_INVALID_PARAMETER;
}
- memcpy (locator, prefix->address.buffer, ip_address_len(&prefix->address, prefix->family));
+ memcpy (locator, address->as_u8, is_ipv4 ? IPV4_ADDR_LEN : IPV6_ADDR_LEN);
return HICN_LIB_ERROR_NONE;
}
@@ -953,16 +949,16 @@ hicn_interest_set_name (hicn_format_t format, hicn_header_t * interest,
int
hicn_interest_get_locator (hicn_format_t format,
const hicn_header_t * interest,
- ip_prefix_t * prefix)
+ ip_address_t * address)
{
- return hicn_packet_get_locator (format, interest, prefix, _INTEREST);
+ return hicn_packet_get_locator (format, interest, address, _INTEREST);
}
int
hicn_interest_set_locator (hicn_format_t format, hicn_header_t * interest,
- const ip_prefix_t * prefix)
+ const ip_address_t * address)
{
- return hicn_packet_set_locator (format, interest, prefix, _INTEREST);
+ return hicn_packet_set_locator (format, interest, address, _INTEREST);
}
int
@@ -1045,16 +1041,16 @@ hicn_data_set_name (hicn_format_t format, hicn_header_t * data,
int
hicn_data_get_locator (hicn_format_t format, const hicn_header_t * data,
- ip_prefix_t * prefix)
+ ip_address_t * address)
{
- return hicn_packet_get_locator (format, data, prefix, _DATA);
+ return hicn_packet_get_locator (format, data, address, _DATA);
}
int
hicn_data_set_locator (hicn_format_t format, hicn_header_t * data,
- const ip_prefix_t * prefix)
+ const ip_address_t * address)
{
- return hicn_packet_set_locator (format, data, prefix, _DATA);
+ return hicn_packet_set_locator (format, data, address, _DATA);
}
int
diff --git a/lib/src/name.c b/lib/src/name.c
index d5ee1d520..2e98a3532 100644
--- a/lib/src/name.c
+++ b/lib/src/name.c
@@ -96,7 +96,7 @@ hicn_name_create_from_ip_prefix (const ip_prefix_t * prefix, u32 id,
}
memcpy (name->buffer, prefix->address.buffer,
- ip_address_len(&prefix->address, prefix->family));
+ ip_address_len(prefix->family));
*(u32 *) (name->buffer + name->len) = id;
return HICN_LIB_ERROR_NONE;
diff --git a/lib/src/util/ip_address.c b/lib/src/util/ip_address.c
index c54b1fae6..d4fbcaae6 100644
--- a/lib/src/util/ip_address.c
+++ b/lib/src/util/ip_address.c
@@ -77,7 +77,7 @@ ip_address_get_family (const char * ip_address)
}
int
-ip_address_len (const ip_address_t * ip_address, int family)
+ip_address_len (int family)
{
return (family == AF_INET6) ? IPV6_ADDR_LEN :
(family == AF_INET) ? IPV4_ADDR_LEN : 0;
@@ -165,7 +165,7 @@ ip_address_to_sockaddr(const ip_address_t * ip_address,
int
ip_address_cmp(const ip_address_t * ip1, const ip_address_t * ip2, int family)
{
- return memcmp(ip1, ip2, ip_address_len(ip1, family));
+ return memcmp(ip1, ip2, ip_address_len(family));
}
int
diff --git a/libtransport/CMakeLists.txt b/libtransport/CMakeLists.txt
index dc3409c6f..e90d3a2f4 100644
--- a/libtransport/CMakeLists.txt
+++ b/libtransport/CMakeLists.txt
@@ -138,7 +138,7 @@ list(APPEND LIBRARIES
${LIBPARC_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
${HICN_LIBRARIES}
- ${VPP_LIBRARY_VPPAPICLIENT}
+ ${VPP_LIBRARIES}
${ANDROID_LIBRARIES}
${OPENSSL_LIBRARIES}
${WINDOWS_LIBRARIES}
diff --git a/libtransport/src/hicn/transport/core/content_object.cc b/libtransport/src/hicn/transport/core/content_object.cc
index d05239372..6cbcdb29e 100644
--- a/libtransport/src/hicn/transport/core/content_object.cc
+++ b/libtransport/src/hicn/transport/core/content_object.cc
@@ -154,7 +154,7 @@ ContentObject &ContentObject::setPathLabel(uint32_t path_label) {
return *this;
}
-void ContentObject::setLocator(const ip_prefix_t &ip_address) {
+void ContentObject::setLocator(const ip_address_t &ip_address) {
if (hicn_data_set_locator(format_, packet_start_, &ip_address) < 0) {
throw errors::RuntimeException("Error setting content object locator");
}
@@ -162,8 +162,8 @@ void ContentObject::setLocator(const ip_prefix_t &ip_address) {
return;
}
-ip_prefix_t ContentObject::getLocator() const {
- ip_prefix_t ip;
+ip_address_t ContentObject::getLocator() const {
+ ip_address_t ip;
if (hicn_data_get_locator(format_, packet_start_, &ip) < 0) {
throw errors::RuntimeException("Error getting content object locator.");
diff --git a/libtransport/src/hicn/transport/core/content_object.h b/libtransport/src/hicn/transport/core/content_object.h
index ef5144c23..5af548fe4 100644
--- a/libtransport/src/hicn/transport/core/content_object.h
+++ b/libtransport/src/hicn/transport/core/content_object.h
@@ -60,9 +60,9 @@ class ContentObject : public Packet {
ContentObject &setPathLabel(uint32_t path_label);
- void setLocator(const ip_prefix_t &ip_address) override;
+ void setLocator(const ip_address_t &ip_address) override;
- ip_prefix_t getLocator() const override;
+ ip_address_t getLocator() const override;
void setLifetime(uint32_t lifetime) override;
diff --git a/libtransport/src/hicn/transport/core/forwarder_interface.h b/libtransport/src/hicn/transport/core/forwarder_interface.h
index a89ed8a3c..380ce76bd 100644
--- a/libtransport/src/hicn/transport/core/forwarder_interface.h
+++ b/libtransport/src/hicn/transport/core/forwarder_interface.h
@@ -49,10 +49,6 @@ class ForwarderInterface {
mtu_(1500),
output_interface_(""),
content_store_reserved_(standard_cs_reserved) {
- inet_address_.family = AF_INET;
- inet_address_.len = IPV4_ADDR_LEN;
- inet6_address_.family = AF_INET6;
- inet6_address_.len = IPV6_ADDR_LEN;
}
public:
@@ -135,8 +131,8 @@ class ForwarderInterface {
protected:
ConnectorType &connector_;
- ip_prefix_t inet_address_;
- ip_prefix_t inet6_address_;
+ ip_address_t inet_address_;
+ ip_address_t inet6_address_;
uint16_t mtu_;
std::string output_interface_;
uint32_t content_store_reserved_;
diff --git a/libtransport/src/hicn/transport/core/hicn_binary_api.c b/libtransport/src/hicn/transport/core/hicn_binary_api.c
index 8fde516fd..9f93953ab 100644
--- a/libtransport/src/hicn/transport/core/hicn_binary_api.c
+++ b/libtransport/src/hicn/transport/core/hicn_binary_api.c
@@ -39,6 +39,8 @@
#include <vnet/ip/format.h>
#include <vnet/ip/ip4_packet.h>
#include <vnet/ip/ip6_packet.h>
+#include <vnet/ip/ip_types_api.h>
+#include <vnet/fib/fib_types.h>
#include <vpp_plugins/hicn/error.h>
#include <vpp_plugins/hicn/hicn_api.h>
@@ -58,7 +60,6 @@
#undef vl_api_version
#undef vl_printfun
#undef vl_endianfun
-
/////////////////////////////////////////////////////
const char *HICN_ERROR_STRING[] = {
#define _(a, b, c) c,
@@ -67,6 +68,24 @@ const char *HICN_ERROR_STRING[] = {
};
/////////////////////////////////////////////////////
+/*********************** Missing Symbol in vpp libraries *************************/
+u8 *
+format_vl_api_address_union (u8 * s, va_list * args)
+{
+ const vl_api_address_union_t *addr =
+ va_arg (*args, vl_api_address_union_t *);
+ vl_api_address_family_t af = va_arg (*args, vl_api_address_family_t);
+
+ if (ADDRESS_IP6 == af)
+ s = format (s, "%U", format_ip6_address, addr->ip6);
+ else
+ s = format (s, "%U", format_ip4_address, addr->ip4);
+
+ return s;
+}
+
+/*********************************************************************************/
+
static context_store_t context_store = {
.global_pointers_map_index = 0,
};
@@ -92,13 +111,14 @@ int hicn_binary_api_register_prod_app(
CONTEXT_SAVE(context_store, api, mp)
- mp->len = (u8)input_params->prefix->len;
+ fib_prefix_t prefix;
+ memcpy(&prefix.fp_addr.as_u64, &input_params->prefix->address.as_u64, sizeof(ip46_address_t));
+ prefix.fp_len = input_params->prefix->len;
+ prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
+ ip_prefix_encode(&prefix, &mp->prefix);
mp->swif = clib_host_to_net_u32(input_params->swif);
mp->cs_reserved = clib_host_to_net_u32(input_params->cs_reserved);
- mp->prefix[0] = clib_host_to_net_u64(input_params->prefix->address.as_u64[0]);
- mp->prefix[1] = clib_host_to_net_u64(input_params->prefix->address.as_u64[1]);
-
return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp);
}
@@ -112,8 +132,8 @@ static void vl_api_hicn_api_register_prod_app_reply_t_handler(
vpp_binary_api_set_ret_value(binary_api->vpp_api,
clib_net_to_host_u32(mp->retval));
params->cs_reserved = mp->cs_reserved;
- params->prod_addr->address.as_u64[0] = mp->prod_addr[0];
- params->prod_addr->address.as_u64[1] = mp->prod_addr[1];
+ params->prod_addr = (ip_address_t *)malloc(sizeof(ip_address_t));
+ ip_address_decode(&mp->prod_addr, (ip46_address_t *)(params->prod_addr));
params->face_id = clib_net_to_host_u32(mp->faceid);
vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
@@ -147,9 +167,8 @@ static void vl_api_hicn_api_register_cons_app_reply_t_handler(
vpp_binary_api_set_ret_value(binary_api->vpp_api,
clib_net_to_host_u32(mp->retval));
- params->src4->address.v4.as_u32 = clib_net_to_host_u32(mp->src_addr4);
- params->src6->address.as_u64[0] = clib_net_to_host_u64(mp->src_addr6[0]);
- params->src6->address.as_u64[1] = clib_net_to_host_u64(mp->src_addr6[1]);
+ ip_address_decode(&mp->src_addr4, (ip46_address_t *)params->src4);
+ ip_address_decode(&mp->src_addr6, (ip46_address_t *)params->src6);
params->face_id = clib_host_to_net_u32(mp->faceid);
vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api);
@@ -165,11 +184,10 @@ int hicn_binary_api_register_route(
M(HICN_API_ROUTE_NHOPS_ADD, mp);
CONTEXT_SAVE(context_store, api, mp)
-
- mp->prefix[0] = input_params->prefix->address.as_u64[0];
- mp->prefix[1] = input_params->prefix->address.as_u64[1];
- mp->len = input_params->prefix->len;
- mp->face_ids[0] = input_params->face_id;
+ fib_prefix_t prefix;
+ memcpy(&prefix.fp_addr.as_u64, &input_params->prefix->address.as_u64, sizeof(ip46_address_t));
+ prefix.fp_len = input_params->prefix->len;
+ mp->face_ids[0] = clib_host_to_net_u32(input_params->face_id);
mp->n_faces = 1;
return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp);
diff --git a/libtransport/src/hicn/transport/core/hicn_binary_api.h b/libtransport/src/hicn/transport/core/hicn_binary_api.h
index b09b5f4a7..50590917f 100644
--- a/libtransport/src/hicn/transport/core/hicn_binary_api.h
+++ b/libtransport/src/hicn/transport/core/hicn_binary_api.h
@@ -40,13 +40,13 @@ typedef struct {
typedef struct {
uint32_t cs_reserved;
- ip_prefix_t* prod_addr;
+ ip_address_t* prod_addr;
uint32_t face_id;
} hicn_producer_output_params;
typedef struct {
- ip_prefix_t* src4;
- ip_prefix_t* src6;
+ ip_address_t* src4;
+ ip_address_t* src6;
uint32_t face_id;
} hicn_consumer_output_params;
diff --git a/libtransport/src/hicn/transport/core/interest.cc b/libtransport/src/hicn/transport/core/interest.cc
index 6465053de..166632f0a 100644
--- a/libtransport/src/hicn/transport/core/interest.cc
+++ b/libtransport/src/hicn/transport/core/interest.cc
@@ -119,7 +119,7 @@ void Interest::setName(Name &&name) {
}
}
-void Interest::setLocator(const ip_prefix_t &ip_address) {
+void Interest::setLocator(const ip_address_t &ip_address) {
if (hicn_interest_set_locator(format_, packet_start_, &ip_address) < 0) {
throw errors::RuntimeException("Error setting interest locator.");
}
@@ -127,8 +127,8 @@ void Interest::setLocator(const ip_prefix_t &ip_address) {
return;
}
-ip_prefix_t Interest::getLocator() const {
- ip_prefix_t ip;
+ip_address_t Interest::getLocator() const {
+ ip_address_t ip;
if (hicn_interest_get_locator(format_, packet_start_, &ip) < 0) {
throw errors::RuntimeException("Error getting interest locator.");
diff --git a/libtransport/src/hicn/transport/core/interest.h b/libtransport/src/hicn/transport/core/interest.h
index 12fd597e5..48c833a73 100644
--- a/libtransport/src/hicn/transport/core/interest.h
+++ b/libtransport/src/hicn/transport/core/interest.h
@@ -55,9 +55,9 @@ class Interest
void setName(Name &&name) override;
- void setLocator(const ip_prefix_t &ip_address) override;
+ void setLocator(const ip_address_t &ip_address) override;
- ip_prefix_t getLocator() const override;
+ ip_address_t getLocator() const override;
void setLifetime(uint32_t lifetime) override;
diff --git a/libtransport/src/hicn/transport/core/packet.h b/libtransport/src/hicn/transport/core/packet.h
index 825c4c9dd..4ec93205a 100644
--- a/libtransport/src/hicn/transport/core/packet.h
+++ b/libtransport/src/hicn/transport/core/packet.h
@@ -133,9 +133,9 @@ class Packet : public std::enable_shared_from_this<Packet> {
void dump() const;
- virtual void setLocator(const ip_prefix_t &locator) = 0;
+ virtual void setLocator(const ip_address_t &locator) = 0;
- virtual ip_prefix_t getLocator() const = 0;
+ virtual ip_address_t getLocator() const = 0;
void setSignatureTimestamp(const uint64_t &timestamp);
diff --git a/libtransport/src/hicn/transport/core/portal.h b/libtransport/src/hicn/transport/core/portal.h
index b2614d361..4f161e4c8 100644
--- a/libtransport/src/hicn/transport/core/portal.h
+++ b/libtransport/src/hicn/transport/core/portal.h
@@ -451,11 +451,12 @@ class Portal {
if (it != pending_interest_hash_table_.end()) {
PendingInterest::Ptr ptr = std::move(it->second);
pending_interest_hash_table_.erase(it);
+ auto _int = ptr->getInterest();
if (ptr->getOnTimeoutCallback() != UNSET_CALLBACK) {
- ptr->on_interest_timeout_callback_(std::move(ptr->getInterest()));
+ ptr->on_interest_timeout_callback_(std::move(_int));
} else if (consumer_callback_) {
- consumer_callback_->onTimeout(std::move(ptr->getInterest()));
+ consumer_callback_->onTimeout(std::move(_int));
}
}
}
diff --git a/libtransport/src/hicn/transport/core/prefix.cc b/libtransport/src/hicn/transport/core/prefix.cc
index 6b87ccd1f..b7ddce73a 100644
--- a/libtransport/src/hicn/transport/core/prefix.cc
+++ b/libtransport/src/hicn/transport/core/prefix.cc
@@ -33,7 +33,7 @@ namespace transport {
namespace core {
-Prefix::Prefix() { std::memset(&ip_address_, 0, sizeof(ip_prefix_t)); }
+Prefix::Prefix() { std::memset(&ip_prefix_, 0, sizeof(ip_prefix_t)); }
Prefix::Prefix(const char *prefix) : Prefix(std::string(prefix)) {}
@@ -66,9 +66,9 @@ Prefix::Prefix(const core::Name &content_name, uint16_t prefix_length) {
throw errors::InvalidIpAddressException();
}
- ip_address_ = content_name.toIpAddress();
- ip_address_.len = prefix_length;
- ip_address_.family = family;
+ ip_prefix_ = content_name.toIpAddress();
+ ip_prefix_.len = prefix_length;
+ ip_prefix_.family = family;
}
void Prefix::buildPrefix(std::string &prefix, uint16_t prefix_length,
@@ -77,20 +77,20 @@ void Prefix::buildPrefix(std::string &prefix, uint16_t prefix_length,
throw errors::InvalidIpAddressException();
}
- int ret = inet_pton(family, prefix.c_str(), ip_address_.address.buffer);
+ int ret = inet_pton(family, prefix.c_str(), ip_prefix_.address.buffer);
if (ret != 1) {
throw errors::InvalidIpAddressException();
}
- ip_address_.len = prefix_length;
- ip_address_.family = family;
+ ip_prefix_.len = prefix_length;
+ ip_prefix_.family = family;
}
std::unique_ptr<Sockaddr> Prefix::toSockaddr() {
Sockaddr *ret = nullptr;
- switch (ip_address_.family) {
+ switch (ip_prefix_.family) {
case AF_INET6:
ret = (Sockaddr *)new Sockaddr6;
break;
@@ -101,39 +101,39 @@ std::unique_ptr<Sockaddr> Prefix::toSockaddr() {
throw errors::InvalidIpAddressException();
}
- if (ip_prefix_to_sockaddr(&ip_address_, ret) < 0) {
+ if (ip_prefix_to_sockaddr(&ip_prefix_, ret) < 0) {
throw errors::InvalidIpAddressException();
}
return std::unique_ptr<Sockaddr>(ret);
}
-uint16_t Prefix::getPrefixLength() { return ip_address_.len; }
+uint16_t Prefix::getPrefixLength() { return ip_prefix_.len; }
Prefix &Prefix::setPrefixLength(uint16_t prefix_length) {
- ip_address_.len = prefix_length;
+ ip_prefix_.len = prefix_length;
return *this;
}
-int Prefix::getAddressFamily() { return ip_address_.family; }
+int Prefix::getAddressFamily() { return ip_prefix_.family; }
Prefix &Prefix::setAddressFamily(int address_family) {
- ip_address_.family = address_family;
+ ip_prefix_.family = address_family;
return *this;
}
std::string Prefix::getNetwork() const {
- if (!checkPrefixLengthAndAddressFamily(ip_address_.len,
- ip_address_.family)) {
+ if (!checkPrefixLengthAndAddressFamily(ip_prefix_.len,
+ ip_prefix_.family)) {
throw errors::InvalidIpAddressException();
}
std::size_t size =
- ip_address_.family == 4 + AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
+ ip_prefix_.family == 4 + AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
std::string network(size, 0);
- if (ip_prefix_ntop_short(&ip_address_, (char *)network.c_str(), size) < 0) {
+ if (ip_prefix_ntop_short(&ip_prefix_, (char *)network.c_str(), size) < 0) {
throw errors::RuntimeException(
"Impossible to retrieve network from ip address.");
}
@@ -147,7 +147,7 @@ Name Prefix::getName() const {
}
Prefix &Prefix::setNetwork(std::string &network) {
- if (!inet_pton(AF_INET6, network.c_str(), ip_address_.address.buffer)) {
+ if (!inet_pton(AF_INET6, network.c_str(), ip_prefix_.address.buffer)) {
throw errors::RuntimeException("The network name is not valid.");
}
@@ -157,16 +157,16 @@ Prefix &Prefix::setNetwork(std::string &network) {
Name Prefix::makeRandomName() const {
srand((unsigned int)time(nullptr));
- if (ip_address_.family == AF_INET6) {
+ if (ip_prefix_.family == AF_INET6) {
std::default_random_engine eng((std::random_device())());
std::uniform_int_distribution<uint32_t> idis(
0, std::numeric_limits<uint32_t>::max());
uint64_t random_number = idis(eng);
- uint32_t hash_size_bits = IPV6_ADDR_LEN_BITS - ip_address_.len;
+ uint32_t hash_size_bits = IPV6_ADDR_LEN_BITS - ip_prefix_.len;
uint64_t ip_address[2];
- memcpy(ip_address, ip_address_.address.buffer, sizeof(uint64_t));
- memcpy(ip_address + 1, ip_address_.address.buffer + 8, sizeof(uint64_t));
+ memcpy(ip_address, ip_prefix_.address.buffer, sizeof(uint64_t));
+ memcpy(ip_address + 1, ip_prefix_.address.buffer + 8, sizeof(uint64_t));
std::string network(IPV6_ADDR_LEN * 3, 0);
// Let's do the magic ;)
@@ -179,7 +179,7 @@ Name Prefix::makeRandomName() const {
ip_address[1] |= random_number >> (sizeof(uint64_t) * 8 - shift_size);
- if (!inet_ntop(ip_address_.family, ip_address, (char *)network.c_str(),
+ if (!inet_ntop(ip_prefix_.family, ip_address, (char *)network.c_str(),
IPV6_ADDR_LEN * 3)) {
throw errors::RuntimeException(
"Impossible to retrieve network from ip address.");
@@ -208,7 +208,7 @@ bool Prefix::checkPrefixLengthAndAddressFamily(uint16_t prefix_length,
return true;
}
-ip_prefix_t &Prefix::toIpAddressStruct() { return ip_address_; }
+ip_prefix_t &Prefix::toIpPrefixStruct() { return ip_prefix_; }
} // namespace core
diff --git a/libtransport/src/hicn/transport/core/prefix.h b/libtransport/src/hicn/transport/core/prefix.h
index 022e2bec2..af7c705cf 100644
--- a/libtransport/src/hicn/transport/core/prefix.h
+++ b/libtransport/src/hicn/transport/core/prefix.h
@@ -52,7 +52,7 @@ class Prefix {
Name makeRandomName() const;
- ip_prefix_t &toIpAddressStruct();
+ ip_prefix_t &toIpPrefixStruct();
private:
static bool checkPrefixLengthAndAddressFamily(uint16_t prefix_length,
@@ -60,7 +60,7 @@ class Prefix {
void buildPrefix(std::string &prefix, uint16_t prefix_length, int family);
- ip_prefix_t ip_address_;
+ ip_prefix_t ip_prefix_;
};
} // end namespace core
diff --git a/libtransport/src/hicn/transport/core/raw_socket_interface.cc b/libtransport/src/hicn/transport/core/raw_socket_interface.cc
index ef365fce7..bb4e083e1 100644
--- a/libtransport/src/hicn/transport/core/raw_socket_interface.cc
+++ b/libtransport/src/hicn/transport/core/raw_socket_interface.cc
@@ -43,9 +43,8 @@ void RawSocketInterface::connect(bool is_consumer) {
// Get interface ip address
struct sockaddr_in6 address = {0};
utils::retrieveInterfaceAddress(output_interface_, &address);
- inet6_address_.family = address.sin6_family;
- std::memcpy(inet6_address_.address.buffer, &address.sin6_addr,
+ std::memcpy(&inet6_address_.v6.as_u8, &address.sin6_addr,
sizeof(address.sin6_addr));
connector_.connect(output_interface_, remote_mac_address_);
}
diff --git a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc
index c8a4f9c88..598b692c9 100644
--- a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc
+++ b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc
@@ -87,8 +87,8 @@ uint32_t VPPForwarderInterface::getMemifConfiguration() {
void VPPForwarderInterface::consumerConnection() {
hicn_consumer_input_params input = {0};
hicn_consumer_output_params output = {0};
- ip_prefix_t ip4_address;
- ip_prefix_t ip6_address;
+ ip_address_t ip4_address;
+ ip_address_t ip6_address;
output.src4 = &ip4_address;
output.src6 = &ip6_address;
@@ -102,13 +102,9 @@ void VPPForwarderInterface::consumerConnection() {
throw errors::RuntimeException(hicn_binary_api_get_error_string(ret));
}
- inet_address_.family = AF_INET;
- inet_address_.len = output.src4->len;
- std::memcpy(inet_address_.address.buffer, output.src4->address.buffer, IPV6_ADDR_LEN);
+ std::memcpy(inet_address_.v4.as_u8, output.src4->as_u8, IPV4_ADDR_LEN);
- inet6_address_.family = AF_INET6;
- inet6_address_.len = output.src6->len;
- std::memcpy(inet6_address_.address.buffer, output.src6->address.buffer, IPV6_ADDR_LEN);
+ std::memcpy(inet6_address_.v6.as_u8, output.src6->as_u8, IPV6_ADDR_LEN);
}
void VPPForwarderInterface::producerConnection() {
@@ -141,10 +137,10 @@ void VPPForwarderInterface::connect(bool is_consumer) {
}
void VPPForwarderInterface::registerRoute(Prefix &prefix) {
- auto &addr = prefix.toIpAddressStruct();
+ ip_prefix_t &addr = prefix.toIpPrefixStruct();
- // Same ip address for input and outurt params
- ip_prefix_t ip_address;
+ ip_prefix_t producer_prefix;
+ ip_address_t producer_locator;
if (face_id_ == uint32_t(~0)) {
hicn_producer_input_params input;
@@ -153,8 +149,8 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) {
hicn_producer_output_params output;
std::memset(&output, 0, sizeof(output));
- input.prefix = &ip_address;
- output.prod_addr = &ip_address;
+ input.prefix = &producer_prefix;
+ output.prod_addr = &producer_locator;
// Here we have to ask to the actual connector what is the
// memif_id, since this function should be called after the
@@ -174,21 +170,18 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) {
}
if (addr.family == AF_INET6) {
- inet6_address_.len = output.prod_addr->len;
- inet6_address_.address.as_u64[0] = output.prod_addr->address.as_u64[0];
- inet6_address_.address.as_u64[1] = output.prod_addr->address.as_u64[1];
+ inet6_address_.v6.as_u64[0] = output.prod_addr->v6.as_u64[0];
+ inet6_address_.v6.as_u64[1] = output.prod_addr->v6.as_u64[1];
} else {
- inet_address_.len = output.prod_addr->len;
// The ipv4 is written in the last 4 bytes of the ipv6 address, so we need
// to copy from the byte 12
- inet_address_.address.as_u64[0] = output.prod_addr->address.as_u64[0];
- inet_address_.address.as_u64[1] = output.prod_addr->address.as_u64[1];
+ inet_address_.v4.as_u32 = output.prod_addr->v4.as_u32;
}
face_id_ = output.face_id;
} else {
hicn_producer_set_route_params params;
- params.prefix = &ip_address;
+ params.prefix = &producer_prefix;
params.prefix->address.as_u64[0] = addr.address.as_u64[0];
params.prefix->address.as_u64[1] = addr.address.as_u64[1];
params.prefix->family = addr.family == AF_INET6 ? AF_INET6 : AF_INET;
diff --git a/libtransport/src/hicn/transport/utils/verifier.cc b/libtransport/src/hicn/transport/utils/verifier.cc
index af19d8b5e..69b2101da 100644
--- a/libtransport/src/hicn/transport/utils/verifier.cc
+++ b/libtransport/src/hicn/transport/utils/verifier.cc
@@ -97,6 +97,8 @@ PARCKeyId *Verifier::addKeyFromCertificate(const std::string &file_name) {
int Verifier::verify(const Packet &packet) {
bool valid = false;
+ // initialize packet.payload_head_
+ const_cast<Packet*>(&packet)->separateHeaderPayload();
// header chain points to the IP + TCP hicn header
utils::MemBuf *header_chain = packet.header_head_;
utils::MemBuf *payload_chain = packet.payload_head_;
diff --git a/scripts/build-sysrepo.sh b/scripts/build-sysrepo.sh
index 7d83cac14..205fcc6bd 100644
--- a/scripts/build-sysrepo.sh
+++ b/scripts/build-sysrepo.sh
@@ -25,12 +25,12 @@ PACKAGECLOUD_RELEASE_REPO_RPM="https://packagecloud.io/install/repositories/fdio
VPP_GIT_REPO="https://git.fd.io/vpp"
VPP_BRANCH="stable/1908"
-VPP_VERSION_DEB="19.08-release"
-VPP_VERSION_RPM="19.08-release.x86_64"
+VPP_VERSION_DEB="19.08.1-release"
+VPP_VERSION_RPM="19.08.1-release.x86_64"
BUILD_TOOLS_UBUNTU="build-essential doxygen"
LIBSSL_LIBEVENT_UBUNTU="libevent-dev libssl-dev"
-DEPS_UBUNTU="hicn-light hicn-plugin libvppinfra=${VPP_VERSION_DEB} libvppinfra-dev=${VPP_VERSION_DEB} vpp=${VPP_VERSION_DEB} vpp-dev=${VPP_VERSION_DEB} vpp-plugin-core=${VPP_VERSION_DEB}"
+DEPS_UBUNTU="hicn-light libhicn-dev libhicnctrl libhicnctrl-dev hicn-plugin hicn-plugin-dev libvppinfra=${VPP_VERSION_DEB} libvppinfra-dev=${VPP_VERSION_DEB} vpp=${VPP_VERSION_DEB} vpp-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 asio-devel centos-release-scl devtoolset-7"
@@ -122,8 +122,8 @@ build_package() {
mkdir -p build && pushd build
rm -rf *
-# cp ${SCRIPT_PATH}/../cmake/Modules/Packager.cmake ${SCRIPT_PATH}/../utils/sysrepo-plugin/cmake/
- cmake -DCMAKE_INSTALL_PREFIX=/usr ${SCRIPT_PATH}/../utils/sysrepo-plugins/ \
+# cp ${SCRIPT_PATH}/../cmake/Modules/Packager.cmake ${SCRIPT_PATH}/../ctrl/sysrepo-plugin/cmake/
+ cmake -DCMAKE_INSTALL_PREFIX=/usr ${SCRIPT_PATH}/../ctrl/sysrepo-plugins/ \
-DSR_PLUGINS_DIR=/usr/lib/x86_64-linux-gnu/sysrepo/plugins
make package
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 4e73ab2b0..3ed6f9bf3 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -47,6 +47,7 @@ endif()
set(SUFFIX "")
if (${LIBTRANSPORT_LIBRARIES} MATCHES ".*-memif.*")
set(SUFFIX "-memif")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-unresolved-symbols=ignore-in-shared-libs")
endif()
set(HICN_UTILS "${HICN_UTILS}${SUFFIX}")