aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/mapme.h
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/mapme.h')
-rw-r--r--hicn-plugin/src/mapme.h98
1 files changed, 77 insertions, 21 deletions
diff --git a/hicn-plugin/src/mapme.h b/hicn-plugin/src/mapme.h
index 1d46ea9f3..c5567d1d4 100644
--- a/hicn-plugin/src/mapme.h
+++ b/hicn-plugin/src/mapme.h
@@ -61,10 +61,13 @@ typedef struct hicn_mapme_conf_s
{
hicn_mapme_conf_t conf;
bool remove_dpo; // FIXME used ?
+ fib_prefix_t default_route;
vlib_main_t *vm;
} hicn_mapme_main_t;
+extern hicn_mapme_main_t *hicn_mapme_get_main ();
+
/**
* @brief List of event to signat to the procesing node (eventmgr)
*/
@@ -87,6 +90,21 @@ typedef enum
typedef hicn_dpo_ctx_t hicn_mapme_tfib_t;
+/**
+ * FIB Lookup Type
+ */
+#define foreach_hicn_mapme_fib_lookup_type \
+ _ (EPM) \
+ _ (LPM) \
+ _ (LESSPM)
+
+typedef enum
+{
+#define _(a) HICN_MAPME_FIB_LOOKUP_TYPE_##a,
+ foreach_hicn_mapme_fib_lookup_type
+#undef _
+} hicn_mapme_fib_lookup_type_t;
+
/*
* Ideally we might need to care about alignment, but this struct is only
* used for casting hicn_dpo_ctx_t.
@@ -123,7 +141,17 @@ hicn_mapme_tfib_add (hicn_mapme_tfib_t *tfib, hicn_face_id_t face_id)
// Don't add if it already exists
// (eg. an old IU received on a face on which we are retransmitting)
if (hicn_mapme_tfib_has (tfib, face_id))
- return 0;
+ {
+ HICN_DEBUG ("Found face %d in tfib.");
+ return 0;
+ }
+
+ // If local face, do not put in in tfib
+ if (hicn_face_is_local (face_id))
+ {
+ HICN_DEBUG ("Do not add local face %d to TFIB.", face_id);
+ return 0;
+ }
u8 pos = HICN_PARAM_FIB_ENTRY_NHOPS_MAX - tfib->tfib_entry_count;
@@ -174,9 +202,12 @@ hicn_mapme_tfib_del (hicn_mapme_tfib_t *tfib, hicn_face_id_t face_id)
*/
u8 start_pos = HICN_PARAM_FIB_ENTRY_NHOPS_MAX - tfib->tfib_entry_count;
u8 pos = ~0;
+
for (pos = start_pos; pos < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; pos++)
if (tfib->next_hops[pos] == face_id)
{
+ HICN_DEBUG ("Deleted the face_id=%d from TFIB as we received an ack.",
+ face_id);
hicn_face_unlock_with_id (tfib->next_hops[pos]);
tfib->next_hops[pos] = invalid;
break;
@@ -196,30 +227,15 @@ hicn_mapme_tfib_del (hicn_mapme_tfib_t *tfib, hicn_face_id_t face_id)
}
/**
- * @brief Performs an Exact Prefix Match lookup on the FIB
+ * @brief Retrive DPO from fib entry
* @returns the corresponding DPO (hICN or IP LB), or NULL
*/
static_always_inline dpo_id_t *
-fib_epm_lookup (ip46_address_t *addr, u8 plen)
+dpo_from_fib_node_index (fib_node_index_t fib_entry_index)
{
- fib_prefix_t fib_pfx;
- fib_node_index_t fib_entry_index;
- u32 fib_index;
- dpo_id_t *dpo_id;
- load_balance_t *lb;
-
- const dpo_id_t *load_balance_dpo_id;
-
- /* At this point the face exists in the face table */
- fib_prefix_from_ip46_addr (addr, &fib_pfx);
- fib_pfx.fp_len = plen;
-
- /* Check if the route already exist in the fib : EPM */
- fib_index = fib_table_find (fib_pfx.fp_proto, HICN_FIB_TABLE);
-
- fib_entry_index = fib_table_lookup_exact_match (fib_index, &fib_pfx);
- if (fib_entry_index == FIB_NODE_INDEX_INVALID)
- return NULL;
+ const dpo_id_t *load_balance_dpo_id = NULL;
+ load_balance_t *lb = NULL;
+ dpo_id_t *dpo_id = NULL;
load_balance_dpo_id = fib_entry_contribute_ip_forwarding (fib_entry_index);
@@ -251,6 +267,46 @@ fib_epm_lookup (ip46_address_t *addr, u8 plen)
return (dpo_id_t *) load_balance_dpo_id;
}
+/**
+ * @brief Performs an Exact Prefix Match lookup on the FIB
+ * @returns the corresponding DPO (hICN or IP LB), or NULL
+ */
+static_always_inline dpo_id_t *
+fib_lookup (ip46_address_t *addr, u8 plen,
+ hicn_mapme_fib_lookup_type_t lookup_type)
+{
+ fib_prefix_t fib_pfx;
+ fib_node_index_t fib_entry_index;
+ u32 fib_index;
+
+ /* At this point the face exists in the face table */
+ fib_prefix_from_ip46_addr (addr, &fib_pfx);
+ fib_pfx.fp_len = plen;
+
+ /* Check if the route already exist in the fib : EPM */
+ fib_index = fib_table_find (fib_pfx.fp_proto, HICN_FIB_TABLE);
+
+ switch (lookup_type)
+ {
+ case HICN_MAPME_FIB_LOOKUP_TYPE_EPM:
+ fib_entry_index = fib_table_lookup_exact_match (fib_index, &fib_pfx);
+ break;
+ case HICN_MAPME_FIB_LOOKUP_TYPE_LPM:
+ fib_entry_index = fib_table_lookup (fib_index, &fib_pfx);
+ break;
+ case HICN_MAPME_FIB_LOOKUP_TYPE_LESSPM:
+ fib_entry_index = fib_table_get_less_specific (fib_index, &fib_pfx);
+ break;
+ default:
+ return NULL;
+ }
+
+ if (fib_entry_index == FIB_NODE_INDEX_INVALID)
+ return NULL;
+
+ return dpo_from_fib_node_index (fib_entry_index);
+}
+
/* DPO types */
extern dpo_type_t hicn_face_udp_type;