/* * Copyright 2016 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _TAP_INJECT_H #define _TAP_INJECT_H #include #include #ifndef ETHER_ADDR_LEN #define ETHER_ADDR_LEN 6 #endif typedef struct { /* * tap-inject can be enabled or disabled in config file or during runtime. * When disabled in config, it is not possible to enable during runtime. * * When the netlink-only option is used, netlink configuration is monitored * and mirrored to the data plane but no traffic is passed between the host * and the data plane. */ #define TAP_INJECT_F_CONFIG_ENABLE (1U << 0) #define TAP_INJECT_F_CONFIG_DISABLE (1U << 1) #define TAP_INJECT_F_CONFIG_NETLINK (1U << 2) #define TAP_INJECT_F_ENABLED (1U << 3) u32 flags; u32 *sw_if_index_to_tap_fd; u32 *sw_if_index_to_tap_if_index; u32 *tap_fd_to_sw_if_index; u32 *tap_if_index_to_sw_if_index; u32 *interfaces_to_enable; u32 *interfaces_to_disable; u32 *rx_file_descriptors; u32 rx_node_index; u32 tx_node_index; u32 neighbor_node_index; u32 *rx_buffers; } tap_inject_main_t; 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_delete_tap (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); static inline int tap_inject_is_enabled (void) { tap_inject_main_t *im = tap_inject_get_main (); return !!(im->flags & TAP_INJECT_F_ENABLED); } static inline int tap_inject_is_config_enabled (void) { tap_inject_main_t *im = tap_inject_get_main (); return !!(im->flags & TAP_INJECT_F_CONFIG_ENABLE); } static inline int tap_inject_is_config_disabled (void) { tap_inject_main_t *im = tap_inject_get_main (); return !!(im->flags & TAP_INJECT_F_CONFIG_DISABLE); } /* Netlink */ void tap_inject_enable_netlink (void); /* Tap */ clib_error_t *tap_inject_tap_connect (vnet_hw_interface_t *hw); clib_error_t *tap_inject_tap_disconnect (u32 sw_if_index); u8 *format_tap_inject_tap_name (u8 *s, va_list *args); #endif /* _TAP_INJECT_H */