blob: 9b61c6485e1344925f92efdd9a954c2f2f8dfacb [file] [log] [blame]
Ratan Gupta594123d2017-05-16 22:48:35 +05301#include "util.hpp"
2
William A. Kennington III5058f572019-01-30 17:18:14 -08003#include <arpa/inet.h>
Gunnar Mills57d9c502018-09-14 14:42:34 -05004#include <netinet/in.h>
5
William A. Kennington IIId27410f2019-01-30 17:15:43 -08006#include <cstddef>
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -07007#include <cstring>
William A. Kennington III12beaad2020-06-13 19:30:41 -07008#include <stdplus/raw.hpp>
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -07009#include <string>
10#include <string_view>
Ratan Gupta35297172018-11-28 18:40:16 +053011#include <xyz/openbmc_project/Common/error.hpp>
12
Gunnar Mills57d9c502018-09-14 14:42:34 -050013#include <gtest/gtest.h>
14
Ratan Gupta594123d2017-05-16 22:48:35 +053015namespace phosphor
16{
17namespace network
18{
19
William A. Kennington IIIc920bdb2019-04-19 14:23:06 -070020using namespace std::literals;
Ratan Gupta35297172018-11-28 18:40:16 +053021using InternalFailure =
22 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
Ratan Gupta594123d2017-05-16 22:48:35 +053023class TestUtil : public testing::Test
24{
Gunnar Mills57d9c502018-09-14 14:42:34 -050025 public:
26 TestUtil()
27 {
28 // Empty
29 }
Ratan Gupta594123d2017-05-16 22:48:35 +053030};
31
William A. Kennington IIIa00b1c32019-02-01 18:57:17 -080032TEST_F(TestUtil, AddrFromBuf)
33{
34 std::string tooSmall(1, 'a');
35 std::string tooLarge(24, 'a');
36
37 struct in_addr ip1;
38 EXPECT_EQ(1, inet_pton(AF_INET, "192.168.10.1", &ip1));
39 std::string_view buf1(reinterpret_cast<char*>(&ip1), sizeof(ip1));
40 InAddrAny res1 = addrFromBuf(AF_INET, buf1);
41 EXPECT_EQ(0, memcmp(&ip1, &std::get<struct in_addr>(res1), sizeof(ip1)));
42 EXPECT_THROW(addrFromBuf(AF_INET, tooSmall), std::runtime_error);
43 EXPECT_THROW(addrFromBuf(AF_INET, tooLarge), std::runtime_error);
44 EXPECT_THROW(addrFromBuf(AF_UNSPEC, buf1), std::runtime_error);
45
46 struct in6_addr ip2;
47 EXPECT_EQ(1, inet_pton(AF_INET6, "fdd8:b5ad:9d93:94ee::2:1", &ip2));
48 std::string_view buf2(reinterpret_cast<char*>(&ip2), sizeof(ip2));
49 InAddrAny res2 = addrFromBuf(AF_INET6, buf2);
50 EXPECT_EQ(0, memcmp(&ip2, &std::get<struct in6_addr>(res2), sizeof(ip2)));
51 EXPECT_THROW(addrFromBuf(AF_INET6, tooSmall), std::runtime_error);
52 EXPECT_THROW(addrFromBuf(AF_INET6, tooLarge), std::runtime_error);
53 EXPECT_THROW(addrFromBuf(AF_UNSPEC, buf2), std::runtime_error);
54}
55
William A. Kennington III5058f572019-01-30 17:18:14 -080056TEST_F(TestUtil, IpToString)
57{
58 struct in_addr ip1;
59 EXPECT_EQ(1, inet_pton(AF_INET, "192.168.10.1", &ip1));
Alexander Filippov983da552021-02-08 15:26:54 +030060 EXPECT_EQ("192.168.10.1", toString(ip1));
William A. Kennington III5058f572019-01-30 17:18:14 -080061 EXPECT_EQ("192.168.10.1", toString(InAddrAny(ip1)));
62
63 struct in6_addr ip2;
64 EXPECT_EQ(1, inet_pton(AF_INET6, "fdd8:b5ad:9d93:94ee::2:1", &ip2));
Alexander Filippov983da552021-02-08 15:26:54 +030065 EXPECT_EQ("fdd8:b5ad:9d93:94ee::2:1", toString(ip2));
William A. Kennington III5058f572019-01-30 17:18:14 -080066 EXPECT_EQ("fdd8:b5ad:9d93:94ee::2:1", toString(InAddrAny(ip2)));
William A. Kennington III5058f572019-01-30 17:18:14 -080067}
68
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -060069TEST_F(TestUtil, IpValidation)
70{
71 std::string ipaddress = "0.0.0.0";
72 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
73
74 ipaddress = "9.3.185.83";
75 EXPECT_EQ(true, isValidIP(AF_INET, ipaddress));
76
77 ipaddress = "9.3.185.a";
78 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
79
80 ipaddress = "9.3.a.83";
81 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
82
83 ipaddress = "x.x.x.x";
84 EXPECT_EQ(false, isValidIP(AF_INET, ipaddress));
85
86 ipaddress = "0:0:0:0:0:0:0:0";
87 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
88
89 ipaddress = "1:0:0:0:0:0:0:8";
90 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
91
92 ipaddress = "1::8";
93 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
94
95 ipaddress = "0:0:0:0:0:FFFF:204.152.189.116";
96 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
97
98 ipaddress = "::ffff:204.152.189.116";
99 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
100
101 ipaddress = "a:0:0:0:0:FFFF:204.152.189.116";
102 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
103
104 ipaddress = "1::8";
105 EXPECT_EQ(true, isValidIP(AF_INET6, ipaddress));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600106}
107
108TEST_F(TestUtil, PrefixValidation)
109{
110 uint8_t prefixLength = 1;
111 EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
112
113 prefixLength = 32;
114 EXPECT_EQ(true, isValidPrefix(AF_INET, prefixLength));
115
116 prefixLength = 0;
117 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
118
119 prefixLength = 33;
120 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
121
122 prefixLength = 33;
123 EXPECT_EQ(true, isValidPrefix(AF_INET6, prefixLength));
124
125 prefixLength = 65;
126 EXPECT_EQ(false, isValidPrefix(AF_INET, prefixLength));
Nagaraju Goruganti067ca2d2018-01-17 01:12:00 -0600127}
128
Ratan Gupta594123d2017-05-16 22:48:35 +0530129TEST_F(TestUtil, ConvertV4MasktoPrefix)
130{
131 std::string mask = "255.255.255.0";
132 uint8_t prefix = toCidr(AF_INET, mask);
133 EXPECT_EQ(prefix, 24);
134
William A. Kennington IIIa1b897e2021-03-31 13:27:11 -0700135 mask = "255.255.255.255";
136 prefix = toCidr(AF_INET, mask);
137 EXPECT_EQ(prefix, 32);
138
Ratan Gupta594123d2017-05-16 22:48:35 +0530139 mask = "255.255.0.0";
140 prefix = toCidr(AF_INET, mask);
141 EXPECT_EQ(prefix, 16);
142
143 mask = "255.0.0.0";
144 prefix = toCidr(AF_INET, mask);
145 EXPECT_EQ(prefix, 8);
146
147 mask = "255.224.0.0";
148 prefix = toCidr(AF_INET, mask);
149 EXPECT_EQ(prefix, 11);
150
Gunnar Mills57d9c502018-09-14 14:42:34 -0500151 // Invalid Mask
Ratan Gupta594123d2017-05-16 22:48:35 +0530152 mask = "255.0.255.0";
153 prefix = toCidr(AF_INET, mask);
154 EXPECT_EQ(prefix, 0);
155}
156
157TEST_F(TestUtil, convertV6MasktoPrefix)
158{
159 std::string mask = "ffff:ffff::";
160 uint8_t prefix = toCidr(AF_INET6, mask);
161 EXPECT_EQ(prefix, 32);
162
William A. Kennington IIIa1b897e2021-03-31 13:27:11 -0700163 mask = "::";
164 prefix = toCidr(AF_INET6, mask);
165 EXPECT_EQ(prefix, 0);
166
Ratan Gupta594123d2017-05-16 22:48:35 +0530167 mask = "ffff:ffff:ffff::";
168 prefix = toCidr(AF_INET6, mask);
169 EXPECT_EQ(prefix, 48);
170
171 mask = "ffff:ffff:fc00::";
172 prefix = toCidr(AF_INET6, mask);
173 EXPECT_EQ(prefix, 38);
174
Johnathan Mantey359623e2021-01-26 15:02:54 -0800175 mask = "ffff:0:0:0:0:0:0:0";
176 prefix = toCidr(AF_INET6, mask);
177 EXPECT_EQ(prefix, 16);
178
179 mask = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff";
180 prefix = toCidr(AF_INET6, mask);
181 EXPECT_EQ(prefix, 128);
182
183 mask = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc";
184 prefix = toCidr(AF_INET6, mask);
185 EXPECT_EQ(prefix, 126);
186
Lei YUa3b14dc2021-04-06 11:42:10 +0800187 mask = "ffff:ffff:ffff:ffff::";
188 prefix = toCidr(AF_INET6, mask);
189 EXPECT_EQ(prefix, 64);
190
Johnathan Mantey359623e2021-01-26 15:02:54 -0800191 // Invalid Masks
Ratan Gupta594123d2017-05-16 22:48:35 +0530192 mask = "ffff:0fff::";
193 prefix = toCidr(AF_INET6, mask);
194 EXPECT_EQ(prefix, 0);
Johnathan Mantey359623e2021-01-26 15:02:54 -0800195
196 mask = "ffff:fgff::";
197 prefix = toCidr(AF_INET6, mask);
198 EXPECT_EQ(prefix, 0);
199
200 mask = "ffff:0:0:6:0:0:0:0";
201 prefix = toCidr(AF_INET6, mask);
202 EXPECT_EQ(prefix, 0);
203
Johnathan Mantey359623e2021-01-26 15:02:54 -0800204 mask = ":";
205 prefix = toCidr(AF_INET6, mask);
206 EXPECT_EQ(prefix, 0);
207
208 mask = "abcd:efgh:ijkl:mnop:pqrs:tuvw:xyz:abcd";
209 prefix = toCidr(AF_INET6, mask);
210 EXPECT_EQ(prefix, 0);
211
212 mask = "ffff:0:0:0:0:0:0";
213 prefix = toCidr(AF_INET6, mask);
214 EXPECT_EQ(prefix, 0);
Ratan Gupta594123d2017-05-16 22:48:35 +0530215}
216
Ratan Gupta11cef802017-05-29 08:41:48 +0530217TEST_F(TestUtil, isLinkLocaladdress)
Ratan Gupta594123d2017-05-16 22:48:35 +0530218{
219 std::string ipaddress = "fe80:fec0::";
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500220 EXPECT_TRUE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530221
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500222 ipaddress = "2000:fe80:789::";
223 EXPECT_FALSE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530224
225 ipaddress = "2000:fe80::";
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -0500226 EXPECT_FALSE(isLinkLocalIP(ipaddress));
227
228 ipaddress = "169.254.3.3";
229 EXPECT_TRUE(isLinkLocalIP(ipaddress));
230
231 ipaddress = "3.169.254.3";
232 EXPECT_FALSE(isLinkLocalIP(ipaddress));
233
234 ipaddress = "3.3.169.254";
235 EXPECT_FALSE(isLinkLocalIP(ipaddress));
Ratan Gupta594123d2017-05-16 22:48:35 +0530236}
237
238TEST_F(TestUtil, convertPrefixToMask)
239{
240 std::string mask = toMask(AF_INET, 24);
241 EXPECT_EQ(mask, "255.255.255.0");
242
243 mask = toMask(AF_INET, 8);
244 EXPECT_EQ(mask, "255.0.0.0");
245
246 mask = toMask(AF_INET, 27);
247 EXPECT_EQ(mask, "255.255.255.224");
248}
249
William A. Kennington III7b9e8bd2019-04-23 19:31:31 -0700250TEST_F(TestUtil, InterfaceToUbootEthAddr)
251{
252 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("et"));
253 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("eth"));
254 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("sit0"));
255 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("ethh0"));
256 EXPECT_EQ(std::nullopt, interfaceToUbootEthAddr("eth0h"));
257 EXPECT_EQ("ethaddr", interfaceToUbootEthAddr("eth0"));
258 EXPECT_EQ("eth1addr", interfaceToUbootEthAddr("eth1"));
259 EXPECT_EQ("eth5addr", interfaceToUbootEthAddr("eth5"));
260 EXPECT_EQ("eth28addr", interfaceToUbootEthAddr("eth28"));
261}
262
William A. Kennington III1137a972019-04-20 20:49:58 -0700263namespace mac_address
264{
265
266TEST(MacFromString, Bad)
267{
Asmitha Karunanithi86f659e2021-01-05 00:16:03 -0600268 EXPECT_THROW(fromString("0x:00:00:00:00:00"), std::invalid_argument);
269 EXPECT_THROW(fromString("00:00:00:00:00"), std::invalid_argument);
270 EXPECT_THROW(fromString(""), std::invalid_argument);
William A. Kennington III1137a972019-04-20 20:49:58 -0700271}
272
273TEST(MacFromString, Valid)
274{
William A. Kennington III12beaad2020-06-13 19:30:41 -0700275 EXPECT_TRUE(
276 stdplus::raw::equal(ether_addr{}, fromString("00:00:00:00:00:00")));
277 EXPECT_TRUE(
278 stdplus::raw::equal(ether_addr{0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa},
279 fromString("FF:EE:DD:cc:bb:aa")));
280 EXPECT_TRUE(
281 stdplus::raw::equal(ether_addr{0x00, 0x01, 0x02, 0x03, 0x04, 0x05},
282 fromString("0:1:2:3:4:5")));
William A. Kennington III1137a972019-04-20 20:49:58 -0700283}
284
285TEST(MacToString, Valid)
286{
287 EXPECT_EQ("11:22:33:44:55:66",
288 toString({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}));
Karthick Sundarrajandbd328d2019-11-20 15:19:08 -0800289 EXPECT_EQ("01:02:03:04:05:67",
290 toString({0x01, 0x02, 0x03, 0x04, 0x05, 0x67}));
291 EXPECT_EQ("00:00:00:00:00:00",
292 toString({0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
William A. Kennington III1137a972019-04-20 20:49:58 -0700293}
294
295TEST(MacIsEmpty, True)
296{
297 EXPECT_TRUE(isEmpty({}));
298}
299
300TEST(MacIsEmpty, False)
301{
302 EXPECT_FALSE(isEmpty(fromString("01:00:00:00:00:00")));
303 EXPECT_FALSE(isEmpty(fromString("00:00:00:10:00:00")));
304 EXPECT_FALSE(isEmpty(fromString("00:00:00:00:00:01")));
305}
306
307TEST(MacIsMulticast, True)
308{
309 EXPECT_TRUE(isMulticast(fromString("ff:ff:ff:ff:ff:ff")));
310 EXPECT_TRUE(isMulticast(fromString("01:00:00:00:00:00")));
311}
312
313TEST(MacIsMulticast, False)
314{
315 EXPECT_FALSE(isMulticast(fromString("00:11:22:33:44:55")));
316 EXPECT_FALSE(isMulticast(fromString("FE:11:22:33:44:55")));
317}
318
319TEST(MacIsUnicast, True)
320{
321 EXPECT_TRUE(isUnicast(fromString("00:11:22:33:44:55")));
322 EXPECT_TRUE(isUnicast(fromString("FE:11:22:33:44:55")));
323}
324
325TEST(MacIsUnicast, False)
326{
327 EXPECT_FALSE(isUnicast(fromString("00:00:00:00:00:00")));
328 EXPECT_FALSE(isUnicast(fromString("01:00:00:00:00:00")));
329 EXPECT_FALSE(isUnicast(fromString("ff:ff:ff:ff:ff:ff")));
330}
331
William A. Kennington III1137a972019-04-20 20:49:58 -0700332} // namespace mac_address
Gunnar Mills57d9c502018-09-14 14:42:34 -0500333} // namespace network
334} // namespace phosphor