summaryrefslogtreecommitdiffstats
path: root/ctrl/libhicnctrl/src
diff options
context:
space:
mode:
Diffstat (limited to 'ctrl/libhicnctrl/src')
-rw-r--r--ctrl/libhicnctrl/src/CMakeLists.txt1
-rw-r--r--ctrl/libhicnctrl/src/api.c96
-rw-r--r--ctrl/libhicnctrl/src/route.c98
3 files changed, 174 insertions, 21 deletions
diff --git a/ctrl/libhicnctrl/src/CMakeLists.txt b/ctrl/libhicnctrl/src/CMakeLists.txt
index 4708595e0..670e79f05 100644
--- a/ctrl/libhicnctrl/src/CMakeLists.txt
+++ b/ctrl/libhicnctrl/src/CMakeLists.txt
@@ -30,6 +30,7 @@ set(UTIL_HEADER_FILES
set(SOURCE_FILES
api.c
face.c
+ route.c
util/log.c
)
diff --git a/ctrl/libhicnctrl/src/api.c b/ctrl/libhicnctrl/src/api.c
index 2955e2e71..e6fdb4120 100644
--- a/ctrl/libhicnctrl/src/api.c
+++ b/ctrl/libhicnctrl/src/api.c
@@ -36,6 +36,8 @@
#define PORT 9695
+#define INT_CMP(x, y) ((x > y) ? 1 : (x < y) ? -1 : 0)
+
/*
* Internal state associated to a pending request
*/
@@ -1086,13 +1088,29 @@ hc_listener_validate(const hc_listener_t * listener)
int
hc_listener_cmp(const hc_listener_t * l1, const hc_listener_t * l2)
{
- return ((l1->type == l2->type) &&
- (l1->family == l2->family) &&
- (strncmp(l1->interface_name, l2->interface_name, INTERFACE_LEN) == 0) &&
- (ip_address_cmp(&l1->local_addr, &l2->local_addr, l1->family) == 0) &&
- (l1->local_port == l2->local_port))
- ? 0
- : -1;
+ int rc;
+
+ rc = INT_CMP(l1->type, l2->type);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(l1->family, l2->family);
+ if (rc != 0)
+ return rc;
+
+ rc = strncmp(l1->interface_name, l2->interface_name, INTERFACE_LEN);
+ if (rc != 0)
+ return rc;
+
+ rc = ip_address_cmp(&l1->local_addr, &l2->local_addr, l1->family);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(l1->local_port, l2->local_port);
+ if (rc != 0)
+ return rc;
+
+ return rc;
}
/* LISTENER PARSE */
@@ -1360,14 +1378,37 @@ hc_connection_validate(const hc_connection_t * connection)
*/
int hc_connection_cmp(const hc_connection_t * c1, const hc_connection_t * c2)
{
- return ((c1->type == c2->type) &&
- (c1->family == c2->family) &&
- (ip_address_cmp(&c1->local_addr, &c2->local_addr, c1->family) == 0) &&
- (c1->local_port == c2->local_port) &&
- (ip_address_cmp(&c1->remote_addr, &c2->remote_addr, c1->family) == 0) &&
- (c1->remote_port == c2->remote_port))
- ? 0
- : -1;
+ int rc;
+
+ rc = INT_CMP(c1->type, c2->type);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(c1->family, c2->family);
+ if (rc != 0)
+ return rc;
+
+ rc = strncmp(c1->interface_name, c2->interface_name, INTERFACE_LEN);
+ if (rc != 0)
+ return rc;
+
+ rc = ip_address_cmp(&c1->local_addr, &c2->local_addr, c1->family);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(c1->local_port, c2->local_port);
+ if (rc != 0)
+ return rc;
+
+ rc = ip_address_cmp(&c1->remote_addr, &c2->remote_addr, c1->family);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(c1->remote_port, c2->remote_port);
+ if (rc != 0)
+ return rc;
+
+ return rc;
}
/* CONNECTION PARSE */
@@ -2350,12 +2391,25 @@ int hc_punting_validate(const hc_punting_t * punting)
int hc_punting_cmp(const hc_punting_t * p1, const hc_punting_t * p2)
{
- return ((p1->face_id == p2->face_id) &&
- (p1->family == p2->family) &&
- (ip_address_cmp(&p1->prefix, &p2->prefix, p1->family) == 0) &&
- (p1->prefix_len == p2->prefix_len))
- ? 0
- : -1;
+ int rc;
+
+ rc = INT_CMP(p1->face_id, p2->face_id);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(p1->family, p2->family);
+ if (rc != 0)
+ return rc;
+
+ rc = ip_address_cmp(&p1->prefix, &p2->prefix, p1->family);
+ if (rc != 0)
+ return rc;
+
+ rc = INT_CMP(p1->prefix_len, p2->prefix_len);
+ if (rc != 0)
+ return rc;
+
+ return rc;
}
int hc_punting_parse(void * in, hc_punting_t * punting)
diff --git a/ctrl/libhicnctrl/src/route.c b/ctrl/libhicnctrl/src/route.c
new file mode 100644
index 000000000..61434871b
--- /dev/null
+++ b/ctrl/libhicnctrl/src/route.c
@@ -0,0 +1,98 @@
+/*
+ * 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 route.c
+ * \brief Implementation of hICN route
+ */
+
+#include <hicn/hicn.h>
+#include <hicn/ctrl/route.h>
+#include <hicn/util/ip_address.h>
+
+#define DEFAULT_HICN_ROUTE_COST 1
+
+struct hicn_route_s {
+ ip_prefix_t prefix;
+ face_id_t face_id;
+ route_cost_t cost; /* Optional, 0 means no value, defaults to 1 */
+};
+
+hicn_route_t *
+hicn_route_create(ip_prefix_t * prefix, face_id_t face_id, route_cost_t cost)
+{
+ hicn_route_t * route = malloc(sizeof(hicn_route_t));
+ if (!route)
+ return NULL;
+ route->prefix = *prefix;
+ route->face_id = face_id;
+ route->cost = cost != 0 ? cost : DEFAULT_HICN_ROUTE_COST;
+
+ return route;
+}
+
+void hicn_route_free(hicn_route_t * route)
+{
+ free(route);
+}
+
+int
+hicn_route_cmp(const hicn_route_t * route1, const hicn_route_t * route2)
+{
+ int rc;
+ rc = ip_prefix_cmp(&route1->prefix, &route2->prefix);
+ if (rc != 0)
+ return rc;
+
+ return (route1->face_id > route2->face_id) ? 1 :
+ (route1->face_id < route2->face_id) ? -1 : 0;
+}
+
+int
+hicn_route_get_prefix(const hicn_route_t * route, ip_prefix_t * prefix)
+{
+ *prefix = route->prefix;
+ return 0;
+}
+
+int
+hicn_route_set_prefix(hicn_route_t * route, const ip_prefix_t prefix)
+{
+ route->prefix = prefix;
+ return 0;
+}
+
+int
+hicn_route_get_cost(const hicn_route_t * route, int * cost)
+{
+ *cost = route->cost;
+ return 0;
+}
+
+int
+hicn_route_set_cost(hicn_route_t * route, const int cost)
+{
+ route->cost = cost;
+ return 0;
+}
+
+/* /!\ Please update constants in header file upon changes */
+size_t
+hicn_route_snprintf(char * s, size_t size, const hicn_route_t * route)
+{
+ char prefix_s[MAXSZ_PREFIX];
+ ip_prefix_ntop(&route->prefix, prefix_s, MAXSZ_PREFIX);
+ return snprintf(s, size, "%s [%d]", prefix_s, route->cost);
+}