summaryrefslogtreecommitdiffstats
path: root/src/vnet/interface_api.c
diff options
context:
space:
mode:
authorJon Loeliger <jdl@netgate.com>2017-09-28 13:54:16 -0500
committerFlorin Coras <florin.coras@gmail.com>2017-10-04 18:48:52 +0000
commitde6c03c0f104114d43a53776839600ce792731de (patch)
tree0a447fc26eb98d2ed3bd605be676b73700646098 /src/vnet/interface_api.c
parent77d7dcba32516b3353dc075ca2753f5532178137 (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> (cherry picked from commit 35ffa3e8f6b032f6e324234d495f769049d8feea)
Diffstat (limited to 'src/vnet/interface_api.c')
-rw-r--r--src/vnet/interface_api.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c
index 05d9f211760..6374a8808b0 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);
}