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