X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Finterface_funcs.h;h=b84d151c86d4b789e53fd34de59036c649af271b;hb=1099b0db45a7a0bb597c4deb5b9387f5b6ae280f;hp=f3d3247fd5db187e4933f5f486d6e00ebd865814;hpb=cb9cadad578297ffd78fa8a33670bdf1ab669e7e;p=vpp.git diff --git a/vnet/vnet/interface_funcs.h b/vnet/vnet/interface_funcs.h index f3d3247fd5d..b84d151c86d 100644 --- a/vnet/vnet/interface_funcs.h +++ b/vnet/vnet/interface_funcs.h @@ -42,17 +42,21 @@ always_inline vnet_hw_interface_t * vnet_get_hw_interface (vnet_main_t * vnm, u32 hw_if_index) -{ return pool_elt_at_index (vnm->interface_main.hw_interfaces, hw_if_index); } +{ + return pool_elt_at_index (vnm->interface_main.hw_interfaces, hw_if_index); +} always_inline vnet_sw_interface_t * vnet_get_sw_interface (vnet_main_t * vnm, u32 sw_if_index) -{ return pool_elt_at_index (vnm->interface_main.sw_interfaces, sw_if_index); } +{ + return pool_elt_at_index (vnm->interface_main.sw_interfaces, sw_if_index); +} always_inline vnet_sw_interface_t * vnet_get_hw_sw_interface (vnet_main_t * vnm, u32 hw_if_index) { - vnet_hw_interface_t * hw = vnet_get_hw_interface (vnm, hw_if_index); - vnet_sw_interface_t * sw = vnet_get_sw_interface (vnm, hw->sw_if_index); + vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index); + vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, hw->sw_if_index); ASSERT (sw->type == VNET_SW_INTERFACE_TYPE_HARDWARE); return sw; } @@ -60,7 +64,7 @@ vnet_get_hw_sw_interface (vnet_main_t * vnm, u32 hw_if_index) always_inline vnet_sw_interface_t * vnet_get_sup_sw_interface (vnet_main_t * vnm, u32 sw_if_index) { - vnet_sw_interface_t * sw = vnet_get_sw_interface (vnm, sw_if_index); + vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, sw_if_index); if (sw->type == VNET_SW_INTERFACE_TYPE_SUB) sw = vnet_get_sw_interface (vnm, sw->sup_sw_if_index); return sw; @@ -69,91 +73,185 @@ vnet_get_sup_sw_interface (vnet_main_t * vnm, u32 sw_if_index) always_inline vnet_hw_interface_t * vnet_get_sup_hw_interface (vnet_main_t * vnm, u32 sw_if_index) { - vnet_sw_interface_t * sw = vnet_get_sup_sw_interface (vnm, sw_if_index); + vnet_sw_interface_t *sw = vnet_get_sup_sw_interface (vnm, sw_if_index); ASSERT (sw->type == VNET_SW_INTERFACE_TYPE_HARDWARE); return vnet_get_hw_interface (vnm, sw->hw_if_index); } always_inline vnet_hw_interface_class_t * vnet_get_hw_interface_class (vnet_main_t * vnm, u32 hw_class_index) -{ return vec_elt_at_index (vnm->interface_main.hw_interface_classes, hw_class_index); } +{ + return vec_elt_at_index (vnm->interface_main.hw_interface_classes, + hw_class_index); +} always_inline vnet_device_class_t * vnet_get_device_class (vnet_main_t * vnm, u32 dev_class_index) -{ return vec_elt_at_index (vnm->interface_main.device_classes, dev_class_index); } +{ + return vec_elt_at_index (vnm->interface_main.device_classes, + dev_class_index); +} + +static inline u8 * +vnet_get_sw_interface_tag (vnet_main_t * vnm, u32 sw_if_index) +{ + uword *p; + p = hash_get (vnm->interface_tag_by_sw_if_index, sw_if_index); + if (p) + return ((u8 *) p[0]); + return 0; +} + +static inline void +vnet_set_sw_interface_tag (vnet_main_t * vnm, u8 * tag, u32 sw_if_index) +{ + uword *p; + p = hash_get (vnm->interface_tag_by_sw_if_index, sw_if_index); + if (p) + { + u8 *oldtag = (u8 *) p[0]; + hash_unset (vnm->interface_tag_by_sw_if_index, sw_if_index); + vec_free (oldtag); + } + + hash_set (vnm->interface_tag_by_sw_if_index, sw_if_index, tag); +} + +static inline void +vnet_clear_sw_interface_tag (vnet_main_t * vnm, u32 sw_if_index) +{ + uword *p; + p = hash_get (vnm->interface_tag_by_sw_if_index, sw_if_index); + if (p) + { + u8 *oldtag = (u8 *) p[0]; + hash_unset (vnm->interface_tag_by_sw_if_index, sw_if_index); + vec_free (oldtag); + } +} + +/** + * Call back walk type for walking SW indices on a HW interface + */ +typedef void (*vnet_hw_sw_interface_walk_t) (vnet_main_t * vnm, + u32 sw_if_index, void *ctx); + +/** + * @brief + * Walk the SW interfaces on a HW interface - this is the super + * interface and any sub-interfaces. + */ +void vnet_hw_interface_walk_sw (vnet_main_t * vnm, + u32 hw_if_index, + vnet_hw_sw_interface_walk_t fn, void *ctx); /* Register a hardware interface instance. */ u32 vnet_register_interface (vnet_main_t * vnm, u32 dev_class_index, u32 dev_instance, - u32 hw_class_index, - u32 hw_instance); + u32 hw_class_index, u32 hw_instance); /* Creates a software interface given template. */ -clib_error_t * -vnet_create_sw_interface (vnet_main_t * vnm, vnet_sw_interface_t * template, u32 * sw_if_index); +clib_error_t *vnet_create_sw_interface (vnet_main_t * vnm, + vnet_sw_interface_t * template, + u32 * sw_if_index); void vnet_delete_hw_interface (vnet_main_t * vnm, u32 hw_if_index); void vnet_delete_sw_interface (vnet_main_t * vnm, u32 sw_if_index); +int vnet_sw_interface_is_p2p (vnet_main_t * vnm, u32 sw_if_index); always_inline uword vnet_sw_interface_get_flags (vnet_main_t * vnm, u32 sw_if_index) { - vnet_sw_interface_t * sw = vnet_get_sw_interface (vnm, sw_if_index); + vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, sw_if_index); return sw->flags; } always_inline uword vnet_sw_interface_is_admin_up (vnet_main_t * vnm, u32 sw_if_index) -{ return (vnet_sw_interface_get_flags (vnm, sw_if_index) & VNET_SW_INTERFACE_FLAG_ADMIN_UP) != 0; } +{ + return (vnet_sw_interface_get_flags (vnm, sw_if_index) & + VNET_SW_INTERFACE_FLAG_ADMIN_UP) != 0; +} always_inline uword vnet_hw_interface_get_flags (vnet_main_t * vnm, u32 hw_if_index) { - vnet_hw_interface_t * hw = vnet_get_hw_interface (vnm, hw_if_index); + vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index); return hw->flags; } +always_inline uword +vnet_hw_interface_get_mtu (vnet_main_t * vnm, u32 hw_if_index, + vlib_rx_or_tx_t dir) +{ + vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index); + return hw->max_l3_packet_bytes[dir]; +} + +always_inline uword +vnet_sw_interface_get_mtu (vnet_main_t * vnm, u32 sw_if_index, + vlib_rx_or_tx_t dir) +{ + vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index); + return (hw->max_l3_packet_bytes[dir]); +} + always_inline uword vnet_hw_interface_is_link_up (vnet_main_t * vnm, u32 hw_if_index) -{ return (vnet_hw_interface_get_flags (vnm, hw_if_index) & VNET_HW_INTERFACE_FLAG_LINK_UP) != 0; } +{ + return (vnet_hw_interface_get_flags (vnm, hw_if_index) & + VNET_HW_INTERFACE_FLAG_LINK_UP) != 0; +} always_inline vlib_frame_t * vnet_get_frame_to_sw_interface (vnet_main_t * vnm, u32 sw_if_index) { - vnet_hw_interface_t * hw = vnet_get_sup_hw_interface (vnm, sw_if_index); + vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index); return vlib_get_frame_to_node (vnm->vlib_main, hw->output_node_index); } always_inline void -vnet_put_frame_to_sw_interface (vnet_main_t * vnm, u32 sw_if_index, vlib_frame_t * f) +vnet_put_frame_to_sw_interface (vnet_main_t * vnm, u32 sw_if_index, + vlib_frame_t * f) { - vnet_hw_interface_t * hw = vnet_get_sup_hw_interface (vnm, sw_if_index); + vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index); return vlib_put_frame_to_node (vnm->vlib_main, hw->output_node_index, f); } /* Change interface flags (e.g. up, down, enable, disable). */ -clib_error_t * -vnet_hw_interface_set_flags (vnet_main_t * vnm, u32 hw_if_index, u32 flags); +clib_error_t *vnet_hw_interface_set_flags (vnet_main_t * vnm, u32 hw_if_index, + u32 flags); /* Change interface flags (e.g. up, down, enable, disable). */ -clib_error_t * -vnet_sw_interface_set_flags (vnet_main_t * vnm, u32 sw_if_index, u32 flags); +clib_error_t *vnet_sw_interface_set_flags (vnet_main_t * vnm, u32 sw_if_index, + u32 flags); /* Change interface class. */ -clib_error_t * -vnet_hw_interface_set_class (vnet_main_t * vnm, u32 hw_if_index, u32 new_hw_class_index); +clib_error_t *vnet_hw_interface_set_class (vnet_main_t * vnm, u32 hw_if_index, + u32 new_hw_class_index); /* Redirect rx pkts to node */ int vnet_hw_interface_rx_redirect_to_node (vnet_main_t * vnm, u32 hw_if_index, - u32 node_index); + u32 node_index); + +void vnet_hw_interface_init_for_class (vnet_main_t * vnm, u32 hw_if_index, + u32 hw_class_index, u32 hw_instance); + +/* Rename interface */ +clib_error_t *vnet_rename_interface (vnet_main_t * vnm, u32 hw_if_index, + char *new_name); -void vnet_hw_interface_init_for_class (vnet_main_t * vnm, u32 hw_if_index, u32 hw_class_index, u32 hw_instance); +/* Change interface mac address*/ +clib_error_t *vnet_hw_interface_change_mac_address (vnet_main_t * vnm, + u32 hw_if_index, + u64 mac_address); /* Formats sw/hw interface. */ format_function_t format_vnet_hw_interface; format_function_t format_vnet_sw_interface; format_function_t format_vnet_sw_interface_name; +format_function_t format_vnet_sw_interface_name_override; format_function_t format_vnet_sw_if_index_name; format_function_t format_vnet_sw_interface_flags; @@ -166,7 +264,8 @@ unformat_function_t unformat_vnet_hw_interface_flags; unformat_function_t unformat_vnet_sw_interface_flags; /* Node runtime for interface output function. */ -typedef struct { +typedef struct +{ u32 hw_if_index; u32 sw_if_index; u32 dev_instance; @@ -174,39 +273,46 @@ typedef struct { } vnet_interface_output_runtime_t; /* Interface output functions. */ -uword -vnet_interface_output_node (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * frame); -uword -vnet_interface_output_node_no_flatten (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * frame); - -word vnet_sw_interface_compare (vnet_main_t * vnm, uword sw_if_index0, uword sw_if_index1); -word vnet_hw_interface_compare (vnet_main_t * vnm, uword hw_if_index0, uword hw_if_index1); - -typedef enum { -#define _(sym,str) VNET_INTERFACE_OUTPUT_NEXT_##sym, - foreach_intf_output_feat -#undef _ +void *vnet_interface_output_node_multiarch_select (void); +void *vnet_interface_output_node_flatten_multiarch_select (void); + +word vnet_sw_interface_compare (vnet_main_t * vnm, uword sw_if_index0, + uword sw_if_index1); +word vnet_hw_interface_compare (vnet_main_t * vnm, uword hw_if_index0, + uword hw_if_index1); + +typedef enum +{ VNET_INTERFACE_OUTPUT_NEXT_DROP, VNET_INTERFACE_OUTPUT_NEXT_TX, } vnet_interface_output_next_t; -typedef enum { +typedef enum +{ VNET_INTERFACE_TX_NEXT_DROP, VNET_INTERFACE_TX_N_NEXT, } vnet_interface_tx_next_t; -typedef enum { +#define VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT VNET_INTERFACE_TX_N_NEXT + +typedef enum +{ VNET_INTERFACE_OUTPUT_ERROR_INTERFACE_DOWN, VNET_INTERFACE_OUTPUT_ERROR_INTERFACE_DELETED, } vnet_interface_output_error_t; /* Format for interface output traces. */ -u8 * format_vnet_interface_output_trace (u8 * s, va_list * va); +u8 *format_vnet_interface_output_trace (u8 * s, va_list * va); -serialize_function_t serialize_vnet_interface_state, unserialize_vnet_interface_state; +serialize_function_t serialize_vnet_interface_state, + unserialize_vnet_interface_state; #endif /* included_vnet_interface_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */