vlib_buffer_alloc_from_free_list(vm, &tm->rx_buffers[len],
VLIB_FRAME_SIZE - len, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
if (PREDICT_FALSE(vec_len(tm->rx_buffers) < tm->mtu_buffers)) {
- clib_warning("vlib_buffer_alloc failed");
+ vlib_node_increment_counter(vm, tapcli_rx_node.index,
+ TAPCLI_ERROR_BUFFER_ALLOC,
+ tm->mtu_buffers - vec_len(tm->rx_buffers));
break;
}
}
vec_validate (tm->iovecs, tm->mtu_buffers - 1);
for (j = 0; j < tm->mtu_buffers; j++) {
b = vlib_get_buffer (vm, tm->rx_buffers[i_rx - j]);
- b->clone_count = 0;
tm->iovecs[j].iov_base = b->data;
tm->iovecs[j].iov_len = buffer_size;
}
}));
if (vec_len (ready_interface_indices) == 0)
- return 1;
+ return 0;
for (i = 0; i < vec_len(ready_interface_indices); i++)
{
goto error;
}
- if (ioctl (dev_tap_fd, SIOCGIFHWADDR, &ifr) < 0)
- {
- rv = VNET_API_ERROR_SYSCALL_ERROR_1;
- goto error;
- }
-
ti = tapcli_get_new_tapif();
ti->per_interface_next_index = ~0;
if (hwaddr_arg != 0)
clib_memcpy(hwaddr, hwaddr_arg, 6);
+ else
+ {
+ f64 now = vlib_time_now(vm);
+ u32 rnd;
+ rnd = (u32) (now * 1e6);
+ rnd = random_u32 (&rnd);
+
+ memcpy (hwaddr+2, &rnd, sizeof(rnd));
+ hwaddr[0] = 2;
+ hwaddr[1] = 0xfe;
+ }
error = ethernet_register_interface
(tm->vnet_main,
tapcli_dev_class.index,
ti - tm->tapcli_interfaces /* device instance */,
- hwaddr_arg != 0 ? hwaddr :
- (u8 *) ifr.ifr_hwaddr.sa_data /* ethernet address */,
+ hwaddr /* ethernet address */,
&ti->hw_if_index,
tapcli_flag_change);
error:
close (dev_net_tun_fd);
- close (dev_tap_fd);
+ if (dev_tap_fd >= 0)
+ close (dev_tap_fd);
return rv;
}
VLIB_CLI_COMMAND (tap_modify_command, static) = {
.path = "tap modify",
- .short_help = "tap modify <vpp-tap-intfc-name> <linux-intfc-name> [hwaddr [<addr> | random]]",
+ .short_help = "tap modify <vpp-tap-intfc-name> <linux-intfc-name> [hwaddr <addr>]",
.function = tap_modify_command_fn,
};
{
u8 * intfc_name;
tapcli_main_t * tm = &tapcli_main;
- int user_hwaddr = 0;
u8 hwaddr[6];
u8 *hwaddr_arg = 0;
u32 sw_if_index;
if (unformat(input, "hwaddr %U", unformat_ethernet_address,
&hwaddr))
- user_hwaddr = 1;
+ hwaddr_arg = hwaddr;
+ /* It is here for backward compatibility */
if (unformat(input, "hwaddr random"))
- {
- f64 now = vlib_time_now(vm);
- u32 rnd;
- rnd = (u32) (now * 1e6);
- rnd = random_u32 (&rnd);
-
- clib_memcpy (hwaddr+2, &rnd, sizeof(rnd));
- hwaddr[0] = 2;
- hwaddr[1] = 0xfe;
- user_hwaddr = 1;
- }
- if (user_hwaddr) hwaddr_arg = hwaddr;
+ ;
int rv = vnet_tap_connect(vm, intfc_name, hwaddr_arg, &sw_if_index);
if (rv) {
return 0;
}
- vlib_cli_output (vm, "Created %U for Linux tap '%s'",
- format_vnet_sw_if_index_name, tm->vnet_main,
- sw_if_index, intfc_name);
-
+ vlib_cli_output(vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main(), sw_if_index);
return 0;
-
}
VLIB_CLI_COMMAND (tap_connect_command, static) = {
.path = "tap connect",
- .short_help = "tap connect <intfc-name> [hwaddr [<addr> | random]]",
+ .short_help = "tap connect <intfc-name> [hwaddr <addr>]",
.function = tap_connect_command_fn,
};