blob: 34130b26bcead302572fac068efa8119662f35fc [file] [log] [blame]
Harald Welte4ffb43f2017-01-27 10:29:49 +01001/*
2 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
3 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
Harald Welte4ffb43f2017-01-27 10:29:49 +010015 */
16
17#include <stdio.h>
18#include <stdlib.h>
19#include <unistd.h>
20#include <string.h>
21#include <fcntl.h>
Pau Espin Pedrolcd133312020-08-19 17:25:04 +020022#include <inttypes.h>
Pau Espin Pedrold9e04172020-08-31 18:56:10 +020023#include <errno.h>
Harald Welte4ffb43f2017-01-27 10:29:49 +010024
25#include <sys/socket.h>
26#include <arpa/inet.h>
27#include <netinet/in.h>
28
Philipp Maier6f0f5602017-02-09 14:09:06 +010029#include <osmocom/core/application.h>
Harald Welte4ffb43f2017-01-27 10:29:49 +010030#include <osmocom/core/utils.h>
31#include <osmocom/core/socket.h>
Philipp Maier6f0f5602017-02-09 14:09:06 +010032#include <osmocom/core/logging.h>
Pau Espin Pedrolcd133312020-08-19 17:25:04 +020033#include <osmocom/core/bits.h>
Harald Welte4ffb43f2017-01-27 10:29:49 +010034
Pau Espin Pedrol88955fb2023-01-18 18:54:00 +010035#include "config.h"
Harald Welte4ffb43f2017-01-27 10:29:49 +010036
Neels Hofmeyra829b452018-04-05 03:02:35 +020037void *ctx = NULL;
38
Harald Welte4ffb43f2017-01-27 10:29:49 +010039static int test_sockinit(void)
40{
41 int fd, rc;
42 char *name;
43
44 printf("Checking osmo_sock_init() with bind to a random local UDP port\n");
45 fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
46 "0.0.0.0", 0, OSMO_SOCK_F_BIND);
47 OSMO_ASSERT(fd >= 0);
Neels Hofmeyra829b452018-04-05 03:02:35 +020048 name = osmo_sock_get_name(ctx, fd);
Harald Welte4ffb43f2017-01-27 10:29:49 +010049 /* expect it to be not connected. We cannot match on INADDR_ANY,
50 * as apparently that won't work on FreeBSD if there's only one
51 * address (e.g. 127.0.0.1) assigned to the entire system, like
52 * the Osmocom FreeBSD build slaves */
Neels Hofmeyr1f82d0a2017-06-21 22:54:46 +020053 OSMO_ASSERT(!strncmp(name, "(r=NULL<->", 9));
Harald Welte4ffb43f2017-01-27 10:29:49 +010054 talloc_free(name);
55 /* expect it to be blocking */
56 rc = fcntl(fd, F_GETFL);
57 OSMO_ASSERT(!(rc & O_NONBLOCK));
58 close(fd);
59
60 printf("Checking for OSMO_SOCK_F_NONBLOCK\n");
61 fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
62 "0.0.0.0", 0, OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
63 OSMO_ASSERT(fd >= 0);
64 /* expect it to be blocking */
65 rc = fcntl(fd, F_GETFL);
66 OSMO_ASSERT(rc & O_NONBLOCK);
67 close(fd);
68
69 printf("Checking for invalid flags\n");
70 fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
71 "0.0.0.0", 0, OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
72 OSMO_ASSERT(fd < 0);
73
74 return 0;
75}
76
Harald Weltedda70fc2017-04-08 20:52:33 +020077static int test_sockinit2(void)
78{
79 int fd, rc;
80 char *name;
81
82 printf("Checking osmo_sock_init2() with bind to a random local UDP port\n");
83 fd = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
84 "0.0.0.0", 0, NULL, 0, OSMO_SOCK_F_BIND);
85 OSMO_ASSERT(fd >= 0);
Neels Hofmeyra829b452018-04-05 03:02:35 +020086 name = osmo_sock_get_name(ctx, fd);
Harald Weltedda70fc2017-04-08 20:52:33 +020087 /* expect it to be not connected. We cannot match on INADDR_ANY,
88 * as apparently that won't work on FreeBSD if there's only one
89 * address (e.g. 127.0.0.1) assigned to the entire system, like
90 * the Osmocom FreeBSD build slaves */
Neels Hofmeyr1f82d0a2017-06-21 22:54:46 +020091 OSMO_ASSERT(!strncmp(name, "(r=NULL<->", 9));
Harald Weltedda70fc2017-04-08 20:52:33 +020092 talloc_free(name);
93 /* expect it to be blocking */
94 rc = fcntl(fd, F_GETFL);
95 OSMO_ASSERT(!(rc & O_NONBLOCK));
96 close(fd);
97
98 printf("Checking osmo_sock_init2() for OSMO_SOCK_F_NONBLOCK\n");
99 fd = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP,
100 "0.0.0.0", 0, NULL, 0, OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
101 OSMO_ASSERT(fd >= 0);
102 /* expect it to be blocking */
103 rc = fcntl(fd, F_GETFL);
104 OSMO_ASSERT(rc & O_NONBLOCK);
105 close(fd);
106
107 printf("Checking osmo_sock_init2() for invalid flags\n");
108 fd = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP, "0.0.0.0", 0, NULL, 0, 0);
109 OSMO_ASSERT(fd < 0);
110
111 printf("Checking osmo_sock_init2() for combined BIND + CONNECT\n");
112 fd = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, "127.0.0.1", 53,
113 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
114 OSMO_ASSERT(fd >= 0);
Neels Hofmeyra829b452018-04-05 03:02:35 +0200115 name = osmo_sock_get_name(ctx, fd);
Harald Weltedda70fc2017-04-08 20:52:33 +0200116#ifndef __FreeBSD__
117 /* For some reason, on the jenkins.osmocom.org build slave with
118 * FreeBSD 10 inside a jail, it fails. Works fine on laforge's
119 * FreeBSD 10 or 11 VM at home */
Neels Hofmeyr1f82d0a2017-06-21 22:54:46 +0200120 OSMO_ASSERT(!strncmp(name, "(r=127.0.0.1:53<->l=127.0.0.1", 29));
Harald Weltedda70fc2017-04-08 20:52:33 +0200121#endif
Alexander Couzens2c962f52020-06-03 00:28:02 +0200122
123 printf("Checking osmo_sock_init2(AF_UNSPEC) must fail on mixed IPv4 & IPv6\n");
124 fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, "::1", 53,
125 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
126 OSMO_ASSERT(fd < 0);
127
128 printf("Checking osmo_sock_init2(AF_UNSPEC) must fail on mixed IPv6 & IPv4\n");
129 fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "::1", 0, "127.0.0.1", 53,
130 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
131 OSMO_ASSERT(fd < 0);
132
133 printf("Checking osmo_sock_init2(AF_UNSPEC) BIND + CONNECT on IPv4\n");
134 fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, "127.0.0.1", 53,
135 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
136 OSMO_ASSERT(fd >= 0);
137
138 printf("Checking osmo_sock_init2(AF_UNSPEC) BIND + CONNECT on IPv6\n");
139 fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "::1", 0, "::1", 53,
140 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
141 OSMO_ASSERT(fd >= 0);
142
Pau Espin Pedrold9e04172020-08-31 18:56:10 +0200143 printf("Checking osmo_sock_init2(AF_UNSPEC) BIND on IPv4\n");
144 fd = osmo_sock_init2(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, NULL, 0,
145 OSMO_SOCK_F_BIND);
Pau Espin Pedrold8cf52b2020-08-31 19:00:59 +0200146 OSMO_ASSERT(fd >= 0);
Pau Espin Pedrold9e04172020-08-31 18:56:10 +0200147
Harald Weltedda70fc2017-04-08 20:52:33 +0200148 talloc_free(name);
149
150 return 0;
151}
152
Harald Weltee61d4592022-11-03 11:05:58 +0100153static int test_get_ip_and_port(void)
Alexander Couzensea198392020-08-01 22:02:03 +0200154{
155 int fd, rc;
156 char ip[INET6_ADDRSTRLEN] = { };
157 char port[6] = { };
158
159 printf("Checking test_get_ip_and_port() for combined BIND + CONNECT on IPv4\n");
160 fd = osmo_sock_init2(AF_INET, SOCK_DGRAM, IPPROTO_UDP, "127.0.0.1", 0, "127.0.0.1", 55,
161 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
162
163 OSMO_ASSERT(fd >= 0);
164
165 /* get the remote */
166 rc = osmo_sock_get_ip_and_port(fd, ip, sizeof(ip), port, sizeof(port), false);
167 OSMO_ASSERT(rc == 0);
168 OSMO_ASSERT(strncmp(ip, "127.0.0.1", INET6_ADDRSTRLEN) == 0);
169 OSMO_ASSERT(strncmp(port, "55", 6) == 0);
170
171 printf("Checking test_get_ip_and_port() for combined BIND + CONNECT on IPv6\n");
172 fd = osmo_sock_init2(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, "::1", 0, "::1", 55,
173 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
174 OSMO_ASSERT(fd >= 0);
175
176 /* get the remote */
177 rc = osmo_sock_get_ip_and_port(fd, ip, sizeof(ip), port, sizeof(port), false);
178 OSMO_ASSERT(rc == 0);
179 OSMO_ASSERT(strncmp(ip, "::1", INET6_ADDRSTRLEN) == 0);
180 OSMO_ASSERT(strncmp(port, "55", 6) == 0);
181
182 return 0;
183}
184
Alexander Couzens43957e62020-08-01 21:56:45 +0200185static int test_sockinit_osa(void)
186{
187 int fd, rc;
188 char *name;
189
190 struct osmo_sockaddr localhost4 = {};
191 struct osmo_sockaddr localhost6 = {};
192 struct osmo_sockaddr localhost4_noport = {};
193 struct osmo_sockaddr localhost6_noport = {};
194 struct osmo_sockaddr any4 = {};
195 struct osmo_sockaddr any6 = {};
196 struct osmo_sockaddr invalid = {};
197
198 localhost4.u.sin = (struct sockaddr_in){
199 .sin_family = AF_INET,
200 .sin_addr.s_addr = inet_addr("127.0.0.1"),
201 .sin_port = htons(42),
202 };
203
204 localhost6.u.sin6 = (struct sockaddr_in6){
205 .sin6_family = AF_INET6,
206 .sin6_port = htons(42),
207 };
208 inet_pton(AF_INET6, "::1", &localhost6.u.sin6.sin6_addr);
209
210 localhost4_noport = localhost4;
211 localhost4_noport.u.sin.sin_port = htons(0);
212 localhost6_noport = localhost6;
213 localhost6_noport.u.sin6.sin6_port = htons(0);
214
215 any4.u.sin = (struct sockaddr_in){
216 .sin_family = AF_INET,
217 .sin_addr.s_addr = inet_addr("0.0.0.0"),
218 .sin_port = htons(0),
219 };
220 any6.u.sin6 = (struct sockaddr_in6){
221 .sin6_family = AF_INET6,
222 .sin6_port = htons(0),
223 };
224 inet_pton(AF_INET6, "::", &any6.u.sin6.sin6_addr);
225
226 invalid.u.sa.sa_family = AF_UNSPEC;
227
228 printf("Checking osmo_sock_init_osa() with bind to a random local UDP port\n");
229 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP,
230 &any4, NULL, OSMO_SOCK_F_BIND);
231 OSMO_ASSERT(fd >= 0);
232 name = osmo_sock_get_name(ctx, fd);
233 /* expect it to be not connected. We cannot match on INADDR_ANY,
234 * as apparently that won't work on FreeBSD if there's only one
235 * address (e.g. 137.0.0.1) assigned to the entire system, like
236 * the Osmocom FreeBSD build slaves */
237 OSMO_ASSERT(!strncmp(name, "(r=NULL<->", 9));
238 talloc_free(name);
239 /* expect it to be blocking */
240 rc = fcntl(fd, F_GETFL);
241 OSMO_ASSERT(!(rc & O_NONBLOCK));
242 close(fd);
243
244 printf("Checking osmo_sock_init_osa() IPv4 for OSMO_SOCK_F_NONBLOCK\n");
245 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP,
246 &any4, NULL, OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
247 OSMO_ASSERT(fd >= 0);
248 /* expect it to be blocking */
249 rc = fcntl(fd, F_GETFL);
250 OSMO_ASSERT(rc & O_NONBLOCK);
251 close(fd);
252
253 printf("Checking osmo_sock_init_osa() IPv6 for OSMO_SOCK_F_NONBLOCK\n");
254 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP,
255 &any6, NULL, OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
256 OSMO_ASSERT(fd >= 0);
257 /* expect it to be blocking */
258 rc = fcntl(fd, F_GETFL);
259 OSMO_ASSERT(rc & O_NONBLOCK);
260 close(fd);
261
262 printf("Checking osmo_sock_init_osa() for invalid flags\n");
263 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &any4, NULL, 0);
264 OSMO_ASSERT(fd < 0);
265
266 printf("Checking osmo_sock_init_osa() for combined BIND + CONNECT on IPv4\n");
267 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &localhost4_noport, &localhost4,
268 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
269 OSMO_ASSERT(fd >= 0);
270 name = osmo_sock_get_name(ctx, fd);
271#ifndef __FreeBSD__
272 /* For some reason, on the jenkins.osmocom.org build slave with
273 * FreeBSD 10 inside a jail, it fails. Works fine on laforge's
274 * FreeBSD 10 or 11 VM at home */
275 OSMO_ASSERT(!strncmp(name, "(r=127.0.0.1:42<->l=127.0.0.1", 29));
276#endif
277 close(fd);
278
279 printf("Checking osmo_sock_init_osa() for combined BIND + CONNECT on IPv6\n");
280 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &localhost6_noport, &localhost6,
281 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
282 OSMO_ASSERT(fd >= 0);
283 name = osmo_sock_get_name(ctx, fd);
284#ifndef __FreeBSD__
285 /* For some reason, on the jenkins.osmocom.org build slave with
286 * FreeBSD 10 inside a jail, it fails. Works fine on laforge's
287 * FreeBSD 10 or 11 VM at home */
288 OSMO_ASSERT(!strncmp(name, "(r=::1:42<->l=::1", 17));
289#endif
290 close(fd);
291
292 printf("Checking osmo_sock_init_osa() must fail on mixed IPv4 & IPv6\n");
293 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &localhost4_noport, &localhost6,
294 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
295 OSMO_ASSERT(fd < 0);
296
297 printf("Checking osmo_sock_init_osa() must fail on mixed IPv6 & IPv4\n");
298 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &localhost6_noport, &localhost4,
299 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
300 OSMO_ASSERT(fd < 0);
301
302 printf("Checking osmo_sock_init_osa() must fail on invalid osmo_sockaddr\n");
303 fd = osmo_sock_init_osa(SOCK_DGRAM, IPPROTO_UDP, &invalid, &localhost4,
304 OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT);
305 OSMO_ASSERT(fd < 0);
306
307 talloc_free(name);
308
309 return 0;
310}
311
Alexander Couzens80788fa2020-10-12 01:11:20 +0200312static void test_osa_str(void)
313{
314 char buf[256];
315 const char *result;
316 struct osmo_sockaddr localhost4 = {};
317 struct osmo_sockaddr localhost6 = {};
Harald Welte641cc3c2023-11-21 19:45:57 +0100318 struct osmo_sockaddr osa = {};
Alexander Couzens80788fa2020-10-12 01:11:20 +0200319
320 localhost4.u.sin = (struct sockaddr_in){
321 .sin_family = AF_INET,
322 .sin_addr.s_addr = inet_addr("127.0.0.1"),
323 .sin_port = htons(42),
324 };
325
326 localhost6.u.sin6 = (struct sockaddr_in6){
327 .sin6_family = AF_INET6,
328 .sin6_port = htons(42),
329 };
330 inet_pton(AF_INET6, "::1", &localhost6.u.sin6.sin6_addr);
331
332 /* test a too short str */
333 memset(&buf[0], 0, sizeof(buf));
334 result = osmo_sockaddr_to_str_buf(buf, 1, &localhost4);
335 printf("Checking osmo_sockaddr_to_str_buf to small IPv4\n");
336 OSMO_ASSERT(result == NULL);
337
338 memset(&buf[0], 0, sizeof(buf));
339 result = osmo_sockaddr_to_str_buf(buf, sizeof(buf), &localhost4);
340 printf("Checking osmo_sockaddr_to_str_buf IPv4\n");
341 OSMO_ASSERT(!strncmp("127.0.0.1:42", result, sizeof(buf)));
342
343 memset(&buf[0], 0, sizeof(buf));
344 result = osmo_sockaddr_to_str_buf(buf, 256, &localhost6);
345 printf("Checking osmo_sockaddr_to_str_buf IPv6\n");
346 OSMO_ASSERT(!strncmp("[::1]:42", result, sizeof(buf)));
347
348 memset(&buf[0], 0, sizeof(buf));
Alexander Couzens80788fa2020-10-12 01:11:20 +0200349 printf("Checking osmo_sockaddr_to_str_buf too short IPv6\n");
Neels Hofmeyr09d65742021-12-01 10:25:02 +0100350 result = osmo_sockaddr_to_str_buf(buf, 8, &localhost6);
351 OSMO_ASSERT(result == NULL);
352 osmo_sockaddr_to_str_buf2(buf, 8, &localhost6);
353 OSMO_ASSERT(!strncmp("[::1]:4", buf, sizeof(buf)));
Alexander Couzens80788fa2020-10-12 01:11:20 +0200354
355 memset(&buf[0], 0, sizeof(buf));
356 result = osmo_sockaddr_to_str_buf(buf, 5, &localhost6);
357 printf("Checking osmo_sockaddr_to_str_buf too short IPv6\n");
358 OSMO_ASSERT(result == NULL);
359
360 localhost6.u.sin6.sin6_port = 0;
361 memset(&buf[0], 0, sizeof(buf));
362 result = osmo_sockaddr_to_str_buf(buf, 5, &localhost6);
363 printf("Checking osmo_sockaddr_to_str_buf only 5 bytes IPv6\n");
364 OSMO_ASSERT(result == NULL);
365
366 inet_pton(AF_INET6, "::", &localhost6.u.sin6.sin6_addr);
367 memset(&buf[0], 0, sizeof(buf));
368 result = osmo_sockaddr_to_str_buf(buf, 5, &localhost6);
369 printf("Checking osmo_sockaddr_to_str_buf only 5 bytes IPv6\n");
370 OSMO_ASSERT(!strncmp("[::]", result, sizeof(buf)));
371
372 inet_pton(AF_INET6, "2003:1234:5678:90ab:cdef:1234:4321:4321", &localhost6.u.sin6.sin6_addr);
373 memset(&buf[0], 0, sizeof(buf));
374 result = osmo_sockaddr_to_str_buf(buf, sizeof(buf), &localhost6);
375 printf("Checking osmo_sockaddr_to_str_buf long IPv6\n");
376 OSMO_ASSERT(!strncmp("[2003:1234:5678:90ab:cdef:1234:4321:4321]", result, sizeof(buf)));
377
378 localhost6.u.sin6.sin6_port = htons(23420);
379 memset(&buf[0], 0, sizeof(buf));
380 result = osmo_sockaddr_to_str_buf(buf, sizeof(buf), &localhost6);
381 printf("Checking osmo_sockaddr_to_str_buf long IPv6 port\n");
382 OSMO_ASSERT(!strncmp("[2003:1234:5678:90ab:cdef:1234:4321:4321]:23420", result, sizeof(buf)));
383
384 result = osmo_sockaddr_to_str(&localhost6);
385 printf("Checking osmo_sockaddr_to_str_buf long IPv6 port static buffer\n");
386 OSMO_ASSERT(!strncmp("[2003:1234:5678:90ab:cdef:1234:4321:4321]:23420", result, sizeof(buf)));
Harald Welte641cc3c2023-11-21 19:45:57 +0100387
388 printf("Checking osmo_sockaddr_from_str_and_uint for 0.0.0.0\n");
389 OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "0.0.0.0", 1234) == 0);
390 OSMO_ASSERT(osmo_sockaddr_is_any(&osa));
391
392 printf("Checking osmo_sockaddr_from_str_and_uint for ::\n");
393 OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "::", 1234) == 0);
394 OSMO_ASSERT(osmo_sockaddr_is_any(&osa));
395
396 printf("Checking osmo_sockaddr_from_str_and_uint for 1.2.3.4\n");
397 OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "1.2.3.4", 1234) == 0);
398 OSMO_ASSERT(!osmo_sockaddr_is_any(&osa));
Alexander Couzens80788fa2020-10-12 01:11:20 +0200399}
400
Pau Espin Pedrolcc296c92023-01-16 14:54:55 +0100401static void test_osa_netmask_prefixlen(void)
402{
403 struct osmo_sockaddr ipv4;
404 struct osmo_sockaddr ipv6;
405 int rc;
406
407 ipv4.u.sin = (struct sockaddr_in){
408 .sin_family = AF_INET,
409 };
410
411 ipv4.u.sin.sin_addr.s_addr = inet_addr("0.0.0.0");
412 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
413 OSMO_ASSERT(rc == 0);
414
415 ipv4.u.sin.sin_addr.s_addr = inet_addr("255.0.0.0");
416 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
417 OSMO_ASSERT(rc == 8);
418
419 ipv4.u.sin.sin_addr.s_addr = inet_addr("255.255.0.0");
420 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
421 OSMO_ASSERT(rc == 16);
422
423 ipv4.u.sin.sin_addr.s_addr = inet_addr("255.255.255.0");
424 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
425 OSMO_ASSERT(rc == 24);
426
427 ipv4.u.sin.sin_addr.s_addr = inet_addr("255.255.255.255");
428 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
429 OSMO_ASSERT(rc == 32);
430
431 ipv4.u.sin.sin_addr.s_addr = inet_addr("0.255.0.0");
432 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv4);
433 /* FIXME: This shows the implementation is not that robust checking validity of input netmask: */
434 OSMO_ASSERT(rc == 8);
435
436 ipv6.u.sin6 = (struct sockaddr_in6){
437 .sin6_family = AF_INET6,
438 };
439
440 inet_pton(AF_INET6, "fe::", &ipv6.u.sin6.sin6_addr);
441 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv6);
442 OSMO_ASSERT(rc == 7);
443
444 inet_pton(AF_INET6, "ff::", &ipv6.u.sin6.sin6_addr);
445 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv6);
446 OSMO_ASSERT(rc == 8);
447
448 inet_pton(AF_INET6, "ff:ff::", &ipv6.u.sin6.sin6_addr);
449 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv6);
450 OSMO_ASSERT(rc == 16);
451
452 inet_pton(AF_INET6, "ff:ff::ff", &ipv6.u.sin6.sin6_addr);
453 rc = osmo_sockaddr_netmask_to_prefixlen(&ipv6);
454 /* FIXME: This shows the implementation is not that robust checking validity of input netmask: */
455 OSMO_ASSERT(rc == 24);
456}
457
Philipp Maier6f0f5602017-02-09 14:09:06 +0100458const struct log_info_cat default_categories[] = {
459};
460
461static struct log_info info = {
462 .cat = default_categories,
463 .num_cat = ARRAY_SIZE(default_categories),
464};
465
Harald Welte4ffb43f2017-01-27 10:29:49 +0100466int main(int argc, char *argv[])
467{
Neels Hofmeyra829b452018-04-05 03:02:35 +0200468 ctx = talloc_named_const(NULL, 0, "socket_test");
469 osmo_init_logging2(ctx, &info);
Philipp Maier6f0f5602017-02-09 14:09:06 +0100470 log_set_use_color(osmo_stderr_target, 0);
Pau Espin Pedrol01e0d3e2021-02-18 19:25:44 +0100471 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
Pau Espin Pedrol690b6612021-02-18 19:10:28 +0100472 log_set_print_category(osmo_stderr_target, 0);
473 log_set_print_category_hex(osmo_stderr_target, 0);
Philipp Maier6f0f5602017-02-09 14:09:06 +0100474
Harald Welte4ffb43f2017-01-27 10:29:49 +0100475 test_sockinit();
Harald Weltedda70fc2017-04-08 20:52:33 +0200476 test_sockinit2();
Alexander Couzensea198392020-08-01 22:02:03 +0200477 test_get_ip_and_port();
Alexander Couzens43957e62020-08-01 21:56:45 +0200478 test_sockinit_osa();
Alexander Couzens80788fa2020-10-12 01:11:20 +0200479 test_osa_str();
Pau Espin Pedrolcc296c92023-01-16 14:54:55 +0100480 test_osa_netmask_prefixlen();
Philipp Maier6f0f5602017-02-09 14:09:06 +0100481
482 return EXIT_SUCCESS;
Harald Welte4ffb43f2017-01-27 10:29:49 +0100483}