xref: /freebsd/tests/sys/netinet/libalias/util.c (revision 61bf830cbb260c2a046cb44421d319184393e028)
17b8696bfSLutz Donnerhacke /*
27b8696bfSLutz Donnerhacke  * SPDX-License-Identifier: BSD-3-Clause
37b8696bfSLutz Donnerhacke  *
47b8696bfSLutz Donnerhacke  * Copyright 2021 Lutz Donnerhacke
57b8696bfSLutz Donnerhacke  *
67b8696bfSLutz Donnerhacke  * Redistribution and use in source and binary forms, with or without
77b8696bfSLutz Donnerhacke  * modification, are permitted provided that the following conditions
87b8696bfSLutz Donnerhacke  * are met:
97b8696bfSLutz Donnerhacke  *
107b8696bfSLutz Donnerhacke  * 1. Redistributions of source code must retain the above copyright
117b8696bfSLutz Donnerhacke  *    notice, this list of conditions and the following disclaimer.
127b8696bfSLutz Donnerhacke  * 2. Redistributions in binary form must reproduce the above
137b8696bfSLutz Donnerhacke  *    copyright notice, this list of conditions and the following
147b8696bfSLutz Donnerhacke  *    disclaimer in the documentation and/or other materials provided
157b8696bfSLutz Donnerhacke  *    with the distribution.
167b8696bfSLutz Donnerhacke  * 3. Neither the name of the copyright holder nor the names of its
177b8696bfSLutz Donnerhacke  *    contributors may be used to endorse or promote products derived
187b8696bfSLutz Donnerhacke  *    from this software without specific prior written permission.
197b8696bfSLutz Donnerhacke  *
207b8696bfSLutz Donnerhacke  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
217b8696bfSLutz Donnerhacke  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
227b8696bfSLutz Donnerhacke  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
237b8696bfSLutz Donnerhacke  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
247b8696bfSLutz Donnerhacke  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
257b8696bfSLutz Donnerhacke  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
267b8696bfSLutz Donnerhacke  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
277b8696bfSLutz Donnerhacke  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
287b8696bfSLutz Donnerhacke  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
297b8696bfSLutz Donnerhacke  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
307b8696bfSLutz Donnerhacke  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
317b8696bfSLutz Donnerhacke  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
327b8696bfSLutz Donnerhacke  * SUCH DAMAGE.
337b8696bfSLutz Donnerhacke  */
34c1fbb54fSLutz Donnerhacke #include <stdio.h>
35c1fbb54fSLutz Donnerhacke #include <stdlib.h>
36c1fbb54fSLutz Donnerhacke 
37c1fbb54fSLutz Donnerhacke #include <netinet/in.h>
38c1fbb54fSLutz Donnerhacke 
39c1fbb54fSLutz Donnerhacke #include "util.h"
40c1fbb54fSLutz Donnerhacke 
41f1462ab0SLutz Donnerhacke /* common ip ranges */
42f1462ab0SLutz Donnerhacke struct in_addr masq = { htonl(0x01020304) };
43f1462ab0SLutz Donnerhacke struct in_addr pub  = { htonl(0x0102dead) };
44*61bf830cSDamjan Jovanovic struct in_addr pub2 = { htonl(0x0102beef) };
45f1462ab0SLutz Donnerhacke struct in_addr prv1 = { htonl(0x0a00dead) };
46f1462ab0SLutz Donnerhacke struct in_addr prv2 = { htonl(0xac10dead) };
47f1462ab0SLutz Donnerhacke struct in_addr prv3 = { htonl(0xc0a8dead) };
48f1462ab0SLutz Donnerhacke struct in_addr cgn  = { htonl(0x6440dead) };
49f1462ab0SLutz Donnerhacke struct in_addr ext  = { htonl(0x12345678) };
50f1462ab0SLutz Donnerhacke struct in_addr ANY_ADDR = { 0 };
51f1462ab0SLutz Donnerhacke 
5233c1bdfcSLutz Donnerhacke #define REQUIRE(x)	do {				\
5333c1bdfcSLutz Donnerhacke 	if (!(x)) {					\
5433c1bdfcSLutz Donnerhacke 		fprintf(stderr, "Failed in %s %s:%d.\n",\
5533c1bdfcSLutz Donnerhacke 		    __FUNCTION__, __FILE__, __LINE__);	\
5633c1bdfcSLutz Donnerhacke 		exit(-1);				\
5733c1bdfcSLutz Donnerhacke 	}						\
5833c1bdfcSLutz Donnerhacke } while(0)
5933c1bdfcSLutz Donnerhacke 
60c1fbb54fSLutz Donnerhacke int
randcmp(const void * a,const void * b)61c1fbb54fSLutz Donnerhacke randcmp(const void *a, const void *b)
62c1fbb54fSLutz Donnerhacke {
63c1fbb54fSLutz Donnerhacke 	int res, r = rand();
64c1fbb54fSLutz Donnerhacke 
65c1fbb54fSLutz Donnerhacke 	(void)a;
66c1fbb54fSLutz Donnerhacke 	(void)b;
67c1fbb54fSLutz Donnerhacke 	res = (r/4 < RAND_MAX/9) ? 1
68c1fbb54fSLutz Donnerhacke 	    : (r/5 < RAND_MAX/9) ? 0
69c1fbb54fSLutz Donnerhacke 	    : -1;
70c1fbb54fSLutz Donnerhacke 	return (res);
71c1fbb54fSLutz Donnerhacke }
72c1fbb54fSLutz Donnerhacke 
73c1fbb54fSLutz Donnerhacke void
hexdump(void * p,size_t len)74c1fbb54fSLutz Donnerhacke hexdump(void *p, size_t len)
75c1fbb54fSLutz Donnerhacke {
76c1fbb54fSLutz Donnerhacke 	size_t i;
77c1fbb54fSLutz Donnerhacke 	unsigned char *c = p;
78c1fbb54fSLutz Donnerhacke 
79c1fbb54fSLutz Donnerhacke 	for (i = 0; i < len; i++) {
80c1fbb54fSLutz Donnerhacke 		printf(" %02x", c[i]);
81c1fbb54fSLutz Donnerhacke 		switch (i & 0xf) {
82c1fbb54fSLutz Donnerhacke 		case 0xf: printf("\n"); break;
83c1fbb54fSLutz Donnerhacke 		case 0x7: printf(" "); break;
84c1fbb54fSLutz Donnerhacke 		default:  break;
85c1fbb54fSLutz Donnerhacke 		}
86c1fbb54fSLutz Donnerhacke 	}
87c1fbb54fSLutz Donnerhacke 	if ((i & 0xf) != 0x0)
88c1fbb54fSLutz Donnerhacke 		printf("\n");
89c1fbb54fSLutz Donnerhacke }
90c1fbb54fSLutz Donnerhacke 
91c1fbb54fSLutz Donnerhacke struct ip *
ip_packet(u_char protocol,size_t len)92f1462ab0SLutz Donnerhacke ip_packet(u_char protocol, size_t len)
93c1fbb54fSLutz Donnerhacke {
94c1fbb54fSLutz Donnerhacke 	struct ip * p;
95c1fbb54fSLutz Donnerhacke 
9633c1bdfcSLutz Donnerhacke 	REQUIRE(len >= 64 && len <= IP_MAXPACKET);
97c1fbb54fSLutz Donnerhacke 
98c1fbb54fSLutz Donnerhacke 	p = calloc(1, len);
9933c1bdfcSLutz Donnerhacke 	REQUIRE(p != NULL);
100c1fbb54fSLutz Donnerhacke 
101c1fbb54fSLutz Donnerhacke 	p->ip_v = IPVERSION;
102c1fbb54fSLutz Donnerhacke 	p->ip_hl = sizeof(*p)/4;
103c1fbb54fSLutz Donnerhacke 	p->ip_len = htons(len);
104c1fbb54fSLutz Donnerhacke 	p->ip_ttl = IPDEFTTL;
105c1fbb54fSLutz Donnerhacke 	p->ip_p = protocol;
10633c1bdfcSLutz Donnerhacke 	REQUIRE(p->ip_hl == 5);
107c1fbb54fSLutz Donnerhacke 
108c1fbb54fSLutz Donnerhacke 	return (p);
109c1fbb54fSLutz Donnerhacke }
110c1fbb54fSLutz Donnerhacke 
111c1fbb54fSLutz Donnerhacke struct udphdr *
set_udp(struct ip * p,u_short sport,u_short dport)112c1fbb54fSLutz Donnerhacke set_udp(struct ip *p, u_short sport, u_short dport) {
113dba02df3SJohn Baldwin 	int hlen = p->ip_hl << 2;
114dba02df3SJohn Baldwin 	struct udphdr *u = (struct udphdr *)((uintptr_t)p + hlen);
115dba02df3SJohn Baldwin 	int payload = ntohs(p->ip_len) - hlen;
116c1fbb54fSLutz Donnerhacke 
11733c1bdfcSLutz Donnerhacke 	REQUIRE(payload >= (int)sizeof(*u));
118c1fbb54fSLutz Donnerhacke 	p->ip_p = IPPROTO_UDP;
119c1fbb54fSLutz Donnerhacke 	u->uh_sport = htons(sport);
120c1fbb54fSLutz Donnerhacke 	u->uh_dport = htons(dport);
121c1fbb54fSLutz Donnerhacke 	u->uh_ulen = htons(payload);
122c1fbb54fSLutz Donnerhacke 	return (u);
123c1fbb54fSLutz Donnerhacke }
124