X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fpunt.c;h=04e3b5a39569aecd998ceef3f4ca5ea25459bea8;hb=a31698bb7401f6e2389c0e805bf280ae52278524;hp=7c2daf25ee4271b0843e4fce50fffcaa740d0533;hpb=50f0ac0f097e5495da1f2b1816106e3d420ff34b;p=vpp.git diff --git a/src/vlib/punt.c b/src/vlib/punt.c index 7c2daf25ee4..04e3b5a3956 100644 --- a/src/vlib/punt.c +++ b/src/vlib/punt.c @@ -17,8 +17,9 @@ /** * The last allocated punt reason + * Value 0 is reserved for invalid index. */ -static vlib_punt_reason_t punt_reason_last; +static vlib_punt_reason_t punt_reason_last = 1; /** * Counters per punt-reason @@ -47,6 +48,21 @@ typedef struct punt_reason_data_t_ * Clients/owners that have registered this reason */ u32 *pd_owners; + + /** + * clients interested/listening to this reason + */ + u32 pd_users; + + /** + * function to invoke if a client becomes interested in the code. + */ + punt_interested_listener_t pd_fn; + + /** + * Data to pass to the callback + */ + void *pd_data; } punt_reason_data_t; /** @@ -249,8 +265,8 @@ punt_reg_mk_dp (vlib_punt_reason_t reason) } int -vlib_punt_register (vlib_punt_hdl_t client, vlib_punt_reason_t reason, - const char *node_name) +vlib_punt_register (vlib_punt_hdl_t client, + vlib_punt_reason_t reason, const char *node_name) { vlib_node_t *punt_to, *punt_from; punt_client_t *pc; @@ -298,6 +314,11 @@ vlib_punt_register (vlib_punt_hdl_t client, vlib_punt_reason_t reason, pri = pr - punt_reg_pool; + if (0 == punt_reason_data[reason].pd_users++ && + NULL != punt_reason_data[reason].pd_fn) + punt_reason_data[reason].pd_fn (VLIB_ENABLE, + punt_reason_data[reason].pd_data); + punt_reg_add (pr); } @@ -353,6 +374,10 @@ vlib_punt_unregister (vlib_punt_hdl_t client, if (0 == pr->pr_locks) { + if (0 == --punt_reason_data[reason].pd_users && + NULL != punt_reason_data[reason].pd_fn) + punt_reason_data[reason].pd_fn (VLIB_DISABLE, + punt_reason_data[reason].pd_data); punt_reg_remove (pr); pool_put (punt_reg_pool, pr); } @@ -377,7 +402,9 @@ vlib_punt_reason_validate (vlib_punt_reason_t reason) int vlib_punt_reason_alloc (vlib_punt_hdl_t client, - const char *reason_name, vlib_punt_reason_t * reason) + const char *reason_name, + punt_interested_listener_t fn, + void *data, vlib_punt_reason_t * reason) { vlib_punt_reason_t new; @@ -388,6 +415,8 @@ vlib_punt_reason_alloc (vlib_punt_hdl_t client, vec_validate (punt_reason_data, new); punt_reason_data[new].pd_name = format (NULL, "%s", reason_name); punt_reason_data[new].pd_reason = new; + punt_reason_data[new].pd_fn = fn; + punt_reason_data[new].pd_data = data; vec_add1 (punt_reason_data[new].pd_owners, client); vlib_validate_combined_counter (&punt_counters, new); @@ -406,10 +435,10 @@ punt_reason_walk (punt_reason_walk_cb_t cb, void *ctx) { punt_reason_data_t *pd; - vec_foreach (pd, punt_reason_data) - { - cb (pd->pd_reason, pd->pd_name, ctx); - } + for (pd = punt_reason_data + 1; pd < vec_end (punt_reason_data); pd++) + { + cb (pd->pd_reason, pd->pd_name, ctx); + } } /* Parse node name -> node index. */