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