aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/api_errno.h3
-rw-r--r--src/vnet/interface_api.c23
-rw-r--r--[-rwxr-xr-x]src/vnet/ip/lookup.c12
3 files changed, 30 insertions, 8 deletions
diff --git a/src/vnet/api_errno.h b/src/vnet/api_errno.h
index c0deb1d0087..22cfaee41d6 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 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);
}
diff --git a/src/vnet/ip/lookup.c b/src/vnet/ip/lookup.c
index d9922f46453..856c4942ea4 100755..100644
--- 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;
}