summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-05-26 02:59:16 -0700
committerDamjan Marion <dmarion.lists@gmail.com>2017-05-26 18:15:14 +0000
commitdcd6d6254a2b204a4283c889d1feac8f59a62639 (patch)
tree27ccbe218bef92ef0070f05518b76417150ba0a4 /src/vnet/fib
parented1e242866704d1f8654e44ed32c4b431d2d5795 (diff)
ARP/ND use path_remove to complement path_add
don't add duplicate extensions. Change-Id: Icf72d6e1b004d0dda532bec2b51f6b74544925bb Signed-off-by: Neale Ranns <nranns@cisco.com>
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.
*/