diff options
Diffstat (limited to 'hicn-light/src/hicn/config/configuration.c')
-rw-r--r-- | hicn-light/src/hicn/config/configuration.c | 205 |
1 files changed, 124 insertions, 81 deletions
diff --git a/hicn-light/src/hicn/config/configuration.c b/hicn-light/src/hicn/config/configuration.c index a6f78f9c2..f56ce73ce 100644 --- a/hicn-light/src/hicn/config/configuration.c +++ b/hicn-light/src/hicn/config/configuration.c @@ -41,7 +41,7 @@ #include <hicn/core/listener.h> //the listener list #include <hicn/core/listener_table.h> -#include <hicn/utils/commands.h> +#include <hicn/ctrl/commands.h> #include <hicn/utils/utils.h> #include <hicn/utils/punting.h> #include <hicn/util/log.h> @@ -51,13 +51,13 @@ #define DEFAULT_COST 1 #define DEFAULT_PORT 1234 -#define make_ack(msg) msg->header.messageType = ACK_LIGHT -#define make_nack(msg) msg->header.messageType = NACK_LIGHT +#define make_ack(msg) ((msg_header_t *)msg)->header.message_type = ACK_LIGHT +#define make_nack(msg) ((msg_header_t *)msg)->header.message_type = NACK_LIGHT #define msg_malloc_list(msg, N) \ do { \ msg = malloc(sizeof((msg)->header) + N * sizeof((msg)->payload)); \ - (msg)->header.messageType = RESPONSE_LIGHT; \ + (msg)->header.message_type = RESPONSE_LIGHT; \ (msg)->header.length = (uint16_t)(N); \ } while(0); @@ -71,7 +71,7 @@ do { \ * * prefix_str -> strategy_type */ -KHASH_INIT(strategy_map, const char *, unsigned, 0, str_hash, str_hash_eq); +KHASH_MAP_INIT_STR(strategy_map, unsigned); struct configuration_s { forwarder_t * forwarder; @@ -198,23 +198,31 @@ configuration_on_listener_add(configuration_t * config, uint8_t * packet, /* Verify that the listener DOES NOT exist */ listener_t * listener = listener_table_get_by_name(table, control->symbolic); - if (listener) + if (listener) { + DEBUG("Listener %s already exists", control->symbolic); goto NACK; + } address_t address; if (address_from_ip_port(&address, control->family, &control->address, control->port) < 0) { WARN("Unsupported address type for HICN (ingress id %u): " "must be either IPV4 or IPV6", ingress_id); - return false; + goto NACK; } - // NOTE: interface_name is expected NULL for hICN listener - face_type_t face_type; - if (!face_type_is_defined(control->listener_type)) + if (!face_type_is_defined(control->type)) { + WARN("[configuration_on_listener_add] Invalid listener type"); goto NACK; - face_type = (face_type_t)control->listener_type; + } + // XXX validate that we use face_type everywhere, as we use the untyped + // uint8_t for the control protocol + face_type_t face_type = get_face_type_from_listener_type((hc_connection_type_t) control->type); + if (!face_type_is_defined(face_type)) + goto NACK; + + // NOTE: interface_name is expected NULL for hICN listener listener = listener_create(face_type, &address, control->interface_name, control->symbolic, forwarder); if (!listener) @@ -224,7 +232,7 @@ configuration_on_listener_add(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -291,7 +299,7 @@ configuration_on_listener_remove(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -348,7 +356,7 @@ configuration_on_listener_list(configuration_t * config, uint8_t * packet, msg_listener_list_reply_t * msg; msg_malloc_list(msg, n) if (!msg) - return NULL; + goto NACK; cmd_listener_list_item_t * payload = &msg->payload; listener_t * listener; @@ -358,6 +366,10 @@ configuration_on_listener_list(configuration_t * config, uint8_t * packet, }); return (uint8_t*)msg; + +NACK: + make_nack(msg); + return (uint8_t*)msg; } /* Connection */ @@ -374,10 +386,9 @@ configuration_on_connection_add(configuration_t * config, uint8_t * packet, const char *symbolic_name = control->symbolic; - face_type_t face_type; - if (!face_type_is_defined(control->type)) + face_type_t face_type = get_face_type_from_listener_type((hc_connection_type_t) control->type); + if (!face_type_is_defined(face_type)) goto NACK; - face_type = (face_type_t)control->type; connection_table_t * table = forwarder_get_connection_table(config->forwarder); if (connection_table_get_by_name(table, symbolic_name)) { @@ -435,7 +446,7 @@ configuration_on_connection_add(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -488,7 +499,7 @@ configuration_on_connection_remove(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -578,7 +589,7 @@ configuration_on_connection_list(configuration_t * config, uint8_t * packet, msg_connection_list_reply_t * msg; msg_malloc_list(msg, n) if (!msg) - return NULL; + goto NACK; cmd_connection_list_item_t * payload = &msg->payload; connection_t * connection; @@ -588,6 +599,10 @@ configuration_on_connection_list(configuration_t * config, uint8_t * packet, }); return (uint8_t*)msg; + +NACK: + make_nack(msg); + return (uint8_t*)msg; } uint8_t * @@ -622,7 +637,7 @@ configuration_on_connection_set_admin_state(configuration_t * config, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -652,7 +667,7 @@ configuration_on_connection_update(configuration_t * config, uint8_t * packet, NACK: #endif /* WITH_POLICY */ - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -684,7 +699,7 @@ configuration_on_connection_set_priority(configuration_t * config, NACK: #endif /* WITH_POLICY */ - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -716,7 +731,7 @@ configuration_on_connection_set_tags(configuration_t * config, uint8_t * packet, NACK: #endif /* WITH_POLICY */ - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -751,7 +766,7 @@ configuration_on_route_add(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -782,7 +797,7 @@ configuration_on_route_remove(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -811,7 +826,7 @@ configuration_on_route_list(configuration_t * config, uint8_t * packet, msg_route_list_reply_t * msg; msg_malloc_list(msg, n); if (!msg) - return NULL; + goto NACK; cmd_route_list_item_t * payload = &msg->payload; fib_foreach_entry(fib, entry, { @@ -850,6 +865,10 @@ configuration_on_route_list(configuration_t * config, uint8_t * packet, }); return (uint8_t*)msg; + +NACK: + make_nack(msg); + return (uint8_t*)msg; } @@ -869,16 +888,16 @@ configuration_on_cache_set_store(configuration_t * config, uint8_t * packet, goto NACK; bool value = (bool)control->activate; - forwarder_content_store_set_store(config->forwarder, value); + forwarder_cs_set_store(config->forwarder, value); /* XXX Why do we need to check ? */ - if (forwarder_content_store_get_store(config->forwarder) != value) + if (forwarder_cs_get_store(config->forwarder) != value) goto NACK; make_ack(msg); return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -896,16 +915,16 @@ configuration_on_cache_set_serve(configuration_t * config, uint8_t * packet, goto NACK; bool value = (bool)control->activate; - forwarder_content_store_set_serve(config->forwarder, value); + forwarder_cs_set_serve(config->forwarder, value); /* XXX Why do we need to check ? */ - if (forwarder_content_store_get_serve(config->forwarder) != value) + if (forwarder_cs_get_serve(config->forwarder) != value) goto NACK; make_ack(msg); return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -918,7 +937,7 @@ configuration_on_cache_clear(configuration_t * config, uint8_t * packet, msg_cache_clear_t * msg = (msg_cache_clear_t *)packet; - forwarder_content_store_clear(config->forwarder); + forwarder_cs_clear(config->forwarder); make_ack(msg); return (uint8_t*)msg; @@ -1039,7 +1058,7 @@ configuration_on_wldr_set(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1049,10 +1068,11 @@ uint8_t * configuration_on_punting_add(configuration_t * config, uint8_t * packet, unsigned ingress_id) { -#if !defined(__APPLE__) && !defined(_WIN32) && defined(PUNTING) +// #if !defined(__APPLE__) && !defined(_WIN32) && defined(PUNTING) msg_punting_add_t * msg = (msg_punting_add_t *)packet; - cmd_punting_add_t * control = &msg->payload; +#if !defined(__APPLE__) && !defined(_WIN32) && defined(PUNTING) + cmd_punting_add_t * control = &msg->payload; if (ip_address_empty(&control->address)) goto NACK; @@ -1098,7 +1118,7 @@ configuration_on_punting_add(configuration_t * config, uint8_t * packet, NACK: #endif - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1124,7 +1144,7 @@ configuration_on_mapme_enable(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1148,7 +1168,7 @@ configuration_on_mapme_set_discovery(configuration_t * config, uint8_t * packet, return (uint8_t*)msg; NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1221,7 +1241,7 @@ configuration_on_mapme_send_update(configuration_t * config, uint8_t * packet, }); NACK: - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1252,7 +1272,7 @@ configuration_on_policy_add(configuration_t * config, uint8_t * packet, NACK: #endif /* WITH_POLICY */ - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1282,7 +1302,7 @@ configuration_on_policy_remove(configuration_t * config, uint8_t * packet, NACK: #endif /* WITH_POLICY */ - make_ack(msg); + make_nack(msg); return (uint8_t*)msg; } @@ -1298,10 +1318,10 @@ configuration_on_policy_list(configuration_t * config, uint8_t * packet, size_t n = fib_get_size(fib); #ifdef WITH_POLICY - msg_policy_list_reply_t * msg; + msg_policy_list_reply_t * msg = (msg_policy_list_reply_t *)packet; msg_malloc_list(msg, n); if (!msg) - return NULL; + goto NACK; cmd_policy_list_item_t * payload = &msg->payload; @@ -1333,23 +1353,25 @@ configuration_on_policy_list(configuration_t * config, uint8_t * packet, }); return (uint8_t*)msg; -#else - return NULL; #endif /* WITH_POLICY */ + +NACK: + make_nack(msg); + return (uint8_t *)msg; } size_t -configuration_content_store_get_size(configuration_t * config) +configuration_cs_get_size(configuration_t * config) { return config->maximumContentObjectStoreSize; } void -configuration_content_store_set_size(configuration_t * config, size_t size) +configuration_cs_set_size(configuration_t * config, size_t size) { config->maximumContentObjectStoreSize = size; - forwarder_content_store_set_size(config->forwarder, + forwarder_cs_set_size(config->forwarder, config->maximumContentObjectStoreSize); } @@ -1359,58 +1381,79 @@ configuration_get_forwarder(const configuration_t * config) { } -// =========================== -// Main functions that deal with receiving commands, executing them, and sending -// ACK/NACK - -uint8_t * -configuration_dispatch_command(configuration_t * config, command_type_t command_type, - uint8_t * packet, unsigned ingress_id) +ssize_t +configuration_receive_command(configuration_t * config, msgbuf_t * msgbuf) { + assert(config); + assert(msgbuf); + + uint8_t * packet = msgbuf_get_packet(msgbuf); + unsigned ingress_id = msgbuf_get_connection_id(msgbuf); + + uint8_t * reply = NULL; + + /* + * For most commands, the packet will simply be transformed into an ack. + * For list commands, a new message will be allocated, and the return value + * might eventually be NULL in case of an error. That is why the free the + * reply at the end in these circumstances. + * + * XXX rework this part. + */ + command_type_t command_type = msgbuf_get_command_type(msgbuf); switch (command_type) { #define _(l, u) \ case COMMAND_TYPE_ ## u: \ - return configuration_on_ ## l(config, packet, ingress_id); + reply = configuration_on_ ## l(config, packet, ingress_id); \ + assert(reply); \ + break; foreach_command_type #undef _ case COMMAND_TYPE_UNDEFINED: case COMMAND_TYPE_N: ERROR("Unexpected command type"); + reply = packet; + make_nack(reply); break; } - return NULL; -} - -void configuration_receive_command(configuration_t * config, - command_type_t command_type, uint8_t * packet, unsigned ingress_id) -{ - assert(config); - assert(command_type_is_valid(command_type)); - assert(packet); - bool nack = false; - - uint8_t * reply = configuration_dispatch_command(config, command_type, packet, ingress_id); - if (!reply) { - reply = packet; - msg_header_t * hdr = (msg_header_t *)reply; - make_nack(hdr); - nack = true; + if (connection_id_is_valid(msgbuf->connection_id)) { + connection_table_t * table = forwarder_get_connection_table(config->forwarder); + const connection_t *connection = connection_table_at(table, ingress_id); + connection_send_packet(connection, reply, sizeof(cmd_header_t)); } - connection_table_t * table = forwarder_get_connection_table(config->forwarder); - const connection_t *connection = connection_table_at(table, ingress_id); - connection_send_packet(connection, reply, false); - - switch (command_type) { + switch (msgbuf->command.type) { case COMMAND_TYPE_LISTENER_LIST: case COMMAND_TYPE_CONNECTION_LIST: case COMMAND_TYPE_ROUTE_LIST: case COMMAND_TYPE_POLICY_LIST: - if (!nack) + /* Free replies that have been allocated (not NACK's) */ + if (((msg_header_t *)reply)->header.message_type != NACK_LIGHT) free(reply); break; default: break; } + + // XXX only if we consumed the whole packet. + return (ssize_t)msgbuf_get_len(msgbuf); +} + +face_type_t get_face_type_from_listener_type(hc_connection_type_t listener_type) { + face_type_t face_type; + switch (listener_type) { + case CONNECTION_TYPE_TCP: + face_type = FACE_TYPE_TCP_LISTENER; + break; + case CONNECTION_TYPE_UDP: + face_type = FACE_TYPE_UDP_LISTENER; + break; + case CONNECTION_TYPE_HICN: + face_type = FACE_TYPE_HICN_LISTENER; + break; + default: + face_type = FACE_TYPE_UNDEFINED; + } + return face_type; } |