xref: /dpdk/app/test/test_ethdev_link.c (revision 295968d1)
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 = {
17*295968d1SFerruh Yigit 		.link_speed = RTE_ETH_SPEED_NUM_2_5G,
18*295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_UP,
19*295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
20*295968d1SFerruh 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 
30*295968d1SFerruh Yigit 	link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
31*295968d1SFerruh Yigit 	link_status.link_autoneg = RTE_ETH_LINK_FIXED;
32*295968d1SFerruh 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 
40*295968d1SFerruh 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 
48*295968d1SFerruh 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 */
57*295968d1SFerruh Yigit 	link_status.link_speed = RTE_ETH_SPEED_NUM_200G;
58*295968d1SFerruh Yigit 	link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
59*295968d1SFerruh 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 = {
72*295968d1SFerruh Yigit 		.link_speed = RTE_ETH_SPEED_NUM_2_5G,
73*295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_DOWN,
74*295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
75*295968d1SFerruh 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,
93*295968d1SFerruh Yigit 		.link_status = RTE_ETH_LINK_UP,
94*295968d1SFerruh Yigit 		.link_autoneg = RTE_ETH_LINK_AUTONEG,
95*295968d1SFerruh 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[] = {
119*295968d1SFerruh Yigit 		{ "None",   RTE_ETH_SPEED_NUM_NONE },
120*295968d1SFerruh Yigit 		{ "10 Mbps",  RTE_ETH_SPEED_NUM_10M },
121*295968d1SFerruh Yigit 		{ "100 Mbps", RTE_ETH_SPEED_NUM_100M },
122*295968d1SFerruh Yigit 		{ "1 Gbps",   RTE_ETH_SPEED_NUM_1G },
123*295968d1SFerruh Yigit 		{ "2.5 Gbps", RTE_ETH_SPEED_NUM_2_5G },
124*295968d1SFerruh Yigit 		{ "5 Gbps",   RTE_ETH_SPEED_NUM_5G },
125*295968d1SFerruh Yigit 		{ "10 Gbps",  RTE_ETH_SPEED_NUM_10G },
126*295968d1SFerruh Yigit 		{ "20 Gbps",  RTE_ETH_SPEED_NUM_20G },
127*295968d1SFerruh Yigit 		{ "25 Gbps",  RTE_ETH_SPEED_NUM_25G },
128*295968d1SFerruh Yigit 		{ "40 Gbps",  RTE_ETH_SPEED_NUM_40G },
129*295968d1SFerruh Yigit 		{ "50 Gbps",  RTE_ETH_SPEED_NUM_50G },
130*295968d1SFerruh Yigit 		{ "56 Gbps",  RTE_ETH_SPEED_NUM_56G },
131*295968d1SFerruh Yigit 		{ "100 Gbps", RTE_ETH_SPEED_NUM_100G },
132*295968d1SFerruh Yigit 		{ "200 Gbps", RTE_ETH_SPEED_NUM_200G },
133*295968d1SFerruh Yigit 		{ "Unknown",  RTE_ETH_SPEED_NUM_UNKNOWN },
134fbf931c9SIvan Dyukov 		{ "Invalid",   50505 }
135fbf931c9SIvan Dyukov 	};
136fbf931c9SIvan Dyukov 
137fbf931c9SIvan Dyukov 	for (i = 0; i < sizeof(speed_str_map) / sizeof(struct link_speed_t);
138fbf931c9SIvan Dyukov 			i++) {
139fbf931c9SIvan Dyukov 		speed = rte_eth_link_speed_to_str(speed_str_map[i].link_speed);
140fbf931c9SIvan Dyukov 		TEST_ASSERT_BUFFERS_ARE_EQUAL(speed_str_map[i].value,
141fbf931c9SIvan Dyukov 			speed, strlen(speed_str_map[i].value),
142fbf931c9SIvan Dyukov 			"Invalid link speed string");
143fbf931c9SIvan Dyukov 	}
144fbf931c9SIvan Dyukov 	return TEST_SUCCESS;
145fbf931c9SIvan Dyukov }
146fbf931c9SIvan Dyukov 
147fbf931c9SIvan Dyukov static struct unit_test_suite link_status_testsuite = {
148fbf931c9SIvan Dyukov 	.suite_name = "link status formatting",
149fbf931c9SIvan Dyukov 	.setup = NULL,
150fbf931c9SIvan Dyukov 	.teardown = NULL,
151fbf931c9SIvan Dyukov 	.unit_test_cases = {
152fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_up_default),
153fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_down_default),
154fbf931c9SIvan Dyukov 		TEST_CASE(test_link_speed_all_values),
155fbf931c9SIvan Dyukov 		TEST_CASE(test_link_status_invalid),
156fbf931c9SIvan Dyukov 		TEST_CASES_END() /**< NULL terminate unit test array */
157fbf931c9SIvan Dyukov 	}
158fbf931c9SIvan Dyukov };
159fbf931c9SIvan Dyukov 
160fbf931c9SIvan Dyukov static int
test_link_status(void)161fbf931c9SIvan Dyukov test_link_status(void)
162fbf931c9SIvan Dyukov {
163fbf931c9SIvan Dyukov 	rte_log_set_global_level(RTE_LOG_DEBUG);
164fbf931c9SIvan Dyukov 	rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
165fbf931c9SIvan Dyukov 
166fbf931c9SIvan Dyukov 	return unit_test_suite_runner(&link_status_testsuite);
167fbf931c9SIvan Dyukov }
168fbf931c9SIvan Dyukov 
169fbf931c9SIvan Dyukov REGISTER_TEST_COMMAND(ethdev_link_status, test_link_status);
170