summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2019-04-18 09:42:20 +0000
committerDamjan Marion <dmarion@me.com>2019-04-18 13:58:34 +0000
commite57ae7a0f901e64e6e37db0932816785d03fea7c (patch)
tree542d59cee44ef6aed173799d234d43e10e97f9ee /src/vnet/fib
parent9ae8c8e23d41aed2cf0b14061130cb58cdec2c74 (diff)
FIB: recursion casues path realloc
Change-Id: Ie9c2954eee90ca1a1fc1aa8280f93b2340b544c1 Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/fib')
-rw-r--r--src/vnet/fib/fib_path.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/vnet/fib/fib_path.c b/src/vnet/fib/fib_path.c
index 55013a992e3..67a4bc1d4de 100644
--- a/src/vnet/fib/fib_path.c
+++ b/src/vnet/fib/fib_path.c
@@ -1883,6 +1883,9 @@ fib_path_resolve (fib_node_index_t path_index)
fib_path_attached_next_hop_set(path);
break;
case FIB_PATH_TYPE_ATTACHED:
+ {
+ dpo_id_t tmp = DPO_INVALID;
+
/*
* path->attached.fp_interface
*/
@@ -1891,20 +1894,28 @@ fib_path_resolve (fib_node_index_t path_index)
{
path->fp_oper_flags &= ~FIB_PATH_OPER_FLAG_RESOLVED;
}
- dpo_set(&path->fp_dpo,
+ dpo_set(&tmp,
DPO_ADJACENCY,
path->fp_nh_proto,
fib_path_attached_get_adj(path,
dpo_proto_to_link(path->fp_nh_proto)));
/*
+ * re-fetch after possible mem realloc
+ */
+ path = fib_path_get(path_index);
+ dpo_copy(&path->fp_dpo, &tmp);
+
+ /*
* become a child of the adjacency so we receive updates
* when the interface state changes
*/
path->fp_sibling = adj_child_add(path->fp_dpo.dpoi_index,
FIB_NODE_TYPE_PATH,
fib_path_get_index(path));
+ dpo_reset(&tmp);
break;
+ }
case FIB_PATH_TYPE_RECURSIVE:
{
/*