diff options
author | Neale Ranns <nranns@cisco.com> | 2019-10-14 08:52:43 -0700 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2019-10-15 11:17:36 +0000 |
commit | 66b1689cfa1cd53d1c24fa68cffef6d507b866f9 (patch) | |
tree | a63113750ab6677d96170a3fb02a843dfcae1dd9 | |
parent | 61b8ba69f7a9540ed00576504528ce439f0286f5 (diff) |
fib: recursive calculation leads to delegate pool realloc
Type: fix
Change-Id: Ib7ac53d1b59b641ccd3b1d733107d7f1ba174314
Signed-off-by: Neale Ranns <nranns@cisco.com>
(cherry picked from commit a66020becd7d01eefea55244cbcf5df9679a9443)
-rw-r--r-- | src/vnet/fib/fib_entry.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/vnet/fib/fib_entry.c b/src/vnet/fib/fib_entry.c index edbfdf6e3a4..21e8f087fd2 100644 --- a/src/vnet/fib/fib_entry.c +++ b/src/vnet/fib/fib_entry.c @@ -469,9 +469,12 @@ fib_entry_contribute_forwarding (fib_node_index_t fib_entry_index, if (NULL == fed) { - fed = fib_entry_delegate_find_or_add( - fib_entry, - fib_entry_chain_type_to_delegate_type(fct)); + /* + * use a temporary DPO lest the delegate realloc in the recursive + * calculation. + */ + dpo_id_t tmp = DPO_INVALID; + /* * on-demand create eos/non-eos. * There is no on-demand delete because: @@ -482,7 +485,14 @@ fib_entry_contribute_forwarding (fib_node_index_t fib_entry_index, fib_entry_src_mk_lb(fib_entry, fib_entry_get_best_src_i(fib_entry), fct, - &fed->fd_dpo); + &tmp); + + fed = fib_entry_delegate_find_or_add( + fib_entry, + fib_entry_chain_type_to_delegate_type(fct)); + + dpo_copy(&fed->fd_dpo, &tmp); + dpo_reset(&tmp); } dpo_copy(dpo, &fed->fd_dpo); |