diff options
Diffstat (limited to 'hicn-light/src/hicn/core/fib.c')
-rw-r--r-- | hicn-light/src/hicn/core/fib.c | 126 |
1 files changed, 50 insertions, 76 deletions
diff --git a/hicn-light/src/hicn/core/fib.c b/hicn-light/src/hicn/core/fib.c index 66e6ae339..b3b5d4036 100644 --- a/hicn-light/src/hicn/core/fib.c +++ b/hicn-light/src/hicn/core/fib.c @@ -124,11 +124,13 @@ fib_node_t *fib_search(const fib_t *fib, const hicn_prefix_t *prefix, uint32_t curr_len; uint32_t match_len; - char buf[MAXSZ_HICN_PREFIX]; - int rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO("FIB SEARCH: %s prefix len %d", buf, prefix_len); + WITH_DEBUG({ + char buf[MAXSZ_HICN_PREFIX]; + int rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix); + if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) + snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); + DEBUG("[fib_search] prefix=%s prefix_len=%d\n", buf, prefix_len); + }); fib_node_t *parent = NULL; fib_node_t *gparent = NULL; @@ -136,23 +138,13 @@ fib_node_t *fib_search(const fib_t *fib, const hicn_prefix_t *prefix, while (curr) { const hicn_prefix_t *curr_prefix = fib_entry_get_prefix(curr->entry); - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, curr_prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO(" >> current %s", buf); - curr_len = hicn_prefix_get_len(curr_prefix); match_len = hicn_prefix_lpm(prefix, curr_prefix); - INFO("curr len %d match len %d", curr_len, match_len); - - // XXX >= vs == for the second stop condition // curr_len >= prefix_len l >= L // L is a prefix of l // > means we did not find // = means we could have found - // leverage this info for contains! - // XXX remove this comment when done if (match_len < curr_len || curr_len >= prefix_len) break; gparent = parent; @@ -191,30 +183,14 @@ fib_node_t *_fib_insert(fib_t *fib, fib_entry_t *entry, fib_node_t *parent, const hicn_prefix_t *parent_prefix = fib_entry_get_prefix(parent->entry); uint32_t parent_prefix_len = hicn_prefix_get_len(parent_prefix); uint8_t next_bit = hicn_prefix_get_bit(prefix, parent_prefix_len); - INFO("parent prefix len %d next bit %d", parent_prefix_len, next_bit); parent->child[next_bit] = new_node; } if (child) { - char buf[MAXSZ_HICN_PREFIX]; - int rc; - const hicn_prefix_t *child_prefix = fib_entry_get_prefix(child->entry); - INFO("prefix lengths %d==127 %d==128", hicn_prefix_get_len(prefix), - hicn_prefix_get_len(child_prefix)); - INFO("LPM BETWEEN"); - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO("prefix %s", buf); - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, child_prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO("child prefix %s", buf); uint32_t match_len = hicn_prefix_lpm(prefix, child_prefix); uint8_t next_bit = hicn_prefix_get_bit(child_prefix, match_len); new_node->child[next_bit] = child; - INFO("child match len %d next bit %d", match_len, next_bit); } if (is_used) fib->size++; @@ -319,16 +295,34 @@ void fib_add(fib_t *fib, fib_entry_t *entry) { fib_search_t search; fib_node_t *curr = fib_search(fib, prefix, &search); + char buf[MAXSZ_HICN_PREFIX]; + char buf2[MAXSZ_HICN_PREFIX]; + int rc; + + rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix); + if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) + snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); + if (curr) { + rc = hicn_prefix_snprintf(buf2, MAXSZ_HICN_PREFIX, + fib_entry_get_prefix(curr->entry)); + if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) + snprintf(buf2, MAXSZ_HICN_PREFIX, "%s", "(error)"); + } else { + snprintf(buf2, MAXSZ_HICN_PREFIX, "%s", "(null)"); + search.prefix_len = 0; + search.match_len = 0; + } + DEBUG("fib_search(%s) result: curr=%s, prefix_len=%d; match_len=%d\n", buf, + buf2, search.prefix_len, search.match_len); + /* Case 1 */ if (!curr) { - INFO("Case 1"); _fib_insert(fib, entry, search.parent, NULL, true); goto END; } /* Case 2 */ if (search.prefix_len == search.match_len && prefix_len == search.match_len) { - INFO("Case 2"); if (!curr->is_used) { curr->is_used = true; if (curr->entry) fib_entry_free(curr->entry); @@ -345,51 +339,28 @@ void fib_add(fib_t *fib, fib_entry_t *entry) { /* Case 3 */ if (prefix_len == search.match_len) { - INFO("Case 3"); _fib_insert(fib, entry, search.parent, curr, true); goto END; } /* Case 4 */ - char buf[MAXSZ_HICN_PREFIX]; - int rc; - - INFO("Case 4 : match len = %d", search.match_len); hicn_prefix_t inner_prefix; /* dup'ed in fib_entry_create */ hicn_prefix_copy(&inner_prefix, prefix); - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, &inner_prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO("inner prefix before truncate %s", buf); - INFO("last bit should be 1: %d", hicn_prefix_get_bit(&inner_prefix, 127)); - - INFO("truncate to length = %d", search.match_len); hicn_prefix_truncate(&inner_prefix, search.match_len); - INFO("last bit should be 0: %d", hicn_prefix_get_bit(&inner_prefix, 127)); - - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, &inner_prefix); - if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - INFO("inner prefix after truncate %s", buf); fib_entry_t *inner_entry = fib_entry_create( &inner_prefix, STRATEGY_TYPE_UNDEFINED, NULL, fib->forwarder); - INFO("inner prefix len=%d", hicn_prefix_get_len(&inner_prefix)); - // debug - const hicn_prefix_t *parent_prefix = fib_entry_get_prefix(inner_entry); - INFO("inner prefix len=%d", hicn_prefix_get_len(parent_prefix)); - - INFO("insert inner"); fib_node_t *new_node = _fib_insert(fib, inner_entry, search.parent, curr, false); - INFO("insert new node"); - fib_dump(fib); _fib_insert(fib, entry, new_node, NULL, true); END: +#if 0 fib_dump(fib); +#endif + ; /* required for clang */ } /* @@ -695,18 +666,16 @@ bool __fib_check_preorder(const fib_node_t *node, if (!hicn_prefix_equals(prefix, prefix_array[*pos])) { char buf[MAXSZ_HICN_PREFIX]; + char buf2[MAXSZ_HICN_PREFIX]; int rc; - ERROR("Prefix mismatch in position %d %s != %s", pos); rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix); if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - ERROR("Expected: %s", buf); - - rc = hicn_prefix_snprintf(buf, MAXSZ_HICN_PREFIX, prefix_array[*pos]); + rc = hicn_prefix_snprintf(buf2, MAXSZ_HICN_PREFIX, prefix_array[*pos]); if (rc < 0 || rc >= MAXSZ_HICN_PREFIX) - snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(error)"); - ERROR("Expected: %s", buf); + snprintf(buf2, MAXSZ_HICN_PREFIX, "%s", "(error)"); + ERROR("Prefix mismatch in position %ld %s != %s", *pos, buf, buf2); return false; } @@ -736,7 +705,7 @@ bool _fib_check_preorder(const fib_t *fib, const hicn_prefix_t **prefix_array, } // XXX print empty node but not recurse -void _fib_dump(const fib_node_t *node, int start, int indent) { +void _fib_dump(const fib_node_t *node, int start, int indent, int location) { char buf[MAXSZ_HICN_PREFIX]; if (node) { @@ -748,20 +717,25 @@ void _fib_dump(const fib_node_t *node, int start, int indent) { snprintf(buf, MAXSZ_HICN_PREFIX, "%s", "(null)"); } - // Left if (indent > 0) { - for (int i = 0; i < start - 1; i++) printf(" "); - for (int i = start + 1; i < indent; i++) printf("| "); - printf("|"); - printf("_ %s\n", buf); - } else { - printf("%s\n", buf); + for (int i = 0; i < start; i++) printf(" "); + for (int i = 0; i < indent - start - 1; i++) printf("| "); + printf("|_ "); } + printf("%s", buf); + if (node && !node->is_used) printf(" [inner]"); + printf("\n"); if (!node) return; - _fib_dump(node->child[ZERO], start, indent + 1); - _fib_dump(node->child[ONE], start + 1, indent + 1); + if (location == 2) { + start++; + location = 0; + } + _fib_dump(node->child[ZERO], start, indent + 1, + (location == 0) ? 1 : location); + _fib_dump(node->child[ONE], start, indent + 1, + (location == 0) ? 2 : location); } -void fib_dump(const fib_t *fib) { _fib_dump(fib->root, 0, 0); } +void fib_dump(const fib_t *fib) { _fib_dump(fib->root, 0, 0, 0); } |