aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/config/configuration.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/config/configuration.c')
-rw-r--r--hicn-light/src/hicn/config/configuration.c205
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;
}