xref: /dpdk/app/test/test_ethdev_link.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1fbf931c9SIvan Dyukov /* SPDX-License-Identifier: BSD-3-Clause
2fbf931c9SIvan Dyukov  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
3fbf931c9SIvan Dyukov  */
4fbf931c9SIvan Dyukov 
5fbf931c9SIvan Dyukov #include <rte_log.h>
6fbf931c9SIvan Dyukov #include <rte_ethdev.h>
7fbf931c9SIvan Dyukov 
8fbf931c9SIvan Dyukov #include <rte_test.h>
9fbf931c9SIvan Dyukov #include "test.h"
10fbf931c9SIvan Dyukov 
11fbf931c9SIvan Dyukov 
12fbf931c9SIvan Dyukov static int32_t
test_link_status_up_default(void)13fbf931c9SIvan Dyukov test_link_status_up_default(void)
14fbf931c9SIvan Dyukov {
15fbf931c9SIvan Dyukov 	int ret = 0;
16fbf931c9SIvan Dyukov 	struct rte_eth_link link_status = {
17295968d1SFerruh Yigit 		.link_speed = RTE_ETH_SPEED_NUM_2_5G,
18295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_UP,
19295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
20295968d1SFerruh Yigit 		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX
21fbf931c9SIvan Dyukov 	};
22fbf931c9SIvan Dyukov 	char text[RTE_ETH_LINK_MAX_STR_LEN];
23fbf931c9SIvan Dyukov 
24fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
25fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
26fbf931c9SIvan Dyukov 	printf("Default link up #1: %s\n", text);
27fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 2.5 Gbps FDX Autoneg",
28fbf931c9SIvan Dyukov 		text, strlen(text), "Invalid default link status string");
29fbf931c9SIvan Dyukov 
30295968d1SFerruh Yigit 	link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
31295968d1SFerruh Yigit 	link_status.link_autoneg = RTE_ETH_LINK_FIXED;
32295968d1SFerruh Yigit 	link_status.link_speed = RTE_ETH_SPEED_NUM_10M;
33fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
34fbf931c9SIvan Dyukov 	printf("Default link up #2: %s\n", text);
35fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
36fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 10 Mbps HDX Fixed",
37fbf931c9SIvan Dyukov 		text, strlen(text), "Invalid default link status "
38fbf931c9SIvan Dyukov 		"string with HDX");
39fbf931c9SIvan Dyukov 
40295968d1SFerruh Yigit 	link_status.link_speed = RTE_ETH_SPEED_NUM_UNKNOWN;
41fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
42fbf931c9SIvan Dyukov 	printf("Default link up #3: %s\n", text);
43fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
44fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Unknown HDX Fixed",
45fbf931c9SIvan Dyukov 		text, strlen(text), "Invalid default link status "
46fbf931c9SIvan Dyukov 		"string with HDX");
47fbf931c9SIvan Dyukov 
48295968d1SFerruh Yigit 	link_status.link_speed = RTE_ETH_SPEED_NUM_NONE;
49fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
50fbf931c9SIvan Dyukov 	printf("Default link up #3: %s\n", text);
51fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
52fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at None HDX Fixed",
53fbf931c9SIvan Dyukov 		text, strlen(text), "Invalid default link status "
54fbf931c9SIvan Dyukov 		"string with HDX");
55fbf931c9SIvan Dyukov 
56fbf931c9SIvan Dyukov 	/* test max str len */
57a131d9ecSThomas Monjalon 	link_status.link_speed = RTE_ETH_SPEED_NUM_400G;
58295968d1SFerruh Yigit 	link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
59295968d1SFerruh Yigit 	link_status.link_autoneg = RTE_ETH_LINK_AUTONEG;
60fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
61fbf931c9SIvan Dyukov 	printf("Default link up #4:len = %d, %s\n", ret, text);
62fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
63fbf931c9SIvan Dyukov 		"String length exceeds max allowed value\n");
64fbf931c9SIvan Dyukov 	return TEST_SUCCESS;
65fbf931c9SIvan Dyukov }
66fbf931c9SIvan Dyukov 
67fbf931c9SIvan Dyukov static int32_t
test_link_status_down_default(void)68fbf931c9SIvan Dyukov test_link_status_down_default(void)
69fbf931c9SIvan Dyukov {
70fbf931c9SIvan Dyukov 	int ret = 0;
71fbf931c9SIvan Dyukov 	struct rte_eth_link link_status = {
72295968d1SFerruh Yigit 		.link_speed = RTE_ETH_SPEED_NUM_2_5G,
73295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_DOWN,
74295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
75295968d1SFerruh Yigit 		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX
76fbf931c9SIvan Dyukov 	};
77fbf931c9SIvan Dyukov 	char text[RTE_ETH_LINK_MAX_STR_LEN];
78fbf931c9SIvan Dyukov 
79fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
80fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
81fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link down",
82fbf931c9SIvan Dyukov 		text, strlen(text), "Invalid default link status string");
83fbf931c9SIvan Dyukov 
84fbf931c9SIvan Dyukov 	return TEST_SUCCESS;
85fbf931c9SIvan Dyukov }
86fbf931c9SIvan Dyukov 
87fbf931c9SIvan Dyukov static int32_t
test_link_status_invalid(void)88fbf931c9SIvan Dyukov test_link_status_invalid(void)
89fbf931c9SIvan Dyukov {
90fbf931c9SIvan Dyukov 	int ret = 0;
91fbf931c9SIvan Dyukov 	struct rte_eth_link link_status = {
92fbf931c9SIvan Dyukov 		.link_speed = 55555,
93295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_UP,
94295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
95295968d1SFerruh Yigit 		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX
96fbf931c9SIvan Dyukov 	};
97fbf931c9SIvan Dyukov 	char text[RTE_ETH_LINK_MAX_STR_LEN];
98fbf931c9SIvan Dyukov 
99fbf931c9SIvan Dyukov 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
100fbf931c9SIvan Dyukov 	RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
101fbf931c9SIvan Dyukov 		"Failed to format invalid string\n");
102fbf931c9SIvan Dyukov 	printf("invalid link up #1: len=%d %s\n", ret, text);
103fbf931c9SIvan Dyukov 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Invalid FDX Autoneg",
104fbf931c9SIvan Dyukov 		text, strlen(text), "Incorrect invalid link status string");
105fbf931c9SIvan Dyukov 
106fbf931c9SIvan Dyukov 	return TEST_SUCCESS;
107fbf931c9SIvan Dyukov }
108fbf931c9SIvan Dyukov 
109fbf931c9SIvan Dyukov 
110fbf931c9SIvan Dyukov static int32_t
test_link_speed_all_values(void)111fbf931c9SIvan Dyukov test_link_speed_all_values(void)
112fbf931c9SIvan Dyukov {
113fbf931c9SIvan Dyukov 	const char *speed;
114fbf931c9SIvan Dyukov 	uint32_t i;
115fbf931c9SIvan Dyukov 	struct link_speed_t {
116fbf931c9SIvan Dyukov 		const char *value;
117fbf931c9SIvan Dyukov 		uint32_t link_speed;
118fbf931c9SIvan Dyukov 	} speed_str_map[] = {
119295968d1SFerruh Yigit 		{ "None",   RTE_ETH_SPEED_NUM_NONE },
120295968d1SFerruh Yigit 		{ "10 Mbps",  RTE_ETH_SPEED_NUM_10M },
121295968d1SFerruh Yigit 		{ "100 Mbps", RTE_ETH_SPEED_NUM_100M },
122295968d1SFerruh Yigit 		{ "1 Gbps",   RTE_ETH_SPEED_NUM_1G },
123295968d1SFerruh Yigit 		{ "2.5 Gbps", RTE_ETH_SPEED_NUM_2_5G },
124295968d1SFerruh Yigit 		{ "5 Gbps",   RTE_ETH_SPEED_NUM_5G },
125295968d1SFerruh Yigit 		{ "10 Gbps",  RTE_ETH_SPEED_NUM_10G },
126295968d1SFerruh Yigit 		{ "20 Gbps",  RTE_ETH_SPEED_NUM_20G },
127295968d1SFerruh Yigit 		{ "25 Gbps",  RTE_ETH_SPEED_NUM_25G },
128295968d1SFerruh Yigit 		{ "40 Gbps",  RTE_ETH_SPEED_NUM_40G },
129295968d1SFerruh Yigit 		{ "50 Gbps",  RTE_ETH_SPEED_NUM_50G },
130295968d1SFerruh Yigit 		{ "56 Gbps",  RTE_ETH_SPEED_NUM_56G },
131295968d1SFerruh Yigit 		{ "100 Gbps", RTE_ETH_SPEED_NUM_100G },
132295968d1SFerruh Yigit 		{ "200 Gbps", RTE_ETH_SPEED_NUM_200G },
133a131d9ecSThomas Monjalon 		{ "400 Gbps", RTE_ETH_SPEED_NUM_400G },
134295968d1SFerruh Yigit 		{ "Unknown",  RTE_ETH_SPEED_NUM_UNKNOWN },
135fbf931c9SIvan Dyukov 		{ "Invalid",   50505 }
136fbf931c9SIvan Dyukov 	};
137fbf931c9SIvan Dyukov 
138fbf931c9SIvan Dyukov 	for (i = 0; i < sizeof(speed_str_map) / sizeof(struct link_speed_t);
139fbf931c9SIvan Dyukov 			i++) {
140fbf931c9SIvan Dyukov 		speed = rte_eth_link_speed_to_str(speed_str_map[i].link_speed);
141fbf931c9SIvan Dyukov 		TEST_ASSERT_BUFFERS_ARE_EQUAL(speed_str_map[i].value,
142fbf931c9SIvan Dyukov 			speed, strlen(speed_str_map[i].value),
143fbf931c9SIvan Dyukov 			"Invalid link speed string");
144fbf931c9SIvan Dyukov 	}
145fbf931c9SIvan Dyukov 	return TEST_SUCCESS;
146fbf931c9SIvan Dyukov }
147fbf931c9SIvan Dyukov 
148fbf931c9SIvan Dyukov static struct unit_test_suite link_status_testsuite = {
149fbf931c9SIvan Dyukov 	.suite_name = "link status formatting",
150fbf931c9SIvan Dyukov 	.setup = NULL,
151fbf931c9SIvan Dyukov 	.teardown = NULL,
152fbf931c9SIvan Dyukov 	.unit_test_cases = {
153fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_up_default),
154fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_down_default),
155fbf931c9SIvan Dyukov 		TEST_CASE(test_link_speed_all_values),
156fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_invalid),
157fbf931c9SIvan Dyukov 		TEST_CASES_END() /**< NULL terminate unit test array */
158fbf931c9SIvan Dyukov 	}
159fbf931c9SIvan Dyukov };
160fbf931c9SIvan Dyukov 
161fbf931c9SIvan Dyukov static int
test_link_status(void)162fbf931c9SIvan Dyukov test_link_status(void)
163fbf931c9SIvan Dyukov {
164fbf931c9SIvan Dyukov 	rte_log_set_global_level(RTE_LOG_DEBUG);
165fbf931c9SIvan Dyukov 	rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
166fbf931c9SIvan Dyukov 
167fbf931c9SIvan Dyukov 	return unit_test_suite_runner(&link_status_testsuite);
168fbf931c9SIvan Dyukov }
169fbf931c9SIvan Dyukov 
170*e0a8442cSBruce Richardson REGISTER_FAST_TEST(ethdev_link_status, true, true, test_link_status);
171