summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/fib')
-rw-r--r--src/vnet/fib/fib_path_ext.c17
-rw-r--r--src/vnet/fib/fib_path_ext.h10
2 files changed, 19 insertions, 8 deletions
diff --git a/src/vnet/fib/fib_path_ext.c b/src/vnet/fib/fib_path_ext.c
index 45ab1f1498d..26f2b9b6d5d 100644
--- a/src/vnet/fib/fib_path_ext.c
+++ b/src/vnet/fib/fib_path_ext.c
@@ -105,7 +105,7 @@ fib_path_ext_resolve (fib_path_ext_t *path_ext,
path_ext);
}
-void
+static void
fib_path_ext_init (fib_path_ext_t *path_ext,
fib_node_index_t path_list_index,
fib_path_ext_type_t ext_type,
@@ -338,7 +338,18 @@ fib_path_ext_list_insert (fib_path_ext_list_t *list,
vec_foreach(path_ext, list->fpel_exts)
{
- if (fib_path_ext_cmp(path_ext, rpath) < 0)
+ int res = fib_path_ext_cmp(path_ext, rpath);
+
+ if (0 == res)
+ {
+ /*
+ * don't add duplicate extensions. modify instead
+ */
+ vec_free(path_ext->fpe_label_stack);
+ *path_ext = new_path_ext;
+ goto done;
+ }
+ else if (res < 0)
{
i++;
}
@@ -348,7 +359,7 @@ fib_path_ext_list_insert (fib_path_ext_list_t *list,
}
}
vec_insert_elts(list->fpel_exts, &new_path_ext, 1, i);
-
+done:
return (&(list->fpel_exts[i]));
}
diff --git a/src/vnet/fib/fib_path_ext.h b/src/vnet/fib/fib_path_ext.h
index d1571a1b4ee..d07941c108b 100644
--- a/src/vnet/fib/fib_path_ext.h
+++ b/src/vnet/fib/fib_path_ext.h
@@ -72,11 +72,6 @@ typedef enum fib_path_ext_adj_flags_t_
typedef struct fib_path_ext_t_
{
/**
- * The type of path extension
- */
- fib_path_ext_type_t fpe_type;
-
- /**
* A description of the path that is being extended.
* This description is used to match this extension with the [changing]
* instance of a fib_path_t that is extended
@@ -94,6 +89,11 @@ typedef struct fib_path_ext_t_
};
/**
+ * The type of path extension
+ */
+ fib_path_ext_type_t fpe_type;
+
+ /**
* The index of the path. This is the global index, not the path's
* position in the path-list.
*/