aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/mapme_eventmgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/mapme_eventmgr.c')
-rw-r--r--hicn-plugin/src/mapme_eventmgr.c109
1 files changed, 67 insertions, 42 deletions
diff --git a/hicn-plugin/src/mapme_eventmgr.c b/hicn-plugin/src/mapme_eventmgr.c
index 49a9b5c57..bb654edf8 100644
--- a/hicn-plugin/src/mapme_eventmgr.c
+++ b/hicn-plugin/src/mapme_eventmgr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2021 Cisco and/or its affiliates.
+ * Copyright (c) 2021-2022 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:
@@ -22,8 +22,15 @@
#include <vnet/fib/ip4_fib.h>
#include <vnet/fib/ip6_fib.h>
+#include <hicn/mapme.h>
+
#define DEFAULT_TIMEOUT 1.0 /* s */
+/**
+ * @brief This is a process node reacting to face events.
+ */
+vlib_node_registration_t hicn_mapme_eventmgr_process_node;
+
hicn_mapme_main_t mapme_main;
hicn_prefix_t *retx_pool;
@@ -33,7 +40,14 @@ void
hicn_mapme_init (vlib_main_t *vm)
{
mapme_main.vm = vm;
- mapme_main.log_class = vlib_log_register_class ("hicn_mapme", 0);
+ clib_memset_u8 (&mapme_main.default_route, 0,
+ sizeof (mapme_main.default_route));
+}
+
+hicn_mapme_main_t *
+hicn_mapme_get_main ()
+{
+ return &mapme_main;
}
/* borrowed from vnet/fib/ip4_fib.c */
@@ -77,7 +91,6 @@ hicn_mapme_process_fib_entry (vlib_main_t *vm, hicn_face_id_t face,
const dpo_id_t *load_balance_dpo_id;
load_balance_t *lb;
dpo_id_t *dpo_id;
- fib_entry_t *fib_entry;
load_balance_dpo_id = fib_entry_contribute_ip_forwarding (*fib_entry_index);
@@ -92,12 +105,14 @@ hicn_mapme_process_fib_entry (vlib_main_t *vm, hicn_face_id_t face,
{
/* un-const */
dpo_id = (dpo_id_t *) load_balance_get_bucket_i (lb, i);
-
if (dpo_is_hicn (dpo_id))
{
+#ifdef HICN_DDEBUG
+ fib_entry_t *fib_entry;
fib_entry = fib_entry_get (*fib_entry_index);
- vlib_cli_output (vm, "set face pending %U", format_fib_prefix,
- &fib_entry->fe_prefix);
+ HICN_DEBUG ("set face pending %U", format_fib_prefix,
+ &fib_entry->fe_prefix);
+#endif
}
}
}
@@ -107,16 +122,10 @@ hicn_mapme_process_ip4_fib (vlib_main_t *vm, hicn_face_id_t face)
{
ip4_main_t *im4 = &ip4_main;
fib_table_t *fib_table;
- int table_id = -1, fib_index = ~0;
pool_foreach (fib_table, im4->fibs)
{
- ip4_fib_t *fib = pool_elt_at_index (im4->v4_fibs, fib_table->ft_index);
-
- if (table_id >= 0 && table_id != (int) fib->table_id)
- continue;
- if (fib_index != ~0 && fib_index != (int) fib->index)
- continue;
+ ip4_fib_t *fib = pool_elt_at_index (ip4_fibs, fib_table->ft_index);
fib_node_index_t *fib_entry_index;
ip4_fib_show_walk_ctx_t ctx = {
@@ -195,29 +204,38 @@ hicn_mapme_on_face_added (vlib_main_t *vm, hicn_face_id_t face)
#define CURLEN retx_len[cur]
#define NXTLEN retx_len[NEXT_SLOT (cur)]
-static_always_inline void *
-get_packet_buffer (vlib_main_t *vm, u32 node_index, u32 dpoi_index,
- ip46_address_t *addr, hicn_type_t type)
+static_always_inline bool
+create_mapme_packet_buffer (vlib_main_t *vm, u32 node_index, u32 dpoi_index,
+ const hicn_prefix_t *prefix,
+ const mapme_params_t *params)
{
vlib_frame_t *f;
vlib_buffer_t *b; // for newly created packet
u32 *to_next;
u32 bi;
u8 *buffer;
+ size_t n;
+ hicn_packet_format_t format;
if (vlib_buffer_alloc (vm, &bi, 1) != 1)
{
- clib_warning ("buffer allocation failure");
+ HICN_ERROR ("buffer allocation failure");
return NULL;
}
+ format = (params->protocol == IPPROTO_IPV6) ? HICN_PACKET_FORMAT_IPV6_ICMP :
+ HICN_PACKET_FORMAT_IPV4_ICMP;
+
/* Create a new packet from scratch */
b = vlib_get_buffer (vm, bi);
ASSERT (b->current_data == 0);
/* Face information for next hop node index */
vnet_buffer (b)->ip.adj_index[VLIB_TX] = dpoi_index;
- hicn_get_buffer (b)->type = type;
+
+ hicn_packet_buffer_t *pkbuf = &hicn_get_buffer (b)->pkbuf;
+ hicn_packet_set_format (pkbuf, format);
+ hicn_packet_init_header (pkbuf, 0);
/* Enqueue the packet right now */
f = vlib_get_frame_to_node (vm, node_index);
@@ -228,8 +246,21 @@ get_packet_buffer (vlib_main_t *vm, u32 node_index, u32 dpoi_index,
// pointer to IP layer ? do we need to prepare for ethernet ???
buffer = vlib_buffer_get_current (b);
- b->current_length =
- (type.l1 == IPPROTO_IPV6) ? HICN_MAPME_V6_HDRLEN : HICN_MAPME_V4_HDRLEN;
+ b->current_length = HICN_PACKET_FORMAT_IS_IPV6 (format) ?
+ EXPECTED_MAPME_V6_HDRLEN :
+ EXPECTED_MAPME_V4_HDRLEN;
+
+ n = hicn_mapme_create_packet (buffer, prefix, params);
+
+ if (n <= 0)
+ {
+ HICN_ERROR ("Could not create MAP-Me packet");
+ return false;
+ }
+
+ hicn_packet_set_buffer (pkbuf, vlib_buffer_get_current (b),
+ b->current_length, b->current_length);
+ hicn_packet_analyze (&hicn_get_buffer (b)->pkbuf);
return buffer;
}
@@ -238,11 +269,9 @@ static_always_inline bool
hicn_mapme_send_message (vlib_main_t *vm, const hicn_prefix_t *prefix,
mapme_params_t *params, hicn_face_id_t face)
{
- size_t n;
-
/* This should be retrieved from face information */
- DEBUG ("Retransmission for prefix %U seq=%d", format_ip46_address,
- &prefix->name, IP46_TYPE_ANY, params->seq);
+ HICN_DEBUG ("Retransmission for prefix %U/%d seq=%d", format_ip46_address,
+ &prefix->name, IP46_TYPE_ANY, prefix->len, params->seq);
char *node_name = hicn_mapme_get_dpo_face_node (face);
if (!node_name)
@@ -254,18 +283,7 @@ hicn_mapme_send_message (vlib_main_t *vm, const hicn_prefix_t *prefix,
vlib_node_t *node = vlib_get_node_by_name (vm, (u8 *) node_name);
u32 node_index = node->index;
- u8 *buffer = get_packet_buffer (
- vm, node_index, face, (ip46_address_t *) prefix,
- (params->protocol == IPPROTO_IPV6) ? HICN_TYPE_IPV6_ICMP :
- HICN_TYPE_IPV4_ICMP);
- n = hicn_mapme_create_packet (buffer, prefix, params);
- if (n <= 0)
- {
- clib_warning ("Could not create MAP-Me packet");
- return false;
- }
-
- return true;
+ return create_mapme_packet_buffer (vm, node_index, face, prefix, params);
}
static_always_inline void
@@ -275,7 +293,7 @@ hicn_mapme_send_updates (vlib_main_t *vm, hicn_prefix_t *prefix, dpo_id_t dpo,
hicn_mapme_tfib_t *tfib = TFIB (hicn_strategy_dpo_ctx_get (dpo.dpoi_index));
if (!tfib)
{
- DEBUG ("NULL TFIB entry id=%d", dpo.dpoi_index);
+ HICN_DEBUG ("NULL TFIB entry id=%d", dpo.dpoi_index);
return;
}
@@ -283,14 +301,15 @@ hicn_mapme_send_updates (vlib_main_t *vm, hicn_prefix_t *prefix, dpo_id_t dpo,
mapme_params_t params = {
.protocol =
- ip46_address_is_ip4 (&prefix->name) ? IPPROTO_IP : IPPROTO_IPV6,
+ ip46_address_is_ip4 (&prefix->name.as_ip46) ? IPPROTO_IP : IPPROTO_IPV6,
.type = UPDATE,
.seq = tfib->seq,
};
if (send_all)
{
- for (u8 pos = tfib_last_idx; pos < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; pos++)
+ u8 pos;
+ for (pos = tfib_last_idx; pos < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; pos++)
{
hicn_mapme_send_message (vm, prefix, &params, tfib->next_hops[pos]);
}
@@ -337,7 +356,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
* Also, we only run a timer when there are pending retransmissions.
*/
timeout = (due_time > current_time) ? due_time - current_time :
- DEFAULT_TIMEOUT;
+ DEFAULT_TIMEOUT;
due_time = current_time + timeout;
}
else
@@ -359,6 +378,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
* - For another local face type, we need to advertise local
* prefixes and schedule retransmissions
*/
+ HICN_DEBUG ("Mapme Event: HICN_MAPME_EVENT_FACE_ADD");
retx_t *retx_events = event_data;
for (u8 i = 0; i < vec_len (retx_events); i++)
{
@@ -374,6 +394,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
case HICN_MAPME_EVENT_FACE_NH_SET:
{
+ HICN_DEBUG ("Mapme Event: HICN_MAPME_EVENT_FACE_NH_SET");
/*
* An hICN FIB entry has been modified. All operations so far
* have been procedded in the nodes. Here we need to track
@@ -410,6 +431,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
* Transmit IU for all TFIB entries with latest seqno (we have
* at least one for sure!)
*/
+ HICN_DEBUG ("Sending mapme message upon NH_SET event");
hicn_mapme_send_updates (vm, &retx->prefix, retx->dpo, true);
/* Delete entry_id from retransmissions in the current slot (if
@@ -433,6 +455,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
break;
case HICN_MAPME_EVENT_FACE_NH_ADD:
+ HICN_DEBUG ("Mapme Event: HICN_MAPME_EVENT_FACE_NH_ADD");
/*
* As per the description of states, this event should add the face
* to the list of next hops, and eventually remove it from TFIB.
@@ -452,6 +475,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
break;
case HICN_MAPME_EVENT_FACE_PH_ADD:
+ HICN_DEBUG ("Mapme Event: HICN_MAPME_EVENT_FACE_PH_ADD");
/* Back-propagation, interesting even for IN (desync) */
{
retx_t *retx_events = event_data;
@@ -465,6 +489,7 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
break;
case HICN_MAPME_EVENT_FACE_PH_DEL:
+ HICN_DEBUG ("Mapme Event: HICN_MAPME_EVENT_FACE_PH_DEL");
/* Ack : remove an element from TFIB */
break;
@@ -493,8 +518,8 @@ hicn_mapme_eventmgr_process (vlib_main_t *vm, vlib_node_runtime_t *rt,
TFIB (hicn_strategy_dpo_ctx_get (retx->dpo.dpoi_index));
if (!tfib)
{
- DEBUG ("NULL TFIB entry for dpoi_index=%d",
- retx->dpo.dpoi_index);
+ HICN_ERROR ("NULL TFIB entry for dpoi_index=%d",
+ retx->dpo.dpoi_index);
continue;
}