diff options
author | Jon Loeliger <jdl@netgate.com> | 2017-09-28 13:54:16 -0500 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2017-10-03 10:15:53 +0000 |
commit | 35ffa3e8f6b032f6e324234d495f769049d8feea (patch) | |
tree | 877225cf1f8997501e2dd1efdaf011fdedb7d95f /src/vnet/interface_api.c | |
parent | e2efd12b8418558cd8e701368287860409e8d265 (diff) |
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 <jdl@netgate.com>
Diffstat (limited to 'src/vnet/interface_api.c')
-rw-r--r-- | src/vnet/interface_api.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 0731ab35639..93551e476eb 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); } |