aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/abf
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/abf')
-rw-r--r--src/plugins/abf/abf.api1
-rw-r--r--src/plugins/abf/abf_api.c15
-rw-r--r--src/plugins/abf/abf_error.def1
-rw-r--r--src/plugins/abf/abf_itf_attach.c13
4 files changed, 22 insertions, 8 deletions
diff --git a/src/plugins/abf/abf.api b/src/plugins/abf/abf.api
index 6716dce562f..03044ad5a6b 100644
--- a/src/plugins/abf/abf.api
+++ b/src/plugins/abf/abf.api
@@ -20,6 +20,7 @@
*/
option version = "1.0.0";
+import "vnet/ip/ip_types.api";
import "vnet/fib/fib_types.api";
/** \brief Get the plugin version
diff --git a/src/plugins/abf/abf_api.c b/src/plugins/abf/abf_api.c
index e5c3bfa6f3f..a14c9008332 100644
--- a/src/plugins/abf/abf_api.c
+++ b/src/plugins/abf/abf_api.c
@@ -101,7 +101,7 @@ vl_api_abf_policy_add_del_t_handler (vl_api_abf_policy_add_del_t * mp)
for (pi = 0; pi < mp->policy.n_paths; pi++)
{
path = &paths[pi];
- rv = fib_path_api_parse (&mp->policy.paths[pi], path);
+ rv = fib_api_path_decode (&mp->policy.paths[pi], path);
if (0 != rv)
{
@@ -158,9 +158,12 @@ typedef struct abf_dump_walk_ctx_t_
static int
abf_policy_send_details (u32 api, void *args)
{
- fib_route_path_encode_t *api_rpaths = NULL, *api_rpath;
+ fib_path_encode_ctx_t walk_ctx = {
+ .rpaths = NULL,
+ };
vl_api_abf_policy_details_t *mp;
abf_dump_walk_ctx_t *ctx;
+ fib_route_path_t *rpath;
vl_api_fib_path_t *fp;
size_t msg_size;
abf_policy_t *ap;
@@ -181,17 +184,19 @@ abf_policy_send_details (u32 api, void *args)
mp->policy.acl_index = htonl (ap->ap_acl);
mp->policy.policy_id = htonl (ap->ap_id);
- fib_path_list_walk_w_ext (ap->ap_pl, NULL, fib_path_encode, &api_rpaths);
+ fib_path_list_walk_w_ext (ap->ap_pl, NULL, fib_path_encode, &walk_ctx);
fp = mp->policy.paths;
- vec_foreach (api_rpath, api_rpaths)
+ vec_foreach (rpath, walk_ctx.rpaths)
{
- fib_api_path_encode (api_rpath, fp);
+ fib_api_path_encode (rpath, fp);
fp++;
}
vl_api_send_msg (ctx->rp, (u8 *) mp);
+ vec_free (walk_ctx.rpaths);
+
return (1);
}
diff --git a/src/plugins/abf/abf_error.def b/src/plugins/abf/abf_error.def
index 71e798beb71..83349eae42a 100644
--- a/src/plugins/abf/abf_error.def
+++ b/src/plugins/abf/abf_error.def
@@ -17,3 +17,4 @@
abf_error (NONE, "no match")
abf_error (MATCHED, "matched")
+abf_error (MISSED, "missed")
diff --git a/src/plugins/abf/abf_itf_attach.c b/src/plugins/abf/abf_itf_attach.c
index 9569306ec2a..337eed8697d 100644
--- a/src/plugins/abf/abf_itf_attach.c
+++ b/src/plugins/abf/abf_itf_attach.c
@@ -505,12 +505,12 @@ abf_input_inline (vlib_main_t * vm,
vlib_node_runtime_t * node,
vlib_frame_t * frame, fib_protocol_t fproto)
{
- u32 n_left_from, *from, *to_next, next_index, matches;
+ u32 n_left_from, *from, *to_next, next_index, matches, misses;
from = vlib_frame_vector_args (frame);
n_left_from = frame->n_vectors;
next_index = node->cached_next_index;
- matches = 0;
+ matches = misses = 0;
while (n_left_from > 0)
{
@@ -530,6 +530,7 @@ abf_input_inline (vlib_main_t * vm,
u32 match_acl_pos = ~0;
u32 match_rule_index = ~0;
u32 trace_bitmap = 0;
+ u32 lc_index;
u8 action;
bi0 = from[0];
@@ -549,7 +550,7 @@ abf_input_inline (vlib_main_t * vm,
/*
* check if any of the policies attached to this interface matches.
*/
- u32 lc_index = abf_alctx_per_itf[fproto][sw_if_index0];
+ lc_index = abf_alctx_per_itf[fproto][sw_if_index0];
/*
A non-inline version looks like this:
@@ -589,6 +590,7 @@ abf_input_inline (vlib_main_t * vm,
* move on down the feature arc
*/
vnet_feature_next (&next0, b0);
+ misses++;
}
if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
@@ -614,6 +616,11 @@ abf_input_inline (vlib_main_t * vm,
abf_ip4_node.index :
abf_ip6_node.index),
ABF_ERROR_MATCHED, matches);
+ vlib_node_increment_counter (vm,
+ (fproto = FIB_PROTOCOL_IP6 ?
+ abf_ip4_node.index :
+ abf_ip6_node.index),
+ ABF_ERROR_MISSED, misses);
return frame->n_vectors;
}