xref: /f-stack/dpdk/app/test/test_ethdev_link.c (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 #include <rte_log.h>
6*2d9fd380Sjfb8856606 #include <rte_ethdev.h>
7*2d9fd380Sjfb8856606 
8*2d9fd380Sjfb8856606 #include <rte_test.h>
9*2d9fd380Sjfb8856606 #include "test.h"
10*2d9fd380Sjfb8856606 
11*2d9fd380Sjfb8856606 
12*2d9fd380Sjfb8856606 static int32_t
test_link_status_up_default(void)13*2d9fd380Sjfb8856606 test_link_status_up_default(void)
14*2d9fd380Sjfb8856606 {
15*2d9fd380Sjfb8856606 	int ret = 0;
16*2d9fd380Sjfb8856606 	struct rte_eth_link link_status = {
17*2d9fd380Sjfb8856606 		.link_speed = ETH_SPEED_NUM_2_5G,
18*2d9fd380Sjfb8856606 		.link_status = ETH_LINK_UP,
19*2d9fd380Sjfb8856606 		.link_autoneg = ETH_LINK_AUTONEG,
20*2d9fd380Sjfb8856606 		.link_duplex = ETH_LINK_FULL_DUPLEX
21*2d9fd380Sjfb8856606 	};
22*2d9fd380Sjfb8856606 	char text[RTE_ETH_LINK_MAX_STR_LEN];
23*2d9fd380Sjfb8856606 
24*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
25*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
26*2d9fd380Sjfb8856606 	printf("Default link up #1: %s\n", text);
27*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 2.5 Gbps FDX Autoneg",
28*2d9fd380Sjfb8856606 		text, strlen(text), "Invalid default link status string");
29*2d9fd380Sjfb8856606 
30*2d9fd380Sjfb8856606 	link_status.link_duplex = ETH_LINK_HALF_DUPLEX;
31*2d9fd380Sjfb8856606 	link_status.link_autoneg = ETH_LINK_FIXED;
32*2d9fd380Sjfb8856606 	link_status.link_speed = ETH_SPEED_NUM_10M,
33*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
34*2d9fd380Sjfb8856606 	printf("Default link up #2: %s\n", text);
35*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
36*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 10 Mbps HDX Fixed",
37*2d9fd380Sjfb8856606 		text, strlen(text), "Invalid default link status "
38*2d9fd380Sjfb8856606 		"string with HDX");
39*2d9fd380Sjfb8856606 
40*2d9fd380Sjfb8856606 	link_status.link_speed = ETH_SPEED_NUM_UNKNOWN;
41*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
42*2d9fd380Sjfb8856606 	printf("Default link up #3: %s\n", text);
43*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
44*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Unknown HDX Fixed",
45*2d9fd380Sjfb8856606 		text, strlen(text), "Invalid default link status "
46*2d9fd380Sjfb8856606 		"string with HDX");
47*2d9fd380Sjfb8856606 
48*2d9fd380Sjfb8856606 	link_status.link_speed = ETH_SPEED_NUM_NONE;
49*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
50*2d9fd380Sjfb8856606 	printf("Default link up #3: %s\n", text);
51*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
52*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at None HDX Fixed",
53*2d9fd380Sjfb8856606 		text, strlen(text), "Invalid default link status "
54*2d9fd380Sjfb8856606 		"string with HDX");
55*2d9fd380Sjfb8856606 
56*2d9fd380Sjfb8856606 	/* test max str len */
57*2d9fd380Sjfb8856606 	link_status.link_speed = ETH_SPEED_NUM_200G;
58*2d9fd380Sjfb8856606 	link_status.link_duplex = ETH_LINK_HALF_DUPLEX;
59*2d9fd380Sjfb8856606 	link_status.link_autoneg = ETH_LINK_AUTONEG;
60*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
61*2d9fd380Sjfb8856606 	printf("Default link up #4:len = %d, %s\n", ret, text);
62*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
63*2d9fd380Sjfb8856606 		"String length exceeds max allowed value\n");
64*2d9fd380Sjfb8856606 	return TEST_SUCCESS;
65*2d9fd380Sjfb8856606 }
66*2d9fd380Sjfb8856606 
67*2d9fd380Sjfb8856606 static int32_t
test_link_status_down_default(void)68*2d9fd380Sjfb8856606 test_link_status_down_default(void)
69*2d9fd380Sjfb8856606 {
70*2d9fd380Sjfb8856606 	int ret = 0;
71*2d9fd380Sjfb8856606 	struct rte_eth_link link_status = {
72*2d9fd380Sjfb8856606 		.link_speed = ETH_SPEED_NUM_2_5G,
73*2d9fd380Sjfb8856606 		.link_status = ETH_LINK_DOWN,
74*2d9fd380Sjfb8856606 		.link_autoneg = ETH_LINK_AUTONEG,
75*2d9fd380Sjfb8856606 		.link_duplex = ETH_LINK_FULL_DUPLEX
76*2d9fd380Sjfb8856606 	};
77*2d9fd380Sjfb8856606 	char text[RTE_ETH_LINK_MAX_STR_LEN];
78*2d9fd380Sjfb8856606 
79*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
80*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
81*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link down",
82*2d9fd380Sjfb8856606 		text, strlen(text), "Invalid default link status string");
83*2d9fd380Sjfb8856606 
84*2d9fd380Sjfb8856606 	return TEST_SUCCESS;
85*2d9fd380Sjfb8856606 }
86*2d9fd380Sjfb8856606 
87*2d9fd380Sjfb8856606 static int32_t
test_link_status_invalid(void)88*2d9fd380Sjfb8856606 test_link_status_invalid(void)
89*2d9fd380Sjfb8856606 {
90*2d9fd380Sjfb8856606 	int ret = 0;
91*2d9fd380Sjfb8856606 	struct rte_eth_link link_status = {
92*2d9fd380Sjfb8856606 		.link_speed = 55555,
93*2d9fd380Sjfb8856606 		.link_status = ETH_LINK_UP,
94*2d9fd380Sjfb8856606 		.link_autoneg = ETH_LINK_AUTONEG,
95*2d9fd380Sjfb8856606 		.link_duplex = ETH_LINK_FULL_DUPLEX
96*2d9fd380Sjfb8856606 	};
97*2d9fd380Sjfb8856606 	char text[RTE_ETH_LINK_MAX_STR_LEN];
98*2d9fd380Sjfb8856606 
99*2d9fd380Sjfb8856606 	ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
100*2d9fd380Sjfb8856606 	RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
101*2d9fd380Sjfb8856606 		"Failed to format invalid string\n");
102*2d9fd380Sjfb8856606 	printf("invalid link up #1: len=%d %s\n", ret, text);
103*2d9fd380Sjfb8856606 	TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Invalid FDX Autoneg",
104*2d9fd380Sjfb8856606 		text, strlen(text), "Incorrect invalid link status string");
105*2d9fd380Sjfb8856606 
106*2d9fd380Sjfb8856606 	return TEST_SUCCESS;
107*2d9fd380Sjfb8856606 }
108*2d9fd380Sjfb8856606 
109*2d9fd380Sjfb8856606 
110*2d9fd380Sjfb8856606 static int32_t
test_link_speed_all_values(void)111*2d9fd380Sjfb8856606 test_link_speed_all_values(void)
112*2d9fd380Sjfb8856606 {
113*2d9fd380Sjfb8856606 	const char *speed;
114*2d9fd380Sjfb8856606 	uint32_t i;
115*2d9fd380Sjfb8856606 	struct link_speed_t {
116*2d9fd380Sjfb8856606 		const char *value;
117*2d9fd380Sjfb8856606 		uint32_t link_speed;
118*2d9fd380Sjfb8856606 	} speed_str_map[] = {
119*2d9fd380Sjfb8856606 		{ "None",   ETH_SPEED_NUM_NONE },
120*2d9fd380Sjfb8856606 		{ "10 Mbps",  ETH_SPEED_NUM_10M },
121*2d9fd380Sjfb8856606 		{ "100 Mbps", ETH_SPEED_NUM_100M },
122*2d9fd380Sjfb8856606 		{ "1 Gbps",   ETH_SPEED_NUM_1G },
123*2d9fd380Sjfb8856606 		{ "2.5 Gbps", ETH_SPEED_NUM_2_5G },
124*2d9fd380Sjfb8856606 		{ "5 Gbps",   ETH_SPEED_NUM_5G },
125*2d9fd380Sjfb8856606 		{ "10 Gbps",  ETH_SPEED_NUM_10G },
126*2d9fd380Sjfb8856606 		{ "20 Gbps",  ETH_SPEED_NUM_20G },
127*2d9fd380Sjfb8856606 		{ "25 Gbps",  ETH_SPEED_NUM_25G },
128*2d9fd380Sjfb8856606 		{ "40 Gbps",  ETH_SPEED_NUM_40G },
129*2d9fd380Sjfb8856606 		{ "50 Gbps",  ETH_SPEED_NUM_50G },
130*2d9fd380Sjfb8856606 		{ "56 Gbps",  ETH_SPEED_NUM_56G },
131*2d9fd380Sjfb8856606 		{ "100 Gbps", ETH_SPEED_NUM_100G },
132*2d9fd380Sjfb8856606 		{ "200 Gbps", ETH_SPEED_NUM_200G },
133*2d9fd380Sjfb8856606 		{ "Unknown",  ETH_SPEED_NUM_UNKNOWN },
134*2d9fd380Sjfb8856606 		{ "Invalid",   50505 }
135*2d9fd380Sjfb8856606 	};
136*2d9fd380Sjfb8856606 
137*2d9fd380Sjfb8856606 	for (i = 0; i < sizeof(speed_str_map) / sizeof(struct link_speed_t);
138*2d9fd380Sjfb8856606 			i++) {
139*2d9fd380Sjfb8856606 		speed = rte_eth_link_speed_to_str(speed_str_map[i].link_speed);
140*2d9fd380Sjfb8856606 		TEST_ASSERT_BUFFERS_ARE_EQUAL(speed_str_map[i].value,
141*2d9fd380Sjfb8856606 			speed, strlen(speed_str_map[i].value),
142*2d9fd380Sjfb8856606 			"Invalid link speed string");
143*2d9fd380Sjfb8856606 	}
144*2d9fd380Sjfb8856606 	return TEST_SUCCESS;
145*2d9fd380Sjfb8856606 }
146*2d9fd380Sjfb8856606 
147*2d9fd380Sjfb8856606 static struct unit_test_suite link_status_testsuite = {
148*2d9fd380Sjfb8856606 	.suite_name = "link status formatting",
149*2d9fd380Sjfb8856606 	.setup = NULL,
150*2d9fd380Sjfb8856606 	.teardown = NULL,
151*2d9fd380Sjfb8856606 	.unit_test_cases = {
152*2d9fd380Sjfb8856606 		TEST_CASE(test_link_status_up_default),
153*2d9fd380Sjfb8856606 		TEST_CASE(test_link_status_down_default),
154*2d9fd380Sjfb8856606 		TEST_CASE(test_link_speed_all_values),
155*2d9fd380Sjfb8856606 		TEST_CASE(test_link_status_invalid),
156*2d9fd380Sjfb8856606 		TEST_CASES_END() /**< NULL terminate unit test array */
157*2d9fd380Sjfb8856606 	}
158*2d9fd380Sjfb8856606 };
159*2d9fd380Sjfb8856606 
160*2d9fd380Sjfb8856606 static int
test_link_status(void)161*2d9fd380Sjfb8856606 test_link_status(void)
162*2d9fd380Sjfb8856606 {
163*2d9fd380Sjfb8856606 	rte_log_set_global_level(RTE_LOG_DEBUG);
164*2d9fd380Sjfb8856606 	rte_log_set_level(RTE_LOGTYPE_EAL, RTE_LOG_DEBUG);
165*2d9fd380Sjfb8856606 
166*2d9fd380Sjfb8856606 	return unit_test_suite_runner(&link_status_testsuite);
167*2d9fd380Sjfb8856606 }
168*2d9fd380Sjfb8856606 
169*2d9fd380Sjfb8856606 REGISTER_TEST_COMMAND(ethdev_link_status, test_link_status);
170