From de6c03c0f104114d43a53776839600ce792731de Mon Sep 17 00:00:00 2001 From: Jon Loeliger Date: Thu, 28 Sep 2017 13:54:16 -0500 Subject: Propagate duplicate IF addr add/del error up to API. Identify and complain when the same IP prefix is assigned to two different SW interfaces: vpp# set int ip address TenGigabitEthernet6/0/0 1.2.3.4/32 vpp# set int ip address TenGigabitEthernet6/0/1 1.2.3.4/32 set interface ip address: Prefix 1.2.3.4/32 already found on interface TenGigabitEthernet6/0/0 Change-Id: I1aee1b6a7ddd00d3109a53d8e1b6ce97bf45e372 Signed-off-by: Jon Loeliger (cherry picked from commit 35ffa3e8f6b032f6e324234d495f769049d8feea) --- src/vnet/api_errno.h | 3 ++- src/vnet/interface_api.c | 23 +++++++++++++++++------ src/vnet/ip/lookup.c | 12 +++++++++++- 3 files changed, 30 insertions(+), 8 deletions(-) mode change 100755 => 100644 src/vnet/ip/lookup.c diff --git a/src/vnet/api_errno.h b/src/vnet/api_errno.h index c0deb1d0..22cfaee4 100644 --- a/src/vnet/api_errno.h +++ b/src/vnet/api_errno.h @@ -115,7 +115,8 @@ _(BD_ID_EXCEED_MAX, -122, "Bridge domain ID exceed 16M limit") \ _(SUBIF_DOESNT_EXIST, -123, "Subinterface doesn't exist") \ _(L2_MACS_EVENT_CLINET_PRESENT, -124, "Client already exist for L2 MACs events") \ _(INVALID_QUEUE, -125, "Invalid queue") \ -_(UNSUPPORTED, -126, "Unsupported") +_(UNSUPPORTED, -126, "Unsupported") \ +_(DUPLICATE_IF_ADDRESS, -127, "Address already present on another interface") typedef enum { diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 05d9f211..6374a880 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -281,27 +281,38 @@ static void (vl_api_sw_interface_add_del_address_t * mp) { vlib_main_t *vm = vlib_get_main (); + vnet_main_t *vnm = vnet_get_main (); vl_api_sw_interface_add_del_address_reply_t *rmp; int rv = 0; u32 is_del; + clib_error_t *error = 0; VALIDATE_SW_IF_INDEX (mp); is_del = mp->is_add == 0; + vnm->api_errno = 0; if (mp->del_all) ip_del_all_interface_addresses (vm, ntohl (mp->sw_if_index)); else if (mp->is_ipv6) - ip6_add_del_interface_address (vm, ntohl (mp->sw_if_index), - (void *) mp->address, - mp->address_length, is_del); + error = ip6_add_del_interface_address (vm, ntohl (mp->sw_if_index), + (void *) mp->address, + mp->address_length, is_del); else - ip4_add_del_interface_address (vm, ntohl (mp->sw_if_index), - (void *) mp->address, - mp->address_length, is_del); + error = ip4_add_del_interface_address (vm, ntohl (mp->sw_if_index), + (void *) mp->address, + mp->address_length, is_del); + + if (error) + { + rv = vnm->api_errno; + clib_error_report (error); + goto done; + } BAD_SW_IF_INDEX_LABEL; +done: REPLY_MACRO (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS_REPLY); } diff --git a/src/vnet/ip/lookup.c b/src/vnet/ip/lookup.c old mode 100755 new mode 100644 index d9922f46..856c4942 --- a/src/vnet/ip/lookup.c +++ b/src/vnet/ip/lookup.c @@ -165,11 +165,21 @@ ip_interface_address_add_del (ip_lookup_main_t * lm, } else { + if (sw_if_index != a->sw_if_index) + { + if (result_if_address_index) + *result_if_address_index = ~0; + vnm->api_errno = VNET_API_ERROR_DUPLICATE_IF_ADDRESS; + return clib_error_create + ("Prefix %U already found on interface %U", + lm->format_address_and_length, addr_fib, address_length, + format_vnet_sw_if_index_name, vnm, a->sw_if_index); + } + if (result_if_address_index) *result_if_address_index = a - lm->if_address_pool; } - return /* no error */ 0; } -- cgit 1.2.3-korg