-/*-
- * BSD LICENSE
- *
- * Copyright(c) 2015 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2015 Intel Corporation
*/
#include <string.h>
#include <rte_log.h>
#include <rte_lcore.h>
#include <rte_memory.h>
+#include <rte_bus_vdev.h>
#include <rte_string_fns.h>
#include <rte_errno.h>
#include <rte_eth_bond.h>
-#include <rte_eth_null.h>
#include "test.h"
#define RXTX_RING_SIZE 1024
#define RXTX_QUEUE_COUNT 4
-#define BONDED_DEV_NAME ("rssconf_bond_dev")
+#define BONDED_DEV_NAME ("net_bonding_rss")
-#define SLAVE_DEV_NAME_FMT ("rssconf_slave%d")
+#define SLAVE_DEV_NAME_FMT ("net_null%d")
#define SLAVE_RXTX_QUEUE_FMT ("rssconf_slave%d_q%d")
#define NUM_MBUFS 8191
-#define MBUF_SIZE (1600 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
+#define MBUF_SIZE (1600 + RTE_PKTMBUF_HEADROOM)
#define MBUF_CACHE_SIZE 250
#define BURST_SIZE 32
#define INVALID_BONDING_MODE (-1)
struct slave_conf {
- uint8_t port_id;
+ uint16_t port_id;
struct rte_eth_dev_info dev_info;
struct rte_eth_rss_conf rss_conf;
uint8_t rss_key[40];
- struct rte_eth_rss_reta_entry64 reta_conf[512 / RTE_RETA_GROUP_SIZE];
+ struct rte_eth_rss_reta_entry64 reta_conf[512 / RTE_ETH_RETA_GROUP_SIZE];
uint8_t is_slave;
struct rte_ring *rxtx_queue[RXTX_QUEUE_COUNT];
struct link_bonding_rssconf_unittest_params {
uint8_t bond_port_id;
struct rte_eth_dev_info bond_dev_info;
- struct rte_eth_rss_reta_entry64 bond_reta_conf[512 / RTE_RETA_GROUP_SIZE];
+ struct rte_eth_rss_reta_entry64 bond_reta_conf[512 / RTE_ETH_RETA_GROUP_SIZE];
struct slave_conf slave_ports[SLAVE_COUNT];
struct rte_mempool *mbuf_pool;
*/
static struct rte_eth_conf default_pmd_conf = {
.rxmode = {
- .mq_mode = ETH_MQ_RX_NONE,
- .max_rx_pkt_len = ETHER_MAX_LEN,
+ .mq_mode = RTE_ETH_MQ_RX_NONE,
.split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled */
- .hw_ip_checksum = 0, /**< IP checksum offload enabled */
- .hw_vlan_filter = 0, /**< VLAN filtering disabled */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled */
- .hw_strip_crc = 0, /**< CRC stripped by hardware */
},
.txmode = {
- .mq_mode = ETH_MQ_TX_NONE,
+ .mq_mode = RTE_ETH_MQ_TX_NONE,
},
.lpbk_mode = 0,
};
static struct rte_eth_conf rss_pmd_conf = {
.rxmode = {
- .mq_mode = ETH_MQ_RX_RSS,
- .max_rx_pkt_len = ETHER_MAX_LEN,
+ .mq_mode = RTE_ETH_MQ_RX_RSS,
.split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled */
- .hw_ip_checksum = 0, /**< IP checksum offload enabled */
- .hw_vlan_filter = 0, /**< VLAN filtering disabled */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled */
- .hw_strip_crc = 0, /**< CRC stripped by hardware */
},
.txmode = {
- .mq_mode = ETH_MQ_TX_NONE,
+ .mq_mode = RTE_ETH_MQ_TX_NONE,
},
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL,
- .rss_hf = ETH_RSS_IPV6,
+ .rss_hf = RTE_ETH_RSS_IPV6,
},
},
.lpbk_mode = 0,
RTE_DIM(test_params.slave_ports))
static int
-configure_ethdev(uint8_t port_id, struct rte_eth_conf *eth_conf, uint8_t start)
+configure_ethdev(uint16_t port_id, struct rte_eth_conf *eth_conf,
+ uint8_t start)
{
int rxq, txq;
RXTX_QUEUE_COUNT, eth_conf) == 0, "Failed to configure device %u",
port_id);
+ int ret = rte_eth_dev_set_mtu(port_id, 1550);
+ RTE_TEST_ASSERT(ret == 0 || ret == -ENOTSUP,
+ "rte_eth_dev_set_mtu for port %d failed", port_id);
+
for (rxq = 0; rxq < RXTX_QUEUE_COUNT; rxq++) {
TEST_ASSERT(rte_eth_rx_queue_setup(port_id, rxq, RXTX_RING_SIZE,
rte_eth_dev_socket_id(port_id), NULL,
remove_slaves_and_stop_bonded_device(void)
{
TEST_ASSERT_SUCCESS(remove_slaves(), "Removing slaves");
- rte_eth_dev_stop(test_params.bond_port_id);
+ TEST_ASSERT_SUCCESS(rte_eth_dev_stop(test_params.bond_port_id),
+ "Failed to stop port %u", test_params.bond_port_id);
return TEST_SUCCESS;
}
* Set all RETA values in port_id to value
*/
static int
-reta_set(uint8_t port_id, uint8_t value, int reta_size)
+reta_set(uint16_t port_id, uint8_t value, int reta_size)
{
- struct rte_eth_rss_reta_entry64 reta_conf[512/RTE_RETA_GROUP_SIZE];
+ struct rte_eth_rss_reta_entry64 reta_conf[512/RTE_ETH_RETA_GROUP_SIZE];
int i, j;
- for (i = 0; i < reta_size / RTE_RETA_GROUP_SIZE; i++) {
+ for (i = 0; i < reta_size / RTE_ETH_RETA_GROUP_SIZE; i++) {
/* select all fields to set */
reta_conf[i].mask = ~0LL;
- for (j = 0; j < RTE_RETA_GROUP_SIZE; j++)
+ for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++)
reta_conf[i].reta[j] = value;
}
for (i = 0; i < test_params.bond_dev_info.reta_size;
i++) {
- int index = i / RTE_RETA_GROUP_SIZE;
- int shift = i % RTE_RETA_GROUP_SIZE;
+ int index = i / RTE_ETH_RETA_GROUP_SIZE;
+ int shift = i % RTE_ETH_RETA_GROUP_SIZE;
if (port->reta_conf[index].reta[shift] !=
test_params.bond_reta_conf[index].reta[shift])
bond_reta_fetch(void) {
unsigned j;
- for (j = 0; j < test_params.bond_dev_info.reta_size / RTE_RETA_GROUP_SIZE;
+ for (j = 0; j < test_params.bond_dev_info.reta_size / RTE_ETH_RETA_GROUP_SIZE;
j++)
test_params.bond_reta_conf[j].mask = ~0LL;
slave_reta_fetch(struct slave_conf *port) {
unsigned j;
- for (j = 0; j < port->dev_info.reta_size / RTE_RETA_GROUP_SIZE; j++)
+ for (j = 0; j < port->dev_info.reta_size / RTE_ETH_RETA_GROUP_SIZE; j++)
port->reta_conf[j].mask = ~0LL;
TEST_ASSERT_SUCCESS(rte_eth_dev_rss_reta_query(port->port_id,
uint64_t rss_hf = 0;
uint64_t default_rss_hf = 0;
- rte_eth_dev_info_get(test_params.bond_port_id, &test_params.bond_dev_info);
+ retval = rte_eth_dev_info_get(test_params.bond_port_id,
+ &test_params.bond_dev_info);
+ TEST_ASSERT((retval == 0),
+ "Error during getting device (port %u) info: %s\n",
+ test_params.bond_port_id, strerror(-retval));
/*
* Test hash function propagation
/**
* Configure bonding port in RSS mq mode
*/
+ int ret;
+
TEST_ASSERT_SUCCESS(configure_ethdev(test_params.bond_port_id,
&rss_pmd_conf, 0), "Failed to configure bonding device\n");
- rte_eth_dev_info_get(test_params.bond_port_id, &test_params.bond_dev_info);
+ ret = rte_eth_dev_info_get(test_params.bond_port_id,
+ &test_params.bond_dev_info);
+ TEST_ASSERT((ret == 0),
+ "Error during getting device (port %u) info: %s\n",
+ test_params.bond_port_id, strerror(-ret));
TEST_ASSERT_SUCCESS(bond_slaves(), "Bonding slaves failed");
static int
test_rss_lazy(void)
{
+ int ret;
+
TEST_ASSERT_SUCCESS(configure_ethdev(test_params.bond_port_id,
&default_pmd_conf, 0), "Failed to configure bonding device\n");
- rte_eth_dev_info_get(test_params.bond_port_id, &test_params.bond_dev_info);
+ ret = rte_eth_dev_info_get(test_params.bond_port_id,
+ &test_params.bond_dev_info);
+ TEST_ASSERT((ret == 0),
+ "Error during getting device (port %u) info: %s\n",
+ test_params.bond_port_id, strerror(-ret));
TEST_ASSERT_SUCCESS(bond_slaves(), "Bonding slaves failed");
int port_id;
char name[256];
struct slave_conf *port;
+ struct rte_ether_addr mac_addr = { .addr_bytes = {0} };
if (test_params.mbuf_pool == NULL) {
- test_params.mbuf_pool = rte_mempool_create("RSS_MBUF_POOL", NUM_MBUFS *
- SLAVE_COUNT, MBUF_SIZE, MBUF_CACHE_SIZE,
- sizeof(struct rte_pktmbuf_pool_private), rte_pktmbuf_pool_init,
- NULL, rte_pktmbuf_init, NULL, rte_socket_id(), 0);
+ test_params.mbuf_pool = rte_pktmbuf_pool_create(
+ "RSS_MBUF_POOL", NUM_MBUFS * SLAVE_COUNT,
+ MBUF_CACHE_SIZE, 0, MBUF_SIZE, rte_socket_id());
TEST_ASSERT(test_params.mbuf_pool != NULL,
- "rte_mempool_create failed\n");
+ "rte_pktmbuf_pool_create failed\n");
}
/* Create / initialize ring eth devs. */
FOR_EACH_PORT(n, port) {
port = &test_params.slave_ports[n];
- port_id = rte_eth_dev_count();
+ port_id = rte_eth_dev_count_avail();
snprintf(name, sizeof(name), SLAVE_DEV_NAME_FMT, port_id);
- retval = eth_dev_null_create(name, 0, 64, 0);
+ retval = rte_vdev_init(name, "size=64,copy=0");
TEST_ASSERT_SUCCESS(retval, "Failed to create null device '%s'\n",
name);
TEST_ASSERT_SUCCESS(retval, "Failed to configure virtual ethdev %s\n",
name);
+ /* assign a non-zero MAC */
+ mac_addr.addr_bytes[5] = 0x10 + port->port_id;
+ rte_eth_dev_default_mac_addr_set(port->port_id, &mac_addr);
+
rte_eth_dev_info_get(port->port_id, &port->dev_info);
+ retval = rte_eth_dev_info_get(port->port_id, &port->dev_info);
+ TEST_ASSERT((retval == 0),
+ "Error during getting device (port %u) info: %s\n",
+ test_params.bond_port_id, strerror(-retval));
}
if (test_params.bond_port_id == INVALID_PORT_ID) {
TEST_ASSERT_SUCCESS(configure_ethdev(test_params.bond_port_id,
&default_pmd_conf, 0), "Failed to configure bonding device\n");
- rte_eth_dev_info_get(test_params.bond_port_id,
- &test_params.bond_dev_info);
+ retval = rte_eth_dev_info_get(test_params.bond_port_id,
+ &test_params.bond_dev_info);
+ TEST_ASSERT((retval == 0),
+ "Error during getting device (port %u) info: %s\n",
+ test_params.bond_port_id, strerror(-retval));
}
return TEST_SUCCESS;
}
-static int
+static void
testsuite_teardown(void)
{
struct slave_conf *port;
FOR_EACH_PORT(i, port)
rte_eth_dev_stop(port->port_id);
-
- return 0;
}
static int
TEST_CASE_NAMED("test_setup", test_setup_wrapper),
TEST_CASE_NAMED("test_rss", test_rss_wrapper),
TEST_CASE_NAMED("test_rss_lazy", test_rss_lazy_wrapper),
- { NULL, NULL, NULL, NULL, NULL } /**< NULL terminate unit test array */
+
+ TEST_CASES_END()
}
};
return unit_test_suite_runner(&link_bonding_rssconf_test_suite);
}
-static struct test_command test_link_bonding_rssconf_cmd = {
- .command = "link_bonding_rssconf_autotest",
- .callback = test_link_bonding_rssconf,
-};
-
-REGISTER_TEST_COMMAND(test_link_bonding_rssconf_cmd);
+REGISTER_TEST_COMMAND(link_bonding_rssconf_autotest, test_link_bonding_rssconf);