diff options
Diffstat (limited to 'src/plugins/af_packet')
-rw-r--r-- | src/plugins/af_packet/CMakeLists.txt | 36 | ||||
-rw-r--r-- | src/plugins/af_packet/FEATURE.yaml | 16 | ||||
-rw-r--r-- | src/plugins/af_packet/af_packet.api | 192 | ||||
-rw-r--r-- | src/plugins/af_packet/af_packet.c | 879 | ||||
-rw-r--r-- | src/plugins/af_packet/af_packet.h | 179 | ||||
-rw-r--r-- | src/plugins/af_packet/af_packet_api.c | 253 | ||||
-rw-r--r-- | src/plugins/af_packet/cli.c | 295 | ||||
-rw-r--r-- | src/plugins/af_packet/device.c | 836 | ||||
-rw-r--r-- | src/plugins/af_packet/dir.dox | 29 | ||||
-rw-r--r-- | src/plugins/af_packet/node.c | 845 | ||||
-rw-r--r-- | src/plugins/af_packet/plugin.c | 22 |
11 files changed, 3582 insertions, 0 deletions
diff --git a/src/plugins/af_packet/CMakeLists.txt b/src/plugins/af_packet/CMakeLists.txt new file mode 100644 index 00000000000..4b79615cae7 --- /dev/null +++ b/src/plugins/af_packet/CMakeLists.txt @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2022 Cisco and/or its affiliates. +# 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. + +add_vpp_plugin(af_packet + SOURCES + plugin.c + af_packet.c + device.c + node.c + cli.c + af_packet_api.c + + MULTIARCH_SOURCES + node.c + device.c + + INSTALL_HEADERS + af_packet.h + + API_FILES + af_packet.api + + # API_TEST_SOURCES + #af_packet_test_api.c +) diff --git a/src/plugins/af_packet/FEATURE.yaml b/src/plugins/af_packet/FEATURE.yaml new file mode 100644 index 00000000000..4a11ea2beb5 --- /dev/null +++ b/src/plugins/af_packet/FEATURE.yaml @@ -0,0 +1,16 @@ +--- +name: host-interface Device AF_PACKET +maintainer: Damjan Marion <damarion@cisco.com> +features: + - L4 checksum offload + - GSO offload +description: "Create a host interface that will attach to a linux AF_PACKET + interface, one side of a veth pair. The veth pair must + already exist. Once created, a new host interface will + exist in VPP with the name 'host-<ifname>', where '<ifname>' + is the name of the specified veth pair. Use the 'show interface' + command to display host interface details." +missing: + - API dump details beyond sw_if_index and name +state: production +properties: [API, CLI, STATS, MULTITHREAD] diff --git a/src/plugins/af_packet/af_packet.api b/src/plugins/af_packet/af_packet.api new file mode 100644 index 00000000000..a12da37796a --- /dev/null +++ b/src/plugins/af_packet/af_packet.api @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2015-2016 Cisco and/or its affiliates. + * 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. + */ + +option version = "2.0.0"; + +import "vnet/interface_types.api"; +import "vnet/ethernet/ethernet_types.api"; + +/** \brief Create host-interface + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param hw_addr - interface MAC + @param use_random_hw_addr - use random generated MAC + @param host_if_name - interface name +*/ +define af_packet_create +{ + u32 client_index; + u32 context; + + vl_api_mac_address_t hw_addr; + bool use_random_hw_addr; + string host_if_name[64]; +}; + +/** \brief Create host-interface response + @param context - sender context, to match reply w/ request + @param retval - return value for request +*/ +define af_packet_create_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; +}; + +/** \brief Create host-interface + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param hw_addr - interface MAC + @param use_random_hw_addr - use random generated MAC + @param host_if_name - interface name + @param rx_frame_size - frame size for RX + @param tx_frame_size - frame size for TX + @param rx_frames_per_block - frames per block for RX + @param tx_frames_per_block - frames per block for TX + @param flags - flags for the af_packet interface creation + @param num_rx_queues - number of rx queues +*/ +define af_packet_create_v2 +{ + u32 client_index; + u32 context; + + vl_api_mac_address_t hw_addr; + bool use_random_hw_addr; + string host_if_name[64]; + u32 rx_frame_size; + u32 tx_frame_size; + u32 rx_frames_per_block; + u32 tx_frames_per_block; + u32 flags; + u16 num_rx_queues [default=1]; +}; + +/** \brief Create host-interface response + @param context - sender context, to match reply w/ request + @param retval - return value for request +*/ +define af_packet_create_v2_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; +}; + +enum af_packet_mode { + AF_PACKET_API_MODE_ETHERNET = 1, /* mode ethernet */ + AF_PACKET_API_MODE_IP = 2, /* mode ip */ +}; + +enum af_packet_flags { + AF_PACKET_API_FLAG_QDISC_BYPASS = 1, /* enable the qdisc bypass */ + AF_PACKET_API_FLAG_CKSUM_GSO = 2, /* enable checksum/gso */ + AF_PACKET_API_FLAG_VERSION_2 = 8 [backwards_compatible], /* af packet v2, default is v3 */ +}; + +/** \brief Create host-interface + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param mode - 1 - Ethernet, 2 - IP + @param hw_addr - interface MAC + @param use_random_hw_addr - use random generated MAC + @param host_if_name - interface name + @param rx_frame_size - frame size for RX + @param tx_frame_size - frame size for TX + @param rx_frames_per_block - frames per block for RX + @param tx_frames_per_block - frames per block for TX + @param flags - flags for the af_packet interface creation + @param num_rx_queues - number of rx queues + @param num_tx_queues - number of tx queues +*/ +define af_packet_create_v3 +{ + u32 client_index; + u32 context; + + vl_api_af_packet_mode_t mode; + vl_api_mac_address_t hw_addr; + bool use_random_hw_addr; + string host_if_name[64]; + u32 rx_frame_size; + u32 tx_frame_size; + u32 rx_frames_per_block; + u32 tx_frames_per_block; + vl_api_af_packet_flags_t flags; + u16 num_rx_queues [default=1]; + u16 num_tx_queues [default=1]; +}; + +/** \brief Create host-interface response + @param context - sender context, to match reply w/ request + @param retval - return value for request +*/ +define af_packet_create_v3_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; +}; + +/** \brief Delete host-interface + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param host_if_name - interface name +*/ +autoreply define af_packet_delete +{ + u32 client_index; + u32 context; + + string host_if_name[64]; +}; + +/** \brief Set l4 offload checksum calculation + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request +*/ +autoreply define af_packet_set_l4_cksum_offload +{ + u32 client_index; + u32 context; + + vl_api_interface_index_t sw_if_index; + bool set; +}; + +/** \brief Dump af_packet interfaces request */ +define af_packet_dump +{ + u32 client_index; + u32 context; +}; + +/** \brief Reply for af_packet dump request + @param sw_if_index - software index of af_packet interface + @param host_if_name - interface name +*/ +define af_packet_details +{ + u32 context; + vl_api_interface_index_t sw_if_index; + string host_if_name[64]; +}; + +/* + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/plugins/af_packet/af_packet.c b/src/plugins/af_packet/af_packet.c new file mode 100644 index 00000000000..b2f860e658d --- /dev/null +++ b/src/plugins/af_packet/af_packet.c @@ -0,0 +1,879 @@ +/* + *------------------------------------------------------------------ + * af_packet.c - linux kernel packet interface + * + * Copyright (c) 2016 Cisco and/or its affiliates. + * 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. + *------------------------------------------------------------------ + */ + +#include <linux/if_ether.h> +#include <linux/if_packet.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <dirent.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> + +#include <vppinfra/linux/sysfs.h> +#include <vlib/vlib.h> +#include <vlib/unix/unix.h> +#include <vnet/ip/ip.h> +#include <vnet/devices/netlink.h> +#include <vnet/ethernet/ethernet.h> +#include <vnet/interface/rx_queue_funcs.h> +#include <vnet/interface/tx_queue_funcs.h> + +#include <af_packet/af_packet.h> + +af_packet_main_t af_packet_main; + +VNET_HW_INTERFACE_CLASS (af_packet_ip_device_hw_interface_class, static) = { + .name = "af-packet-ip-device", + .flags = VNET_HW_INTERFACE_CLASS_FLAG_P2P, +}; + +#define AF_PACKET_DEFAULT_TX_FRAMES_PER_BLOCK 1024 +#define AF_PACKET_DEFAULT_TX_FRAME_SIZE (2048 * 33) // GSO packet of 64KB +#define AF_PACKET_TX_BLOCK_NR 1 + +#define AF_PACKET_DEFAULT_RX_FRAMES_PER_BLOCK_V2 1024 +#define AF_PACKET_DEFAULT_RX_FRAME_SIZE_V2 (2048 * 33) // GSO packet of 64KB +#define AF_PACKET_RX_BLOCK_NR_V2 1 + +#define AF_PACKET_DEFAULT_RX_FRAMES_PER_BLOCK 32 +#define AF_PACKET_DEFAULT_RX_FRAME_SIZE 2048 +#define AF_PACKET_RX_BLOCK_NR 160 + +/*defined in net/if.h but clashes with dpdk headers */ +unsigned int if_nametoindex (const char *ifname); + +static clib_error_t * +af_packet_eth_set_max_frame_size (vnet_main_t *vnm, vnet_hw_interface_t *hi, + u32 frame_size) +{ + clib_error_t *error, *rv; + af_packet_main_t *apm = &af_packet_main; + af_packet_if_t *apif = pool_elt_at_index (apm->interfaces, hi->dev_instance); + + error = vnet_netlink_set_link_mtu (apif->host_if_index, + frame_size + hi->frame_overhead); + + if (error) + { + vlib_log_err (apm->log_class, "netlink failed to change MTU: %U", + format_clib_error, error); + rv = vnet_error (VNET_ERR_SYSCALL_ERROR_1, "netlink error: %U", + format_clib_error, error); + clib_error_free (error); + return rv; + } + else + apif->host_mtu = frame_size + hi->frame_overhead; + return 0; +} + +static int +af_packet_read_mtu (af_packet_if_t *apif) +{ + af_packet_main_t *apm = &af_packet_main; + clib_error_t *error; + error = vnet_netlink_get_link_mtu (apif->host_if_index, &apif->host_mtu); + if (error) + { + vlib_log_err (apm->log_class, "netlink failed to get MTU: %U", + format_clib_error, error); + clib_error_free (error); + return VNET_API_ERROR_SYSCALL_ERROR_1; + } + return 0; +} + +static clib_error_t * +af_packet_fd_read_ready (clib_file_t * uf) +{ + vnet_main_t *vnm = vnet_get_main (); + + /* Schedule the rx node */ + vnet_hw_if_rx_queue_set_int_pending (vnm, uf->private_data); + return 0; +} + +static int +is_bridge (const u8 * host_if_name) +{ + u8 *s; + DIR *dir = NULL; + + s = format (0, "/sys/class/net/%s/bridge%c", host_if_name, 0); + dir = opendir ((char *) s); + vec_free (s); + + if (dir) + { + closedir (dir); + return 0; + } + + return -1; +} + +static void +af_packet_set_rx_queues (vlib_main_t *vm, af_packet_if_t *apif) +{ + vnet_main_t *vnm = vnet_get_main (); + af_packet_queue_t *rx_queue; + + vnet_hw_if_set_input_node (vnm, apif->hw_if_index, + af_packet_input_node.index); + + vec_foreach (rx_queue, apif->rx_queues) + { + rx_queue->queue_index = vnet_hw_if_register_rx_queue ( + vnm, apif->hw_if_index, rx_queue->queue_id, VNET_HW_IF_RXQ_THREAD_ANY); + + { + clib_file_t template = { 0 }; + template.read_function = af_packet_fd_read_ready; + template.file_descriptor = rx_queue->fd; + template.private_data = rx_queue->queue_index; + template.flags = UNIX_FILE_EVENT_EDGE_TRIGGERED; + template.description = + format (0, "%U queue %u", format_af_packet_device_name, + apif->dev_instance, rx_queue->queue_id); + rx_queue->clib_file_index = clib_file_add (&file_main, &template); + } + vnet_hw_if_set_rx_queue_file_index (vnm, rx_queue->queue_index, + rx_queue->clib_file_index); + vnet_hw_if_set_rx_queue_mode (vnm, rx_queue->queue_index, + VNET_HW_IF_RX_MODE_INTERRUPT); + rx_queue->mode = VNET_HW_IF_RX_MODE_INTERRUPT; + } + vnet_hw_if_update_runtime_data (vnm, apif->hw_if_index); +} + +static void
@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
}
# Copyright (c) 2017 Cisco and/or its affiliates.
# 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.
*** Settings ***
| Resource | resources/libraries/robot/performance.robot
| Library | resources.libraries.python.NodePath
| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | NDRPDRDISC
| ... | NIC_Intel-X520-DA2 | DOT1Q | L2XCFWD | BASE | VHOST | VM
| Suite Setup | 3-node Performance Suite Setup with DUT's NIC model
| ... | L2 | Intel-X520-DA2
| Suite Teardown | 3-node Performance Suite Teardown
| Test Setup | Setup all DUTs before test
| Test Teardown | Run Keywords
| ... | Run Keyword If Test Failed
| ... | Traffic should pass with no loss | 10
| ... | ${min_rate}pps | ${framesize} | 3-node-bridge
| ... | fail_on_loss=${False}
| ... | AND | Show Vpp Vhost On All DUTs
| ... | AND | Remove startup configuration of VPP from all DUTs
| ... | AND | Guest VM with dpdk-testpmd Teardown | ${dut1}
| ... | ${dut1_vm_refs}
| ... | AND | Guest VM with dpdk-testpmd Teardown | ${dut2}
| ... | ${dut2_vm_refs}
| Documentation | *RFC2544: Pkt throughput L2XC test cases with vhost*
| ...
| ... | *[Top] Network Topologies:* TG-DUT1-DUT2-TG 3-node circular topology
| ... | with single links between nodes.
| ... | *[Enc] Packet Encapsulations:* Eth-IPv4 for L2 cross connect. 802.1q
| ... | tagging is applied on link between DUT1 and DUT2.
| ... | *[Cfg] DUT configuration:* DUT1 and DUT2 are configured with L2 cross-
| ... | connect. Qemu Guest is connected to VPP via vhost-user interfaces.
| ... | Guest is running DPDK testpmd interconnecting vhost-user interfaces
| ... | using 5 cores pinned to cpus 5-9 and 2048M memory. Testpmd is using
| ... | socket-mem=1024M (512x2M hugepages), 5 cores (1 main core and 4 cores
| ... | dedicated for io), forwarding mode is set to io, rxd/txd=256,
| ... | burst=64. DUT1, DUT2 are tested with 2p10GE NIC X520 Niantic by Intel.
| ... | *[Ver] TG verification:* TG finds and reports throughput NDR (Non Drop
| ... | Rate) with zero packet loss tolerance or throughput PDR (Partial Drop
| ... | Rate) with non-zero packet loss tolerance (LT) expressed in percentage
| ... | of packets transmitted. NDR and PDR are discovered for different
| ... | Ethernet L2 frame sizes using either binary search or linear search
| ... | algorithms with configured starting rate and final step that determines
| ... | throughput measurement resolution. Test packets are generated by TG on
| ... | links to DUTs. TG traffic profile contains two L3 flow-groups
| ... | (flow-group per direction, 253 flows per flow-group) with all packets
| ... | containing Ethernet header, IPv4 header with IP protocol=61 and static
| ... | payload. MAC addresses are matching MAC addresses of the TG node
| ... | interfaces.
| ... | *[Ref] Applicable standard specifications:* RFC2544.
*** Variables ***
| ${subid}= | 10
| ${tag_rewrite}= | pop-1
| ${vlan_overhead}= | ${4}
# Socket names
| ${sock1}= | /tmp/sock-1
| ${sock2}= | /tmp/sock-2
# X520-DA2 bandwidth limit
| ${s_limit}= | ${10000000000}
*** Test Cases ***
| tc01-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 1T1C | STHREAD | NDRDISC
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc02-64B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc03-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 1T1C | STHREAD | NDRDISC
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc04-1518B-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc05-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 1T1C | STHREAD | NDRDISC
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc06-IMIX-1t1c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 1 thread, 1 phy core,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps, LT=0.5%.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 1T1C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '1' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc07-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 2T2C | STHREAD | NDRDISC
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc08-64B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc09-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc10-1518B-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc11-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 2T2C | STHREAD | NDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc12-IMIX-2t2c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2BD switching config with 2 threads, 2 phy cores,\
| | ... | 1 receive queue per NIC port.
| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps, LT=0.5%.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 2T2C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '2' worker threads and rxqueues '1' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc13-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find NDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 4T4C | STHREAD | NDRDISC
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc14-64B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${64}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc15-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find NDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps.
| | ...
| | [Tags] | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc16-1518B-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 10GE\
| | ... | linerate, step 10kpps, LT=0.5%.
| | ...
| | [Tags] | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | ${1518}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${framesize + ${vlan_overhead}}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
| tc17-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-ndrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find NDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 4T4C | STHREAD | NDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find NDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold}
| tc18-IMIX-4t4c-eth-l2xcbase-eth-2vhost-1vm-pdrdisc
| | [Documentation]
| | ... | [Cfg] DUT runs L2XC switching config with 4 threads, 4 phy cores,\
| | ... | 2 receive queues per NIC port.
| | ... | [Ver] Find PDR for IMIX_v4_1 framesize using binary search start at\
| | ... | 10GE linerate, step 10kpps, LT=0.5%.
| | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B)
| | ...
| | [Tags] | 4T4C | STHREAD | PDRDISC | SKIP_PATCH
| | ...
| | ${framesize}= | Set Variable | IMIX_v4_1
| | ${avg_framesize}= | Set Variable | ${357.833}
| | ${min_rate}= | Set Variable | ${10000}
| | ${max_rate}= | Calculate pps | ${s_limit} | ${avg_framesize}
| | ${binary_min}= | Set Variable | ${min_rate}
| | ${binary_max}= | Set Variable | ${max_rate}
| | ${threshold}= | Set Variable | ${min_rate}
| | ${dut1_vm_refs}= | Create Dictionary
| | ${dut2_vm_refs}= | Create Dictionary
| | Given Add '4' worker threads and rxqueues '2' in 3-node single-link topo
| | And Add PCI devices to DUTs from 3-node single link topology
| | And Add No Multi Seg to all DUTs
| | And Apply startup configuration on all VPP DUTs
| | When L2 xconnect with Vhost-User and VLAN initialized in a 3-node circular topology
| | ... | ${sock1} | ${sock2} | ${subid} | ${tag_rewrite}
| | ${vm1}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM1
| | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM1 | ${vm1}
| | ${vm2}= | And Guest VM with dpdk-testpmd connected via vhost-user is setup
| | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM1
| | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM1 | ${vm2}
| | And Setup scheduler policy for VPP on all DUTs
| | Then Find PDR using binary search and pps | ${framesize} | ${binary_min}
| | ... | ${binary_max} | 3-node-bridge | ${min_rate} | ${max_rate}
| | ... | ${threshold} | ${glob_loss_acceptance} | ${glob_loss_acceptance_type}
|