From 4008ac998f43265451281cb6e759cd6184e50bed Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 13 Feb 2017 23:20:04 -0800 Subject: Changing the IP table for an interface is an error if the interface already has an address configured (VPP-601) Change-Id: I311fc264f73dd3b2b3ce9d7d1c33cd0515b36c4a Signed-off-by: Neale Ranns --- src/vnet/interface_api.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/vnet/interface_api.c') diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 60cd6d40368..f94928b6dad 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -318,6 +319,7 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) u32 table_id = ntohl (mp->vrf_id); u32 sw_if_index = ntohl (mp->sw_if_index); vl_api_sw_interface_set_table_reply_t *rmp; + CLIB_UNUSED (ip_interface_address_t * ia); u32 fib_index; VALIDATE_SW_IF_INDEX (mp); @@ -326,21 +328,51 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) if (mp->is_ipv6) { + /* *INDENT-OFF* */ + foreach_ip_interface_address (&ip6_main.lookup_main, + ia, sw_if_index, + 1 /* honor unnumbered */ , + ({ + rv = VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE; + goto done; + })); + /* *INDENT-ON* */ + fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6, table_id); vec_validate (ip6_main.fib_index_by_sw_if_index, sw_if_index); ip6_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; + fib_index = mfib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6, + table_id); + vec_validate (ip6_main.mfib_index_by_sw_if_index, sw_if_index); + ip6_main.mfib_index_by_sw_if_index[sw_if_index] = fib_index; } else { + /* *INDENT-OFF* */ + foreach_ip_interface_address (&ip4_main.lookup_main, + ia, sw_if_index, + 1 /* honor unnumbered */ , + ({ + rv = VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE; + goto done; + })); + /* *INDENT-ON* */ fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, table_id); vec_validate (ip4_main.fib_index_by_sw_if_index, sw_if_index); ip4_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; + + fib_index = mfib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, + table_id); + vec_validate (ip4_main.mfib_index_by_sw_if_index, sw_if_index); + ip4_main.mfib_index_by_sw_if_index[sw_if_index] = fib_index; } + +done: stats_dsunlock (); BAD_SW_IF_INDEX_LABEL; -- cgit 1.2.3-korg