xref: /dpdk/app/test/test_net_ether.c (revision 719b37dd5676b7204cb16d204d8762a92d3b1ecd)
1*719b37ddSStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
2*719b37ddSStephen Hemminger  * Copyright (c) 2023 Stephen Hemminger
3*719b37ddSStephen Hemminger  */
4*719b37ddSStephen Hemminger 
5*719b37ddSStephen Hemminger #include <rte_ether.h>
6*719b37ddSStephen Hemminger 
7*719b37ddSStephen Hemminger #include <rte_test.h>
8*719b37ddSStephen Hemminger #include "test.h"
9*719b37ddSStephen Hemminger 
10*719b37ddSStephen Hemminger #define N 1000000
11*719b37ddSStephen Hemminger 
12*719b37ddSStephen Hemminger static const struct rte_ether_addr zero_ea;
13*719b37ddSStephen Hemminger static const struct rte_ether_addr bcast_ea = {
14*719b37ddSStephen Hemminger 	.addr_bytes = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
15*719b37ddSStephen Hemminger };
16*719b37ddSStephen Hemminger 
17*719b37ddSStephen Hemminger static int
test_ether_addr(void)18*719b37ddSStephen Hemminger test_ether_addr(void)
19*719b37ddSStephen Hemminger {
20*719b37ddSStephen Hemminger 	struct rte_ether_addr rand_ea = { };
21*719b37ddSStephen Hemminger 	unsigned int i;
22*719b37ddSStephen Hemminger 
23*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_zero_ether_addr(&zero_ea), "Zero address is not zero");
24*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&bcast_ea), "Broadcast is zero");
25*719b37ddSStephen Hemminger 
26*719b37ddSStephen Hemminger 	for (i = 0; i < N; i++) {
27*719b37ddSStephen Hemminger 		rte_eth_random_addr(rand_ea.addr_bytes);
28*719b37ddSStephen Hemminger 		RTE_TEST_ASSERT(!rte_is_zero_ether_addr(&rand_ea),
29*719b37ddSStephen Hemminger 				"Random address is zero");
30*719b37ddSStephen Hemminger 		RTE_TEST_ASSERT(rte_is_unicast_ether_addr(&rand_ea),
31*719b37ddSStephen Hemminger 				"Random address is not unicast");
32*719b37ddSStephen Hemminger 		RTE_TEST_ASSERT(rte_is_local_admin_ether_addr(&rand_ea),
33*719b37ddSStephen Hemminger 				"Random address is not local admin");
34*719b37ddSStephen Hemminger 	}
35*719b37ddSStephen Hemminger 
36*719b37ddSStephen Hemminger 	return 0;
37*719b37ddSStephen Hemminger }
38*719b37ddSStephen Hemminger 
39*719b37ddSStephen Hemminger static int
test_format_addr(void)40*719b37ddSStephen Hemminger test_format_addr(void)
41*719b37ddSStephen Hemminger {
42*719b37ddSStephen Hemminger 	struct rte_ether_addr rand_ea = { };
43*719b37ddSStephen Hemminger 	char buf[RTE_ETHER_ADDR_FMT_SIZE];
44*719b37ddSStephen Hemminger 	unsigned int i;
45*719b37ddSStephen Hemminger 
46*719b37ddSStephen Hemminger 	for (i = 0; i < N; i++) {
47*719b37ddSStephen Hemminger 		struct rte_ether_addr result = { };
48*719b37ddSStephen Hemminger 		int ret;
49*719b37ddSStephen Hemminger 
50*719b37ddSStephen Hemminger 		rte_eth_random_addr(rand_ea.addr_bytes);
51*719b37ddSStephen Hemminger 
52*719b37ddSStephen Hemminger 		rte_ether_format_addr(buf, sizeof(buf), &rand_ea);
53*719b37ddSStephen Hemminger 
54*719b37ddSStephen Hemminger 		ret = rte_ether_unformat_addr(buf, &result);
55*719b37ddSStephen Hemminger 		if (ret != 0) {
56*719b37ddSStephen Hemminger 			fprintf(stderr, "rte_ether_unformat_addr(%s) failed\n", buf);
57*719b37ddSStephen Hemminger 			return -1;
58*719b37ddSStephen Hemminger 		}
59*719b37ddSStephen Hemminger 		RTE_TEST_ASSERT(rte_is_same_ether_addr(&rand_ea, &result),
60*719b37ddSStephen Hemminger 			"rte_ether_format/unformat mismatch");
61*719b37ddSStephen Hemminger 	}
62*719b37ddSStephen Hemminger 	return 0;
63*719b37ddSStephen Hemminger 
64*719b37ddSStephen Hemminger }
65*719b37ddSStephen Hemminger 
66*719b37ddSStephen Hemminger static int
test_unformat_addr(void)67*719b37ddSStephen Hemminger test_unformat_addr(void)
68*719b37ddSStephen Hemminger {
69*719b37ddSStephen Hemminger 	const struct rte_ether_addr expected = {
70*719b37ddSStephen Hemminger 		.addr_bytes = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc },
71*719b37ddSStephen Hemminger 	};
72*719b37ddSStephen Hemminger 	const struct rte_ether_addr nozero_ea = {
73*719b37ddSStephen Hemminger 		.addr_bytes = { 1, 2, 3, 4, 5, 6 },
74*719b37ddSStephen Hemminger 	};
75*719b37ddSStephen Hemminger 	struct rte_ether_addr result;
76*719b37ddSStephen Hemminger 	int ret;
77*719b37ddSStephen Hemminger 
78*719b37ddSStephen Hemminger 	/* Test IETF format */
79*719b37ddSStephen Hemminger 	memset(&result, 0, sizeof(result));
80*719b37ddSStephen Hemminger 	ret = rte_ether_unformat_addr("12:34:56:78:9a:bc", &result);
81*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(ret == 0, "IETF unformat failed");
82*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
83*719b37ddSStephen Hemminger 		"IETF unformat mismatch");
84*719b37ddSStephen Hemminger 
85*719b37ddSStephen Hemminger 	/* Test IEEE format */
86*719b37ddSStephen Hemminger 	memset(&result, 0, sizeof(result));
87*719b37ddSStephen Hemminger 	ret = rte_ether_unformat_addr("12-34-56-78-9A-BC", &result);
88*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(ret == 0, "IEEE unformat failed");
89*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
90*719b37ddSStephen Hemminger 			"IEEE unformat mismatch");
91*719b37ddSStephen Hemminger 
92*719b37ddSStephen Hemminger 	/* Test Cisco format */
93*719b37ddSStephen Hemminger 	memset(&result, 0, sizeof(result));
94*719b37ddSStephen Hemminger 	ret = rte_ether_unformat_addr("1234.5678.9ABC", &result);
95*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(ret == 0, "Cisco unformat failed");
96*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_same_ether_addr(&expected, &result),
97*719b37ddSStephen Hemminger 			"Cisco unformat mismatch");
98*719b37ddSStephen Hemminger 
99*719b37ddSStephen Hemminger 	/* Test no leading zeros - IETF */
100*719b37ddSStephen Hemminger 	memset(&result, 0, sizeof(result));
101*719b37ddSStephen Hemminger 	ret = rte_ether_unformat_addr("1:2:3:4:5:6", &result);
102*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(ret == 0, "IETF leading zero failed");
103*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
104*719b37ddSStephen Hemminger 			"IETF leading zero mismatch");
105*719b37ddSStephen Hemminger 
106*719b37ddSStephen Hemminger 	/* Test no-leading zero - IEEE format */
107*719b37ddSStephen Hemminger 	memset(&result, 0, sizeof(result));
108*719b37ddSStephen Hemminger 	ret = rte_ether_unformat_addr("1-2-3-4-5-6", &result);
109*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(ret == 0, "IEEE leading zero failed");
110*719b37ddSStephen Hemminger 	RTE_TEST_ASSERT(rte_is_same_ether_addr(&nozero_ea, &result),
111*719b37ddSStephen Hemminger 			"IEEE leading zero mismatch");
112*719b37ddSStephen Hemminger 
113*719b37ddSStephen Hemminger 
114*719b37ddSStephen Hemminger 	return 0;
115*719b37ddSStephen Hemminger }
116*719b37ddSStephen Hemminger 
117*719b37ddSStephen Hemminger static int
test_invalid_addr(void)118*719b37ddSStephen Hemminger test_invalid_addr(void)
119*719b37ddSStephen Hemminger {
120*719b37ddSStephen Hemminger 	static const char * const invalid[] = {
121*719b37ddSStephen Hemminger 		"123",
122*719b37ddSStephen Hemminger 		"123:456",
123*719b37ddSStephen Hemminger 		"12:34:56:78:9a:gh",
124*719b37ddSStephen Hemminger 		"12:34:56:78:9a",
125*719b37ddSStephen Hemminger 		"100:34:56:78:9a:bc",
126*719b37ddSStephen Hemminger 		"34-56-78-9a-bc",
127*719b37ddSStephen Hemminger 		"12:34:56-78:9a:bc",
128*719b37ddSStephen Hemminger 		"12:34:56.78:9a:bc",
129*719b37ddSStephen Hemminger 		"123:456:789:abc",
130*719b37ddSStephen Hemminger 		"NOT.AN.ADDRESS",
131*719b37ddSStephen Hemminger 		"102.304.506",
132*719b37ddSStephen Hemminger 		"",
133*719b37ddSStephen Hemminger 	};
134*719b37ddSStephen Hemminger 	struct rte_ether_addr result;
135*719b37ddSStephen Hemminger 	unsigned int i;
136*719b37ddSStephen Hemminger 
137*719b37ddSStephen Hemminger 	for (i = 0; i < RTE_DIM(invalid); ++i) {
138*719b37ddSStephen Hemminger 		if (!rte_ether_unformat_addr(invalid[i], &result)) {
139*719b37ddSStephen Hemminger 			fprintf(stderr, "rte_ether_unformat_addr(%s) succeeded!\n",
140*719b37ddSStephen Hemminger 				invalid[i]);
141*719b37ddSStephen Hemminger 			return -1;
142*719b37ddSStephen Hemminger 		}
143*719b37ddSStephen Hemminger 	}
144*719b37ddSStephen Hemminger 	return 0;
145*719b37ddSStephen Hemminger }
146*719b37ddSStephen Hemminger 
147*719b37ddSStephen Hemminger static int
test_net_ether(void)148*719b37ddSStephen Hemminger test_net_ether(void)
149*719b37ddSStephen Hemminger {
150*719b37ddSStephen Hemminger 	if (test_ether_addr())
151*719b37ddSStephen Hemminger 		return -1;
152*719b37ddSStephen Hemminger 
153*719b37ddSStephen Hemminger 	if (test_format_addr())
154*719b37ddSStephen Hemminger 		return -1;
155*719b37ddSStephen Hemminger 
156*719b37ddSStephen Hemminger 	if (test_unformat_addr())
157*719b37ddSStephen Hemminger 		return -1;
158*719b37ddSStephen Hemminger 
159*719b37ddSStephen Hemminger 	if (test_invalid_addr())
160*719b37ddSStephen Hemminger 		return -1;
161*719b37ddSStephen Hemminger 
162*719b37ddSStephen Hemminger 	return 0;
163*719b37ddSStephen Hemminger }
164*719b37ddSStephen Hemminger 
165*719b37ddSStephen Hemminger REGISTER_FAST_TEST(net_ether_autotest, true, true, test_net_ether);
166