3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2018-2019 Google LLC
5 * Copyright (c) 2015-2018 Nest Labs, Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 * This file implements a unit test suite for <tt>chip::Inet::IPAddress</tt>,
23 * a class to store and format IPV4 and IPV6 Internet Protocol addresses.
27 #include <inet/IPAddress.h>
31 #if CHIP_SYSTEM_CONFIG_USE_LWIP
32 #include <lwip/init.h>
33 #include <lwip/ip_addr.h>
35 #if LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS
36 #define htonl(x) lwip_htonl(x)
40 #include <netinet/in.h>
41 #include <sys/socket.h>
44 #include <nlunit-test.h>
46 #include <inet/IPPrefix.h>
48 #include <support/CodeUtils.h>
49 #include <support/UnitTestRegistration.h>
52 using namespace chip::Inet;
54 // Preprocessor Defintions
57 #define LLA_PREFIX 0xfe800000
58 #define ULA_PREFIX 0xfd000000
59 #define MCAST_PREFIX 0xff000000
60 #define NUM_MCAST_SCOPES 7
61 #define NUM_MCAST_GROUPS 2
62 #define NUM_BYTES_IN_IPV6 16
63 #define ULA_UP_24_BIT_MASK 0xffffff0000
64 #define ULA_LO_16_BIT_MASK 0x000000ffff
65 #define NUM_FIELDS_IN_ADDR sizeof (IPAddress) / sizeof (uint32_t)
72 // Test input vector format.
81 kTestIsIPv4Multicast = true,
82 kTestIsNotIPv4Multicast = false,
84 kTestIsIPv4Broadcast = true,
85 kTestIsNotIPv4Broadcast = false,
87 kTestIsMulticast = true,
88 kTestIsNotMulticast = false,
90 kTestIsIPv6Multicast = true,
91 kTestIsNotIPv6Multicast = false,
93 kTestIsIPv6ULA = true,
94 kTestIsNotIPv6ULA = false,
96 kTestIsIPv6LLA = true,
97 kTestIsNotIPv6LLA = false
102 struct IPAddressContext
104 uint32_t mAddrQuartets[4];
105 const IPAddressType mAddrType;
106 const char * mAddrString;
109 typedef const struct IPAddressContext * IPAddressContextIterator;
111 struct IPAddressContextRange
113 IPAddressContextIterator mBegin;
114 IPAddressContextIterator mEnd;
117 struct IPAddressExpandedContext
119 IPAddressContext mAddr;
121 bool isIPv4Multicast;
122 bool isIPv4Broadcast;
124 bool isIPv6Multicast;
133 typedef const struct IPAddressExpandedContext * IPAddressExpandedContextIterator;
135 struct IPAddressExpandedContextRange
137 IPAddressExpandedContextIterator mBegin;
138 IPAddressExpandedContextIterator mEnd;
143 const IPAddressContextRange mIPv6WellKnownMulticastContextRange;
144 const IPAddressContextRange mIPv6TransientMulticastContextRange;
145 const IPAddressContextRange mIPv6PrefixMulticastContextRange;
146 const IPAddressExpandedContextRange mIPAddressExpandedContextRange;
152 const IPv6MulticastScope sIPv6MulticastScopes[NUM_MCAST_SCOPES] =
154 kIPv6MulticastScope_Interface,
155 kIPv6MulticastScope_Link,
156 #if INET_CONFIG_ENABLE_IPV4
157 kIPv6MulticastScope_IPv4,
159 kIPv6MulticastScope_Realm,
160 #endif // INET_CONFIG_ENABLE_IPV4
161 kIPv6MulticastScope_Admin,
162 kIPv6MulticastScope_Site,
163 kIPv6MulticastScope_Organization,
164 kIPv6MulticastScope_Global
167 const IPV6MulticastGroup sIPv6WellKnownMulticastGroups[NUM_MCAST_GROUPS] = {
168 kIPV6MulticastGroup_AllNodes,
169 kIPV6MulticastGroup_AllRouters
174 const struct IPAddressExpandedContext sIPAddressContext[] =
177 { { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, kIPAddressType_Any,
179 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
183 { { 0x26200001, 0x10e70400, 0xe83fb28f, 0x9c3a1941 }, kIPAddressType_IPv6,
184 "2620:1:10e7:400:e83f:b28f:9c3a:1941" } ,
185 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
189 { { 0xfe800000, 0x00000000, 0x8edcd4ff, 0xfe3aebfb }, kIPAddressType_IPv6,
190 "fe80::8edc:d4ff:fe3a:ebfb" },
191 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsIPv6LLA,
195 { { 0xff010000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6,
197 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
201 { { 0xfd000000, 0x00010001, 0x00000000, 0x00000001 }, kIPAddressType_IPv6,
203 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsIPv6ULA, kTestIsNotIPv6LLA,
207 { { 0xfd123456, 0x0001abcd, 0xabcdef00, 0xfedcba09 }, kIPAddressType_IPv6,
208 "fd12:3456:1:abcd:abcd:ef00:fedc:ba09" },
209 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsIPv6ULA, kTestIsNotIPv6LLA,
210 0x1234560001, 0xabcd, 0xabcdef00fedcba09
213 { { 0xfdffffff, 0xffffffff, 0xffffffff, 0xffffffff }, kIPAddressType_IPv6,
214 "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" },
215 kTestIsIPv6, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsIPv6ULA, kTestIsNotIPv6LLA,
216 0xffffffffff, 0xffff, 0xffffffffffffffff
218 #if INET_CONFIG_ENABLE_IPV4
221 { { 0x00000000, 0x00000000, 0x0000ffff, 0xffffff00 }, kIPAddressType_IPv4,
223 kTestIsIPv4, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
227 { { 0x00000000, 0x00000000, 0x0000ffff, 0x7f000001 }, kIPAddressType_IPv4,
229 kTestIsIPv4, kTestIsNotIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
232 // IPv4 and IPv4 multicast
234 // IPv4 Local subnetwork multicast
236 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000000 }, kIPAddressType_IPv4,
238 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
242 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000001 }, kIPAddressType_IPv4,
244 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
248 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000080 }, kIPAddressType_IPv4,
250 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
254 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe00000fe }, kIPAddressType_IPv4,
256 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
260 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe00000ff }, kIPAddressType_IPv4,
262 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
265 // IPv4 Internetwork control multicast
267 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000100 }, kIPAddressType_IPv4,
269 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
273 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000101 }, kIPAddressType_IPv4,
275 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
279 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000180 }, kIPAddressType_IPv4,
281 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
285 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe00001fe }, kIPAddressType_IPv4,
287 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
291 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe00001ff }, kIPAddressType_IPv4,
293 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
296 // IPv4 AD-HOC block 1 multicast
298 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000200 }, kIPAddressType_IPv4,
300 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
304 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0000201 }, kIPAddressType_IPv4,
306 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
310 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0008100 }, kIPAddressType_IPv4,
312 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
316 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe000fffe }, kIPAddressType_IPv4,
318 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
322 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe000ffff }, kIPAddressType_IPv4,
324 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
327 // IPv4 AD-HOC block 2 multicast
329 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0030000 }, kIPAddressType_IPv4,
331 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
335 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0030001 }, kIPAddressType_IPv4,
337 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
341 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe0040000 }, kIPAddressType_IPv4,
343 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
347 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe004fffe }, kIPAddressType_IPv4,
349 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
353 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe004ffff }, kIPAddressType_IPv4,
355 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
358 // IPv4 source-specific multicast
360 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe8000000 }, kIPAddressType_IPv4,
362 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
366 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe8000001 }, kIPAddressType_IPv4,
368 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
372 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe8800000 }, kIPAddressType_IPv4,
374 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
378 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe8fffffe }, kIPAddressType_IPv4,
380 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
384 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe8ffffff }, kIPAddressType_IPv4,
386 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
389 // IPv4 GLOP addressing multicast
391 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9000000 }, kIPAddressType_IPv4,
393 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
397 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9000001 }, kIPAddressType_IPv4,
399 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
403 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe97e0000 }, kIPAddressType_IPv4,
405 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
409 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fbfffe }, kIPAddressType_IPv4,
411 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
415 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fbffff }, kIPAddressType_IPv4,
417 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
420 // IPv4 AD-HOC block 3 multicast
422 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fc0000 }, kIPAddressType_IPv4,
424 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
428 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fc0001 }, kIPAddressType_IPv4,
430 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
434 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fe0000 }, kIPAddressType_IPv4,
436 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
440 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9fffffe }, kIPAddressType_IPv4,
442 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
446 { { 0x00000000, 0x00000000, 0x0000ffff, 0xe9ffffff }, kIPAddressType_IPv4,
448 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
451 // IPv4 unicast-prefix-based multicast
453 { { 0x00000000, 0x00000000, 0x0000ffff, 0xea000000 }, kIPAddressType_IPv4,
455 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
459 { { 0x00000000, 0x00000000, 0x0000ffff, 0xea000001 }, kIPAddressType_IPv4,
461 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
465 { { 0x00000000, 0x00000000, 0x0000ffff, 0xea800000 }, kIPAddressType_IPv4,
467 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
471 { { 0x00000000, 0x00000000, 0x0000ffff, 0xeafffffe }, kIPAddressType_IPv4,
473 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
477 { { 0x00000000, 0x00000000, 0x0000ffff, 0xeaffffff }, kIPAddressType_IPv4,
479 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
482 // IPv4 administratively scoped multicast
484 { { 0x00000000, 0x00000000, 0x0000ffff, 0xef000000 }, kIPAddressType_IPv4,
486 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
490 { { 0x00000000, 0x00000000, 0x0000ffff, 0xef000001 }, kIPAddressType_IPv4,
492 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
496 { { 0x00000000, 0x00000000, 0x0000ffff, 0xef800000 }, kIPAddressType_IPv4,
498 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
502 { { 0x00000000, 0x00000000, 0x0000ffff, 0xeffffffe }, kIPAddressType_IPv4,
504 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
508 { { 0x00000000, 0x00000000, 0x0000ffff, 0xefffffff }, kIPAddressType_IPv4,
510 kTestIsIPv4, kTestIsIPv4Multicast, kTestIsNotIPv4Broadcast, kTestIsMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
513 // IP4 and IPv4 broadcast
515 { { 0x00000000, 0x00000000, 0x0000ffff, 0xffffffff }, kIPAddressType_IPv4,
517 kTestIsIPv4, kTestIsNotIPv4Multicast, kTestIsIPv4Broadcast, kTestIsNotMulticast, kTestIsNotIPv6Multicast, kTestIsNotIPv6ULA, kTestIsNotIPv6LLA,
520 #endif // INET_CONFIG_ENABLE_IPV4
524 const IPAddressContext sIPv6WellKnownMulticastContext[] = {
527 // All-nodes in Various Scopes
529 { { 0xff010000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff01::1" },
530 { { 0xff020000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff02::1" },
531 { { 0xff030000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff03::1" },
532 { { 0xff040000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff04::1" },
533 { { 0xff050000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff05::1" },
534 { { 0xff080000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff08::1" },
535 { { 0xff0e0000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff0e::1" },
537 // All-routers in Various Scopes
539 { { 0xff010000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff01::2" },
540 { { 0xff020000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff02::2" },
541 { { 0xff030000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff03::2" },
542 { { 0xff040000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff04::2" },
543 { { 0xff050000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff05::2" },
544 { { 0xff080000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff08::2" },
545 { { 0xff0e0000, 0x00000000, 0x00000000, 0x00000002 }, kIPAddressType_IPv6, "ff0e::2" }
548 const IPAddressContext sIPv6TransientMulticastContext[] = {
551 // Short Transient Group in Various Scopes
553 { { 0xff110000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff11::1" },
554 { { 0xff120000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff12::1" },
555 { { 0xff130000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff13::1" },
556 { { 0xff140000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff14::1" },
557 { { 0xff150000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff15::1" },
558 { { 0xff180000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff18::1" },
559 { { 0xff1e0000, 0x00000000, 0x00000000, 0x00000001 }, kIPAddressType_IPv6, "ff1e::1" },
561 // Long Transient Group in Various Scopes
563 { { 0xff11d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff11:d5d6:2ba2:7847:6452:587a:c955:b5a" },
564 { { 0xff12d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff12:d5d6:2ba2:7847:6452:587a:c955:b5a" },
565 { { 0xff13d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff13:d5d6:2ba2:7847:6452:587a:c955:b5a" },
566 { { 0xff14d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff14:d5d6:2ba2:7847:6452:587a:c955:b5a" },
567 { { 0xff15d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff15:d5d6:2ba2:7847:6452:587a:c955:b5a" },
568 { { 0xff18d5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff18:d5d6:2ba2:7847:6452:587a:c955:b5a" },
569 { { 0xff1ed5d6, 0x2ba27847, 0x6452587a, 0xc9550b5a }, kIPAddressType_IPv6, "ff1e:d5d6:2ba2:7847:6452:587a:c955:b5a" }
572 const IPAddressContext sIPv6PrefixMulticastContext[] = {
575 // 56-bit Prefix with Short Group in Various Scopes
577 { { 0xff310038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff31:38:373a:cba4:d2ad:8d00:1:1" },
578 { { 0xff320038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff32:38:373a:cba4:d2ad:8d00:1:1" },
579 { { 0xff330038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff33:38:373a:cba4:d2ad:8d00:1:1" },
580 { { 0xff340038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff34:38:373a:cba4:d2ad:8d00:1:1" },
581 { { 0xff350038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff35:38:373a:cba4:d2ad:8d00:1:1" },
582 { { 0xff380038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff38:38:373a:cba4:d2ad:8d00:1:1" },
583 { { 0xff3e0038, 0x373acba4, 0xd2ad8d00, 0x00010001 }, kIPAddressType_IPv6, "ff3e:38:373a:cba4:d2ad:8d00:1:1" },
585 // 56-bit Prefix with Long Group in Various Scopes
587 { { 0xff310038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff31:38:373a:cba4:d2ad:8d00:afff:5258" },
588 { { 0xff320038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff32:38:373a:cba4:d2ad:8d00:afff:5258" },
589 { { 0xff330038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff33:38:373a:cba4:d2ad:8d00:afff:5258" },
590 { { 0xff340038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff34:38:373a:cba4:d2ad:8d00:afff:5258" },
591 { { 0xff350038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff35:38:373a:cba4:d2ad:8d00:afff:5258" },
592 { { 0xff380038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff38:38:373a:cba4:d2ad:8d00:afff:5258" },
593 { { 0xff3e0038, 0x373acba4, 0xd2ad8d00, 0xafff5258 }, kIPAddressType_IPv6, "ff3e:38:373a:cba4:d2ad:8d00:afff:5258" },
595 // 64-bit Prefix with Short Group in Various Scopes
597 { { 0xff310040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff31:40:6664:3dfb:afa4:385b:1:1" },
598 { { 0xff320040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff32:40:6664:3dfb:afa4:385b:1:1" },
599 { { 0xff330040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff33:40:6664:3dfb:afa4:385b:1:1" },
600 { { 0xff340040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff34:40:6664:3dfb:afa4:385b:1:1" },
601 { { 0xff350040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff35:40:6664:3dfb:afa4:385b:1:1" },
602 { { 0xff380040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff38:40:6664:3dfb:afa4:385b:1:1" },
603 { { 0xff3e0040, 0x66643dfb, 0xafa4385b, 0x00010001 }, kIPAddressType_IPv6, "ff3e:40:6664:3dfb:afa4:385b:1:1" },
605 // 64-bit Prefix with Long Group in Various Scopes
607 { { 0xff310040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff31:40:6664:3dfb:afa4:385b:afff:5258" },
608 { { 0xff320040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff32:40:6664:3dfb:afa4:385b:afff:5258" },
609 { { 0xff330040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff33:40:6664:3dfb:afa4:385b:afff:5258" },
610 { { 0xff340040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff34:40:6664:3dfb:afa4:385b:afff:5258" },
611 { { 0xff350040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff35:40:6664:3dfb:afa4:385b:afff:5258" },
612 { { 0xff380040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff38:40:6664:3dfb:afa4:385b:afff:5258" },
613 { { 0xff3e0040, 0x66643dfb, 0xafa4385b, 0xafff5258 }, kIPAddressType_IPv6, "ff3e:40:6664:3dfb:afa4:385b:afff:5258" }
616 const size_t kIPv6WellKnownMulticastTestElements = sizeof(sIPv6WellKnownMulticastContext) / sizeof(struct IPAddressContext);
617 const size_t kIPv6TransientMulticastTestElements = sizeof(sIPv6TransientMulticastContext) / sizeof(struct IPAddressContext);
618 const size_t kIPv6PrefixMulticastTestElements = sizeof(sIPv6PrefixMulticastContext) / sizeof(struct IPAddressContext);
619 const size_t kIPAddressTestElements = sizeof(sIPAddressContext) / sizeof(struct IPAddressExpandedContext);
622 const TestContext sTestContext = {
624 &sIPv6WellKnownMulticastContext[0],
625 &sIPv6WellKnownMulticastContext[kIPv6WellKnownMulticastTestElements]
628 &sIPv6TransientMulticastContext[0],
629 &sIPv6TransientMulticastContext[kIPv6TransientMulticastTestElements]
632 &sIPv6PrefixMulticastContext[0],
633 &sIPv6PrefixMulticastContext[kIPv6PrefixMulticastTestElements]
636 &sIPAddressContext[0],
637 &sIPAddressContext[kIPAddressTestElements]
642 // Utility functions.
645 * Load input test directly into IPAddress.
647 void SetupIPAddress(IPAddress & addr, const struct IPAddressExpandedContext * inContext)
649 for (size_t i = 0; i < NUM_FIELDS_IN_ADDR; i++)
651 addr.Addr[i] = htonl(inContext->mAddr.mAddrQuartets[i]);
656 * Zero out IP address.
658 void ClearIPAddress(IPAddress & addr)
660 addr = IPAddress::Any;
663 void CheckAddressQuartet(nlTestSuite * inSuite, const uint32_t & inFirstAddressQuartet, const uint32_t & inSecondAddressQuartet,
664 const size_t & inWhich)
666 const bool lResult = (inFirstAddressQuartet == inSecondAddressQuartet);
668 NL_TEST_ASSERT(inSuite, lResult == true);
672 fprintf(stdout, "Address quartet %zu mismatch: actual 0x%08x, expected: 0x%08x\n", inWhich, inFirstAddressQuartet,
673 inSecondAddressQuartet);
677 void CheckAddressQuartet(nlTestSuite * inSuite, const IPAddressContext & inContext, const IPAddress & inAddress,
678 const size_t & inWhich)
680 CheckAddressQuartet(inSuite, inAddress.Addr[inWhich], htonl(inContext.mAddrQuartets[inWhich]), inWhich);
683 void CheckAddressQuartets(nlTestSuite * inSuite, const IPAddress & inFirstAddress, const IPAddress & inSecondAddress)
685 for (size_t i = 0; i < 4; i++)
687 CheckAddressQuartet(inSuite, inFirstAddress.Addr[i], inSecondAddress.Addr[i], i);
691 void CheckAddressQuartets(nlTestSuite * inSuite, const IPAddressContext & inContext, const IPAddress & inAddress)
693 for (size_t i = 0; i < 4; i++)
695 CheckAddressQuartet(inSuite, inContext, inAddress, i);
699 void CheckAddressString(nlTestSuite * inSuite, const char * inActual, const char * inExpected)
701 const int lResult = strcasecmp(inActual, inExpected);
703 NL_TEST_ASSERT(inSuite, lResult == 0);
707 fprintf(stdout, "Address format mismatch: actual %s, expected %s\n", inActual, inExpected);
711 void CheckAddress(nlTestSuite * inSuite, const IPAddressContext & inContext, const IPAddress & inAddress)
713 char lAddressBuffer[INET6_ADDRSTRLEN];
714 IPAddress lParsedAddress;
717 // Compare the address quartets to their control values.
719 CheckAddressQuartets(inSuite, inContext, inAddress);
721 // Convert the address to a string and compare it to the control string.
723 inAddress.ToString(lAddressBuffer);
725 CheckAddressString(inSuite, lAddressBuffer, inContext.mAddrString);
727 // Convert the control string to an address and compare the parsed address to the created address.
729 lResult = IPAddress::FromString(inContext.mAddrString, lParsedAddress);
730 NL_TEST_ASSERT(inSuite, lResult == true);
732 lResult = (inAddress == lParsedAddress);
734 if (!static_cast<bool>(lResult))
736 fprintf(stdout, "Address parse mismatch for %s\n", inContext.mAddrString);
740 // Test functions invoked from the suite.
743 * Test IP address conversion from a string.
745 void CheckFromString(nlTestSuite * inSuite, void * inContext)
747 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
748 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
749 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
751 while (lCurrent != lEnd)
755 IPAddress::FromString(lCurrent->mAddr.mAddrString, test_addr);
757 CheckAddressQuartets(inSuite, lCurrent->mAddr, test_addr);
759 char tmpBuf[INET6_ADDRSTRLEN];
760 size_t addrStrLen = strlen(lCurrent->mAddr.mAddrString);
762 memset(tmpBuf, '1', sizeof(tmpBuf));
763 memcpy(tmpBuf, lCurrent->mAddr.mAddrString, addrStrLen);
765 IPAddress::FromString(tmpBuf, addrStrLen, test_addr);
767 CheckAddressQuartets(inSuite, lCurrent->mAddr, test_addr);
774 * Test IP address conversion to a string.
776 void CheckToString(nlTestSuite * inSuite, void * inContext)
778 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
779 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
780 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
781 char lAddressBuffer[INET6_ADDRSTRLEN];
784 while (lCurrent != lEnd)
786 SetupIPAddress(lAddress, lCurrent);
788 lAddress.ToString(lAddressBuffer);
790 CheckAddressString(inSuite, lAddressBuffer, lCurrent->mAddr.mAddrString);
797 * Test correct identification of IPv6 ULA addresses.
799 void CheckIsIPv6ULA(nlTestSuite * inSuite, void * inContext)
801 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
802 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
803 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
805 while (lCurrent != lEnd)
809 SetupIPAddress(test_addr, lCurrent);
811 NL_TEST_ASSERT(inSuite, test_addr.IsIPv6ULA() == lCurrent->isIPv6ULA);
818 * Test correct identification of IPv6 Link Local addresses.
820 void CheckIsIPv6LLA(nlTestSuite * inSuite, void * inContext)
822 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
823 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
824 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
826 while (lCurrent != lEnd)
830 SetupIPAddress(test_addr, lCurrent);
832 NL_TEST_ASSERT(inSuite, test_addr.IsIPv6LinkLocal() == lCurrent->isIPv6LLA);
839 * Test correct identification of IPv6 multicast addresses.
841 void CheckIsIPv6Multicast(nlTestSuite * inSuite, void * inContext)
843 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
844 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
845 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
847 while (lCurrent != lEnd)
851 SetupIPAddress(test_addr, lCurrent);
853 NL_TEST_ASSERT(inSuite, test_addr.IsIPv6Multicast() == lCurrent->isIPv6Multicast);
860 * Test correct identification of multicast addresses.
862 void CheckIsMulticast(nlTestSuite * inSuite, void * inContext)
864 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
865 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
866 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
868 while (lCurrent != lEnd)
872 SetupIPAddress(test_addr, lCurrent);
874 NL_TEST_ASSERT(inSuite, test_addr.IsMulticast() == lCurrent->isMulticast);
881 * Test IPAddress equal operator.
883 void CheckOperatorEqual(nlTestSuite * inSuite, void * inContext)
885 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
886 IPAddressExpandedContextIterator lFirstCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
887 IPAddressExpandedContextIterator lFirstEnd = lContext->mIPAddressExpandedContextRange.mEnd;
889 while (lFirstCurrent != lFirstEnd)
891 IPAddressExpandedContextIterator lSecondCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
892 IPAddressExpandedContextIterator lSecondEnd = lContext->mIPAddressExpandedContextRange.mEnd;
893 IPAddress test_addr_1;
895 SetupIPAddress(test_addr_1, lFirstCurrent);
897 while (lSecondCurrent != lSecondEnd)
899 IPAddress test_addr_2;
901 SetupIPAddress(test_addr_2, lSecondCurrent);
903 if (lFirstCurrent == lSecondCurrent)
905 NL_TEST_ASSERT(inSuite, test_addr_1 == test_addr_2);
909 NL_TEST_ASSERT(inSuite, !(test_addr_1 == test_addr_2));
920 * Test IPAddress not-equal operator.
922 void CheckOperatorNotEqual(nlTestSuite * inSuite, void * inContext)
924 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
925 IPAddressExpandedContextIterator lFirstCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
926 IPAddressExpandedContextIterator lFirstEnd = lContext->mIPAddressExpandedContextRange.mEnd;
928 while (lFirstCurrent != lFirstEnd)
930 IPAddressExpandedContextIterator lSecondCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
931 IPAddressExpandedContextIterator lSecondEnd = lContext->mIPAddressExpandedContextRange.mEnd;
932 IPAddress test_addr_1;
934 SetupIPAddress(test_addr_1, lFirstCurrent);
936 while (lSecondCurrent != lSecondEnd)
938 IPAddress test_addr_2;
940 SetupIPAddress(test_addr_2, lSecondCurrent);
942 if (lFirstCurrent == lSecondCurrent)
944 NL_TEST_ASSERT(inSuite, !(test_addr_1 != test_addr_2));
948 NL_TEST_ASSERT(inSuite, test_addr_1 != test_addr_2);
959 * Test IPAddress assign operator.
961 void CheckOperatorAssign(nlTestSuite * inSuite, void * inContext)
963 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
964 IPAddressExpandedContextIterator lFirstCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
965 IPAddressExpandedContextIterator lFirstEnd = lContext->mIPAddressExpandedContextRange.mEnd;
967 while (lFirstCurrent != lFirstEnd)
969 IPAddressExpandedContextIterator lSecondCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
970 IPAddressExpandedContextIterator lSecondEnd = lContext->mIPAddressExpandedContextRange.mEnd;
972 while (lSecondCurrent != lSecondEnd)
974 IPAddress test_addr_1, test_addr_2;
976 ClearIPAddress(test_addr_1);
977 SetupIPAddress(test_addr_2, lSecondCurrent);
979 // Use operator to assign IPAddress from test_addr_2 to test_addr_1
980 test_addr_1 = test_addr_2;
982 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
992 * Test IPAddress v6 conversion to native representation.
994 void CheckToIPv6(nlTestSuite * inSuite, void * inContext)
996 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
997 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
998 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1000 while (lCurrent != lEnd)
1002 IPAddress test_addr;
1005 addr[0] = htonl(lCurrent->mAddr.mAddrQuartets[0]);
1006 addr[1] = htonl(lCurrent->mAddr.mAddrQuartets[1]);
1007 addr[2] = htonl(lCurrent->mAddr.mAddrQuartets[2]);
1008 addr[3] = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1010 SetupIPAddress(test_addr, lCurrent);
1012 #if CHIP_SYSTEM_CONFIG_USE_LWIP
1013 ip6_addr_t ip_addr_1, ip_addr_2;
1014 ip_addr_1 = *(ip6_addr_t *) addr;
1016 struct in6_addr ip_addr_1, ip_addr_2;
1017 ip_addr_1 = *reinterpret_cast<struct in6_addr *>(addr);
1019 ip_addr_2 = test_addr.ToIPv6();
1021 NL_TEST_ASSERT(inSuite, !memcmp(&ip_addr_1, &ip_addr_2, sizeof(ip_addr_1)));
1028 * Test native IPv6 conversion into IPAddress.
1030 void CheckFromIPv6(nlTestSuite * inSuite, void * inContext)
1032 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1033 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1034 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1036 while (lCurrent != lEnd)
1038 IPAddress test_addr_1, test_addr_2;
1041 addr[0] = htonl(lCurrent->mAddr.mAddrQuartets[0]);
1042 addr[1] = htonl(lCurrent->mAddr.mAddrQuartets[1]);
1043 addr[2] = htonl(lCurrent->mAddr.mAddrQuartets[2]);
1044 addr[3] = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1046 SetupIPAddress(test_addr_1, lCurrent);
1047 ClearIPAddress(test_addr_2);
1049 #if CHIP_SYSTEM_CONFIG_USE_LWIP
1051 ip_addr = *(ip6_addr_t *) addr;
1053 struct in6_addr ip_addr;
1054 ip_addr = *reinterpret_cast<struct in6_addr *>(addr);
1056 test_addr_2 = IPAddress::FromIPv6(ip_addr);
1058 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
1064 #if INET_CONFIG_ENABLE_IPV4
1066 * Test correct identification of IPv4 addresses.
1068 void CheckIsIPv4(nlTestSuite * inSuite, void * inContext)
1070 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1071 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1072 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1074 while (lCurrent != lEnd)
1076 IPAddress test_addr;
1078 SetupIPAddress(test_addr, lCurrent);
1080 NL_TEST_ASSERT(inSuite, test_addr.IsIPv4() == lCurrent->isIPv4);
1087 * Test correct identification of IPv4 multicast addresses.
1089 void CheckIsIPv4Multicast(nlTestSuite * inSuite, void * inContext)
1091 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1092 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1093 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1095 while (lCurrent != lEnd)
1097 IPAddress test_addr;
1099 SetupIPAddress(test_addr, lCurrent);
1101 NL_TEST_ASSERT(inSuite, test_addr.IsIPv4Multicast() == lCurrent->isIPv4Multicast);
1108 * Test correct identification of IPv4 broadcast addresses.
1110 void CheckIsIPv4Broadcast(nlTestSuite * inSuite, void * inContext)
1112 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1113 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1114 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1116 while (lCurrent != lEnd)
1118 IPAddress test_addr;
1120 SetupIPAddress(test_addr, lCurrent);
1122 NL_TEST_ASSERT(inSuite, test_addr.IsIPv4Broadcast() == lCurrent->isIPv4Broadcast);
1129 * Test IPAddress v4 conversion to native representation.
1131 void CheckToIPv4(nlTestSuite * inSuite, void * inContext)
1133 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1134 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1135 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1137 while (lCurrent != lEnd)
1139 IPAddress test_addr;
1141 SetupIPAddress(test_addr, lCurrent);
1143 #if CHIP_SYSTEM_CONFIG_USE_LWIP
1144 ip4_addr_t ip_addr_1, ip_addr_2;
1146 ip_addr_1.addr = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1148 struct in_addr ip_addr_1, ip_addr_2;
1150 ip_addr_1.s_addr = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1152 ip_addr_2 = test_addr.ToIPv4();
1154 NL_TEST_ASSERT(inSuite, !memcmp(&ip_addr_1, &ip_addr_2, sizeof(ip_addr_1)));
1161 * Test native IPv4 conversion into IPAddress.
1163 void CheckFromIPv4(nlTestSuite * inSuite, void * inContext)
1165 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1166 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1167 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1169 while (lCurrent != lEnd)
1171 IPAddress test_addr_1, test_addr_2;
1173 SetupIPAddress(test_addr_1, lCurrent);
1174 ClearIPAddress(test_addr_2);
1176 // Convert to IPv4 (test_addr_1);
1177 test_addr_1.Addr[0] = 0;
1178 test_addr_1.Addr[1] = 0;
1180 #if CHIP_SYSTEM_CONFIG_USE_LWIP
1182 ip_addr.addr = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1183 test_addr_1.Addr[2] = lwip_htonl(0xffff);
1185 struct in_addr ip_addr;
1186 ip_addr.s_addr = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1187 test_addr_1.Addr[2] = htonl(0xffff);
1189 test_addr_2 = IPAddress::FromIPv4(ip_addr);
1191 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
1196 #endif // INET_CONFIG_ENABLE_IPV4
1199 * Test IPAddress address conversion from socket.
1201 void CheckFromSocket(nlTestSuite * inSuite, void * inContext)
1203 #if CHIP_SYSTEM_CONFIG_USE_LWIP
1205 // This test is only supported for non LWIP stack.
1207 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1208 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1209 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1211 while (lCurrent != lEnd)
1213 IPAddress test_addr_1, test_addr_2;
1215 struct sockaddr_in6 sock_v6;
1216 #if INET_CONFIG_ENABLE_IPV4
1217 struct sockaddr_in sock_v4;
1218 #endif // INET_CONFIG_ENABLE_IPV4
1220 addr[0] = htonl(lCurrent->mAddr.mAddrQuartets[0]);
1221 addr[1] = htonl(lCurrent->mAddr.mAddrQuartets[1]);
1222 addr[2] = htonl(lCurrent->mAddr.mAddrQuartets[2]);
1223 addr[3] = htonl(lCurrent->mAddr.mAddrQuartets[3]);
1225 SetupIPAddress(test_addr_1, lCurrent);
1226 ClearIPAddress(test_addr_2);
1228 switch (lCurrent->mAddr.mAddrType)
1230 #if INET_CONFIG_ENABLE_IPV4
1231 case kIPAddressType_IPv4:
1232 memset(&sock_v4, 0, sizeof(struct sockaddr_in));
1233 sock_v4.sin_family = AF_INET;
1234 memcpy(&sock_v4.sin_addr.s_addr, &addr[3], sizeof(struct in_addr));
1235 test_addr_2 = IPAddress::FromSockAddr(reinterpret_cast<struct sockaddr &>(sock_v4));
1237 #endif // INET_CONFIG_ENABLE_IPV4
1239 case kIPAddressType_IPv6:
1240 memset(&sock_v6, 0, sizeof(struct sockaddr_in6));
1241 sock_v6.sin6_family = AF_INET6;
1242 memcpy(&sock_v6.sin6_addr.s6_addr, addr, sizeof(struct in6_addr));
1243 test_addr_2 = IPAddress::FromSockAddr(reinterpret_cast<struct sockaddr &>(sock_v6));
1246 case kIPAddressType_Any:
1247 memset(&sock_v6, 0, sizeof(struct sockaddr_in6));
1248 sock_v6.sin6_family = 0;
1249 memcpy(&sock_v6.sin6_addr.s6_addr, addr, sizeof(struct in6_addr));
1250 test_addr_2 = IPAddress::FromSockAddr(reinterpret_cast<struct sockaddr &>(sock_v6));
1257 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
1265 * Test IP address type.
1267 void CheckType(nlTestSuite * inSuite, void * inContext)
1269 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1270 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1271 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1273 while (lCurrent != lEnd)
1275 IPAddress test_addr;
1277 SetupIPAddress(test_addr, lCurrent);
1279 NL_TEST_ASSERT(inSuite, test_addr.Type() == lCurrent->mAddr.mAddrType);
1286 * Test the Any address global.
1288 void CheckAnyAddress(nlTestSuite * inSuite, void * inContext)
1290 const IPAddress test_addr = IPAddress::Any;
1291 IPAddressType test_type = test_addr.Type();
1293 NL_TEST_ASSERT(inSuite, test_type == kIPAddressType_Any);
1297 * Test IP address interface ID.
1299 void CheckInterface(nlTestSuite * inSuite, void * inContext)
1301 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1302 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1303 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1305 while (lCurrent != lEnd)
1307 IPAddress test_addr;
1309 SetupIPAddress(test_addr, lCurrent);
1311 NL_TEST_ASSERT(inSuite, test_addr.InterfaceId() == lCurrent->interface);
1318 * Test IP address subnet.
1320 void CheckSubnet(nlTestSuite * inSuite, void * inContext)
1322 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1323 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1324 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1326 while (lCurrent != lEnd)
1328 IPAddress test_addr;
1330 SetupIPAddress(test_addr, lCurrent);
1332 NL_TEST_ASSERT(inSuite, test_addr.Subnet() == lCurrent->subnet);
1339 * Test IP address global ID.
1341 void CheckGlobal(nlTestSuite * inSuite, void * inContext)
1343 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1344 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1345 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1347 while (lCurrent != lEnd)
1349 IPAddress test_addr;
1351 SetupIPAddress(test_addr, lCurrent);
1353 NL_TEST_ASSERT(inSuite, test_addr.GlobalId() == lCurrent->global);
1360 * Test address encoding with chip::Encoding.
1362 void CheckEncoding(nlTestSuite * inSuite, void * inContext)
1364 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1365 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1366 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1368 while (lCurrent != lEnd)
1370 IPAddress test_addr;
1372 uint8_t buffer[NUM_BYTES_IN_IPV6];
1374 SetupIPAddress(test_addr, lCurrent);
1375 memset(&buffer, 0, NUM_BYTES_IN_IPV6);
1378 // Call EncodeAddress function that we test.
1379 test_addr.WriteAddress(p);
1381 // buffer has address in network byte order
1382 NL_TEST_ASSERT(inSuite, buffer[3] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[0]));
1383 NL_TEST_ASSERT(inSuite, buffer[2] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[0] >> 8));
1384 NL_TEST_ASSERT(inSuite, buffer[1] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[0] >> 16));
1385 NL_TEST_ASSERT(inSuite, buffer[0] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[0] >> 24));
1387 NL_TEST_ASSERT(inSuite, buffer[7] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[1]));
1388 NL_TEST_ASSERT(inSuite, buffer[6] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[1] >> 8));
1389 NL_TEST_ASSERT(inSuite, buffer[5] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[1] >> 16));
1390 NL_TEST_ASSERT(inSuite, buffer[4] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[1] >> 24));
1392 NL_TEST_ASSERT(inSuite, buffer[11] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[2]));
1393 NL_TEST_ASSERT(inSuite, buffer[10] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[2] >> 8));
1394 NL_TEST_ASSERT(inSuite, buffer[9] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[2] >> 16));
1395 NL_TEST_ASSERT(inSuite, buffer[8] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[2] >> 24));
1397 NL_TEST_ASSERT(inSuite, buffer[15] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[3]));
1398 NL_TEST_ASSERT(inSuite, buffer[14] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[3] >> 8));
1399 NL_TEST_ASSERT(inSuite, buffer[13] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[3] >> 16));
1400 NL_TEST_ASSERT(inSuite, buffer[12] == (uint8_t)(lCurrent->mAddr.mAddrQuartets[3] >> 24));
1407 * Test address decoding with chip::Decoding.
1409 void CheckDecoding(nlTestSuite * inSuite, void * inContext)
1411 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1412 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1413 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1415 while (lCurrent != lEnd)
1417 IPAddress test_addr_1, test_addr_2;
1418 uint8_t buffer[NUM_BYTES_IN_IPV6];
1422 SetupIPAddress(test_addr_1, lCurrent);
1423 ClearIPAddress(test_addr_2);
1424 memset(&buffer, 0, NUM_BYTES_IN_IPV6);
1427 for (b = 0; b < NUM_BYTES_IN_IPV6; b++)
1429 buffer[b] = static_cast<uint8_t>(lCurrent->mAddr.mAddrQuartets[b / 4] >> ((3 - b % 4) * 8));
1432 // Call ReadAddress function that we test.
1433 IPAddress::ReadAddress(const_cast<const uint8_t *&>(p), test_addr_2);
1435 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
1442 * Test address symmetricity of encoding and decoding with chip::(De/En)code.
1444 void CheckEcodeDecodeSymmetricity(nlTestSuite * inSuite, void * inContext)
1446 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1447 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1448 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1450 while (lCurrent != lEnd)
1452 IPAddress test_addr_1, test_addr_2;
1453 uint8_t buffer[NUM_BYTES_IN_IPV6];
1456 SetupIPAddress(test_addr_1, lCurrent);
1457 ClearIPAddress(test_addr_2);
1458 memset(&buffer, 0, NUM_BYTES_IN_IPV6);
1462 // Call EncodeAddress function that we test.
1463 test_addr_1.WriteAddress(p);
1465 // Move pointer back to the beginning of the buffer.
1468 // Call ReadAddress function that we test.
1469 IPAddress::ReadAddress(const_cast<const uint8_t *&>(p), test_addr_2);
1471 CheckAddressQuartets(inSuite, test_addr_1, test_addr_2);
1478 * Test assembling ULA address.
1480 void CheckMakeULA(nlTestSuite * inSuite, void * inContext)
1482 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1483 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1484 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1486 while (lCurrent != lEnd)
1488 IPAddress test_addr;
1490 // Call MakeULA function that we test.
1491 test_addr = IPAddress::MakeULA(lCurrent->global, lCurrent->subnet, lCurrent->interface);
1493 NL_TEST_ASSERT(inSuite, test_addr.Addr[0] == htonl(ULA_PREFIX | (lCurrent->global & ULA_UP_24_BIT_MASK) >> 16));
1494 NL_TEST_ASSERT(inSuite, test_addr.Addr[1] == htonl((lCurrent->global & ULA_LO_16_BIT_MASK) << 16 | lCurrent->subnet));
1495 NL_TEST_ASSERT(inSuite, test_addr.Addr[2] == htonl(lCurrent->interface >> 32));
1496 NL_TEST_ASSERT(inSuite, test_addr.Addr[3] == htonl(lCurrent->interface));
1503 * Test assembling LLA address.
1505 void CheckMakeLLA(nlTestSuite * inSuite, void * inContext)
1507 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1508 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1509 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1511 while (lCurrent != lEnd)
1513 IPAddress test_addr;
1515 // Call MakeLLA function that we test.
1516 test_addr = IPAddress::MakeLLA(lCurrent->interface);
1518 NL_TEST_ASSERT(inSuite, test_addr.Addr[0] == htonl(LLA_PREFIX));
1519 NL_TEST_ASSERT(inSuite, test_addr.Addr[1] == 0);
1520 NL_TEST_ASSERT(inSuite, test_addr.Addr[2] == htonl(lCurrent->interface >> 32));
1521 NL_TEST_ASSERT(inSuite, test_addr.Addr[3] == htonl(lCurrent->interface));
1527 void CheckMakeIPv6WellKnownMulticast(nlTestSuite * inSuite, void * inContext)
1529 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1530 IPAddressContextIterator lCurrent = lContext->mIPv6WellKnownMulticastContextRange.mBegin;
1531 IPAddressContextIterator lEnd = lContext->mIPv6WellKnownMulticastContextRange.mEnd;
1536 if (lCurrent != lEnd)
1538 for (lGroupIndex = 0; lGroupIndex < NUM_MCAST_GROUPS && (lCurrent != lEnd); lGroupIndex++)
1540 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1542 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1543 const IPV6MulticastGroup lGroup = sIPv6WellKnownMulticastGroups[lGroupIndex];
1545 lAddress = IPAddress::MakeIPv6WellKnownMulticast(lScope, lGroup);
1547 CheckAddress(inSuite, *lCurrent, lAddress);
1555 void CheckMakeIPv6TransientMulticast(nlTestSuite * inSuite, void * inContext)
1557 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1558 IPAddressContextIterator lCurrent = lContext->mIPv6TransientMulticastContextRange.mBegin;
1559 IPAddressContextIterator lEnd = lContext->mIPv6TransientMulticastContextRange.mEnd;
1560 const uint8_t lFlags = 0;
1564 if (lCurrent != lEnd)
1566 // Short Transient Group in Various Scopes
1568 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1570 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1571 const uint8_t lGroup[NL_INET_IPV6_MCAST_GROUP_LEN_IN_BYTES] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
1574 lAddress = IPAddress::MakeIPv6TransientMulticast(lFlags, lScope, lGroup);
1576 CheckAddress(inSuite, *lCurrent, lAddress);
1581 // Long Transient Group in Various Scopes
1583 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1585 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1586 const uint8_t lGroup[NL_INET_IPV6_MCAST_GROUP_LEN_IN_BYTES] = { 0xd5, 0xd6, 0x2b, 0xa2, 0x78, 0x47, 0x64,
1587 0x52, 0x58, 0x7a, 0xc9, 0x55, 0x0b, 0x5a };
1589 lAddress = IPAddress::MakeIPv6TransientMulticast(lFlags, lScope, lGroup);
1591 CheckAddress(inSuite, *lCurrent, lAddress);
1598 void CheckMakeIPv6PrefixMulticast(nlTestSuite * inSuite, void * inContext)
1600 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1601 IPAddressContextIterator lCurrent = lContext->mIPv6PrefixMulticastContextRange.mBegin;
1602 IPAddressContextIterator lEnd = lContext->mIPv6PrefixMulticastContextRange.mEnd;
1603 uint8_t lPrefixLength;
1609 if (lCurrent != lEnd)
1611 // 56-bit Prefix with Short Group in Various Scopes
1614 lPrefix = 0x373acba4d2ad8d00;
1615 lGroup = 0x00010001;
1617 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1619 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1621 lAddress = IPAddress::MakeIPv6PrefixMulticast(lScope, lPrefixLength, lPrefix, lGroup);
1623 CheckAddress(inSuite, *lCurrent, lAddress);
1628 // 56-bit Prefix with Long Group in Various Scopes
1631 lPrefix = 0x373acba4d2ad8d00;
1632 lGroup = 0xafff5258;
1634 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1636 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1638 lAddress = IPAddress::MakeIPv6PrefixMulticast(lScope, lPrefixLength, lPrefix, lGroup);
1640 CheckAddress(inSuite, *lCurrent, lAddress);
1645 // 64-bit Prefix with Short Group in Various Scopes
1648 lPrefix = 0x66643dfbafa4385b;
1649 lGroup = 0x00010001;
1651 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1653 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1655 lAddress = IPAddress::MakeIPv6PrefixMulticast(lScope, lPrefixLength, lPrefix, lGroup);
1657 CheckAddress(inSuite, *lCurrent, lAddress);
1662 // 64-bit Prefix with Long Group in Various Scopes
1665 lPrefix = 0x66643dfbafa4385b;
1666 lGroup = 0xafff5258;
1668 for (lScopeIndex = 0; lScopeIndex < NUM_MCAST_SCOPES && (lCurrent != lEnd); lScopeIndex++)
1670 const IPv6MulticastScope lScope = sIPv6MulticastScopes[lScopeIndex];
1672 lAddress = IPAddress::MakeIPv6PrefixMulticast(lScope, lPrefixLength, lPrefix, lGroup);
1674 CheckAddress(inSuite, *lCurrent, lAddress);
1684 void CheckIPPrefix(nlTestSuite * inSuite, void * inContext)
1686 const struct TestContext * lContext = static_cast<const struct TestContext *>(inContext);
1687 IPAddressExpandedContextIterator lCurrent = lContext->mIPAddressExpandedContextRange.mBegin;
1688 IPAddressExpandedContextIterator lEnd = lContext->mIPAddressExpandedContextRange.mEnd;
1691 while (lCurrent != lEnd)
1693 IPPrefix ipprefix_1, ipprefix_2;
1694 IPAddress test_addr_1;
1696 SetupIPAddress(test_addr_1, lCurrent);
1698 ipprefix_1.IPAddr = test_addr_1;
1699 ipprefix_1.Length = 128 - (i++ % 128);
1700 ipprefix_2 = ipprefix_1;
1702 NL_TEST_ASSERT(inSuite, !ipprefix_1.IsZero());
1703 NL_TEST_ASSERT(inSuite, !ipprefix_2.IsZero());
1704 NL_TEST_ASSERT(inSuite, ipprefix_1 == ipprefix_2);
1705 NL_TEST_ASSERT(inSuite, !(ipprefix_1 != ipprefix_2));
1706 #if !CHIP_SYSTEM_CONFIG_USE_LWIP
1707 NL_TEST_ASSERT(inSuite, ipprefix_1.MatchAddress(test_addr_1));
1714 * Test Suite. It lists all the test functions.
1718 const nlTest sTests[] =
1720 NL_TEST_DEF("Address Type", CheckType),
1721 NL_TEST_DEF("Any Address Global", CheckAnyAddress),
1722 NL_TEST_DEF("Address Encoding (Writing)", CheckEncoding),
1723 NL_TEST_DEF("Address Decoding (Reading)", CheckDecoding),
1724 NL_TEST_DEF("Address Encode / Decode Symmetricity", CheckEcodeDecodeSymmetricity),
1725 NL_TEST_DEF("From String Conversion", CheckFromString),
1726 NL_TEST_DEF("To String Conversion", CheckToString),
1727 #if INET_CONFIG_ENABLE_IPV4
1728 NL_TEST_DEF("IPv4 Detection", CheckIsIPv4),
1729 NL_TEST_DEF("IPv4 Multicast Detection", CheckIsIPv4Multicast),
1730 NL_TEST_DEF("IPv4 Broadcast Detection", CheckIsIPv4Broadcast),
1731 NL_TEST_DEF("Convert IPv4 to IPAddress", CheckFromIPv4),
1732 NL_TEST_DEF("Convert IPAddress to IPv4", CheckToIPv4),
1733 #endif // INET_CONFIG_ENABLE_IPV4
1734 NL_TEST_DEF("IPv6 ULA Detection", CheckIsIPv6ULA),
1735 NL_TEST_DEF("IPv6 Link Local Detection", CheckIsIPv6LLA),
1736 NL_TEST_DEF("IPv6 Multicast Detection", CheckIsIPv6Multicast),
1737 NL_TEST_DEF("Multicast Detection", CheckIsMulticast),
1738 NL_TEST_DEF("Equivalence Operator", CheckOperatorEqual),
1739 NL_TEST_DEF("Non-Equivalence Operator", CheckOperatorNotEqual),
1740 NL_TEST_DEF("Assign Operator", CheckOperatorAssign),
1741 NL_TEST_DEF("Convert IPv6 to IPAddress", CheckFromIPv6),
1742 NL_TEST_DEF("Convert IPAddress to IPv6", CheckToIPv6),
1743 NL_TEST_DEF("Assign address from socket", CheckFromSocket),
1744 NL_TEST_DEF("Address Interface ID", CheckInterface),
1745 NL_TEST_DEF("Address Subnet", CheckSubnet),
1746 NL_TEST_DEF("Address Global ID", CheckGlobal),
1747 NL_TEST_DEF("Assemble IPv6 ULA address", CheckMakeULA),
1748 NL_TEST_DEF("Assemble IPv6 LLA address", CheckMakeLLA),
1749 NL_TEST_DEF("Assemble IPv6 Well-known Multicast address", CheckMakeIPv6WellKnownMulticast),
1750 NL_TEST_DEF("Assemble IPv6 Transient Multicast address", CheckMakeIPv6TransientMulticast),
1751 NL_TEST_DEF("Assemble IPv6 Prefix Multicast address", CheckMakeIPv6PrefixMulticast),
1752 NL_TEST_DEF("IPPrefix test", CheckIPPrefix),
1758 * Set up the test suite.
1760 int TestSetup(void * inContext)
1766 * Tear down the test suite.
1768 int TestTeardown(void * inContext)
1775 int TestInetAddress(void)
1778 nlTestSuite theSuite = {
1786 // Run test suit againt one context.
1787 nlTestRunner(&theSuite, const_cast<TestContext *>(&sTestContext));
1789 return (nlTestRunnerStats(&theSuite));
1792 CHIP_REGISTER_TEST_SUITE(TestInetAddress)