X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip6_neighbor.c;h=fde3a7e71d493dc66bfb7c4d5004aa190192bd0e;hb=7c03ed4;hp=177bcc14a7d73dc6e5cb43ab36b5d0af6f825f51;hpb=cd35e53c928f666e50342e27d69e6dd7d60e1283;p=vpp.git
diff --git a/src/vnet/ip/ip6_neighbor.c b/src/vnet/ip/ip6_neighbor.c
index 177bcc14a7d..fde3a7e71d4 100755
--- a/src/vnet/ip/ip6_neighbor.c
+++ b/src/vnet/ip/ip6_neighbor.c
@@ -243,9 +243,10 @@ ip6_neighbor_get_link_local_address (u32 sw_if_index)
static ip6_address_t empty_address = { {0} };
ip6_neighbor_main_t *nm = &ip6_neighbor_main;
ip6_radv_t *radv_info;
- u32 ri;
+ u32 ri = ~0;
- ri = nm->if_radv_pool_index_by_sw_if_index[sw_if_index];
+ if (vec_len (nm->if_radv_pool_index_by_sw_if_index) > sw_if_index)
+ ri = nm->if_radv_pool_index_by_sw_if_index[sw_if_index];
if (ri == ~0)
{
clib_warning ("IPv6 is not enabled for sw_if_index %d", sw_if_index);
@@ -1689,11 +1690,15 @@ icmp6_router_solicitation (vlib_main_t * vm,
u16 payload_length =
sizeof (icmp6_router_advertisement_header_t);
- vlib_buffer_add_data (vm,
- vlib_buffer_get_free_list_index
- (p0), bi0, (void *) &rh,
- sizeof
- (icmp6_router_advertisement_header_t));
+ if (vlib_buffer_add_data
+ (vm, vlib_buffer_get_free_list_index
+ (p0), &bi0, (void *) &rh,
+ sizeof (icmp6_router_advertisement_header_t)))
+ {
+ /* buffer allocation failed, drop the pkt */
+ error0 = ICMP6_ERROR_ALLOC_FAILURE;
+ goto drop0;
+ }
if (radv_info->adv_link_layer_address)
{
@@ -1708,11 +1713,15 @@ icmp6_router_solicitation (vlib_main_t * vm,
clib_memcpy (&h.ethernet_address[0],
eth_if0->address, 6);
- vlib_buffer_add_data (vm,
- vlib_buffer_get_free_list_index
- (p0), bi0, (void *) &h,
- sizeof
- (icmp6_neighbor_discovery_ethernet_link_layer_address_option_t));
+ if (vlib_buffer_add_data
+ (vm, vlib_buffer_get_free_list_index
+ (p0), &bi0, (void *) &h,
+ sizeof
+ (icmp6_neighbor_discovery_ethernet_link_layer_address_option_t)))
+ {
+ error0 = ICMP6_ERROR_ALLOC_FAILURE;
+ goto drop0;
+ }
payload_length +=
sizeof
@@ -1733,11 +1742,15 @@ icmp6_router_solicitation (vlib_main_t * vm,
payload_length +=
sizeof (icmp6_neighbor_discovery_mtu_option_t);
- vlib_buffer_add_data (vm,
- vlib_buffer_get_free_list_index
- (p0), bi0, (void *) &h,
- sizeof
- (icmp6_neighbor_discovery_mtu_option_t));
+ if (vlib_buffer_add_data
+ (vm, vlib_buffer_get_free_list_index
+ (p0), &bi0, (void *) &h,
+ sizeof
+ (icmp6_neighbor_discovery_mtu_option_t)))
+ {
+ error0 = ICMP6_ERROR_ALLOC_FAILURE;
+ goto drop0;
+ }
}
/* add advertised prefix options */
@@ -1786,10 +1799,15 @@ icmp6_router_solicitation (vlib_main_t * vm,
payload_length += sizeof( icmp6_neighbor_discovery_prefix_information_option_t);
- vlib_buffer_add_data (vm,
- vlib_buffer_get_free_list_index (p0),
- bi0,
- (void *)&h, sizeof(icmp6_neighbor_discovery_prefix_information_option_t));
+ if (vlib_buffer_add_data
+ (vm, vlib_buffer_get_free_list_index (p0),
+ &bi0,
+ (void *)&h,
+ sizeof(icmp6_neighbor_discovery_prefix_information_option_t)))
+ {
+ error0 = ICMP6_ERROR_ALLOC_FAILURE;
+ goto drop0;
+ }
}
}));
@@ -1874,6 +1892,7 @@ icmp6_router_solicitation (vlib_main_t * vm,
}
}
+ drop0:
p0->error = error_node->errors[error0];
if (error0 != ICMP6_ERROR_NONE)
@@ -2347,7 +2366,7 @@ create_buffer_for_rs (vlib_main_t * vm, ip6_radv_t * radv_info)
rh->ip.hop_limit = 255;
rh->ip.src_address = radv_info->link_local_address;
/* set address ff02::2 */
- rh->ip.dst_address.as_u64[0] = clib_host_to_net_u64 (0xff02L << 48);
+ rh->ip.dst_address.as_u64[0] = clib_host_to_net_u64 (0xff02ULL << 48);
rh->ip.dst_address.as_u64[1] = clib_host_to_net_u64 (2);
rh->neighbor.icmp.checksum = ip6_tcp_udp_icmp_compute_checksum (vm, p0,
@@ -2757,12 +2776,10 @@ ip6_neighbor_send_mldpv2_report (u32 sw_if_index)
return;
/* send report now - build a mldpv2 report packet */
- n_allocated = vlib_buffer_alloc_from_free_list (vm,
- &bo0,
- n_to_alloc,
- VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
+ n_allocated = vlib_buffer_alloc (vm, &bo0, n_to_alloc);
if (PREDICT_FALSE (n_allocated == 0))
{
+ alloc_fail:
clib_warning ("buffer allocation failure");
return;
}
@@ -2829,9 +2846,13 @@ ip6_neighbor_send_mldpv2_report (u32 sw_if_index)
num_addr_records++;
- vlib_buffer_add_data
- (vm, vlib_buffer_get_free_list_index (b0), bo0,
- (void *)&rr, sizeof(icmp6_multicast_address_record_t));
+ if(vlib_buffer_add_data
+ (vm, vlib_buffer_get_free_list_index (b0), &bo0,
+ (void *)&rr, sizeof(icmp6_multicast_address_record_t)))
+ {
+ vlib_buffer_free (vm, &bo0, 1);
+ goto alloc_fail;
+ }
payload_length += sizeof( icmp6_multicast_address_record_t);
}));
@@ -2953,8 +2974,7 @@ ip6_neighbor_process_timer_event (vlib_main_t * vm,
radv_info->last_multicast_time = now;
/* send advert now - build a "solicted" router advert with unspecified source address */
- n_allocated = vlib_buffer_alloc_from_free_list
- (vm, &bo0, n_to_alloc, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
+ n_allocated = vlib_buffer_alloc (vm, &bo0, n_to_alloc);
if (PREDICT_FALSE(n_allocated == 0))
{
@@ -4424,21 +4444,19 @@ VLIB_CLI_COMMAND (ip6_nd_command, static) =
/* *INDENT-ON* */
clib_error_t *
-set_ip6_link_local_address (vlib_main_t * vm,
- u32 sw_if_index, ip6_address_t * address)
+ip6_neighbor_set_link_local_address (vlib_main_t * vm, u32 sw_if_index,
+ ip6_address_t * address)
{
clib_error_t *error = 0;
ip6_neighbor_main_t *nm = &ip6_neighbor_main;
u32 ri;
ip6_radv_t *radv_info;
vnet_main_t *vnm = vnet_get_main ();
+ ip6_ll_prefix_t pfx = { 0, };
if (!ip6_address_is_link_local_unicast (address))
- {
- vnm->api_errno = VNET_API_ERROR_ADDRESS_NOT_LINK_LOCAL;
- return (error = clib_error_return (0, "address not link-local",
- format_unformat_error));
- }
+ return (error = clib_error_return (0, "address not link-local",
+ format_unformat_error));
/* call enable ipv6 */
enable_ip6_interface (vm, sw_if_index);
@@ -4449,25 +4467,16 @@ set_ip6_link_local_address (vlib_main_t * vm,
{
radv_info = pool_elt_at_index (nm->if_radv_pool, ri);
- /* save if link local address (overwrite default) */
+ pfx.ilp_sw_if_index = sw_if_index;
- /* delete the old one */
- error = ip6_add_del_interface_address (vm, sw_if_index,
- &radv_info->link_local_address,
- 128, 1 /* is_del */ );
+ pfx.ilp_addr = radv_info->link_local_address;
+ ip6_ll_table_entry_delete (&pfx);
- if (!error)
- {
- /* add the new one */
- error = ip6_add_del_interface_address (vm, sw_if_index,
- address, 128,
- 0 /* is_del */ );
+ pfx.ilp_addr = *address;
+ ip6_ll_table_entry_update (&pfx, FIB_ROUTE_PATH_LOCAL);
- if (!error)
- {
- radv_info->link_local_address = *address;
- }
- }
+ radv_info = pool_elt_at_index (nm->if_radv_pool, ri);
+ radv_info->link_local_address = *address;
}
else
{
@@ -4478,50 +4487,6 @@ set_ip6_link_local_address (vlib_main_t * vm,
return error;
}
-clib_error_t *
-set_ip6_link_local_address_cmd (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- vnet_main_t *vnm = vnet_get_main ();
- clib_error_t *error = 0;
- u32 sw_if_index;
- ip6_address_t ip6_addr;
-
- if (unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
- {
- /* get the rest of the command */
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "%U", unformat_ip6_address, &ip6_addr))
- break;
- else
- return (unformat_parse_error (input));
- }
- }
- error = set_ip6_link_local_address (vm, sw_if_index, &ip6_addr);
- return error;
-}
-
-/*?
- * This command is used to assign an IPv6 Link-local address to an
- * interface. This command will enable IPv6 on an interface if it
- * is not already enabled. Use the 'show ip6 interface' command
- * to display the assigned Link-local address.
- *
- * @cliexpar
- * Example of how to assign an IPv6 Link-local address to an interface:
- * @cliexcmd{set ip6 link-local address GigabitEthernet2/0/0 FE80::AB8}
-?*/
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (set_ip6_link_local_address_command, static) =
-{
- .path = "set ip6 link-local address",
- .short_help = "set ip6 link-local address ",
- .function = set_ip6_link_local_address_cmd,
-};
-/* *INDENT-ON* */
-
/**
* @brief callback when an interface address is added or deleted
*/