diff --git a/router/router/tap_inject.c b/router/router/tap_inject.c index 59916b4..6d164f6 100644 --- a/router/router/tap_inject.c +++ b/router/router/tap_inject.c @@ -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 (); @@ -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; @@ -56,6 +60,7 @@ 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; @@ -63,6 +68,16 @@ tap_inject_delete_tap (u32 sw_if_index) 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) { diff --git a/router/router/tap_inject.h b/router/router/tap_inject.h index ec5121a..876890c 100644 --- a/router/router/tap_inject.h +++ b/router/router/tap_inject.h @@ -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; @@ -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); diff --git a/router/router/tap_inject_tap.c b/router/router/tap_inject_tap.c index 6b4d159..2483b0a 100644 --- a/router/router/tap_inject_tap.c +++ b/router/router/tap_inject_tap.c @@ -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; @@ -121,9 +122,9 @@ 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; } @@ -131,12 +132,18 @@ tap_inject_tap_connect (vnet_hw_interface_t * hw) 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);