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 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 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 * 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 * 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