X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Ffib_attached_export.c;h=c6ba0575a04b11787c9ad7d8b6db1ae25f80dc55;hb=8340b249974f1787f5930b8a50da5c32ec7a3fc2;hp=715e63e72460d51c5377c219e609af22403248e6;hpb=08a70f177d340a40c2f3653124f0807fe1e69ebd;p=vpp.git diff --git a/src/vnet/fib/fib_attached_export.c b/src/vnet/fib/fib_attached_export.c index 715e63e7246..c6ba0575a04 100644 --- a/src/vnet/fib/fib_attached_export.c +++ b/src/vnet/fib/fib_attached_export.c @@ -20,6 +20,7 @@ #include #include #include +#include /** * A description of the need to import routes from the export table @@ -27,7 +28,7 @@ typedef struct fib_ae_import_t_ { /** - * The entry in the epxort table that this importer + * The entry in the export table that this importer * is importing covereds from */ fib_node_index_t faei_export_entry; @@ -85,7 +86,7 @@ typedef struct fib_ae_export_t_ { } fib_ae_export_t; /* - * memory pools for the importers and exportes + * memory pools for the importers and exporters */ static fib_ae_import_t *fib_ae_import_pool; static fib_ae_export_t *fib_ae_export_pool; @@ -98,15 +99,14 @@ fib_entry_ae_add_or_lock (fib_node_index_t connected) fib_entry_t *entry; entry = fib_entry_get(connected); - fed = fib_entry_delegate_get(entry, - FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); + fed = fib_entry_delegate_find(entry, + FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); if (NULL == fed) { fed = fib_entry_delegate_find_or_add(entry, FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); - pool_get(fib_ae_export_pool, export); - memset(export, 0, sizeof(*export)); + pool_get_zero(fib_ae_export_pool, export); fed->fd_index = (export - fib_ae_export_pool); export->faee_ei = connected; @@ -125,7 +125,6 @@ static void fib_entry_import_remove (fib_ae_import_t *import, fib_node_index_t entry_index) { - fib_prefix_t prefix; u32 index; /* @@ -136,12 +135,10 @@ fib_entry_import_remove (fib_ae_import_t *import, if (index < vec_len(import->faei_importeds)) { /* - * this is an entry that was previsouly imported + * this is an entry that was previously imported */ - fib_entry_get_prefix(entry_index, &prefix); - fib_table_entry_special_remove(import->faei_import_fib, - &prefix, + fib_entry_get_prefix(entry_index), FIB_SOURCE_AE); fib_entry_unlock(entry_index); @@ -170,21 +167,21 @@ fib_entry_import_add (fib_ae_import_t *import, /* * this is the first time this export entry has been imported - * Add it to the import FIB and to the list of importeds + * Add it to the import FIB and to the list of importeds. + * make a copy of the prefix in case the underlying entry reallocs. */ - fib_entry_get_prefix(entry_index, &prefix); + fib_prefix_copy(&prefix, fib_entry_get_prefix(entry_index)); /* * don't import entries that have the same prefix the import entry */ - if (0 != fib_prefix_cmp(&prefix, - &import->faei_prefix)) + if (0 != fib_prefix_cmp(&prefix, &import->faei_prefix)) { const dpo_id_t *dpo; dpo = fib_entry_contribute_ip_forwarding(entry_index); - if (dpo_id_is_valid(dpo)) + if (dpo_id_is_valid(dpo) && !dpo_is_drop(dpo)) { fib_table_entry_special_dpo_add(import->faei_import_fib, &prefix, @@ -207,7 +204,7 @@ fib_entry_import_add (fib_ae_import_t *import, /** * Call back when walking a connected prefix's covered prefixes for import */ -static int +static walk_rc_t fib_entry_covered_walk_import (fib_entry_t *cover, fib_node_index_t covered, void *ctx) @@ -216,7 +213,7 @@ fib_entry_covered_walk_import (fib_entry_t *cover, fib_entry_import_add(import, covered); - return (0); + return (WALK_CONTINUE); } /* @@ -247,17 +244,18 @@ fib_attached_export_import (fib_entry_t *fib_entry, fib_node_index_t fei; /* - * save index for later post-realloc retreival + * save index for later post-realloc retrieval */ fei = fib_entry_get_index(fib_entry); - pool_get(fib_ae_import_pool, import); + pool_get_zero(fib_ae_import_pool, import); import->faei_import_fib = fib_entry->fe_fib_index; import->faei_export_fib = export_fib; import->faei_prefix = fib_entry->fe_prefix; import->faei_import_entry = fib_entry_get_index(fib_entry); import->faei_export_sibling = ~0; + import->faei_exporter = FIB_NODE_INDEX_INVALID; /* * do an exact match in the export table @@ -275,7 +273,6 @@ fib_attached_export_import (fib_entry_t *fib_entry, import->faei_export_entry = fib_table_lookup(import->faei_export_fib, &import->faei_prefix); - import->faei_exporter = FIB_NODE_INDEX_INVALID; } else { @@ -312,15 +309,15 @@ fib_attached_export_import (fib_entry_t *fib_entry, } /** - * \brief All the imported entries need to be pruged + * \brief All the imported entries need to be purged */ void fib_attached_export_purge (fib_entry_t *fib_entry) { fib_entry_delegate_t *fed; - fed = fib_entry_delegate_get(fib_entry, - FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); + fed = fib_entry_delegate_find(fib_entry, + FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); if (NULL != fed) { @@ -336,12 +333,8 @@ fib_attached_export_purge (fib_entry_t *fib_entry) */ vec_foreach(import_index, import->faei_importeds) { - fib_prefix_t prefix; - - fib_entry_get_prefix(*import_index, &prefix); - fib_table_entry_delete(import->faei_import_fib, - &prefix, + fib_entry_get_prefix(*import_index), FIB_SOURCE_AE); fib_entry_unlock(*import_index); } @@ -368,9 +361,9 @@ fib_attached_export_purge (fib_entry_t *fib_entry) export_entry = fib_entry_get(import->faei_export_entry); - fed = fib_entry_delegate_get(export_entry, - FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); - ASSERT(NULL != fed); + fed = fib_entry_delegate_find(export_entry, + FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); + ALWAYS_ASSERT(NULL != fed); export = pool_elt_at_index(fib_ae_export_pool, fed->fd_index); @@ -385,6 +378,7 @@ fib_attached_export_purge (fib_entry_t *fib_entry) */ if (0 == --export->faee_locks) { + vec_free (export->faee_importers); pool_put(fib_ae_export_pool, export); fib_entry_delegate_remove(export_entry, FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); @@ -397,7 +391,7 @@ fib_attached_export_purge (fib_entry_t *fib_entry) pool_put(fib_ae_import_pool, import); fib_entry_delegate_remove(fib_entry, FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); - } + } } void @@ -406,8 +400,8 @@ fib_attached_export_covered_added (fib_entry_t *cover, { fib_entry_delegate_t *fed; - fed = fib_entry_delegate_get(cover, - FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); + fed = fib_entry_delegate_find(cover, + FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); if (NULL != fed) { @@ -438,8 +432,8 @@ fib_attached_export_covered_removed (fib_entry_t *cover, { fib_entry_delegate_t *fed; - fed = fib_entry_delegate_get(cover, - FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); + fed = fib_entry_delegate_find(cover, + FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); if (NULL != fed) { @@ -469,8 +463,8 @@ fib_attached_export_cover_modified_i (fib_entry_t *fib_entry) { fib_entry_delegate_t *fed; - fed = fib_entry_delegate_get(fib_entry, - FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); + fed = fib_entry_delegate_find(fib_entry, + FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); if (NULL != fed) { @@ -514,67 +508,52 @@ fib_attached_export_cover_update (fib_entry_t *fib_entry) } u8* -fib_ae_import_format (fib_entry_t *fib_entry, +fib_ae_import_format (fib_node_index_t impi, u8* s) { - fib_entry_delegate_t *fed; + fib_node_index_t *index; + fib_ae_import_t *import; - fed = fib_entry_delegate_get(fib_entry, - FIB_ENTRY_DELEGATE_ATTACHED_IMPORT); + import = pool_elt_at_index(fib_ae_import_pool, impi); - if (NULL != fed) - { - fib_node_index_t *index; - fib_ae_import_t *import; - - import = pool_elt_at_index(fib_ae_import_pool, fed->fd_index); + s = format(s, "\n Attached-Import:%d:[", (import - fib_ae_import_pool)); + s = format(s, "export-prefix:%U ", format_fib_prefix, &import->faei_prefix); + s = format(s, "export-entry:%d ", import->faei_export_entry); + s = format(s, "export-sibling:%d ", import->faei_export_sibling); + s = format(s, "exporter:%d ", import->faei_exporter); + s = format(s, "export-fib:%d ", import->faei_export_fib); - s = format(s, "\n Attached-Import:%d:[", (import - fib_ae_import_pool)); - s = format(s, "export-prefix:%U ", format_fib_prefix, &import->faei_prefix); - s = format(s, "export-entry:%d ", import->faei_export_entry); - s = format(s, "export-sibling:%d ", import->faei_export_sibling); - s = format(s, "exporter:%d ", import->faei_exporter); - s = format(s, "export-fib:%d ", import->faei_export_fib); + s = format(s, "import-entry:%d ", import->faei_import_entry); + s = format(s, "import-fib:%d ", import->faei_import_fib); - s = format(s, "import-entry:%d ", import->faei_import_entry); - s = format(s, "import-fib:%d ", import->faei_import_fib); - - s = format(s, "importeds:["); - vec_foreach(index, import->faei_importeds) - { - s = format(s, "%d, ", *index); - } - s = format(s, "]]"); + s = format(s, "importeds:["); + vec_foreach(index, import->faei_importeds) + { + s = format(s, "%d, ", *index); } + s = format(s, "]]"); return (s); } u8* -fib_ae_export_format (fib_entry_t *fib_entry, +fib_ae_export_format (fib_node_index_t expi, u8* s) { - fib_entry_delegate_t *fed; - - fed = fib_entry_delegate_get(fib_entry, - FIB_ENTRY_DELEGATE_ATTACHED_EXPORT); + fib_node_index_t *index; + fib_ae_export_t *export; - if (NULL != fed) - { - fib_node_index_t *index; - fib_ae_export_t *export; + export = pool_elt_at_index(fib_ae_export_pool, expi); - export = pool_elt_at_index(fib_ae_export_pool, fed->fd_list); - - s = format(s, "\n Attached-Export:%d:[", (export - fib_ae_export_pool)); - s = format(s, "export-entry:%d ", export->faee_ei); + s = format(s, "\n Attached-Export:%d:[", (export - fib_ae_export_pool)); + s = format(s, "export-entry:%d ", export->faee_ei); - s = format(s, "importers:["); - vec_foreach(index, export->faee_importers) - { - s = format(s, "%d, ", *index); - } - s = format(s, "]]"); + s = format(s, "importers:["); + vec_foreach(index, export->faee_importers) + { + s = format(s, "%d, ", *index); } + s = format(s, "]]"); + return (s); }