1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2013 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
7*4dc78e53SAndroid Build Coastguard Worker
8*4dc78e53SAndroid Build Coastguard Worker #include <check.h>
9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/addr.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/addr.h>
11*4dc78e53SAndroid Build Coastguard Worker
12*4dc78e53SAndroid Build Coastguard Worker #include "cksuite-all.h"
13*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_alloc)14*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_alloc)
15*4dc78e53SAndroid Build Coastguard Worker {
16*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr;
17*4dc78e53SAndroid Build Coastguard Worker
18*4dc78e53SAndroid Build Coastguard Worker addr = nl_addr_alloc(16);
19*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(addr, "Allocation should not return NULL");
20*4dc78e53SAndroid Build Coastguard Worker
21*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_iszero(addr) != 0,
22*4dc78e53SAndroid Build Coastguard Worker "New empty address should be all zeros");
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_family(addr) == AF_UNSPEC,
25*4dc78e53SAndroid Build Coastguard Worker "New empty address should have family AF_UNSPEC");
26*4dc78e53SAndroid Build Coastguard Worker
27*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_prefixlen(addr) == 0,
28*4dc78e53SAndroid Build Coastguard Worker "New empty address should have prefix length 0");
29*4dc78e53SAndroid Build Coastguard Worker
30*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(!nl_addr_shared(addr),
31*4dc78e53SAndroid Build Coastguard Worker "New empty address should not be shared");
32*4dc78e53SAndroid Build Coastguard Worker
33*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get(addr) == addr,
34*4dc78e53SAndroid Build Coastguard Worker "nl_addr_get() should return pointer to address");
35*4dc78e53SAndroid Build Coastguard Worker
36*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_shared(addr) != 0,
37*4dc78e53SAndroid Build Coastguard Worker "Address should be shared after call to nl_addr_get()");
38*4dc78e53SAndroid Build Coastguard Worker
39*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
40*4dc78e53SAndroid Build Coastguard Worker
41*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
42*4dc78e53SAndroid Build Coastguard Worker !nl_addr_shared(addr),
43*4dc78e53SAndroid Build Coastguard Worker "Address should not be shared after call to nl_addr_put()");
44*4dc78e53SAndroid Build Coastguard Worker
45*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_fill_sockaddr(addr, NULL, 0) != 0,
46*4dc78e53SAndroid Build Coastguard Worker "Socket address filling should fail for empty address");
47*4dc78e53SAndroid Build Coastguard Worker
48*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
49*4dc78e53SAndroid Build Coastguard Worker }
50*4dc78e53SAndroid Build Coastguard Worker END_TEST
51*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_binary_addr)52*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_binary_addr)
53*4dc78e53SAndroid Build Coastguard Worker {
54*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr, *addr2;
55*4dc78e53SAndroid Build Coastguard Worker char baddr[4] = { 0x1, 0x2, 0x3, 0x4 };
56*4dc78e53SAndroid Build Coastguard Worker char baddr2[6] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 };
57*4dc78e53SAndroid Build Coastguard Worker
58*4dc78e53SAndroid Build Coastguard Worker addr = nl_addr_alloc(4);
59*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(addr != NULL, "Allocation should not return NULL");
60*4dc78e53SAndroid Build Coastguard Worker
61*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_set_binary_addr(addr, baddr, 4) >= 0,
62*4dc78e53SAndroid Build Coastguard Worker "Valid binary address should be settable");
63*4dc78e53SAndroid Build Coastguard Worker
64*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
65*4dc78e53SAndroid Build Coastguard Worker nl_addr_get_prefixlen(addr) == 0,
66*4dc78e53SAndroid Build Coastguard Worker "Prefix length should be unchanged after nl_addr_set_binary_addr()");
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_len(addr) == 4, "Address length should be 4");
69*4dc78e53SAndroid Build Coastguard Worker
70*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
71*4dc78e53SAndroid Build Coastguard Worker nl_addr_set_binary_addr(addr, baddr2, 6) != 0,
72*4dc78e53SAndroid Build Coastguard Worker "Should not be able to set binary address exceeding maximum length");
73*4dc78e53SAndroid Build Coastguard Worker
74*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_len(addr) == 4,
75*4dc78e53SAndroid Build Coastguard Worker "Address length should still be 4");
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
78*4dc78e53SAndroid Build Coastguard Worker nl_addr_guess_family(addr) == AF_INET,
79*4dc78e53SAndroid Build Coastguard Worker "Binary address of length 4 should be guessed as AF_INET");
80*4dc78e53SAndroid Build Coastguard Worker
81*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(memcmp(baddr, nl_addr_get_binary_addr(addr), 4) == 0,
82*4dc78e53SAndroid Build Coastguard Worker "Binary address mismatches");
83*4dc78e53SAndroid Build Coastguard Worker
84*4dc78e53SAndroid Build Coastguard Worker addr2 = nl_addr_build(AF_UNSPEC, baddr, 4);
85*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(addr2 != NULL, "Building of address should not fail");
86*4dc78e53SAndroid Build Coastguard Worker
87*4dc78e53SAndroid Build Coastguard Worker nl_addr_set_prefixlen(addr, 32);
88*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
89*4dc78e53SAndroid Build Coastguard Worker nl_addr_get_prefixlen(addr) == 32,
90*4dc78e53SAndroid Build Coastguard Worker "Prefix length should be successful changed after nl_addr_set_prefixlen()");
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(!nl_addr_cmp(addr, addr2),
93*4dc78e53SAndroid Build Coastguard Worker "Addresses built from same binary address should match");
94*4dc78e53SAndroid Build Coastguard Worker
95*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
96*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr2);
97*4dc78e53SAndroid Build Coastguard Worker }
98*4dc78e53SAndroid Build Coastguard Worker END_TEST
99*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_parse4)100*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_parse4)
101*4dc78e53SAndroid Build Coastguard Worker {
102*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr4, *clone;
103*4dc78e53SAndroid Build Coastguard Worker struct sockaddr_in sin;
104*4dc78e53SAndroid Build Coastguard Worker socklen_t len = sizeof(sin);
105*4dc78e53SAndroid Build Coastguard Worker char *addr_str = "10.0.0.1/16";
106*4dc78e53SAndroid Build Coastguard Worker char buf[128];
107*4dc78e53SAndroid Build Coastguard Worker
108*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_parse(addr_str, AF_INET6, &addr4) != 0,
109*4dc78e53SAndroid Build Coastguard Worker "Should not be able to parse IPv4 address in IPv6 mode");
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_parse(addr_str, AF_UNSPEC, &addr4) == 0,
112*4dc78e53SAndroid Build Coastguard Worker "Should be able to parse \"%s\"", addr_str);
113*4dc78e53SAndroid Build Coastguard Worker
114*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_family(addr4) == AF_INET,
115*4dc78e53SAndroid Build Coastguard Worker "Address family should be AF_INET");
116*4dc78e53SAndroid Build Coastguard Worker
117*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_prefixlen(addr4) == 16,
118*4dc78e53SAndroid Build Coastguard Worker "Prefix length should be 16");
119*4dc78e53SAndroid Build Coastguard Worker
120*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(!nl_addr_iszero(addr4),
121*4dc78e53SAndroid Build Coastguard Worker "Address should not be all zeroes");
122*4dc78e53SAndroid Build Coastguard Worker
123*4dc78e53SAndroid Build Coastguard Worker clone = nl_addr_clone(addr4);
124*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(clone != NULL, "Cloned address should not be NULL");
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_cmp(addr4, clone) == 0,
127*4dc78e53SAndroid Build Coastguard Worker "Cloned address should not mismatch original");
128*4dc78e53SAndroid Build Coastguard Worker
129*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_fill_sockaddr(addr4, (struct sockaddr *)&sin,
130*4dc78e53SAndroid Build Coastguard Worker &len) == 0,
131*4dc78e53SAndroid Build Coastguard Worker "Should be able to fill socketaddr");
132*4dc78e53SAndroid Build Coastguard Worker
133*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
134*4dc78e53SAndroid Build Coastguard Worker !strcmp(nl_addr2str(addr4, buf, sizeof(buf)), addr_str),
135*4dc78e53SAndroid Build Coastguard Worker "Address translated back to string does not match original");
136*4dc78e53SAndroid Build Coastguard Worker
137*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr4);
138*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(clone);
139*4dc78e53SAndroid Build Coastguard Worker }
140*4dc78e53SAndroid Build Coastguard Worker END_TEST
141*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_parse6)142*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_parse6)
143*4dc78e53SAndroid Build Coastguard Worker {
144*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr6, *clone;
145*4dc78e53SAndroid Build Coastguard Worker struct sockaddr_in6 sin;
146*4dc78e53SAndroid Build Coastguard Worker socklen_t len = sizeof(sin);
147*4dc78e53SAndroid Build Coastguard Worker char *addr_str = "2001:1:2::3/64";
148*4dc78e53SAndroid Build Coastguard Worker char buf[128];
149*4dc78e53SAndroid Build Coastguard Worker
150*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_parse(addr_str, AF_INET, &addr6) != 0,
151*4dc78e53SAndroid Build Coastguard Worker "Should not be able to parse IPv6 address in IPv4 mode");
152*4dc78e53SAndroid Build Coastguard Worker
153*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_parse(addr_str, AF_UNSPEC, &addr6) == 0,
154*4dc78e53SAndroid Build Coastguard Worker "Should be able to parse \"%s\"", addr_str);
155*4dc78e53SAndroid Build Coastguard Worker
156*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_family(addr6) == AF_INET6,
157*4dc78e53SAndroid Build Coastguard Worker "Address family should be AF_INET6");
158*4dc78e53SAndroid Build Coastguard Worker
159*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_get_prefixlen(addr6) == 64,
160*4dc78e53SAndroid Build Coastguard Worker "Prefix length should be 64");
161*4dc78e53SAndroid Build Coastguard Worker
162*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(!nl_addr_iszero(addr6),
163*4dc78e53SAndroid Build Coastguard Worker "Address should not be all zeroes");
164*4dc78e53SAndroid Build Coastguard Worker
165*4dc78e53SAndroid Build Coastguard Worker clone = nl_addr_clone(addr6);
166*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(clone != NULL, "Cloned address should not be NULL");
167*4dc78e53SAndroid Build Coastguard Worker
168*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_cmp(addr6, clone) == 0,
169*4dc78e53SAndroid Build Coastguard Worker "Cloned address should not mismatch original");
170*4dc78e53SAndroid Build Coastguard Worker
171*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_fill_sockaddr(addr6, (struct sockaddr *)&sin,
172*4dc78e53SAndroid Build Coastguard Worker &len) == 0,
173*4dc78e53SAndroid Build Coastguard Worker "Should be able to fill socketaddr");
174*4dc78e53SAndroid Build Coastguard Worker
175*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
176*4dc78e53SAndroid Build Coastguard Worker !strcmp(nl_addr2str(addr6, buf, sizeof(buf)), addr_str),
177*4dc78e53SAndroid Build Coastguard Worker "Address translated back to string does not match original");
178*4dc78e53SAndroid Build Coastguard Worker
179*4dc78e53SAndroid Build Coastguard Worker _nl_clear_pointer(&addr6, nl_addr_put);
180*4dc78e53SAndroid Build Coastguard Worker
181*4dc78e53SAndroid Build Coastguard Worker ck_assert(nl_addr_parse("default", AF_INET6, &addr6) == 0);
182*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_addr_get_len(addr6), 16);
183*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_addr_get_prefixlen(addr6), 0);
184*4dc78e53SAndroid Build Coastguard Worker ck_assert_mem_eq(nl_addr_get_binary_addr(addr6), ((uint8_t[16]){ 0 }),
185*4dc78e53SAndroid Build Coastguard Worker 16);
186*4dc78e53SAndroid Build Coastguard Worker
187*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr6);
188*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(clone);
189*4dc78e53SAndroid Build Coastguard Worker }
190*4dc78e53SAndroid Build Coastguard Worker END_TEST
191*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_info)192*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_info)
193*4dc78e53SAndroid Build Coastguard Worker {
194*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *addr;
195*4dc78e53SAndroid Build Coastguard Worker char *addr_str = "127.0.0.1";
196*4dc78e53SAndroid Build Coastguard Worker struct addrinfo *result;
197*4dc78e53SAndroid Build Coastguard Worker
198*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_parse(addr_str, AF_UNSPEC, &addr) == 0,
199*4dc78e53SAndroid Build Coastguard Worker "Parsing of valid address should not fail");
200*4dc78e53SAndroid Build Coastguard Worker
201*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(nl_addr_info(addr, &result) == 0,
202*4dc78e53SAndroid Build Coastguard Worker "getaddrinfo() on loopback address should work");
203*4dc78e53SAndroid Build Coastguard Worker
204*4dc78e53SAndroid Build Coastguard Worker freeaddrinfo(result);
205*4dc78e53SAndroid Build Coastguard Worker nl_addr_put(addr);
206*4dc78e53SAndroid Build Coastguard Worker }
207*4dc78e53SAndroid Build Coastguard Worker END_TEST
208*4dc78e53SAndroid Build Coastguard Worker
START_TEST(addr_flags2str)209*4dc78e53SAndroid Build Coastguard Worker START_TEST(addr_flags2str)
210*4dc78e53SAndroid Build Coastguard Worker {
211*4dc78e53SAndroid Build Coastguard Worker int ifa_flags = IFA_F_TENTATIVE | IFA_F_DADFAILED;
212*4dc78e53SAndroid Build Coastguard Worker int ifa_flags2;
213*4dc78e53SAndroid Build Coastguard Worker char buf[128];
214*4dc78e53SAndroid Build Coastguard Worker
215*4dc78e53SAndroid Build Coastguard Worker rtnl_addr_flags2str(ifa_flags, buf, sizeof(buf));
216*4dc78e53SAndroid Build Coastguard Worker ck_assert_str_eq(buf, "dadfailed,tentative");
217*4dc78e53SAndroid Build Coastguard Worker
218*4dc78e53SAndroid Build Coastguard Worker ifa_flags2 = rtnl_addr_str2flags(buf);
219*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(ifa_flags2, ifa_flags);
220*4dc78e53SAndroid Build Coastguard Worker }
221*4dc78e53SAndroid Build Coastguard Worker END_TEST
222*4dc78e53SAndroid Build Coastguard Worker
make_nl_addr_suite(void)223*4dc78e53SAndroid Build Coastguard Worker Suite *make_nl_addr_suite(void)
224*4dc78e53SAndroid Build Coastguard Worker {
225*4dc78e53SAndroid Build Coastguard Worker Suite *suite = suite_create("Abstract addresses");
226*4dc78e53SAndroid Build Coastguard Worker TCase *tc = tcase_create("Core");
227*4dc78e53SAndroid Build Coastguard Worker
228*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_alloc);
229*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_binary_addr);
230*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_parse4);
231*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_parse6);
232*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_info);
233*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, addr_flags2str);
234*4dc78e53SAndroid Build Coastguard Worker suite_add_tcase(suite, tc);
235*4dc78e53SAndroid Build Coastguard Worker
236*4dc78e53SAndroid Build Coastguard Worker return suite;
237*4dc78e53SAndroid Build Coastguard Worker }
238