Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion router/router/tap_inject.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ tap_inject_get_main (void)
}

void
tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index)
tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index, u32 clib_file_index)
{
tap_inject_main_t * im = tap_inject_get_main ();

Expand All @@ -41,6 +41,10 @@ tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index)

vec_validate_init_empty (im->tap_fd_to_sw_if_index, tap_fd, ~0);

vec_validate_init_empty (im->sw_if_index_to_clib_file_index, sw_if_index, ~0);

im->sw_if_index_to_clib_file_index[sw_if_index] = clib_file_index;

im->sw_if_index_to_tap_fd[sw_if_index] = tap_fd;
im->sw_if_index_to_tap_if_index[sw_if_index] = tap_if_index;

Expand All @@ -56,13 +60,24 @@ tap_inject_delete_tap (u32 sw_if_index)
u32 tap_fd = im->sw_if_index_to_tap_fd[sw_if_index];
u32 tap_if_index = im->sw_if_index_to_tap_if_index[sw_if_index];

im->sw_if_index_to_clib_file_index[sw_if_index] = ~0;
im->sw_if_index_to_tap_if_index[sw_if_index] = ~0;
im->sw_if_index_to_tap_fd[sw_if_index] = ~0;
im->tap_fd_to_sw_if_index[tap_fd] = ~0;

hash_unset (im->tap_if_index_to_sw_if_index, tap_if_index);
}

u32
tap_inject_lookup_clib_file_index (u32 sw_if_index)
{
tap_inject_main_t * im = tap_inject_get_main ();

vec_validate_init_empty (im->sw_if_index_to_clib_file_index, sw_if_index, ~0);
return im->sw_if_index_to_clib_file_index[sw_if_index];
}


u32
tap_inject_lookup_tap_fd (u32 sw_if_index)
{
Expand Down
5 changes: 4 additions & 1 deletion router/router/tap_inject.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ typedef struct {
u32 * sw_if_index_to_tap_if_index;
u32 * tap_fd_to_sw_if_index;
u32 * tap_if_index_to_sw_if_index;
u32 * sw_if_index_to_clib_file_index;

u32 * interfaces_to_enable;
u32 * interfaces_to_disable;
Expand All @@ -61,9 +62,11 @@ typedef struct {

tap_inject_main_t * tap_inject_get_main (void);

void tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index);
void tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index,u32 clib_file_index);
void tap_inject_delete_tap (u32 sw_if_index);

u32 tap_inject_lookup_clib_file_index (u32 sw_if_index);

u32 tap_inject_lookup_tap_fd (u32 sw_if_index);
u32 tap_inject_lookup_sw_if_index_from_tap_fd (u32 tap_fd);
u32 tap_inject_lookup_sw_if_index_from_tap_if_index (u32 tap_if_index);
Expand Down
13 changes: 10 additions & 3 deletions router/router/tap_inject_tap.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ tap_inject_tap_connect (vnet_hw_interface_t * hw)
int fd;
struct ifreq ifr;
clib_file_t template;
u32 clib_file_index;
u32 tap_fd;
u8 * name;

Expand Down Expand Up @@ -121,22 +122,28 @@ tap_inject_tap_connect (vnet_hw_interface_t * hw)
template.file_descriptor = tap_fd;
template.description = name;

clib_file_add (&file_main, &template);
clib_file_index = clib_file_add (&file_main, &template);

tap_inject_insert_tap (sw->sw_if_index, tap_fd, ifr.ifr_ifindex);
tap_inject_insert_tap (sw->sw_if_index, tap_fd, ifr.ifr_ifindex,clib_file_index);

return 0;
}

clib_error_t *
tap_inject_tap_disconnect (u32 sw_if_index)
{
u32 tap_fd;
u32 tap_fd,clib_file_index;

tap_fd = tap_inject_lookup_tap_fd (sw_if_index);
if (tap_fd == ~0)
return clib_error_return (0, "failed to disconnect tap");

clib_file_index = tap_inject_lookup_clib_file_index(sw_if_index);
if (clib_file_index != ~0)
{
clib_file_del_by_index(&file_main, clib_file_index);
}

tap_inject_delete_tap (sw_if_index);

close (tap_fd);
Expand Down