X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdevices%2Fvirtio%2Fvhost_user.h;h=f14f26a71e4f76e1c0db787500d4c5774ca61c6c;hb=97c998c2813d7cea4a067a0b8ff246cad4924bf3;hp=ff0669598c98449a5d2148a14fcb475497d4522b;hpb=e7cde313e1df14ea118386d678c3e47219090a0d;p=vpp.git diff --git a/src/vnet/devices/virtio/vhost_user.h b/src/vnet/devices/virtio/vhost_user.h index ff0669598c9..f14f26a71e4 100644 --- a/src/vnet/devices/virtio/vhost_user.h +++ b/src/vnet/devices/virtio/vhost_user.h @@ -36,7 +36,7 @@ #define VHOST_USER_PROTOCOL_FEATURES ((1ULL << VHOST_USER_PROTOCOL_F_MQ) | \ (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD)) -/* If multiqueue is provided by host, then we suppport it. */ +/* If multiqueue is provided by host, then we support it. */ #define VIRTIO_NET_CTRL_MQ 4 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1 @@ -45,20 +45,25 @@ #define VRING_USED_F_NO_NOTIFY 1 #define VRING_AVAIL_F_NO_INTERRUPT 1 -#define DBG_SOCK(args...) \ - { \ - vhost_user_main_t *_vum = &vhost_user_main; \ - if (_vum->debug) \ - clib_warning(args); \ - }; - -#define VHOST_DEBUG_VQ 0 - -#if VHOST_DEBUG_VQ == 1 -#define DBG_VQ(args...) clib_warning(args); -#else -#define DBG_VQ(args...) -#endif +#define vu_log_debug(dev, f, ...) \ +{ \ + vlib_log(VLIB_LOG_LEVEL_DEBUG, vhost_user_main.log_default, "%U: " f, \ + format_vnet_hw_if_index_name, vnet_get_main(), \ + dev->hw_if_index, ##__VA_ARGS__); \ +}; + +#define vu_log_warn(dev, f, ...) \ +{ \ + vlib_log(VLIB_LOG_LEVEL_WARNING, vhost_user_main.log_default, "%U: " f, \ + format_vnet_hw_if_index_name, vnet_get_main(), \ + dev->hw_if_index, ##__VA_ARGS__); \ +}; +#define vu_log_err(dev, f, ...) \ +{ \ + vlib_log(VLIB_LOG_LEVEL_ERR, vhost_user_main.log_default, "%U: " f, \ + format_vnet_hw_if_index_name, vnet_get_main(), \ + dev->hw_if_index, ##__VA_ARGS__); \ +}; #define UNIX_GET_FD(unixfd_idx) ({ \ typeof(unixfd_idx) __unixfd_idx = (unixfd_idx); \ @@ -80,6 +85,14 @@ typedef enum } virtio_trace_flag_t; #define foreach_virtio_net_feature \ + _ (VIRTIO_NET_F_CSUM, 0) \ + _ (VIRTIO_NET_F_GUEST_CSUM, 1) \ + _ (VIRTIO_NET_F_GUEST_TSO4, 7) \ + _ (VIRTIO_NET_F_GUEST_TSO6, 8) \ + _ (VIRTIO_NET_F_GUEST_UFO, 10) \ + _ (VIRTIO_NET_F_HOST_TSO4, 11) \ + _ (VIRTIO_NET_F_HOST_TSO6, 12) \ + _ (VIRTIO_NET_F_HOST_UFO, 14) \ _ (VIRTIO_NET_F_MRG_RXBUF, 15) \ _ (VIRTIO_NET_F_CTRL_VQ, 17) \ _ (VIRTIO_NET_F_GUEST_ANNOUNCE, 21) \ @@ -97,14 +110,32 @@ typedef enum #undef _ } virtio_net_feature_t; +#define FEATURE_VIRTIO_NET_F_HOST_TSO_FEATURE_BITS \ + ((1ULL << FEAT_VIRTIO_NET_F_CSUM) | \ + (1ULL << FEAT_VIRTIO_NET_F_HOST_UFO) | \ + (1ULL << FEAT_VIRTIO_NET_F_HOST_TSO4) | \ + (1ULL << FEAT_VIRTIO_NET_F_HOST_TSO6)) + +#define FEATURE_VIRTIO_NET_F_GUEST_TSO_FEATURE_BITS \ + ((1ULL << FEAT_VIRTIO_NET_F_GUEST_CSUM) | \ + (1ULL << FEAT_VIRTIO_NET_F_GUEST_UFO) | \ + (1ULL << FEAT_VIRTIO_NET_F_GUEST_TSO4) | \ + (1ULL << FEAT_VIRTIO_NET_F_GUEST_TSO6)) + +#define FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS \ + (FEATURE_VIRTIO_NET_F_HOST_TSO_FEATURE_BITS | \ + FEATURE_VIRTIO_NET_F_GUEST_TSO_FEATURE_BITS) + int vhost_user_create_if (vnet_main_t * vnm, vlib_main_t * vm, const char *sock_filename, u8 is_server, u32 * sw_if_index, u64 feature_mask, - u8 renumber, u32 custom_dev_instance, u8 * hwaddr); + u8 renumber, u32 custom_dev_instance, u8 * hwaddr, + u8 enable_gso); int vhost_user_modify_if (vnet_main_t * vnm, vlib_main_t * vm, const char *sock_filename, u8 is_server, u32 sw_if_index, u64 feature_mask, - u8 renumber, u32 custom_dev_instance); + u8 renumber, u32 custom_dev_instance, + u8 enable_gso); int vhost_user_delete_if (vnet_main_t * vnm, vlib_main_t * vm, u32 sw_if_index); @@ -232,6 +263,9 @@ typedef struct vring_desc_t *desc; vring_avail_t *avail; vring_used_t *used; + uword desc_user_addr; + uword used_user_addr; + uword avail_user_addr; f64 int_deadline; u8 started; u8 enabled; @@ -245,6 +279,14 @@ typedef struct /* The rx queue policy (interrupt/adaptive/polling) for this queue */ u32 mode; + + /* + * It contains the device queue number. -1 if it does not. The idea is + * to not invoke vnet_hw_interface_assign_rx_thread and + * vnet_hw_interface_unassign_rx_thread more than once for the duration of + * the interface even if it is disconnected and reconnected. + */ + i16 qid; } vhost_user_vring_t; #define VHOST_USER_EVENT_START_TIMER 1 @@ -253,7 +295,7 @@ typedef struct typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); - u32 is_up; + u32 is_ready; u32 admin_up; u32 unix_server_index; u32 clib_file_index; @@ -289,8 +331,7 @@ typedef struct u8 use_tx_spinlock; u16 *per_cpu_tx_qid; - /* Vector of active rx queues for this interface */ - u16 *rx_queues; + u8 enable_gso; } vhost_user_intf_t; typedef struct @@ -345,8 +386,11 @@ typedef struct /* The number of rx interface/queue pairs in interrupt mode */ u32 ifq_count; - /* debug on or off */ - u8 debug; + /* logging */ + vlib_log_class_t log_default; + + /* gso interface count */ + u32 gso_count; } vhost_user_main_t; typedef struct