diff options
Diffstat (limited to 'vnet/vnet/fib/fib_walk.c')
-rw-r--r-- | vnet/vnet/fib/fib_walk.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/vnet/vnet/fib/fib_walk.c b/vnet/vnet/fib/fib_walk.c index 215d21dc273..e5f9b87f927 100644 --- a/vnet/vnet/fib/fib_walk.c +++ b/vnet/vnet/fib/fib_walk.c @@ -181,6 +181,7 @@ static u32 history_last_walk_pos; typedef struct fib_walk_history_t_ { u32 fwh_n_visits; f64 fwh_duration; + f64 fwh_completed; fib_node_ptr_t fwh_parent; fib_walk_flags_t fwh_flags; fib_node_bw_reason_flag_t fwh_reason; @@ -266,8 +267,11 @@ fib_walk_destroy (fib_walk_t *fwalk) fib_walk_history[history_last_walk_pos].fwh_n_visits = fwalk->fw_n_visits; + fib_walk_history[history_last_walk_pos].fwh_completed = + vlib_time_now(vlib_get_main()); fib_walk_history[history_last_walk_pos].fwh_duration = - vlib_time_now(vlib_get_main()) - fwalk->fw_start_time; + fib_walk_history[history_last_walk_pos].fwh_completed - + fwalk->fw_start_time; fib_walk_history[history_last_walk_pos].fwh_parent = fwalk->fw_parent; fib_walk_history[history_last_walk_pos].fwh_flags = @@ -615,6 +619,14 @@ fib_walk_async (fib_node_type_t parent_type, */ return; } + if (0 == fib_node_child_get_n_children(parent_type, + parent_index)) + { + /* + * no children to walk - quit now + */ + return; + } if (ctx->fnbw_flags & FIB_NODE_BW_FLAG_FORCE_SYNC) { /* @@ -662,6 +674,14 @@ fib_walk_sync (fib_node_type_t parent_type, */ return; } + if (0 == fib_node_child_get_n_children(parent_type, + parent_index)) + { + /* + * no children to walk - quit now + */ + return; + } fwalk = fib_walk_alloc(parent_type, parent_index, @@ -959,16 +979,17 @@ fib_walk_show (vlib_main_t * vm, while (ii != history_last_walk_pos) { - if (0 != fib_walk_history[ii].fwh_n_visits) + if (0 != fib_walk_history[ii].fwh_reason) { fib_node_back_walk_reason_t reason; u8 *s = NULL; - s = format(s, " %s:%d visits:%d duration:%.2f ", - fib_node_type_get_name(fib_walk_history[ii].fwh_parent.fnp_type), + s = format(s, "[@%d]: %s:%d visits:%d duration:%.2f completed:%.2f ", + ii, fib_node_type_get_name(fib_walk_history[ii].fwh_parent.fnp_type), fib_walk_history[ii].fwh_parent.fnp_index, fib_walk_history[ii].fwh_n_visits, - fib_walk_history[ii].fwh_duration); + fib_walk_history[ii].fwh_duration, + fib_walk_history[ii].fwh_completed); if (FIB_WALK_FLAG_SYNC & fib_walk_history[ii].fwh_flags) s = format(s, "sync, "); if (FIB_WALK_FLAG_ASYNC & fib_walk_history[ii].fwh_flags) |