From 8ebb2a1632ccf2079cd6217af2d4045021dc3b9e Mon Sep 17 00:00:00 2001 From: Andrej Kozemcak Date: Tue, 7 Jun 2016 12:25:20 +0200 Subject: [PATCH] Check if LISP is enable Lisp enable flag is enforced. DP API should not be call if the dp is disable. Change-Id: I265cf3ea0460987f3fd5fd84b43127dd3b1c43c3 Signed-off-by: Andrej Kozemcak --- vnet/vnet/api_errno.h | 3 +- vnet/vnet/lisp-cp/control.c | 71 +++++++++++++++++++++++++++++++++++++++--- vnet/vnet/lisp-gpe/interface.c | 26 +++++++++++++--- vnet/vnet/lisp-gpe/lisp_gpe.c | 15 ++++++++- vnet/vnet/lisp-gpe/lisp_gpe.h | 2 +- vpp/api/api.c | 2 +- 6 files changed, 105 insertions(+), 14 deletions(-) diff --git a/vnet/vnet/api_errno.h b/vnet/vnet/api_errno.h index af6f3971a13..5d08fb434a0 100644 --- a/vnet/vnet/api_errno.h +++ b/vnet/vnet/api_errno.h @@ -79,7 +79,8 @@ _(NOT_RUNNING_AS_ROOT, -85, "Not running as root") \ _(ALREADY_CONNECTED, -86, "Connection to the data plane already exists") \ _(UNSUPPORTED_JNI_VERSION, -87, "Unsupported JNI version") \ _(FAILED_TO_ATTACH_TO_JAVA_THREAD, -88, "Failed to attach to Java thread") \ -_(INVALID_WORKER, -89, "Invalid worker thread") +_(INVALID_WORKER, -89, "Invalid worker thread") \ +_(LISP_DISABLED, -90, "LISP is disabled") typedef enum { #define _(a,b,c) VNET_API_ERROR_##a = (b), diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index 537a3340dfd..b6612c44bb4 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -139,6 +139,12 @@ vnet_lisp_add_del_local_mapping (vnet_lisp_add_del_mapping_args_t * a, vnet_lisp_gpe_add_del_iface_args_t _ai, *ai = &_ai; lisp_cp_main_t * lcm = vnet_lisp_cp_get_main (); + if (vnet_lisp_enable_disable_status () == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + vni = gid_address_vni(&a->deid); /* store/remove mapping from map-cache */ @@ -210,6 +216,7 @@ lisp_add_del_local_eid_command_fn (vlib_main_t * vm, unformat_input_t * input, u32 locator_set_index = 0, map_index = 0; uword * p; vnet_lisp_add_del_mapping_args_t _a, * a = &_a; + int rv = 0; gid_address_type (&eid) = GID_ADDR_IP_PREFIX; @@ -251,7 +258,12 @@ lisp_add_del_local_eid_command_fn (vlib_main_t * vm, unformat_input_t * input, a->locator_set_index = locator_set_index; a->local = 1; - vnet_lisp_add_del_local_mapping (a, &map_index); + rv = vnet_lisp_add_del_local_mapping (a, &map_index); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s eid-table!", + is_add ? "add" : "delete"); + } done: vec_free(eids); if (locator_set_name) @@ -383,6 +395,12 @@ vnet_lisp_add_del_remote_mapping (gid_address_t * deid, gid_address_t * seid, ip_address_t * dl; int rc = -1; + if (vnet_lisp_enable_disable_status() == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + if (del_all) return vnet_lisp_clear_all_remote_mappings (); @@ -700,6 +718,12 @@ vnet_lisp_pitr_set_locator_set (u8 * locator_set_name, u8 is_add) mapping_t * m; uword * p; + if (vnet_lisp_enable_disable_status () == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + p = hash_get_mem (lcm->locator_set_index_by_name, locator_set_name); if (!p) { @@ -738,6 +762,8 @@ lisp_pitr_set_locator_set_command_fn (vlib_main_t * vm, u8 * locator_set_name = 0; u8 is_add = 1; unformat_input_t _line_input, * line_input = &_line_input; + clib_error_t * error = 0; + int rv = 0; /* Get a line of input. */ if (! unformat_user (input, unformat_line_input, line_input)) @@ -758,12 +784,17 @@ lisp_pitr_set_locator_set_command_fn (vlib_main_t * vm, clib_warning ("No locator set specified!"); goto done; } - vnet_lisp_pitr_set_locator_set (locator_set_name, is_add); + rv = vnet_lisp_pitr_set_locator_set (locator_set_name, is_add); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s pitr!", + is_add ? "add" : "delete"); + } done: if (locator_set_name) vec_free (locator_set_name); - return 0; + return error; } VLIB_CLI_COMMAND (lisp_pitr_set_locator_set_command) = { @@ -917,6 +948,12 @@ vnet_lisp_add_del_locator (vnet_lisp_add_del_locator_set_args_t * a, ASSERT(a != NULL); + if (vnet_lisp_enable_disable_status () == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + p = get_locator_set_index(a, p); if (!p) { @@ -1002,6 +1039,12 @@ vnet_lisp_add_del_locator_set (vnet_lisp_add_del_locator_set_args_t * a, u32 ** eid_indexes; int ret = 0; + if (vnet_lisp_enable_disable_status () == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + if (a->is_add) { p = get_locator_set_index(a, p); @@ -1264,6 +1307,7 @@ lisp_add_del_locator_set_command_fn (vlib_main_t * vm, unformat_input_t * input, locator_t locator, * locators = 0; vnet_lisp_add_del_locator_set_args_t _a, * a = &_a; u32 ls_index = 0; + int rv = 0; memset(&locator, 0, sizeof(locator)); memset(a, 0, sizeof(a[0])); @@ -1297,7 +1341,12 @@ lisp_add_del_locator_set_command_fn (vlib_main_t * vm, unformat_input_t * input, a->is_add = is_add; a->local = 1; - vnet_lisp_add_del_locator_set(a, &ls_index); + rv = vnet_lisp_add_del_locator_set(a, &ls_index); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s locator-set!", + is_add ? "add" : "delete"); + } done: vec_free(locators); @@ -1358,6 +1407,12 @@ vnet_lisp_add_del_map_resolver (vnet_lisp_add_del_map_resolver_args_t * a) ip_address_t * addr; u32 i; + if (vnet_lisp_enable_disable_status () == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + if (a->is_add) { vec_foreach(addr, lcm->map_resolvers) @@ -1395,6 +1450,7 @@ lisp_add_del_map_resolver_command_fn (vlib_main_t * vm, u8 is_add = 1; ip_address_t ip_addr; clib_error_t * error = 0; + int rv = 0; vnet_lisp_add_del_map_resolver_args_t _a, * a = &_a; /* Get a line of input. */ @@ -1417,7 +1473,12 @@ lisp_add_del_map_resolver_command_fn (vlib_main_t * vm, } a->is_add = is_add; a->address = ip_addr; - vnet_lisp_add_del_map_resolver (a); + rv = vnet_lisp_add_del_map_resolver (a); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s map-resolver!", + is_add ? "add" : "delete"); + } done: return error; diff --git a/vnet/vnet/lisp-gpe/interface.c b/vnet/vnet/lisp-gpe/interface.c index d52df25b550..7537962b3bc 100644 --- a/vnet/vnet/lisp-gpe/interface.c +++ b/vnet/vnet/lisp-gpe/interface.c @@ -480,7 +480,7 @@ lisp_gpe_iface_set_table (u32 sw_if_index, u32 table_id, u8 is_ip4) } } -void +int vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a, u32 * hw_if_indexp) { @@ -490,6 +490,12 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a, u32 hw_if_index = ~0, lookup_next_index4, lookup_next_index6, flen; uword * hip, * vni; + if (vnet_lisp_gpe_enable_disable_status() == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + hip = hash_get(lgm->lisp_gpe_hw_if_index_by_table_id, a->table_id); if (a->is_add) @@ -497,7 +503,7 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a, if (hip) { clib_warning ("Interface for vrf %d already exists", a->table_id); - return; + return -1; } /* create hw lisp_gpeX iface if needed, otherwise reuse existing */ @@ -560,7 +566,7 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a, if (hip == 0) { clib_warning("The interface for vrf %d doesn't exist", a->table_id); - return; + return -1; } hi = vnet_get_hw_interface (vnm, hip[0]); @@ -579,6 +585,8 @@ vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t * a, add_del_lisp_gpe_default_route (a->table_id, /* is_v4 */1, 0); add_del_lisp_gpe_default_route (a->table_id, /* is_v4 */0, 0); } + + return 0; } static clib_error_t * @@ -587,6 +595,8 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input, { unformat_input_t _line_input, * line_input = &_line_input; u8 is_add = 1; + clib_error_t * error = 0; + int rv = 0; u32 table_id; vnet_lisp_gpe_add_del_iface_args_t _a, * a = &_a; @@ -612,8 +622,14 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input, a->is_add = is_add; a->table_id = table_id; - vnet_lisp_gpe_add_del_iface (a, 0); - return 0; + rv = vnet_lisp_gpe_add_del_iface (a, 0); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s gpe iface!", + is_add ? "add" : "delete"); + } + + return error; } VLIB_CLI_COMMAND (add_del_lisp_gpe_iface_command, static) = { diff --git a/vnet/vnet/lisp-gpe/lisp_gpe.c b/vnet/vnet/lisp-gpe/lisp_gpe.c index f594e927ea8..c11824e6315 100644 --- a/vnet/vnet/lisp-gpe/lisp_gpe.c +++ b/vnet/vnet/lisp-gpe/lisp_gpe.c @@ -227,6 +227,12 @@ vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a, uword * lookup_next_index, * lgpe_sw_if_index, * lnip; u8 ip_ver; + if (vnet_lisp_gpe_enable_disable_status() == 0) + { + clib_warning ("LISP is disabled!"); + return VNET_API_ERROR_LISP_DISABLED; + } + /* treat negative fwd entries separately */ if (a->is_negative) return add_del_negative_fwd_entry (lgm, a); @@ -303,6 +309,7 @@ lisp_gpe_add_del_fwd_entry_command_fn (vlib_main_t * vm, gid_address_t * eids = 0, eid; clib_error_t * error = 0; u32 i; + int rv; prefp = &gid_address_ippref(&eid); @@ -355,7 +362,13 @@ lisp_gpe_add_del_fwd_entry_command_fn (vlib_main_t * vm, a.deid = eids[i]; a.slocator = slocators[i]; a.dlocator = dlocators[i]; - vnet_lisp_gpe_add_del_fwd_entry (&a, 0); + rv = vnet_lisp_gpe_add_del_fwd_entry (&a, 0); + if (0 != rv) + { + error = clib_error_return(0, "failed to %s gpe maptunnel!", + is_add ? "add" : "delete"); + break; + } } done: diff --git a/vnet/vnet/lisp-gpe/lisp_gpe.h b/vnet/vnet/lisp-gpe/lisp_gpe.h index 2d18d7d671d..705b64f610b 100644 --- a/vnet/vnet/lisp-gpe/lisp_gpe.h +++ b/vnet/vnet/lisp-gpe/lisp_gpe.h @@ -180,7 +180,7 @@ typedef struct u8 vnet_lisp_gpe_enable_disable_status(void); -void +int vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t *a, u32 * hw_if_indexp); diff --git a/vpp/api/api.c b/vpp/api/api.c index bb9a29636fd..9a5935a880c 100644 --- a/vpp/api/api.c +++ b/vpp/api/api.c @@ -4935,7 +4935,7 @@ vl_api_lisp_gpe_add_del_iface_t_handler( a->is_add = mp->is_add; a->table_id = mp->table_id; a->vni = mp->vni; - vnet_lisp_gpe_add_del_iface (a, 0); + rv = vnet_lisp_gpe_add_del_iface (a, 0); REPLY_MACRO(VL_API_LISP_GPE_ADD_DEL_IFACE_REPLY); } -- 2.16.6