fbf931c9c3
There is new link_speed value introduced. It's INT_MAX value which means that speed is unknown. To simplify processing of the value in application, new function is added which convert link_speed to string. Also dpdk examples have many duplicated code which format entire link status structure to text. This commit adds two functions: * rte_eth_link_speed_to_str - format link_speed to string * rte_eth_link_to_str - convert link status structure to string Signed-off-by: Ivan Dyukov <i.dyukov@samsung.com> Acked-by: Morten Brørup <mb@smartsharesystems.com> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
170 lines
5.1 KiB
C
170 lines
5.1 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
|
|
*/
|
|
|
|
#include <rte_log.h>
|
|
#include <rte_ethdev.h>
|
|
|
|
#include <rte_test.h>
|
|
#include "test.h"
|
|
|
|
|
|
static int32_t
|
|
test_link_status_up_default(void)
|
|
{
|
|
int ret = 0;
|
|
struct rte_eth_link link_status = {
|
|
.link_speed = ETH_SPEED_NUM_2_5G,
|
|
.link_status = ETH_LINK_UP,
|
|
.link_autoneg = ETH_LINK_AUTONEG,
|
|
.link_duplex = ETH_LINK_FULL_DUPLEX
|
|
};
|
|
char text[RTE_ETH_LINK_MAX_STR_LEN];
|
|
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
|
|
printf("Default link up #1: %s\n", text);
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 2.5 Gbps FDX Autoneg",
|
|
text, strlen(text), "Invalid default link status string");
|
|
|
|
link_status.link_duplex = ETH_LINK_HALF_DUPLEX;
|
|
link_status.link_autoneg = ETH_LINK_FIXED;
|
|
link_status.link_speed = ETH_SPEED_NUM_10M,
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
printf("Default link up #2: %s\n", text);
|
|
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 10 Mbps HDX Fixed",
|
|
text, strlen(text), "Invalid default link status "
|
|
"string with HDX");
|
|
|
|
link_status.link_speed = ETH_SPEED_NUM_UNKNOWN;
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
printf("Default link up #3: %s\n", text);
|
|
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Unknown HDX Fixed",
|
|
text, strlen(text), "Invalid default link status "
|
|
"string with HDX");
|
|
|
|
link_status.link_speed = ETH_SPEED_NUM_NONE;
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
printf("Default link up #3: %s\n", text);
|
|
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at None HDX Fixed",
|
|
text, strlen(text), "Invalid default link status "
|
|
"string with HDX");
|
|
|
|
/* test max str len */
|
|
link_status.link_speed = ETH_SPEED_NUM_200G;
|
|
link_status.link_duplex = ETH_LINK_HALF_DUPLEX;
|
|
link_status.link_autoneg = ETH_LINK_AUTONEG;
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
printf("Default link up #4:len = %d, %s\n", ret, text);
|
|
RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
|
|
"String length exceeds max allowed value\n");
|
|
return TEST_SUCCESS;
|
|
}
|
|
|
|
static int32_t
|
|
test_link_status_down_default(void)
|
|
{
|
|
int ret = 0;
|
|
struct rte_eth_link link_status = {
|
|
.link_speed = ETH_SPEED_NUM_2_5G,
|
|
.link_status = ETH_LINK_DOWN,
|
|
.link_autoneg = ETH_LINK_AUTONEG,
|
|
.link_duplex = ETH_LINK_FULL_DUPLEX
|
|
};
|
|
char text[RTE_ETH_LINK_MAX_STR_LEN];
|
|
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link down",
|
|
text, strlen(text), "Invalid default link status string");
|
|
|
|
return TEST_SUCCESS;
|
|
}
|
|
|
|
static int32_t
|
|
test_link_status_invalid(void)
|
|
{
|
|
int ret = 0;
|
|
struct rte_eth_link link_status = {
|
|
.link_speed = 55555,
|
|
.link_status = ETH_LINK_UP,
|
|
.link_autoneg = ETH_LINK_AUTONEG,
|
|
.link_duplex = ETH_LINK_FULL_DUPLEX
|
|
};
|
|
char text[RTE_ETH_LINK_MAX_STR_LEN];
|
|
|
|
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
|
|
RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
|
|
"Failed to format invalid string\n");
|
|
printf("invalid link up #1: len=%d %s\n", ret, text);
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Invalid FDX Autoneg",
|
|
text, strlen(text), "Incorrect invalid link status string");
|
|
|
|
return TEST_SUCCESS;
|
|
}
|
|
|
|
|
|
static int32_t
|
|
test_link_speed_all_values(void)
|
|
{
|
|
const char *speed;
|
|
uint32_t i;
|
|
struct link_speed_t {
|
|
const char *value;
|
|
uint32_t link_speed;
|
|
} speed_str_map[] = {
|
|
{ "None", ETH_SPEED_NUM_NONE },
|
|
{ "10 Mbps", ETH_SPEED_NUM_10M },
|
|
{ "100 Mbps", ETH_SPEED_NUM_100M },
|
|
{ "1 Gbps", ETH_SPEED_NUM_1G },
|
|
{ "2.5 Gbps", ETH_SPEED_NUM_2_5G },
|
|
{ "5 Gbps", ETH_SPEED_NUM_5G },
|
|
{ "10 Gbps", ETH_SPEED_NUM_10G },
|
|
{ "20 Gbps", ETH_SPEED_NUM_20G },
|
|
{ "25 Gbps", ETH_SPEED_NUM_25G },
|
|
{ "40 Gbps", ETH_SPEED_NUM_40G },
|
|
{ "50 Gbps", ETH_SPEED_NUM_50G },
|
|
{ "56 Gbps", ETH_SPEED_NUM_56G },
|
|
{ "100 Gbps", ETH_SPEED_NUM_100G },
|
|
{ "200 Gbps", ETH_SPEED_NUM_200G },
|
|
{ "Unknown", ETH_SPEED_NUM_UNKNOWN },
|
|
{ "Invalid", 50505 }
|
|
};
|
|
|
|
for (i = 0; i < sizeof(speed_str_map) / sizeof(struct link_speed_t);
|
|
i++) {
|
|
speed = rte_eth_link_speed_to_str(speed_str_map[i].link_speed);
|
|
TEST_ASSERT_BUFFERS_ARE_EQUAL(speed_str_map[i].value,
|
|
speed, strlen(speed_str_map[i].value),
|
|
"Invalid link speed string");
|
|
}
|
|
return TEST_SUCCESS;
|
|
}
|
|
|
|
static struct unit_test_suite link_status_testsuite = {
|
|
.suite_name = "link status formatting",
|
|
.setup = NULL,
|
|
.teardown = NULL,
|
|
.unit_test_cases = {
|
|
TEST_CASE(test_link_status_up_default),
|
|
TEST_CASE(test_link_status_down_default),
|
|
TEST_CASE(test_link_speed_all_values),
|
|
TEST_CASE(test_link_status_invalid),
|
|
TEST_CASES_END() /**< NULL terminate unit test array */
|
|
}
|
|
};
|
|
|
|
static int
|
|
test_link_status(void)
|
|
{
|
|
rte_log_set_global_level(RTE_LOG_DEBUG);
|
|
rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
|
|
|
|
return unit_test_suite_runner(&link_status_testsuite);
|
|
}
|
|
|
|
REGISTER_TEST_COMMAND(ethdev_link_status, test_link_status);
|