VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTNetIPv6.cpp@ 93468

Last change on this file since 93468 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 12.7 KB
Line 
1/* $Id: tstRTNetIPv6.cpp 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * IPRT Testcase - IPv6.
4 */
5
6/*
7 * Copyright (C) 2008-2022 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/net.h>
32
33#include <iprt/errcore.h>
34#include <iprt/initterm.h>
35#include <iprt/test.h>
36
37#include <iprt/string.h>
38
39
40/*********************************************************************************************************************************
41* Defined Constants And Macros *
42*********************************************************************************************************************************/
43#define CHECKADDR(String, rcExpected, u32_0, u32_1, u32_2, u32_3) \
44 do { \
45 RTNETADDRIPV6 Addr; \
46 char *pszZone; \
47 uint32_t ExpectedAddr[4] = { \
48 RT_H2N_U32_C(u32_0), RT_H2N_U32_C(u32_1), \
49 RT_H2N_U32_C(u32_2), RT_H2N_U32_C(u32_3) \
50 }; \
51 int rc2 = RTNetStrToIPv6Addr(String, &Addr, &pszZone); \
52 if ((rcExpected) && !rc2) \
53 { \
54 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc\n", \
55 __LINE__, String, (rcExpected), rc2); \
56 } \
57 else if ( (rcExpected) != rc2 \
58 || ( rc2 == VINF_SUCCESS \
59 && memcmp(ExpectedAddr, &Addr, sizeof(Addr)) != 0)) \
60 { \
61 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc," \
62 " expected address %RTnaipv6 got %RTnaipv6\n", \
63 __LINE__, String, rcExpected, rc2, \
64 ExpectedAddr, &Addr); \
65 } \
66 } while (0)
67
68#define GOODADDR(String, u32_0, u32_1, u32_2, u32_3) \
69 CHECKADDR(String, VINF_SUCCESS, u32_0, u32_1, u32_2, u32_3)
70
71#define BADADDR(String) \
72 CHECKADDR(String, VERR_INVALID_PARAMETER, 0, 0, 0, 0)
73
74
75#define CHECKCIDR(String, rcExpected, u32_0, u32_1, u32_2, u32_3, iExpectedPrefix) \
76 do { \
77 RTNETADDRIPV6 Addr; \
78 uint32_t ExpectedAddr[4] = { \
79 RT_H2N_U32_C(u32_0), RT_H2N_U32_C(u32_1), \
80 RT_H2N_U32_C(u32_2), RT_H2N_U32_C(u32_3) \
81 }; \
82 int iPrefix; \
83 \
84 int rc2 = RTNetStrToIPv6Cidr(String, &Addr, &iPrefix); \
85 if ((rcExpected) && !rc2) \
86 { \
87 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc\n", \
88 __LINE__, String, (rcExpected), rc2); \
89 } \
90 else if ( (rcExpected) != rc2 \
91 || ( rc2 == VINF_SUCCESS \
92 && ( memcmp(ExpectedAddr, &Addr, sizeof(Addr)) != 0 \
93 || iExpectedPrefix != iPrefix))) \
94 { \
95 RTTestIFailed("at line %d: '%s': expected %Rrc got %Rrc," \
96 " expected address %RTnaipv6/%d got %RTnaipv6/%d\n",\
97 __LINE__, String, rcExpected, rc2, \
98 ExpectedAddr, iExpectedPrefix, \
99 &Addr, iPrefix); \
100 } \
101 } while (0)
102
103#define GOODCIDR(String, u32_0, u32_1, u32_2, u32_3, iExpectedPrefix) \
104 CHECKCIDR(String, VINF_SUCCESS, u32_0, u32_1, u32_2, u32_3, iExpectedPrefix)
105
106#define BADCIDR(String) \
107 CHECKCIDR(String, VERR_INVALID_PARAMETER, 0, 0, 0, 0, 0)
108
109
110#define CHECKANY(String, fExpected) \
111 do { \
112 bool fRc = RTNetStrIsIPv6AddrAny(String); \
113 if (fRc != fExpected) \
114 { \
115 RTTestIFailed("at line %d: '%s':" \
116 " expected %RTbool got %RTbool\n", \
117 __LINE__, (String), fExpected, fRc); \
118 } \
119 } while (0)
120
121#define IS_ANY(String) CHECKANY((String), true)
122#define NOT_ANY(String) CHECKANY((String), false)
123
124
125int main()
126{
127 RTTEST hTest;
128 int rc = RTTestInitAndCreate("tstRTNetIPv6", &hTest);
129 if (rc)
130 return rc;
131 RTTestBanner(hTest);
132
133
134 /* base case: eight groups fully spelled */
135 GOODADDR("1:2:3:4:5:6:7:8", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
136 GOODADDR("0001:0002:0003:0004:0005:0006:0007:0008", 0x00010002, 0x00030004, 0x00050006, 0x00070008);
137 GOODADDR("D:E:A:D:b:e:e:f", 0x000d000e, 0x000a000d, 0x000b000e, 0x000e000f);
138
139 /* ... too short or too long */
140 BADADDR("1:2:3:4:5:6:7");
141 BADADDR("1:2:3:4:5:6:7:8:9");
142
143 /* ... hex group constraints */
144 BADADDR("1:2:3:4:5:6:7:-8");
145 BADADDR("1:2:3:4:5:6:7:0x8");
146 BADADDR("1:2:3:4:5:6:7:88888");
147 BADADDR("1:2:3:4:5:6:7:00008");
148
149
150 /* embedded IPv4 at the end */
151 GOODADDR("0:0:0:0:0:0:1.2.3.4", 0, 0, 0, 0x01020304);
152
153 /* ... not at the end */
154 BADADDR("0:0:0:0:0:1.2.3.4:0");
155
156 /* ... too short or too long */
157 BADADDR("0:0:0:0:0:0:0:1.2.3.4");
158 BADADDR("0:0:0:0:0:1.2.3.4");
159
160 /* ... invalid IPv4 address */
161 BADADDR("0:0:0:0:0:0:111.222.333.444");
162
163
164 /* "any" in compressed form */
165 GOODADDR("::", 0, 0, 0, 0);
166
167 /* compressed run at the beginning */
168 GOODADDR("::8", 0, 0, 0, 0x00000008);
169 GOODADDR("::7:8", 0, 0, 0, 0x00070008);
170 GOODADDR("::6:7:8", 0, 0, 0x00000006, 0x00070008);
171 GOODADDR("::5:6:7:8", 0, 0, 0x00050006, 0x00070008);
172 GOODADDR("::4:5:6:7:8", 0, 0x00000004, 0x00050006, 0x00070008);
173 GOODADDR("::3:4:5:6:7:8", 0, 0x00030004, 0x00050006, 0x00070008);
174 GOODADDR("::2:3:4:5:6:7:8", 0x00000002, 0x00030004, 0x00050006, 0x00070008);
175
176 /* ... too long */
177 BADADDR("::1:2:3:4:5:6:7:8");
178
179 /* compressed run at the end */
180 GOODADDR("1::", 0x00010000, 0, 0, 0);
181 GOODADDR("1:2::", 0x00010002, 0, 0, 0);
182 GOODADDR("1:2:3::", 0x00010002, 0x00030000, 0, 0);
183 GOODADDR("1:2:3:4::", 0x00010002, 0x00030004, 0, 0);
184 GOODADDR("1:2:3:4:5::", 0x00010002, 0x00030004, 0x00050000, 0);
185 GOODADDR("1:2:3:4:5:6::", 0x00010002, 0x00030004, 0x00050006, 0);
186 GOODADDR("1:2:3:4:5:6:7::", 0x00010002, 0x00030004, 0x00050006, 0x00070000);
187
188 /* ... too long */
189 BADADDR("1:2:3:4:5:6:7:8::");
190
191 /* compressed run in the middle */
192 GOODADDR("1::8", 0x00010000, 0, 0, 0x00000008);
193 GOODADDR("1:2::8", 0x00010002, 0, 0, 0x00000008);
194 GOODADDR("1:2:3::8", 0x00010002, 0x00030000, 0, 0x00000008);
195 GOODADDR("1:2:3:4::8", 0x00010002, 0x00030004, 0, 0x00000008);
196 GOODADDR("1:2:3:4:5::8", 0x00010002, 0x00030004, 0x00050000, 0x00000008);
197 GOODADDR("1:2:3:4:5:6::8", 0x00010002, 0x00030004, 0x00050006, 0x00000008);
198
199 GOODADDR("1::7:8", 0x00010000, 0, 0, 0x00070008);
200 GOODADDR("1::6:7:8", 0x00010000, 0, 0x00000006, 0x00070008);
201 GOODADDR("1::5:6:7:8", 0x00010000, 0, 0x00050006, 0x00070008);
202 GOODADDR("1::4:5:6:7:8", 0x00010000, 0x00000004, 0x00050006, 0x00070008);
203 GOODADDR("1::3:4:5:6:7:8", 0x00010000, 0x00030004, 0x00050006, 0x00070008);
204
205 /* ... too long */
206 BADADDR("1::2:3:4:5:6:7:8");
207 BADADDR("1:2::3:4:5:6:7:8");
208 BADADDR("1:2:3::4:5:6:7:8");
209 BADADDR("1:2:3:4::5:6:7:8");
210 BADADDR("1:2:3:4:5::6:7:8");
211 BADADDR("1:2:3:4:5:6::7:8");
212 BADADDR("1:2:3:4:5:6:7::8");
213
214 /* compressed with embedded IPv4 */
215 GOODADDR("::0.0.0.0", 0, 0, 0, 0);
216 GOODADDR("::1.2.3.4", 0, 0, 0, 0x01020304);
217 GOODADDR("::ffff:1.2.3.4", 0, 0, 0x0000ffff, 0x01020304);
218 GOODADDR("::ffff:0:1.2.3.4", 0, 0, 0xffff0000, 0x01020304);
219
220 GOODADDR("1::1.2.3.4", 0x00010000, 0, 0, 0x01020304);
221 GOODADDR("1:2::1.2.3.4", 0x00010002, 0, 0, 0x01020304);
222 GOODADDR("1:2:3::1.2.3.4", 0x00010002, 0x00030000, 0, 0x01020304);
223 GOODADDR("1:2:3:4::1.2.3.4", 0x00010002, 0x00030004, 0, 0x01020304);
224 GOODADDR("1:2:3:4:5::1.2.3.4", 0x00010002, 0x00030004, 0x00050000, 0x01020304);
225
226 /* ... too long */
227 BADADDR("1:2:3:4:5:6::1.2.3.4");
228 BADADDR("1:2:3:4:5::6:1.2.3.4");
229 BADADDR("1:2:3:4::5:6:1.2.3.4");
230 BADADDR("1:2:3::4:5:6:1.2.3.4");
231 BADADDR("1:2::3:4:5:6:1.2.3.4");
232 BADADDR("1::2:3:4:5:6:1.2.3.4");
233
234 /* zone ids (beware, shaky ground) */
235 GOODADDR("ff01::1%0", 0xff010000, 0, 0, 1);
236 GOODADDR("ff01::1%eth0", 0xff010000, 0, 0, 1);
237 GOODADDR("ff01::1%net1.0", 0xff010000, 0, 0, 1);
238
239 GOODADDR(" ff01::1%net1.1\t", 0xff010000, 0, 0, 1);
240
241 /* just some light testing */
242 GOODCIDR("1:2:3:4:5:6:7:8", 0x00010002, 0x00030004, 0x00050006, 0x00070008, 128);
243 GOODCIDR("1:2:3:4::/64", 0x00010002, 0x00030004, 0, 0, 64);
244 GOODCIDR(" 1:2:3:4::/64 ", 0x00010002, 0x00030004, 0, 0, 64);
245
246 /* we currently ignore the zone */
247 GOODCIDR("1:2:3:4::%if/64", 0x00010002, 0x00030004, 0, 0, 64);
248
249
250 GOODCIDR("::/0", 0, 0, 0, 0, 0);
251
252 /*
253 * we allow zero prefix mostly for the sake of the above
254 * "everything"/default case, but allow it on everything - a
255 * conscientious caller should be doing more checks on the result
256 * anyway.
257 */
258 GOODCIDR("1:2:3:4::/0", 0x00010002, 0x00030004, 0, 0, 0);
259
260
261 BADCIDR("1:2:3:4:: 64");
262 BADCIDR("1:2:3:4::/64x");
263 BADCIDR("1:2:3:4::/-1");
264 BADCIDR("1:2:3:4::/129");
265 BADCIDR("1:2:3:4::/256");
266
267 IS_ANY("::");
268 IS_ANY("::0.0.0.0");
269 IS_ANY("0:0:0:0:0:0:0:0");
270 IS_ANY("0000:0000:0000:0000:0000:0000:0000:0000");
271
272 IS_ANY("\t :: \t");
273
274 NOT_ANY("::1");
275 NOT_ANY("0:0:0:0:0:0:0:1");
276
277 NOT_ANY(":: x");
278 NOT_ANY("::%");
279 NOT_ANY("::%eth0"); /* or is it? */
280
281 return RTTestSummaryAndDestroy(hTest);
282}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette