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 <damarion@cisco.com>
This commit is contained in:
@ -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_main_t *am = &af_xdp_main;
|
||||||
af_xdp_device_t *ad;
|
af_xdp_device_t *ad;
|
||||||
vnet_sw_interface_t *sw;
|
vnet_sw_interface_t *sw;
|
||||||
vnet_hw_interface_t *hw;
|
|
||||||
int rxq_num, txq_num, q_num;
|
int rxq_num, txq_num, q_num;
|
||||||
int ns_fds[2];
|
int ns_fds[2];
|
||||||
int i, ret;
|
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);
|
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;
|
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);
|
vnet_hw_if_set_input_node (vnm, ad->hw_if_index, af_xdp_input_node.index);
|
||||||
|
|
||||||
|
@ -1729,22 +1729,19 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
|
|||||||
if (error)
|
if (error)
|
||||||
goto 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_set_flags (vnm, ad->hw_if_index,
|
||||||
ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
|
ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
|
||||||
|
|
||||||
vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index);
|
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;
|
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);
|
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++)
|
for (i = 0; i < ad->n_rx_queues; i++)
|
||||||
{
|
{
|
||||||
u32 qi, fi;
|
u32 qi, fi;
|
||||||
|
@ -212,7 +212,7 @@ dpdk_setup_interrupts (dpdk_device_t *xd)
|
|||||||
|
|
||||||
if (xd->flags & DPDK_DEVICE_FLAG_INT_SUPPORTED)
|
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++)
|
for (int q = 0; q < xd->conf.n_rx_queues; q++)
|
||||||
{
|
{
|
||||||
dpdk_rx_queue_t *rxq = vec_elt_at_index (xd->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)
|
if (rxq->efd < 0)
|
||||||
{
|
{
|
||||||
xd->flags &= ~DPDK_DEVICE_FLAG_INT_SUPPORTED;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
f.read_function = dpdk_rx_read_ready;
|
f.read_function = dpdk_rx_read_ready;
|
||||||
|
@ -801,7 +801,7 @@ dpdk_lib_init (dpdk_main_t * dm)
|
|||||||
|
|
||||||
/* Indicate ability to support L3 DMAC filtering and
|
/* Indicate ability to support L3 DMAC filtering and
|
||||||
* initialize interface to L3 non-promisc mode */
|
* 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_set_flags (vnm, xd->hw_if_index,
|
||||||
ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
|
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->conf.no_tx_checksum_offload == 0)
|
||||||
if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL)
|
if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL)
|
||||||
{
|
{
|
||||||
hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM |
|
hi->caps |= VNET_HW_IF_CAP_TX_IP4_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
|
VNET_HW_IF_CAP_TX_UDP_CKSUM;
|
||||||
if (xd->conf.enable_outer_checksum_offload)
|
if (xd->conf.enable_outer_checksum_offload)
|
||||||
{
|
{
|
||||||
hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM |
|
hi->caps |= VNET_HW_IF_CAP_TX_IP4_OUTER_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_OUTER_CKSUM;
|
VNET_HW_IF_CAP_TX_UDP_OUTER_CKSUM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL)
|
if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL)
|
||||||
{
|
{
|
||||||
/*tcp_udp checksum must be enabled*/
|
/*tcp_udp checksum must be enabled*/
|
||||||
if ((xd->conf.enable_tcp_udp_checksum) &&
|
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;
|
xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO;
|
||||||
|
|
||||||
if (xd->conf.enable_outer_checksum_offload &&
|
if (xd->conf.enable_outer_checksum_offload &&
|
||||||
@ -832,7 +832,7 @@ dpdk_lib_init (dpdk_main_t * dm)
|
|||||||
{
|
{
|
||||||
xd->port_conf.txmode.offloads |=
|
xd->port_conf.txmode.offloads |=
|
||||||
DEV_TX_OFFLOAD_VXLAN_TNL_TSO;
|
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
|
else
|
||||||
|
@ -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 */
|
/* 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 =
|
error =
|
||||||
vnet_hw_interface_add_del_mac_address (lm->vnet_main,
|
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_intf_t *n = lldp_get_intf (lm, hi->sw_if_index);
|
||||||
lldp_delete_intf (lm, n);
|
lldp_delete_intf (lm, n);
|
||||||
/* Remove MAC address from the interface's filter */
|
/* 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 =
|
error =
|
||||||
vnet_hw_interface_add_del_mac_address (lm->vnet_main,
|
vnet_hw_interface_add_del_mac_address (lm->vnet_main,
|
||||||
|
@ -902,7 +902,6 @@ memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args)
|
|||||||
clib_error_t *error = 0;
|
clib_error_t *error = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
uword *p;
|
uword *p;
|
||||||
vnet_hw_interface_t *hw;
|
|
||||||
memif_socket_file_t *msf = 0;
|
memif_socket_file_t *msf = 0;
|
||||||
int rv = 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;
|
mif->flags |= MEMIF_IF_FLAG_ZERO_COPY;
|
||||||
}
|
}
|
||||||
|
|
||||||
hw = vnet_get_hw_interface (vnm, mif->hw_if_index);
|
vnet_hw_if_set_caps (vnm, mif->hw_if_index, VNET_HW_IF_CAP_INT_MODE);
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE;
|
|
||||||
vnet_hw_if_set_input_node (vnm, mif->hw_if_index, memif_input_node.index);
|
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);
|
mhash_set (&msf->dev_instance_by_id, &mif->id, mif->dev_instance, 0);
|
||||||
|
|
||||||
|
@ -362,8 +362,7 @@ rdma_register_interface (vnet_main_t * vnm, rdma_device_t * rd)
|
|||||||
|
|
||||||
/* Indicate ability to support L3 DMAC filtering and
|
/* Indicate ability to support L3 DMAC filtering and
|
||||||
* initialize interface to L3 non-promisc mode */
|
* initialize interface to L3 non-promisc mode */
|
||||||
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, rd->hw_if_index);
|
vnet_hw_if_set_caps (vnm, rd->hw_if_index, VNET_HW_IF_CAP_MAC_FILTER);
|
||||||
hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER;
|
|
||||||
ethernet_set_flags (vnm, rd->hw_if_index,
|
ethernet_set_flags (vnm, rd->hw_if_index,
|
||||||
ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
|
ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
|
||||||
return err;
|
return err;
|
||||||
@ -1022,7 +1021,7 @@ are explicitly disabled, and if the interface supports it.*/
|
|||||||
/*
|
/*
|
||||||
* FIXME: add support for interrupt mode
|
* FIXME: add support for interrupt mode
|
||||||
* vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, rd->hw_if_index);
|
* 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);
|
vnet_hw_if_set_input_node (vnm, rd->hw_if_index, rdma_input_node.index);
|
||||||
|
|
||||||
|
@ -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;
|
args->sw_if_index = sw->sw_if_index;
|
||||||
|
|
||||||
vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_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)
|
if (vd->gso_enable)
|
||||||
{
|
{
|
||||||
hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TX_UDP_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vnet_hw_if_set_input_node (vnm, vd->hw_if_index, vmxnet3_input_node.index);
|
vnet_hw_if_set_input_node (vnm, vd->hw_if_index, vmxnet3_input_node.index);
|
||||||
|
@ -35,6 +35,7 @@ list(APPEND VNET_SOURCES
|
|||||||
interface_cli.c
|
interface_cli.c
|
||||||
interface_format.c
|
interface_format.c
|
||||||
interface_output.c
|
interface_output.c
|
||||||
|
interface/caps.c
|
||||||
interface/rx_queue.c
|
interface/rx_queue.c
|
||||||
interface/tx_queue.c
|
interface/tx_queue.c
|
||||||
interface/runtime.c
|
interface/runtime.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_main_t *vnm = vnet_get_main ();
|
||||||
vnet_sw_interface_t *sw;
|
vnet_sw_interface_t *sw;
|
||||||
bond_if_t *bif;
|
bond_if_t *bif;
|
||||||
vnet_hw_interface_t *hw;
|
|
||||||
|
|
||||||
if ((args->mode == BOND_MODE_LACP) && bm->lacp_plugin_loaded == 0)
|
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->group = bif->sw_if_index;
|
||||||
bif->numa_only = args->numa_only;
|
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
|
* Add GSO and Checksum offload flags if GSO is enabled on Bond
|
||||||
*/
|
*/
|
||||||
if (args->gso)
|
if (args->gso)
|
||||||
{
|
{
|
||||||
hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
vnet_hw_if_set_caps (vnm, bif->hw_if_index,
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TCP_GSO |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM);
|
VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
|
VNET_HW_IF_CAP_TX_UDP_CKSUM);
|
||||||
}
|
}
|
||||||
if (vlib_get_thread_main ()->n_vlib_mains > 1)
|
if (vlib_get_thread_main ()->n_vlib_mains > 1)
|
||||||
clib_spinlock_init (&bif->lockp);
|
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");
|
clib_error_return (0, "bond interface cannot be added as member");
|
||||||
return;
|
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->rv = VNET_API_ERROR_INVALID_INTERFACE;
|
||||||
args->error =
|
args->error =
|
||||||
|
@ -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,
|
apif->queue_index = vnet_hw_if_register_rx_queue (vnm, apif->hw_if_index, 0,
|
||||||
VNET_HW_IF_RXQ_THREAD_ANY);
|
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_set_flags (vnm, apif->hw_if_index,
|
||||||
VNET_HW_INTERFACE_FLAG_LINK_UP);
|
VNET_HW_INTERFACE_FLAG_LINK_UP);
|
||||||
|
|
||||||
@ -544,13 +544,11 @@ af_packet_set_l4_cksum_offload (u32 sw_if_index, u8 set)
|
|||||||
|
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
hw->caps &= ~(VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
hw->caps |= (VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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->sw_if_index = vif->sw_if_index;
|
||||||
args->rv = 0;
|
args->rv = 0;
|
||||||
hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
|
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)
|
if (args->tap_flags & TAP_FLAG_GSO)
|
||||||
{
|
{
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TX_UDP_CKSUM;
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
|
|
||||||
}
|
}
|
||||||
else if (args->tap_flags & TAP_FLAG_CSUM_OFFLOAD)
|
else if (args->tap_flags & TAP_FLAG_CSUM_OFFLOAD)
|
||||||
{
|
{
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
hw->caps |= VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
|
|
||||||
}
|
}
|
||||||
if ((args->tap_flags & TAP_FLAG_GSO)
|
if ((args->tap_flags & TAP_FLAG_GSO)
|
||||||
&& (args->tap_flags & TAP_FLAG_GRO_COALESCE))
|
&& (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->packet_coalesce = 0;
|
||||||
vif->csum_offload_enabled = enable_disable ? 1 : 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)
|
if (enable_disable)
|
||||||
{
|
{
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM;
|
hw->caps |= VNET_HW_IF_CAP_L4_TX_CKSUM;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM;
|
hw->caps &= ~VNET_HW_IF_CAP_L4_TX_CKSUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
error:
|
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;
|
vif->csum_offload_enabled = 0;
|
||||||
if (enable_disable)
|
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 |
|
hw->caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM;
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM;
|
|
||||||
}
|
}
|
||||||
if (is_packet_coalesce)
|
if (is_packet_coalesce)
|
||||||
{
|
{
|
||||||
@ -858,10 +855,9 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable,
|
|||||||
}
|
}
|
||||||
else
|
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 |
|
hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM);
|
|
||||||
}
|
}
|
||||||
vif->packet_coalesce = 0;
|
vif->packet_coalesce = 0;
|
||||||
}
|
}
|
||||||
|
@ -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_main_t *vnm = vnet_get_main ();
|
||||||
vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
|
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,
|
return virtio_interface_tx_gso_inline (vm, node, vif, type, vring,
|
||||||
buffers, n_left, packed,
|
buffers, n_left, packed,
|
||||||
1 /* do_gso */ ,
|
1 /* do_gso */ ,
|
||||||
1 /* checksum offload */ );
|
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,
|
return virtio_interface_tx_gso_inline (vm, node, vif, type, vring,
|
||||||
buffers, n_left, packed,
|
buffers, n_left, packed,
|
||||||
0 /* no do_gso */ ,
|
0 /* no do_gso */ ,
|
||||||
|
@ -525,9 +525,9 @@ virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled,
|
|||||||
{
|
{
|
||||||
vif->gso_enabled = 1;
|
vif->gso_enabled = 1;
|
||||||
vif->csum_offload_enabled = 0;
|
vif->csum_offload_enabled = 0;
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
hw->caps |= VNET_HW_IF_CAP_TCP_GSO |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
|
VNET_HW_IF_CAP_TX_UDP_CKSUM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (csum_offload_enabled
|
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->csum_offload_enabled = 1;
|
||||||
vif->gso_enabled = 0;
|
vif->gso_enabled = 0;
|
||||||
hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO;
|
hw->caps &= ~VNET_HW_IF_CAP_TCP_GSO;
|
||||||
hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
hw->caps |=
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
|
VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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->csum_offload_enabled = 0;
|
||||||
vif->gso_enabled = 0;
|
vif->gso_enabled = 0;
|
||||||
hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM |
|
hw->caps &=
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO);
|
~(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;
|
args->sw_if_index = sw->sw_if_index;
|
||||||
|
|
||||||
vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_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)
|
if (args->virtio_flags & VIRTIO_FLAG_BUFFERING)
|
||||||
{
|
{
|
||||||
|
@ -558,14 +558,12 @@ vhost_user_socket_read (clib_file_t * uf)
|
|||||||
((vui->features & FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS)
|
((vui->features & FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS)
|
||||||
== 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 |
|
hw->caps |= (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_TCP_CKSUM |
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
|
VNET_HW_IF_CAP_TX_UDP_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
hw->caps &= ~(VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_L4_TX_CKSUM);
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM);
|
|
||||||
}
|
}
|
||||||
vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0);
|
vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0);
|
||||||
vui->is_ready = 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++)
|
for (q = 0; q < vec_len (vui->vrings); q++)
|
||||||
vhost_user_vring_init (vui, 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);
|
vnet_hw_interface_set_flags (vnm, vui->hw_if_index, 0);
|
||||||
|
|
||||||
if (sw_if_index)
|
if (sw_if_index)
|
||||||
|
@ -460,7 +460,7 @@ ethernet_set_flags (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
|
|||||||
switch (opn_flags)
|
switch (opn_flags)
|
||||||
{
|
{
|
||||||
case ETHERNET_INTERFACE_FLAG_DEFAULT_L3:
|
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)
|
if (ei->flag_change (vnm, hi, opn_flags) != ~0)
|
||||||
{
|
{
|
||||||
|
@ -549,30 +549,28 @@ vnet_gso_node_inline (vlib_main_t * vm,
|
|||||||
if (PREDICT_FALSE (hi->sw_if_index != swif0))
|
if (PREDICT_FALSE (hi->sw_if_index != swif0))
|
||||||
{
|
{
|
||||||
hi0 = vnet_get_sup_hw_interface (vnm, swif0);
|
hi0 = vnet_get_sup_hw_interface (vnm, swif0);
|
||||||
if ((hi0->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) ==
|
if ((hi0->caps & VNET_HW_IF_CAP_TCP_GSO) == 0 &&
|
||||||
0 &&
|
|
||||||
(b[0]->flags & VNET_BUFFER_F_GSO))
|
(b[0]->flags & VNET_BUFFER_F_GSO))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (PREDICT_FALSE (hi->sw_if_index != swif1))
|
if (PREDICT_FALSE (hi->sw_if_index != swif1))
|
||||||
{
|
{
|
||||||
hi1 = vnet_get_sup_hw_interface (vnm, 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))
|
(b[1]->flags & VNET_BUFFER_F_GSO))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (PREDICT_FALSE (hi->sw_if_index != swif2))
|
if (PREDICT_FALSE (hi->sw_if_index != swif2))
|
||||||
{
|
{
|
||||||
hi2 = vnet_get_sup_hw_interface (vnm, swif2);
|
hi2 = vnet_get_sup_hw_interface (vnm, swif2);
|
||||||
if ((hi2->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO) ==
|
if ((hi2->caps & VNET_HW_IF_CAP_TCP_GSO) == 0 &&
|
||||||
0 &&
|
|
||||||
(b[2]->flags & VNET_BUFFER_F_GSO))
|
(b[2]->flags & VNET_BUFFER_F_GSO))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (PREDICT_FALSE (hi->sw_if_index != swif3))
|
if (PREDICT_FALSE (hi->sw_if_index != swif3))
|
||||||
{
|
{
|
||||||
hi3 = vnet_get_sup_hw_interface (vnm, 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))
|
(b[3]->flags & VNET_BUFFER_F_GSO))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -643,7 +641,7 @@ vnet_gso_node_inline (vlib_main_t * vm,
|
|||||||
if (PREDICT_FALSE (hi->sw_if_index != swif0))
|
if (PREDICT_FALSE (hi->sw_if_index != swif0))
|
||||||
{
|
{
|
||||||
hi0 = vnet_get_sup_hw_interface (vnm, 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))
|
(b[0]->flags & VNET_BUFFER_F_GSO))
|
||||||
do_segmentation0 = 1;
|
do_segmentation0 = 1;
|
||||||
}
|
}
|
||||||
@ -795,8 +793,7 @@ vnet_gso_inline (vlib_main_t * vm,
|
|||||||
hi = vnet_get_sup_hw_interface (vnm,
|
hi = vnet_get_sup_hw_interface (vnm,
|
||||||
vnet_buffer (b)->sw_if_index[VLIB_TX]);
|
vnet_buffer (b)->sw_if_index[VLIB_TX]);
|
||||||
|
|
||||||
if (hi->caps & (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
|
if (hi->caps & (VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_VXLAN_TNL_GSO))
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_VXLAN_TNL_GSO))
|
|
||||||
return vnet_gso_node_inline (vm, node, frame, vnm, hi,
|
return vnet_gso_node_inline (vm, node, frame, vnm, hi,
|
||||||
is_l2, is_ip4, is_ip6,
|
is_l2, is_ip4, is_ip6,
|
||||||
/* do_segmentation */ 0);
|
/* do_segmentation */ 0);
|
||||||
|
@ -519,72 +519,60 @@ typedef enum vnet_hw_interface_flags_t_
|
|||||||
VNET_HW_INTERFACE_FLAG_NBMA = (1 << 19),
|
VNET_HW_INTERFACE_FLAG_NBMA = (1 << 19),
|
||||||
} vnet_hw_interface_flags_t;
|
} 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,
|
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_if_caps_t;
|
||||||
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 */
|
#define VNET_HW_IF_CAP_L4_TX_CKSUM \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_RX_IP4_CKSUM = (1 << 5),
|
(VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM)
|
||||||
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 */
|
#define VNET_HW_IF_CAP_TX_CKSUM \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO = (1 << 10),
|
(VNET_HW_IF_CAP_TX_IP4_CKSUM | VNET_HW_IF_CAP_TX_TCP_CKSUM | \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_UDP_GSO = (1 << 11),
|
VNET_HW_IF_CAP_TX_UDP_CKSUM)
|
||||||
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 */
|
#define VNET_HW_IF_CAP_TX_OUTER_CKSUM \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_LRO = (1 << 18),
|
(VNET_HW_IF_CAP_TX_IP4_OUTER_CKSUM | VNET_HW_IF_CAP_TX_UDP_OUTER_CKSUM)
|
||||||
|
|
||||||
/* rx mode */
|
#define VNET_HW_IF_CAP_TX_CKSUM_MASK \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE = (1 << 30),
|
(VNET_HW_IF_CAP_TX_CKSUM | VNET_HW_IF_CAP_TX_OUTER_CKSUM)
|
||||||
/* 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 \
|
#define VNET_HW_IF_CAP_L4_RX_CKSUM \
|
||||||
(VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | \
|
(VNET_HW_IF_CAP_RX_TCP_CKSUM | VNET_HW_IF_CAP_RX_UDP_CKSUM)
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM)
|
|
||||||
|
|
||||||
#define VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM \
|
#define VNET_HW_IF_CAP_RX_CKSUM \
|
||||||
(VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_CKSUM | \
|
(VNET_HW_IF_CAP_RX_IP4_CKSUM | VNET_HW_IF_CAP_RX_TCP_CKSUM | \
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | \
|
VNET_HW_IF_CAP_RX_UDP_CKSUM)
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM)
|
|
||||||
|
|
||||||
#define VNET_HW_INTERFACE_CAP_SUPPORTS_TX_OUTER_CKSUM \
|
#define VNET_HW_IF_CAP_TNL_GSO_MASK \
|
||||||
(VNET_HW_INTERFACE_CAP_SUPPORTS_TX_IP4_OUTER_CKSUM | \
|
VNET_HW_IF_CAP_VXLAN_TNL_GSO | VNET_HW_IF_CAP_IPIP_TNL_GSO
|
||||||
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
|
|
||||||
|
|
||||||
#define VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT 1
|
#define VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT 1
|
||||||
#define VNET_HW_INTERFACE_FLAG_SPEED_SHIFT 3
|
#define VNET_HW_INTERFACE_FLAG_SPEED_SHIFT 3
|
||||||
@ -659,7 +647,7 @@ typedef struct vnet_hw_interface_t
|
|||||||
vnet_hw_interface_flags_t flags;
|
vnet_hw_interface_flags_t flags;
|
||||||
|
|
||||||
/* capabilities 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
|
/* Hardware address as vector. Zero (e.g. zero-length vector) if no
|
||||||
address for this class (e.g. PPP). */
|
address for this class (e.g. PPP). */
|
||||||
|
63
src/vnet/interface/caps.c
Normal file
63
src/vnet/interface/caps.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* SPDX-License-Identifier: Apache-2.0
|
||||||
|
* Copyright(c) 2021 Cisco Systems, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vlib/vlib.h>
|
||||||
|
#include <vnet/vnet.h>
|
||||||
|
#include <vnet/interface.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -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);
|
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 */
|
#endif /* included_vnet_interface_funcs_h */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -640,8 +640,7 @@ VLIB_NODE_FN (vnet_interface_output_node)
|
|||||||
|
|
||||||
/* if not all three flags IP4_,TCP_,UDP_CKSUM set, do compute them
|
/* if not all three flags IP4_,TCP_,UDP_CKSUM set, do compute them
|
||||||
* here before sending to the interface */
|
* here before sending to the interface */
|
||||||
if ((hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM) !=
|
if ((hi->caps & VNET_HW_IF_CAP_TX_CKSUM) != VNET_HW_IF_CAP_TX_CKSUM)
|
||||||
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM)
|
|
||||||
do_tx_offloads = 1;
|
do_tx_offloads = 1;
|
||||||
|
|
||||||
// basic processing
|
// basic processing
|
||||||
|
@ -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);
|
hi = vnet_get_hw_interface (vnm, pi->hw_if_index);
|
||||||
if (gso_enabled)
|
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_enabled = 1;
|
||||||
pi->gso_size = gso_size;
|
pi->gso_size = gso_size;
|
||||||
if (coalesce_enabled)
|
if (coalesce_enabled)
|
||||||
|
@ -1796,7 +1796,7 @@ tcp_check_tx_offload (tcp_connection_t * tc, int is_ipv4)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
hw_if = vnet_get_sup_hw_interface (vnm, sw_if_idx);
|
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;
|
tc->cfg_flags |= TCP_CFG_F_TSO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user