diff options
Diffstat (limited to 'src/plugins/abf/abf_policy.c')
-rw-r--r-- | src/plugins/abf/abf_policy.c | 102 |
1 files changed, 51 insertions, 51 deletions
diff --git a/src/plugins/abf/abf_policy.c b/src/plugins/abf/abf_policy.c index 945434bca27..e6dfe4fff55 100644 --- a/src/plugins/abf/abf_policy.c +++ b/src/plugins/abf/abf_policy.c @@ -192,50 +192,45 @@ abf_policy_delete (u32 policy_id, const fib_route_path_t * rpaths) */ return (VNET_API_ERROR_INVALID_VALUE); } - else - { - /* - * update an existing policy. - * - add the path to the path-list and swap our ancestry - * - backwalk to poke all attachments to update - */ - fib_node_index_t old_pl; - ap = abf_policy_get (api); - old_pl = ap->ap_pl; + /* + * update an existing policy. + * - add the path to the path-list and swap our ancestry + * - backwalk to poke all attachments to update + */ + fib_node_index_t old_pl; - fib_path_list_lock (old_pl); - ap->ap_pl = - fib_path_list_copy_and_path_remove (ap->ap_pl, - (FIB_PATH_LIST_FLAG_SHARED | - FIB_PATH_LIST_FLAG_NO_URPF), - rpaths); + ap = abf_policy_get (api); + old_pl = ap->ap_pl; - fib_path_list_child_remove (old_pl, ap->ap_sibling); - ap->ap_sibling = ~0; + fib_path_list_lock (old_pl); + ap->ap_pl = fib_path_list_copy_and_path_remove ( + ap->ap_pl, (FIB_PATH_LIST_FLAG_SHARED | FIB_PATH_LIST_FLAG_NO_URPF), + rpaths); - if (FIB_NODE_INDEX_INVALID == ap->ap_pl) - { - /* - * no more paths on this policy. It's toast - * remove the CLI/API's lock - */ - fib_node_unlock (&ap->ap_node); - } - else - { - ap->ap_sibling = fib_path_list_child_add (ap->ap_pl, - abf_policy_fib_node_type, - api); + fib_path_list_child_remove (old_pl, ap->ap_sibling); + ap->ap_sibling = ~0; - fib_node_back_walk_ctx_t ctx = { - .fnbw_reason = FIB_NODE_BW_REASON_FLAG_EVALUATE, - }; + if (FIB_NODE_INDEX_INVALID == ap->ap_pl) + { + /* + * no more paths on this policy. It's toast + * remove the CLI/API's lock + */ + fib_node_unlock (&ap->ap_node); + } + else + { + ap->ap_sibling = + fib_path_list_child_add (ap->ap_pl, abf_policy_fib_node_type, api); - fib_walk_sync (abf_policy_fib_node_type, api, &ctx); - } - fib_path_list_unlock (old_pl); + fib_node_back_walk_ctx_t ctx = { + .fnbw_reason = FIB_NODE_BW_REASON_FLAG_EVALUATE, + }; + + fib_walk_sync (abf_policy_fib_node_type, api, &ctx); } + fib_path_list_unlock (old_pl); return (0); } @@ -272,14 +267,25 @@ abf_policy_cmd (vlib_main_t * vm, unformat_fib_route_path, &rpath, &payload_proto)) vec_add1 (rpaths, rpath); else - return (clib_error_return (0, "unknown input '%U'", - format_unformat_error, line_input)); + { + clib_error_t *err; + err = clib_error_return (0, "unknown input '%U'", + format_unformat_error, line_input); + unformat_free (line_input); + return err; + } } if (INDEX_INVALID == policy_id) { vlib_cli_output (vm, "Specify a Policy ID"); - return 0; + goto out; + } + + if (vec_len (rpaths) == 0) + { + vlib_cli_output (vm, "Hop path must not be empty"); + goto out; } if (!is_del) @@ -287,7 +293,7 @@ abf_policy_cmd (vlib_main_t * vm, if (INDEX_INVALID == acl_index) { vlib_cli_output (vm, "ACL index must be set"); - return 0; + goto out; } rv = abf_policy_update (policy_id, acl_index, rpaths); @@ -296,7 +302,7 @@ abf_policy_cmd (vlib_main_t * vm, { vlib_cli_output (vm, "ACL index must match existing ACL index in policy"); - return 0; + goto out; } } else @@ -304,11 +310,11 @@ abf_policy_cmd (vlib_main_t * vm, abf_policy_delete (policy_id, rpaths); } +out: unformat_free (line_input); return (NULL); } -/* *INDENT-OFF* */ /** * Create an ABF policy. */ @@ -318,7 +324,6 @@ VLIB_CLI_COMMAND (abf_policy_cmd_node, static) = { .short_help = "abf policy [add|del] id <index> acl <index> via ...", .is_mp_safe = 1, }; -/* *INDENT-ON* */ static u8 * format_abf (u8 * s, va_list * args) @@ -345,13 +350,11 @@ abf_policy_walk (abf_policy_walk_cb_t cb, void *ctx) { u32 api; - /* *INDENT-OFF* */ pool_foreach_index (api, abf_policy_pool) { if (!cb(api, ctx)) break; } - /* *INDENT-ON* */ } static clib_error_t * @@ -374,12 +377,10 @@ abf_show_policy_cmd (vlib_main_t * vm, if (INDEX_INVALID == policy_id) { - /* *INDENT-OFF* */ pool_foreach (ap, abf_policy_pool) { vlib_cli_output(vm, "%U", format_abf, ap); } - /* *INDENT-ON* */ } else { @@ -394,14 +395,12 @@ abf_show_policy_cmd (vlib_main_t * vm, return (NULL); } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (abf_policy_show_policy_cmd_node, static) = { .path = "show abf policy", .function = abf_show_policy_cmd, .short_help = "show abf policy <value>", .is_mp_safe = 1, }; -/* *INDENT-ON* */ static fib_node_t * abf_policy_get_node (fib_node_index_t index) @@ -456,7 +455,8 @@ static const fib_node_vft_t abf_policy_vft = { static clib_error_t * abf_policy_init (vlib_main_t * vm) { - abf_policy_fib_node_type = fib_node_register_new_type (&abf_policy_vft); + abf_policy_fib_node_type = + fib_node_register_new_type ("abf-policy", &abf_policy_vft); return (NULL); } |