From d4f88cc0967ea1de66396ac07b20cf6e33a3fa1a Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 5 Jan 2022 01:52:38 +0100 Subject: interface: refactor interface capabilities code Make it shorter to type, easier to debug, make adding callbacks in future simpler. Type: improvement Change-Id: I6cdd6375e36da23bd452a7c7273ff42789e94433 Signed-off-by: Damjan Marion --- src/plugins/af_xdp/device.c | 5 +- src/plugins/avf/device.c | 13 ++-- src/plugins/dpdk/device/common.c | 4 +- src/plugins/dpdk/device/init.c | 18 ++--- src/plugins/lldp/lldp_cli.c | 4 +- src/plugins/memif/memif.c | 4 +- src/plugins/rdma/device.c | 5 +- src/plugins/vmxnet3/vmxnet3.c | 7 +- src/vnet/CMakeLists.txt | 1 + src/vnet/bonding/cli.c | 11 ++-- src/vnet/devices/af_packet/af_packet.c | 8 +-- src/vnet/devices/tap/tap.c | 28 ++++---- src/vnet/devices/virtio/device.c | 4 +- src/vnet/devices/virtio/pci.c | 18 ++--- src/vnet/devices/virtio/vhost_user.c | 10 ++- src/vnet/ethernet/interface.c | 2 +- src/vnet/gso/node.c | 15 ++--- src/vnet/interface.h | 116 +++++++++++++++------------------ src/vnet/interface/caps.c | 63 ++++++++++++++++++ src/vnet/interface_funcs.h | 25 +++++++ src/vnet/interface_output.c | 3 +- src/vnet/pg/stream.c | 2 +- src/vnet/tcp/tcp_input.c | 2 +- 23 files changed, 212 insertions(+), 156 deletions(-) create mode 100644 src/vnet/interface/caps.c (limited to 'src') diff --git a/src/plugins/af_xdp/device.c b/src/plugins/af_xdp/device.c index d27901b70b3..c45e873f662 100644 --- a/src/plugins/af_xdp/device.c +++ b/src/plugins/af_xdp/device.c @@ -508,7 +508,6 @@ af_xdp_create_if (vlib_main_t * vm, af_xdp_create_if_args_t * args) af_xdp_main_t *am = &af_xdp_main; af_xdp_device_t *ad; vnet_sw_interface_t *sw; - vnet_hw_interface_t *hw; int rxq_num, txq_num, q_num; int ns_fds[2]; int i, ret; @@ -658,9 +657,9 @@ af_xdp_create_if (vlib_main_t * vm, af_xdp_create_if_args_t * args) } sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index); - hw = vnet_get_hw_interface (vnm, ad->hw_if_index); args->sw_if_index = ad->sw_if_index = sw->sw_if_index; - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + + vnet_hw_if_set_caps (vnm, ad->hw_if_index, VNET_HW_IF_CAP_INT_MODE); vnet_hw_if_set_input_node (vnm, ad->hw_if_index, af_xdp_input_node.index); diff --git a/src/plugins/avf/device.c b/src/plugins/avf/device.c index cc2415a9293..627ead6f4e5 100644 --- a/src/plugins/avf/device.c +++ b/src/plugins/avf/device.c @@ -1729,22 +1729,19 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) if (error) goto error; - /* Indicate ability to support L3 DMAC filtering and - * initialize interface to L3 non-promisc mode */ - vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, ad->hw_if_index); - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER | - VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; ethernet_set_flags (vnm, ad->hw_if_index, ETHERNET_INTERFACE_FLAG_DEFAULT_L3); vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index); args->sw_if_index = ad->sw_if_index = sw->sw_if_index; - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, ad->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; vnet_hw_if_set_input_node (vnm, ad->hw_if_index, avf_input_node.index); + /* set hw interface caps */ + vnet_hw_if_set_caps (vnm, ad->hw_if_index, + VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_MAC_FILTER | + VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO); + for (i = 0; i < ad->n_rx_queues; i++) { u32 qi, fi; diff --git a/src/plugins/dpdk/device/common.c b/src/plugins/dpdk/device/common.c index ce91df59868..b0aaaaf9d47 100644 --- a/src/plugins/dpdk/device/common.c +++ b/src/plugins/dpdk/device/common.c @@ -212,7 +212,7 @@ dpdk_setup_interrupts (dpdk_device_t *xd) if (xd->flags & DPDK_DEVICE_FLAG_INT_SUPPORTED) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hi->caps |= VNET_HW_IF_CAP_INT_MODE; for (int q = 0; q < xd->conf.n_rx_queues; q++) { dpdk_rx_queue_t *rxq = vec_elt_at_index (xd->rx_queues, q); @@ -221,7 +221,7 @@ dpdk_setup_interrupts (dpdk_device_t *xd) if (rxq->efd < 0) { xd->flags &= ~DPDK_DEVICE_FLAG_INT_SUPPORTED; - hi->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hi->caps &= ~VNET_HW_IF_CAP_INT_MODE; break; } f.read_function = dpdk_rx_read_ready; diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c index e2c919428f2..80d85a856de 100644 --- a/src/plugins/dpdk/device/init.c +++ b/src/plugins/dpdk/device/init.c @@ -801,7 +801,7 @@ dpdk_lib_init (dpdk_main_t * dm) /* Indicate ability to support L3 DMAC filtering and * initialize interface to L3 non-promisc mode */ - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER; + hi->caps |= VNET_HW_IF_CAP_MAC_FILTER; ethernet_set_flags (vnm, xd->hw_if_index, ETHERNET_INTERFACE_FLAG_DEFAULT_L3); } @@ -809,22 +809,22 @@ dpdk_lib_init (dpdk_main_t * dm) if (xd->conf.no_tx_checksum_offload == 0) if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + hi->caps |= VNET_HW_IF_CAP_TX_IP4_CKSUM | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; if (xd->conf.enable_outer_checksum_offload) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_OUTER_CKSUM; + hi->caps |= VNET_HW_IF_CAP_TX_IP4_OUTER_CKSUM | + VNET_HW_IF_CAP_TX_UDP_OUTER_CKSUM; } } if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL) { /*tcp_udp checksum must be enabled*/ if ((xd->conf.enable_tcp_udp_checksum) && - (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM)) + (hi->caps & VNET_HW_IF_CAP_TX_CKSUM)) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; + hi->caps |= VNET_HW_IF_CAP_TCP_GSO; xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO; if (xd->conf.enable_outer_checksum_offload && @@ -832,7 +832,7 @@ dpdk_lib_init (dpdk_main_t * dm) { xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_VXLAN_TNL_TSO; - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO; + hi->caps |= VNET_HW_IF_CAP_VXLAN_TNL_GSO; } } else diff --git a/src/plugins/lldp/lldp_cli.c b/src/plugins/lldp/lldp_cli.c index 84757977d83..317595ff6a5 100644 --- a/src/plugins/lldp/lldp_cli.c +++ b/src/plugins/lldp/lldp_cli.c @@ -103,7 +103,7 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4, } /* Add MAC address to an interface's filter */ - if (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER) + if (hi->caps & VNET_HW_IF_CAP_MAC_FILTER) { error = vnet_hw_interface_add_del_mac_address (lm->vnet_main, @@ -130,7 +130,7 @@ lldp_cfg_intf_set (u32 hw_if_index, u8 ** port_desc, u8 ** mgmt_ip4, lldp_intf_t *n = lldp_get_intf (lm, hi->sw_if_index); lldp_delete_intf (lm, n); /* Remove MAC address from the interface's filter */ - if ((n) && (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER)) + if ((n) && (hi->caps & VNET_HW_IF_CAP_MAC_FILTER)) { error = vnet_hw_interface_add_del_mac_address (lm->vnet_main, diff --git a/src/plugins/memif/memif.c b/src/plugins/memif/memif.c index 2d5866a9d0d..d7b82ceee5e 100644 --- a/src/plugins/memif/memif.c +++ b/src/plugins/memif/memif.c @@ -902,7 +902,6 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args) clib_error_t *error = 0; int ret = 0; uword *p; - vnet_hw_interface_t *hw; memif_socket_file_t *msf = 0; int rv = 0; @@ -1090,8 +1089,7 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args) mif->flags |= MEMIF_IF_FLAG_ZERO_COPY; } - hw = vnet_get_hw_interface (vnm, mif->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + vnet_hw_if_set_caps (vnm, mif->hw_if_index, VNET_HW_IF_CAP_INT_MODE); vnet_hw_if_set_input_node (vnm, mif->hw_if_index, memif_input_node.index); mhash_set (&msf->dev_instance_by_id, &mif->id, mif->dev_instance, 0); diff --git a/src/plugins/rdma/device.c b/src/plugins/rdma/device.c index 1198d99b14e..3ea8e44b3e7 100644 --- a/src/plugins/rdma/device.c +++ b/src/plugins/rdma/device.c @@ -362,8 +362,7 @@ rdma_register_interface (vnet_main_t * vnm, rdma_device_t * rd) /* Indicate ability to support L3 DMAC filtering and * initialize interface to L3 non-promisc mode */ - vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, rd->hw_if_index); - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER; + vnet_hw_if_set_caps (vnm, rd->hw_if_index, VNET_HW_IF_CAP_MAC_FILTER); ethernet_set_flags (vnm, rd->hw_if_index, ETHERNET_INTERFACE_FLAG_DEFAULT_L3); return err; @@ -1022,7 +1021,7 @@ are explicitly disabled, and if the interface supports it.*/ /* * FIXME: add support for interrupt mode * vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, rd->hw_if_index); - * hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + * hw->caps |= VNET_HW_IF_CAP_INT_MODE; */ vnet_hw_if_set_input_node (vnm, rd->hw_if_index, rdma_input_node.index); diff --git a/src/plugins/vmxnet3/vmxnet3.c b/src/plugins/vmxnet3/vmxnet3.c index 16d7d86fb3a..8059d03c595 100644 --- a/src/plugins/vmxnet3/vmxnet3.c +++ b/src/plugins/vmxnet3/vmxnet3.c @@ -818,12 +818,11 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) args->sw_if_index = sw->sw_if_index; vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hw->caps |= VNET_HW_IF_CAP_INT_MODE; if (vd->gso_enable) { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM); } vnet_hw_if_set_input_node (vnm, vd->hw_if_index, vmxnet3_input_node.index); diff --git a/src/vnet/CMakeLists.txt b/src/vnet/CMakeLists.txt index 1c0834a181e..1b04db677c8 100644 --- a/src/vnet/CMakeLists.txt +++ b/src/vnet/CMakeLists.txt @@ -35,6 +35,7 @@ list(APPEND VNET_SOURCES interface_cli.c interface_format.c interface_output.c + interface/caps.c interface/rx_queue.c interface/tx_queue.c interface/runtime.c diff --git a/src/vnet/bonding/cli.c b/src/vnet/bonding/cli.c index a24d1104486..2045ff43c53 100644 --- a/src/vnet/bonding/cli.c +++ b/src/vnet/bonding/cli.c @@ -380,7 +380,6 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) vnet_main_t *vnm = vnet_get_main (); vnet_sw_interface_t *sw; bond_if_t *bif; - vnet_hw_interface_t *hw; if ((args->mode == BOND_MODE_LACP) && bm->lacp_plugin_loaded == 0) { @@ -458,15 +457,15 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) bif->group = bif->sw_if_index; bif->numa_only = args->numa_only; - hw = vnet_get_hw_interface (vnm, bif->hw_if_index); /* * Add GSO and Checksum offload flags if GSO is enabled on Bond */ if (args->gso) { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + vnet_hw_if_set_caps (vnm, bif->hw_if_index, + VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM); } if (vlib_get_thread_main ()->n_vlib_mains > 1) clib_spinlock_init (&bif->lockp); @@ -632,7 +631,7 @@ bond_add_member (vlib_main_t * vm, bond_add_member_args_t * args) clib_error_return (0, "bond interface cannot be added as member"); return; } - if (bif->gso && !(mif_hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO)) + if (bif->gso && !(mif_hw->caps & VNET_HW_IF_CAP_TCP_GSO)) { args->rv = VNET_API_ERROR_INVALID_INTERFACE; args->error = diff --git a/src/vnet/devices/af_packet/af_packet.c b/src/vnet/devices/af_packet/af_packet.c index bfa28031c1c..2e044472736 100644 --- a/src/vnet/devices/af_packet/af_packet.c +++ b/src/vnet/devices/af_packet/af_packet.c @@ -430,7 +430,7 @@ af_packet_create_if (af_packet_create_if_arg_t *arg) apif->queue_index = vnet_hw_if_register_rx_queue (vnm, apif->hw_if_index, 0, VNET_HW_IF_RXQ_THREAD_ANY); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hw->caps |= VNET_HW_IF_CAP_INT_MODE; vnet_hw_interface_set_flags (vnm, apif->hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP); @@ -544,13 +544,11 @@ af_packet_set_l4_cksum_offload (u32 sw_if_index, u8 set) if (set) { - hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + hw->caps &= ~(VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM); } else { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + hw->caps |= (VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM); } return 0; } diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index a6c9cefc3bf..17ce107ac58 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -669,17 +669,15 @@ tap_create_if (vlib_main_t * vm, tap_create_if_args_t * args) args->sw_if_index = vif->sw_if_index; args->rv = 0; hw = vnet_get_hw_interface (vnm, vif->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hw->caps |= VNET_HW_IF_CAP_INT_MODE; if (args->tap_flags & TAP_FLAG_GSO) { - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; } else if (args->tap_flags & TAP_FLAG_CSUM_OFFLOAD) { - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + hw->caps |= VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; } if ((args->tap_flags & TAP_FLAG_GSO) && (args->tap_flags & TAP_FLAG_GRO_COALESCE)) @@ -795,18 +793,18 @@ tap_csum_offload_enable_disable (vlib_main_t * vm, u32 sw_if_index, vif->packet_coalesce = 0; vif->csum_offload_enabled = enable_disable ? 1 : 0; - if ((hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) != 0) + if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) != 0) { - hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; + hw->caps &= ~VNET_HW_IF_CAP_TCP_GSO; } if (enable_disable) { - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM; + hw->caps |= VNET_HW_IF_CAP_L4_TX_CKSUM; } else { - hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM; + hw->caps &= ~VNET_HW_IF_CAP_L4_TX_CKSUM; } error: @@ -846,10 +844,9 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable, vif->csum_offload_enabled = 0; if (enable_disable) { - if ((hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) == 0) + if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) == 0) { - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM; + hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM; } if (is_packet_coalesce) { @@ -858,10 +855,9 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable, } else { - if ((hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) != 0) + if ((hw->caps & VNET_HW_IF_CAP_TCP_GSO) != 0) { - hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM); + hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM); } vif->packet_coalesce = 0; } diff --git a/src/vnet/devices/virtio/device.c b/src/vnet/devices/virtio/device.c index 8eeeb0d2c74..17b3a175e20 100644 --- a/src/vnet/devices/virtio/device.c +++ b/src/vnet/devices/virtio/device.c @@ -1009,12 +1009,12 @@ virtio_interface_tx_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vnet_main_t *vnm = vnet_get_main (); vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index); - if (hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) + if (hw->caps & VNET_HW_IF_CAP_TCP_GSO) return virtio_interface_tx_gso_inline (vm, node, vif, type, vring, buffers, n_left, packed, 1 /* do_gso */ , 1 /* checksum offload */ ); - else if (hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM) + else if (hw->caps & VNET_HW_IF_CAP_L4_TX_CKSUM) return virtio_interface_tx_gso_inline (vm, node, vif, type, vring, buffers, n_left, packed, 0 /* no do_gso */ , diff --git a/src/vnet/devices/virtio/pci.c b/src/vnet/devices/virtio/pci.c index b053266858c..efa1b88a2b0 100644 --- a/src/vnet/devices/virtio/pci.c +++ b/src/vnet/devices/virtio/pci.c @@ -525,9 +525,9 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->gso_enabled = 1; vif->csum_offload_enabled = 0; - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + hw->caps |= VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM; } } else if (csum_offload_enabled @@ -541,9 +541,9 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->csum_offload_enabled = 1; vif->gso_enabled = 0; - hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM; + hw->caps &= ~VNET_HW_IF_CAP_TCP_GSO; + hw->caps |= + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; } } else @@ -556,8 +556,8 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled, { vif->csum_offload_enabled = 0; vif->gso_enabled = 0; - hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO); + hw->caps &= + ~(VNET_HW_IF_CAP_L4_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO); } } } @@ -1480,7 +1480,7 @@ virtio_pci_create_if (vlib_main_t * vm, virtio_pci_create_if_args_t * args) args->sw_if_index = sw->sw_if_index; vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hw->caps |= VNET_HW_IF_CAP_INT_MODE; if (args->virtio_flags & VIRTIO_FLAG_BUFFERING) { diff --git a/src/vnet/devices/virtio/vhost_user.c b/src/vnet/devices/virtio/vhost_user.c index cd37d4c59f8..85c39b9de8b 100644 --- a/src/vnet/devices/virtio/vhost_user.c +++ b/src/vnet/devices/virtio/vhost_user.c @@ -558,14 +558,12 @@ vhost_user_socket_read (clib_file_t * uf) ((vui->features & FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS) == FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS)) { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM); } else { - hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM); + hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM); } vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0); vui->is_ready = 0; @@ -1658,7 +1656,7 @@ vhost_user_vui_init (vnet_main_t * vnm, vhost_user_intf_t * vui, for (q = 0; q < vec_len (vui->vrings); q++) vhost_user_vring_init (vui, q); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + hw->caps |= VNET_HW_IF_CAP_INT_MODE; vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0); if (sw_if_index) diff --git a/src/vnet/ethernet/interface.c b/src/vnet/ethernet/interface.c index c941f82a50b..9b70ae5dce4 100644 --- a/src/vnet/ethernet/interface.c +++ b/src/vnet/ethernet/interface.c @@ -460,7 +460,7 @@ ethernet_set_flags (vnet_main_t * vnm, u32 hw_if_index, u32 flags) switch (opn_flags) { case ETHERNET_INTERFACE_FLAG_DEFAULT_L3: - if (hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER) + if (hi->caps & VNET_HW_IF_CAP_MAC_FILTER) { if (ei->flag_change (vnm, hi, opn_flags) != ~0) { diff --git a/src/vnet/gso/node.c b/src/vnet/gso/node.c index 109d178c33c..093cd669e3c 100644 --- a/src/vnet/gso/node.c +++ b/src/vnet/gso/node.c @@ -549,30 +549,28 @@ vnet_gso_node_inline (vlib_main_t * vm, if (PREDICT_FALSE (hi->sw_if_index != swif0)) { hi0 = vnet_get_sup_hw_interface (vnm, swif0); - if ((hi0->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) == - 0 && + if ((hi0->caps & VNET_HW_IF_CAP_TCP_GSO) == 0 && (b[0]->flags & VNET_BUFFER_F_GSO)) break; } if (PREDICT_FALSE (hi->sw_if_index != swif1)) { hi1 = vnet_get_sup_hw_interface (vnm, swif1); - if (!(hi1->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) && + if (!(hi1->caps & VNET_HW_IF_CAP_TCP_GSO) && (b[1]->flags & VNET_BUFFER_F_GSO)) break; } if (PREDICT_FALSE (hi->sw_if_index != swif2)) { hi2 = vnet_get_sup_hw_interface (vnm, swif2); - if ((hi2->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) == - 0 && + if ((hi2->caps & VNET_HW_IF_CAP_TCP_GSO) == 0 && (b[2]->flags & VNET_BUFFER_F_GSO)) break; } if (PREDICT_FALSE (hi->sw_if_index != swif3)) { hi3 = vnet_get_sup_hw_interface (vnm, swif3); - if (!(hi3->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) && + if (!(hi3->caps & VNET_HW_IF_CAP_TCP_GSO) && (b[3]->flags & VNET_BUFFER_F_GSO)) break; } @@ -643,7 +641,7 @@ vnet_gso_node_inline (vlib_main_t * vm, if (PREDICT_FALSE (hi->sw_if_index != swif0)) { hi0 = vnet_get_sup_hw_interface (vnm, swif0); - if ((hi0->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) == 0 && + if ((hi0->caps & VNET_HW_IF_CAP_TCP_GSO) == 0 && (b[0]->flags & VNET_BUFFER_F_GSO)) do_segmentation0 = 1; } @@ -795,8 +793,7 @@ vnet_gso_inline (vlib_main_t * vm, hi = vnet_get_sup_hw_interface (vnm, vnet_buffer (b)->sw_if_index[VLIB_TX]); - if (hi->caps & (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO)) + if (hi->caps & (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_VXLAN_TNL_GSO)) return vnet_gso_node_inline (vm, node, frame, vnm, hi, is_l2, is_ip4, is_ip6, /* do_segmentation */ 0); diff --git a/src/vnet/interface.h b/src/vnet/interface.h index 822d4c3a7ad..801298a0f05 100644 --- a/src/vnet/interface.h +++ b/src/vnet/interface.h @@ -519,72 +519,60 @@ typedef enum vnet_hw_interface_flags_t_ VNET_HW_INTERFACE_FLAG_NBMA = (1 << 19), } vnet_hw_interface_flags_t; -typedef enum vnet_hw_interface_capabilities_t_ +#define foreach_vnet_hw_if_caps \ + _ (0, TX_IP4_CKSUM, "ip4-csum-tx") \ + _ (1, TX_TCP_CKSUM, "tcp-csum-tx") \ + _ (2, TX_UDP_CKSUM, "udp-csum-tx") \ + _ (3, TX_IP4_OUTER_CKSUM, "outer-ip4-csum-tx") \ + _ (4, TX_UDP_OUTER_CKSUM, "outer-udp-csum-tx") \ + _ (5, RX_IP4_CKSUM, "ip4-csum-rx") \ + _ (6, RX_TCP_CKSUM, "tcp-csum-rx") \ + _ (7, RX_UDP_CKSUM, "udp-csum-rx") \ + _ (8, RX_IP4_OUTER_CKSUM, "outer-ip4-csum-rx") \ + _ (9, RX_UDP_OUTER_CKSUM, "outer-udp-csum-rx") \ + _ (10, TCP_GSO, "tcp-tso") \ + _ (11, UDP_GSO, "udp-gso") \ + _ (12, VXLAN_TNL_GSO, "vxlan-tnl-gso") \ + _ (13, IPIP_TNL_GSO, "ipip-tnl-gso") \ + _ (14, GENEVE_TNL_GSO, "geneve-tnl-gso") \ + _ (15, GRE_TNL_GSO, "gre-tnl-gso") \ + _ (16, UDP_TNL_GSO, "udp-tnl-gso") \ + _ (17, IP_TNL_GSO, "ip-tnl-gso") \ + _ (18, TCP_LRO, "tcp-lro") \ + _ (30, INT_MODE, "int-mode") \ + _ (31, MAC_FILTER, "mac-filter") + +typedef enum vnet_hw_if_caps_t_ { VNET_HW_INTERFACE_CAP_NONE, +#define _(bit, sfx, str) VNET_HW_IF_CAP_##sfx = (1 << (bit)), + foreach_vnet_hw_if_caps +#undef _ - /* tx checksum offload */ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM = (1 << 0), - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM = (1 << 1), - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM = (1 << 2), - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM = (1 << 3), - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_OUTER_CKSUM = (1 << 4), - - /* rx checksum offload */ - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_IP4_CKSUM = (1 << 5), - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_UDP_CKSUM = (1 << 6), - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_TCP_CKSUM = (1 << 7), - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_IP4_OUTER_CKSUM = (1 << 8), - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_UDP_OUTER_CKSUM = (1 << 9), - - /* gso */ - VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO = (1 << 10), - VNET_HW_INTERFACE_CAP_SUPPORTS_UDP_GSO = (1 << 11), - VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO = (1 << 12), - VNET_HW_INTERFACE_CAP_SUPPORTS_IPIP_TNL_GSO = (1 << 13), - VNET_HW_INTERFACE_CAP_SUPPORTS_GENEVE_TNL_GSO = (1 << 14), - VNET_HW_INTERFACE_CAP_SUPPORTS_GRE_TNL_GSO = (1 << 15), - VNET_HW_INTERFACE_CAP_SUPPORTS_UDP_TNL_GSO = (1 << 16), - VNET_HW_INTERFACE_CAP_SUPPORTS_IP_TNL_GSO = (1 << 17), - - /* lro */ - VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_LRO = (1 << 18), - - /* rx mode */ - VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE = (1 << 30), - /* hw/driver can switch between l2-promisc and l3-dmac-filter modes */ - VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER = (1 << 31), -} vnet_hw_interface_capabilities_t; - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_TX_OUTER_CKSUM \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_OUTER_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM_MASK \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_OUTER_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_L4_RX_CKSUM \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_RX_TCP_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_UDP_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_RX_CKSUM \ - (VNET_HW_INTERFACE_CAP_SUPPORTS_RX_IP4_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_TCP_CKSUM | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_RX_UDP_CKSUM) - -#define VNET_HW_INTERFACE_CAP_SUPPORTS_TNL_GSO_MASK \ - VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO | \ - VNET_HW_INTERFACE_CAP_SUPPORTS_IPIP_TNL_GSO +} vnet_hw_if_caps_t; + +#define VNET_HW_IF_CAP_L4_TX_CKSUM \ + (VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM) + +#define VNET_HW_IF_CAP_TX_CKSUM \ + (VNET_HW_IF_CAP_TX_IP4_CKSUM | VNET_HW_IF_CAP_TX_TCP_CKSUM | \ + VNET_HW_IF_CAP_TX_UDP_CKSUM) + +#define VNET_HW_IF_CAP_TX_OUTER_CKSUM \ + (VNET_HW_IF_CAP_TX_IP4_OUTER_CKSUM | VNET_HW_IF_CAP_TX_UDP_OUTER_CKSUM) + +#define VNET_HW_IF_CAP_TX_CKSUM_MASK \ + (VNET_HW_IF_CAP_TX_CKSUM | VNET_HW_IF_CAP_TX_OUTER_CKSUM) + +#define VNET_HW_IF_CAP_L4_RX_CKSUM \ + (VNET_HW_IF_CAP_RX_TCP_CKSUM | VNET_HW_IF_CAP_RX_UDP_CKSUM) + +#define VNET_HW_IF_CAP_RX_CKSUM \ + (VNET_HW_IF_CAP_RX_IP4_CKSUM | VNET_HW_IF_CAP_RX_TCP_CKSUM | \ + VNET_HW_IF_CAP_RX_UDP_CKSUM) + +#define VNET_HW_IF_CAP_TNL_GSO_MASK \ + VNET_HW_IF_CAP_VXLAN_TNL_GSO | VNET_HW_IF_CAP_IPIP_TNL_GSO #define VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT 1 #define VNET_HW_INTERFACE_FLAG_SPEED_SHIFT 3 @@ -659,7 +647,7 @@ typedef struct vnet_hw_interface_t vnet_hw_interface_flags_t flags; /* capabilities flags */ - vnet_hw_interface_capabilities_t caps; + vnet_hw_if_caps_t caps; /* Hardware address as vector. Zero (e.g. zero-length vector) if no address for this class (e.g. PPP). */ diff --git a/src/vnet/interface/caps.c b/src/vnet/interface/caps.c new file mode 100644 index 00000000000..8b5fda1df43 --- /dev/null +++ b/src/vnet/interface/caps.c @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright(c) 2021 Cisco Systems, Inc. + */ + +#include +#include +#include + +VLIB_REGISTER_LOG_CLASS (if_caps_log, static) = { + .class_name = "interface", + .subclass_name = "caps", +}; + +#define log_debug(fmt, ...) \ + vlib_log_debug (if_caps_log.class, fmt, __VA_ARGS__) + +format_function_t format_vnet_hw_if_caps; + +void +vnet_hw_if_change_caps (vnet_main_t *vnm, u32 hw_if_index, + vnet_hw_if_caps_change_t *caps) +{ + vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index); + vnet_hw_if_caps_t old = hi->caps; + + hi->caps = (hi->caps & ~caps->mask) | caps->val; + + log_debug ("change: interface %U, set: %U, cleared: %U", + format_vnet_hw_if_index_name, vnm, hw_if_index, + format_vnet_hw_if_caps, (old ^ hi->caps) & caps->val, + format_vnet_hw_if_caps, (old ^ hi->caps) & ~caps->val); +} + +u8 * +format_vnet_hw_if_caps (u8 *s, va_list *va) +{ + vnet_hw_if_caps_t caps = va_arg (*va, vnet_hw_if_caps_t); + + const char *strings[sizeof (vnet_hw_if_caps_t) * 8] = { +#define _(bit, sfx, str) [bit] = (str), + foreach_vnet_hw_if_caps +#undef _ + }; + + if (caps == 0) + return format (s, "none"); + + while (caps) + { + int bit = get_lowest_set_bit_index (caps); + + if (strings[bit]) + s = format (s, "%s", strings[bit]); + else + s = format (s, "unknown-%u", bit); + + caps = reset_lowest_set_bit (caps); + if (caps) + vec_add1 (s, ' '); + } + + return s; +} diff --git a/src/vnet/interface_funcs.h b/src/vnet/interface_funcs.h index eef5596644c..7dfa617e2fe 100644 --- a/src/vnet/interface_funcs.h +++ b/src/vnet/interface_funcs.h @@ -557,6 +557,31 @@ pcap_add_buffer (pcap_main_t *pm, struct vlib_main_t *vm, u32 buffer_index, clib_spinlock_unlock_if_init (&pm->lock); } } + +typedef struct +{ + vnet_hw_if_caps_t val; + vnet_hw_if_caps_t mask; +} vnet_hw_if_caps_change_t; + +void vnet_hw_if_change_caps (vnet_main_t *vnm, u32 hw_if_index, + vnet_hw_if_caps_change_t *caps); + +static_always_inline void +vnet_hw_if_set_caps (vnet_main_t *vnm, u32 hw_if_index, vnet_hw_if_caps_t caps) +{ + vnet_hw_if_caps_change_t cc = { .val = caps, .mask = caps }; + vnet_hw_if_change_caps (vnm, hw_if_index, &cc); +} + +static_always_inline void +vnet_hw_if_unset_caps (vnet_main_t *vnm, u32 hw_if_index, + vnet_hw_if_caps_t caps) +{ + vnet_hw_if_caps_change_t cc = { .val = 0, .mask = caps }; + vnet_hw_if_change_caps (vnm, hw_if_index, &cc); +} + #endif /* included_vnet_interface_funcs_h */ /* diff --git a/src/vnet/interface_output.c b/src/vnet/interface_output.c index 659273b53cd..cf64eeed093 100644 --- a/src/vnet/interface_output.c +++ b/src/vnet/interface_output.c @@ -640,8 +640,7 @@ VLIB_NODE_FN (vnet_interface_output_node) /* if not all three flags IP4_,TCP_,UDP_CKSUM set, do compute them * here before sending to the interface */ - if ((hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM) != - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM) + if ((hi->caps & VNET_HW_IF_CAP_TX_CKSUM) != VNET_HW_IF_CAP_TX_CKSUM) do_tx_offloads = 1; // basic processing diff --git a/src/vnet/pg/stream.c b/src/vnet/pg/stream.c index 2c75c2b2bc3..5f34a43812a 100644 --- a/src/vnet/pg/stream.c +++ b/src/vnet/pg/stream.c @@ -299,7 +299,7 @@ pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, hi = vnet_get_hw_interface (vnm, pi->hw_if_index); if (gso_enabled) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; + vnet_hw_if_set_caps (vnm, pi->hw_if_index, VNET_HW_IF_CAP_TCP_GSO); pi->gso_enabled = 1; pi->gso_size = gso_size; if (coalesce_enabled) diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index df31c9e775f..30d57a3bb3e 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1796,7 +1796,7 @@ tcp_check_tx_offload (tcp_connection_t * tc, int is_ipv4) return; hw_if = vnet_get_sup_hw_interface (vnm, sw_if_idx); - if (hw_if->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) + if (hw_if->caps & VNET_HW_IF_CAP_TCP_GSO) tc->cfg_flags |= TCP_CFG_F_TSO; } -- cgit 1.2.3-korg