Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
tapv2: coverity woe
[vpp.git]
/
src
/
vnet
/
devices
/
tap
/
tap.c
diff --git
a/src/vnet/devices/tap/tap.c
b/src/vnet/devices/tap/tap.c
index
eb5a7a9
..
d0ed58c
100644
(file)
--- a/
src/vnet/devices/tap/tap.c
+++ b/
src/vnet/devices/tap/tap.c
@@
-75,6
+75,7
@@
open_netns_fd (char *netns)
return fd;
}
return fd;
}
+#define TAP_MAX_INSTANCE 1024
void
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
void
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
@@
-92,12
+93,10
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
struct vhost_memory *vhost_mem = 0;
virtio_if_t *vif = 0;
clib_error_t *err = 0;
struct vhost_memory *vhost_mem = 0;
virtio_if_t *vif = 0;
clib_error_t *err = 0;
- uword *p;
if (args->id != ~0)
{
if (args->id != ~0)
{
- p = hash_get (tm->dev_instance_by_interface_id, args->id);
- if (p)
+ if (clib_bitmap_get (tm->tap_ids, args->id))
{
args->rv = VNET_API_ERROR_INVALID_INTERFACE;
args->error = clib_error_return (0, "interface already exists");
{
args->rv = VNET_API_ERROR_INVALID_INTERFACE;
args->error = clib_error_return (0, "interface already exists");
@@
-106,32
+105,22
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
}
else
{
}
else
{
- int tries = 1000;
- while (--tries)
- {
- args->id = tm->last_used_interface_id++;
- p = hash_get (tm->dev_instance_by_interface_id, args->id);
- if (!p)
- break;
- }
+ args->id = clib_bitmap_first_clear (tm->tap_ids);
+ }
- if (!tries)
- {
- args->rv = VNET_API_ERROR_UNSPECIFIED;
- args->error =
- clib_error_return (0, "cannot find free interface id");
- return;
- }
+ if (args->id > TAP_MAX_INSTANCE)
+ {
+ args->rv = VNET_API_ERROR_UNSPECIFIED;
+ args->error = clib_error_return (0, "cannot find free interface id");
+ return;
}
}
- memset (&ifr, 0, sizeof (ifr));
+
clib_
memset (&ifr, 0, sizeof (ifr));
pool_get (vim->interfaces, vif);
vif->dev_instance = vif - vim->interfaces;
vif->tap_fd = -1;
vif->id = args->id;
pool_get (vim->interfaces, vif);
vif->dev_instance = vif - vim->interfaces;
vif->tap_fd = -1;
vif->id = args->id;
- hash_set (tm->dev_instance_by_interface_id, vif->id, vif->dev_instance);
-
if ((vif->fd = open ("/dev/vhost-net", O_RDWR | O_NONBLOCK)) < 0)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_1;
if ((vif->fd = open ("/dev/vhost-net", O_RDWR | O_NONBLOCK)) < 0)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_1;
@@
-193,6
+182,7
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
if (args->host_namespace)
{
int fd;
if (args->host_namespace)
{
int fd;
+ int rc;
old_netns_fd = open ("/proc/self/ns/net", O_RDONLY);
if ((fd = open_netns_fd ((char *) args->host_namespace)) == -1)
{
old_netns_fd = open ("/proc/self/ns/net", O_RDONLY);
if ((fd = open_netns_fd ((char *) args->host_namespace)) == -1)
{
@@
-208,14
+198,15
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
args->rv = VNET_API_ERROR_NETLINK_ERROR;
goto error;
}
args->rv = VNET_API_ERROR_NETLINK_ERROR;
goto error;
}
- if (setns (fd, CLONE_NEWNET) == -1)
+ rc = setns (fd, CLONE_NEWNET);
+ close (fd);
+ if (rc == -1)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_3;
args->error = clib_error_return_unix (0, "setns '%s'",
args->host_namespace);
goto error;
}
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_3;
args->error = clib_error_return_unix (0, "setns '%s'",
args->host_namespace);
goto error;
}
- close (fd);
if ((vif->ifindex = if_nametoindex ((char *) args->host_if_name)) == 0)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_3;
if ((vif->ifindex = if_nametoindex ((char *) args->host_if_name)) == 0)
{
args->rv = VNET_API_ERROR_SYSCALL_ERROR_3;
@@
-328,7
+319,7
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
/* Set vhost memory table */
i = sizeof (struct vhost_memory) + sizeof (struct vhost_memory_region);
vhost_mem = clib_mem_alloc (i);
/* Set vhost memory table */
i = sizeof (struct vhost_memory) + sizeof (struct vhost_memory_region);
vhost_mem = clib_mem_alloc (i);
- memset (vhost_mem, 0, i);
+
clib_
memset (vhost_mem, 0, i);
vhost_mem->nregions = 1;
vhost_mem->regions[0].memory_size = (1ULL << 47) - 4096;
_IOCTL (vif->fd, VHOST_SET_MEM_TABLE, vhost_mem);
vhost_mem->nregions = 1;
vhost_mem->regions[0].memory_size = (1ULL << 47) - 4096;
_IOCTL (vif->fd, VHOST_SET_MEM_TABLE, vhost_mem);
@@
-383,6
+374,7
@@
tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args)
goto error;
}
goto error;
}
+ tm->tap_ids = clib_bitmap_set (tm->tap_ids, vif->id, 1);
sw = vnet_get_hw_sw_interface (vnm, vif->hw_if_index);
vif->sw_if_index = sw->sw_if_index;
args->sw_if_index = vif->sw_if_index;
sw = vnet_get_hw_sw_interface (vnm, vif->hw_if_index);
vif->sw_if_index = sw->sw_if_index;
args->sw_if_index = vif->sw_if_index;
@@
-414,7
+406,8
@@
error:
if (vif->fd != -1)
close (vif->fd);
vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i);
if (vif->fd != -1)
close (vif->fd);
vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i);
- memset (vif, 0, sizeof (virtio_if_t));
+ vec_free (vif->vrings);
+ clib_memset (vif, 0, sizeof (virtio_if_t));
pool_put (vim->interfaces, vif);
done:
pool_put (vim->interfaces, vif);
done:
@@
-456,9
+449,9
@@
tap_delete_if (vlib_main_t * vm, u32 sw_if_index)
vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i);
vec_free (vif->vrings);
vec_foreach_index (i, vif->vrings) virtio_vring_free (vm, vif, i);
vec_free (vif->vrings);
-
hash_unset (tm->dev_instance_by_interface_id, vif->id
);
+
tm->tap_ids = clib_bitmap_set (tm->tap_ids, vif->id, 0
);
clib_spinlock_free (&vif->lockp);
clib_spinlock_free (&vif->lockp);
- memset (vif, 0, sizeof (*vif));
+
clib_
memset (vif, 0, sizeof (*vif));
pool_put (mm->interfaces, vif);
return 0;
pool_put (mm->interfaces, vif);
return 0;
@@
-477,7
+470,7
@@
tap_dump_ifs (tap_interface_details_t ** out_tapids)
/* *INDENT-OFF* */
pool_foreach (vif, mm->interfaces,
vec_add2(r_tapids, tapid, 1);
/* *INDENT-OFF* */
pool_foreach (vif, mm->interfaces,
vec_add2(r_tapids, tapid, 1);
- memset (tapid, 0, sizeof (*tapid));
+
clib_
memset (tapid, 0, sizeof (*tapid));
tapid->id = vif->id;
tapid->sw_if_index = vif->sw_if_index;
hi = vnet_get_hw_interface (vnm, vif->hw_if_index);
tapid->id = vif->id;
tapid->sw_if_index = vif->sw_if_index;
hi = vnet_get_hw_interface (vnm, vif->hw_if_index);
@@
-523,8
+516,12
@@
static clib_error_t *
tap_init (vlib_main_t * vm)
{
tap_main_t *tm = &tap_main;
tap_init (vlib_main_t * vm)
{
tap_main_t *tm = &tap_main;
- tm->dev_instance_by_interface_id = hash_create (0, sizeof (uword));
- return 0;
+ clib_error_t *error = 0;
+
+ tm->log_default = vlib_log_register_class ("tap", 0);
+ vlib_log_debug (tm->log_default, "initialized");
+
+ return error;
}
VLIB_INIT_FUNCTION (tap_init);
}
VLIB_INIT_FUNCTION (tap_init);