diff options
Diffstat (limited to 'ctrl/libhicnctrl/src')
-rw-r--r-- | ctrl/libhicnctrl/src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | ctrl/libhicnctrl/src/api.c | 96 | ||||
-rw-r--r-- | ctrl/libhicnctrl/src/route.c | 98 |
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); +} |