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