1*755bab6dSLutz Donnerhacke /* 2*755bab6dSLutz Donnerhacke * SPDX-License-Identifier: BSD-3-Clause 3*755bab6dSLutz Donnerhacke * 4*755bab6dSLutz Donnerhacke * Copyright 2021 Lutz Donnerhacke 5*755bab6dSLutz Donnerhacke * 6*755bab6dSLutz Donnerhacke * Redistribution and use in source and binary forms, with or without 7*755bab6dSLutz Donnerhacke * modification, are permitted provided that the following conditions 8*755bab6dSLutz Donnerhacke * are met: 9*755bab6dSLutz Donnerhacke * 10*755bab6dSLutz Donnerhacke * 1. Redistributions of source code must retain the above copyright 11*755bab6dSLutz Donnerhacke * notice, this list of conditions and the following disclaimer. 12*755bab6dSLutz Donnerhacke * 2. Redistributions in binary form must reproduce the above 13*755bab6dSLutz Donnerhacke * copyright notice, this list of conditions and the following 14*755bab6dSLutz Donnerhacke * disclaimer in the documentation and/or other materials provided 15*755bab6dSLutz Donnerhacke * with the distribution. 16*755bab6dSLutz Donnerhacke * 3. Neither the name of the copyright holder nor the names of its 17*755bab6dSLutz Donnerhacke * contributors may be used to endorse or promote products derived 18*755bab6dSLutz Donnerhacke * from this software without specific prior written permission. 19*755bab6dSLutz Donnerhacke * 20*755bab6dSLutz Donnerhacke * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 21*755bab6dSLutz Donnerhacke * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 22*755bab6dSLutz Donnerhacke * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23*755bab6dSLutz Donnerhacke * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24*755bab6dSLutz Donnerhacke * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 25*755bab6dSLutz Donnerhacke * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26*755bab6dSLutz Donnerhacke * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27*755bab6dSLutz Donnerhacke * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28*755bab6dSLutz Donnerhacke * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 29*755bab6dSLutz Donnerhacke * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 30*755bab6dSLutz Donnerhacke * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 31*755bab6dSLutz Donnerhacke * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*755bab6dSLutz Donnerhacke * SUCH DAMAGE. 33*755bab6dSLutz Donnerhacke */ 34*755bab6dSLutz Donnerhacke #include <atf-c.h> 35*755bab6dSLutz Donnerhacke #include <alias.h> 36*755bab6dSLutz Donnerhacke #include <stdio.h> 37*755bab6dSLutz Donnerhacke #include <stdlib.h> 38*755bab6dSLutz Donnerhacke 39*755bab6dSLutz Donnerhacke #include "util.h" 40*755bab6dSLutz Donnerhacke 41*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(1_portforward); 42*755bab6dSLutz Donnerhacke ATF_TC_BODY(1_portforward, dummy) 43*755bab6dSLutz Donnerhacke { 44*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 45*755bab6dSLutz Donnerhacke struct alias_link *pf1, *pf2, *pf3, *pf4; 46*755bab6dSLutz Donnerhacke struct ip *p; 47*755bab6dSLutz Donnerhacke struct udphdr *u; 48*755bab6dSLutz Donnerhacke 49*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 50*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 51*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0); 52*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING); 53*755bab6dSLutz Donnerhacke 54*755bab6dSLutz Donnerhacke /* 55*755bab6dSLutz Donnerhacke * Fully specified 56*755bab6dSLutz Donnerhacke */ 57*755bab6dSLutz Donnerhacke pf1 = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 58*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf1 != NULL); 59*755bab6dSLutz Donnerhacke 60*755bab6dSLutz Donnerhacke p = ip_packet(0, 64); 61*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 62*755bab6dSLutz Donnerhacke /* try again */ 63*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 64*755bab6dSLutz Donnerhacke /* different source */ 65*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, pub, 0x5678, masq, 0xabcd); 66*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0xdead, masq, 0xabcd); 67*755bab6dSLutz Donnerhacke 68*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 69*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 70*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 71*755bab6dSLutz Donnerhacke 72*755bab6dSLutz Donnerhacke /* delete and try again */ 73*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf1); 74*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd); 75*755bab6dSLutz Donnerhacke 76*755bab6dSLutz Donnerhacke /* 77*755bab6dSLutz Donnerhacke * Any external port 78*755bab6dSLutz Donnerhacke */ 79*755bab6dSLutz Donnerhacke pf2 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP); 80*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf2 != NULL); 81*755bab6dSLutz Donnerhacke 82*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234); 83*755bab6dSLutz Donnerhacke /* try again */ 84*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234); 85*755bab6dSLutz Donnerhacke /* different source */ 86*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, pub, 0x5678, masq, 0xabcd); 87*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0xdead, masq, 0xabcd, prv2, 0x1234); 88*755bab6dSLutz Donnerhacke 89*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 90*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 91*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 92*755bab6dSLutz Donnerhacke 93*755bab6dSLutz Donnerhacke /* delete and try again */ 94*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf2); 95*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd); 96*755bab6dSLutz Donnerhacke 97*755bab6dSLutz Donnerhacke /* 98*755bab6dSLutz Donnerhacke * Any external host 99*755bab6dSLutz Donnerhacke */ 100*755bab6dSLutz Donnerhacke pf3 = LibAliasRedirectPort(la, prv3, ntohs(0x1234), ANY_ADDR, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 101*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf3 != NULL); 102*755bab6dSLutz Donnerhacke 103*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x1234); 104*755bab6dSLutz Donnerhacke /* try again */ 105*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x1234); 106*755bab6dSLutz Donnerhacke /* different source */ 107*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234); 108*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0xdead, masq, 0xabcd); 109*755bab6dSLutz Donnerhacke 110*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 111*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 112*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 113*755bab6dSLutz Donnerhacke 114*755bab6dSLutz Donnerhacke /* delete and try again */ 115*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf2); 116*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd); 117*755bab6dSLutz Donnerhacke 118*755bab6dSLutz Donnerhacke /* 119*755bab6dSLutz Donnerhacke * Any external host, any port 120*755bab6dSLutz Donnerhacke */ 121*755bab6dSLutz Donnerhacke pf4 = LibAliasRedirectPort(la, cgn, ntohs(0x1234), ANY_ADDR, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP); 122*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf4 != NULL); 123*755bab6dSLutz Donnerhacke 124*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, cgn, 0x1234); 125*755bab6dSLutz Donnerhacke /* try again */ 126*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, cgn, 0x1234); 127*755bab6dSLutz Donnerhacke /* different source */ 128*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, cgn, 0x1234); 129*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0xdead, masq, 0xabcd, cgn, 0x1234); 130*755bab6dSLutz Donnerhacke 131*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 132*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 133*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 134*755bab6dSLutz Donnerhacke 135*755bab6dSLutz Donnerhacke /* delete and try again */ 136*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf2); 137*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd); 138*755bab6dSLutz Donnerhacke 139*755bab6dSLutz Donnerhacke free(p); 140*755bab6dSLutz Donnerhacke LibAliasUninit(la); 141*755bab6dSLutz Donnerhacke } 142*755bab6dSLutz Donnerhacke 143*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(2_portoverlap); 144*755bab6dSLutz Donnerhacke ATF_TC_BODY(2_portoverlap, dummy) 145*755bab6dSLutz Donnerhacke { 146*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 147*755bab6dSLutz Donnerhacke struct alias_link *pf1, *pf2, *pf3, *pf4; 148*755bab6dSLutz Donnerhacke struct ip *p; 149*755bab6dSLutz Donnerhacke struct udphdr *u; 150*755bab6dSLutz Donnerhacke 151*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 152*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 153*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0); 154*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING); 155*755bab6dSLutz Donnerhacke 156*755bab6dSLutz Donnerhacke /* 157*755bab6dSLutz Donnerhacke * Fully specified 158*755bab6dSLutz Donnerhacke */ 159*755bab6dSLutz Donnerhacke pf1 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 160*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf1 != NULL); 161*755bab6dSLutz Donnerhacke 162*755bab6dSLutz Donnerhacke p = ip_packet(0, 64); 163*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234); 164*755bab6dSLutz Donnerhacke 165*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 166*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 167*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 168*755bab6dSLutz Donnerhacke 169*755bab6dSLutz Donnerhacke /* 170*755bab6dSLutz Donnerhacke * Fully specified (override) 171*755bab6dSLutz Donnerhacke */ 172*755bab6dSLutz Donnerhacke pf1 = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 173*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf1 != NULL); 174*755bab6dSLutz Donnerhacke 175*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 176*755bab6dSLutz Donnerhacke 177*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 178*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 179*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 180*755bab6dSLutz Donnerhacke 181*755bab6dSLutz Donnerhacke /* 182*755bab6dSLutz Donnerhacke * Any external port 183*755bab6dSLutz Donnerhacke */ 184*755bab6dSLutz Donnerhacke pf2 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP); 185*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf2 != NULL); 186*755bab6dSLutz Donnerhacke 187*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234); 188*755bab6dSLutz Donnerhacke /* more specific rule wins */ 189*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 190*755bab6dSLutz Donnerhacke 191*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 192*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 193*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 194*755bab6dSLutz Donnerhacke 195*755bab6dSLutz Donnerhacke /* 196*755bab6dSLutz Donnerhacke * Any external host 197*755bab6dSLutz Donnerhacke */ 198*755bab6dSLutz Donnerhacke pf3 = LibAliasRedirectPort(la, prv3, ntohs(0x1234), ANY_ADDR, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 199*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf3 != NULL); 200*755bab6dSLutz Donnerhacke 201*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234); 202*755bab6dSLutz Donnerhacke /* more specific rule wins */ 203*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234); 204*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 205*755bab6dSLutz Donnerhacke 206*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 207*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 208*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 209*755bab6dSLutz Donnerhacke 210*755bab6dSLutz Donnerhacke /* 211*755bab6dSLutz Donnerhacke * Any external host, any port 212*755bab6dSLutz Donnerhacke */ 213*755bab6dSLutz Donnerhacke pf4 = LibAliasRedirectPort(la, cgn, ntohs(0x1234), ANY_ADDR, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP); 214*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf4 != NULL); 215*755bab6dSLutz Donnerhacke 216*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, prv1, 0x5679, masq, 0xabcd, cgn, 0x1234); 217*755bab6dSLutz Donnerhacke /* more specific rule wins */ 218*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234); 219*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234); 220*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 221*755bab6dSLutz Donnerhacke 222*755bab6dSLutz Donnerhacke free(p); 223*755bab6dSLutz Donnerhacke LibAliasUninit(la); 224*755bab6dSLutz Donnerhacke } 225*755bab6dSLutz Donnerhacke 226*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(3_redirectany); 227*755bab6dSLutz Donnerhacke ATF_TC_BODY(3_redirectany, dummy) 228*755bab6dSLutz Donnerhacke { 229*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 230*755bab6dSLutz Donnerhacke struct alias_link *pf; 231*755bab6dSLutz Donnerhacke struct ip *p; 232*755bab6dSLutz Donnerhacke struct udphdr *u; 233*755bab6dSLutz Donnerhacke 234*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 235*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, ~0); 236*755bab6dSLutz Donnerhacke p = ip_packet(0, 64); 237*755bab6dSLutz Donnerhacke 238*755bab6dSLutz Donnerhacke pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ANY_ADDR, 0, ANY_ADDR, ntohs(0xabcd), IPPROTO_UDP); 239*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf != NULL); 240*755bab6dSLutz Donnerhacke 241*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 242*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 243*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, pub, 0x5678, pub, 0xabcd); 244*755bab6dSLutz Donnerhacke 245*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, pub); 246*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, pub, 0x5679, pub, 0xabcd, prv1, 0x1234); 247*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5679, masq, 0xabcd); 248*755bab6dSLutz Donnerhacke 249*755bab6dSLutz Donnerhacke free(p); 250*755bab6dSLutz Donnerhacke LibAliasUninit(la); 251*755bab6dSLutz Donnerhacke } 252*755bab6dSLutz Donnerhacke 253*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(4_redirectaddr); 254*755bab6dSLutz Donnerhacke ATF_TC_BODY(4_redirectaddr, dummy) 255*755bab6dSLutz Donnerhacke { 256*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 257*755bab6dSLutz Donnerhacke struct alias_link *pf1, *pf2; 258*755bab6dSLutz Donnerhacke struct ip *p; 259*755bab6dSLutz Donnerhacke 260*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 261*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 262*755bab6dSLutz Donnerhacke pf1 = LibAliasRedirectAddr(la, prv1, pub); 263*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf1 != NULL); 264*755bab6dSLutz Donnerhacke 265*755bab6dSLutz Donnerhacke p = ip_packet(254, 64); 266*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, pub, prv1); 267*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, masq, masq); 268*755bab6dSLutz Donnerhacke 269*755bab6dSLutz Donnerhacke pf2 = LibAliasRedirectAddr(la, prv2, pub); 270*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf2 != NULL); 271*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, pub, prv1); 272*755bab6dSLutz Donnerhacke p->ip_p = 253; /* new flows */ 273*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, pub, prv2); 274*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, masq, masq); 275*755bab6dSLutz Donnerhacke 276*755bab6dSLutz Donnerhacke p->ip_p = 252; /* new flows */ 277*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv1, ext, pub); 278*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv2, ext, pub); 279*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv3, ext, masq); 280*755bab6dSLutz Donnerhacke 281*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, ~0); 282*755bab6dSLutz Donnerhacke p->ip_p = 251; /* new flows */ 283*755bab6dSLutz Donnerhacke UNNAT_FAIL(p, ext, pub); 284*755bab6dSLutz Donnerhacke UNNAT_FAIL(p, ext, masq); 285*755bab6dSLutz Donnerhacke 286*755bab6dSLutz Donnerhacke /* unhide older version */ 287*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf2); 288*755bab6dSLutz Donnerhacke LibAliasSetMode(la, 0, ~0); 289*755bab6dSLutz Donnerhacke p->ip_p = 250; /* new flows */ 290*755bab6dSLutz Donnerhacke UNNAT_CHECK(p, ext, pub, prv1); 291*755bab6dSLutz Donnerhacke 292*755bab6dSLutz Donnerhacke p->ip_p = 249; /* new flows */ 293*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv1, ext, pub); 294*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv2, ext, masq); 295*755bab6dSLutz Donnerhacke NAT_CHECK(p, prv3, ext, masq); 296*755bab6dSLutz Donnerhacke 297*755bab6dSLutz Donnerhacke free(p); 298*755bab6dSLutz Donnerhacke LibAliasUninit(la); 299*755bab6dSLutz Donnerhacke } 300*755bab6dSLutz Donnerhacke 301*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(5_lsnat); 302*755bab6dSLutz Donnerhacke ATF_TC_BODY(5_lsnat, dummy) 303*755bab6dSLutz Donnerhacke { 304*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 305*755bab6dSLutz Donnerhacke struct alias_link *pf; 306*755bab6dSLutz Donnerhacke struct ip *p; 307*755bab6dSLutz Donnerhacke struct udphdr *u; 308*755bab6dSLutz Donnerhacke 309*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 310*755bab6dSLutz Donnerhacke LibAliasSetMode(la, 0, ~0); 311*755bab6dSLutz Donnerhacke p = ip_packet(0, 64); 312*755bab6dSLutz Donnerhacke 313*755bab6dSLutz Donnerhacke pf = LibAliasRedirectPort(la, cgn, ntohs(0xdead), ANY_ADDR, 0, masq, ntohs(0xabcd), IPPROTO_UDP); 314*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf != NULL); 315*755bab6dSLutz Donnerhacke 316*755bab6dSLutz Donnerhacke ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv1, ntohs(0x1234))); 317*755bab6dSLutz Donnerhacke ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv2, ntohs(0x2345))); 318*755bab6dSLutz Donnerhacke ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv3, ntohs(0x3456))); 319*755bab6dSLutz Donnerhacke 320*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x3456); 321*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x2345); 322*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x567a, masq, 0xabcd, prv1, 0x1234); 323*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x567b, masq, 0xabcd, prv3, 0x3456); 324*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x567c, masq, 0xabcd, prv2, 0x2345); 325*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x567d, masq, 0xabcd, prv1, 0x1234); 326*755bab6dSLutz Donnerhacke 327*755bab6dSLutz Donnerhacke free(p); 328*755bab6dSLutz Donnerhacke LibAliasUninit(la); 329*755bab6dSLutz Donnerhacke } 330*755bab6dSLutz Donnerhacke 331*755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(6_oneshot); 332*755bab6dSLutz Donnerhacke ATF_TC_BODY(6_oneshot, dummy) 333*755bab6dSLutz Donnerhacke { 334*755bab6dSLutz Donnerhacke struct libalias *la = LibAliasInit(NULL); 335*755bab6dSLutz Donnerhacke struct alias_link *pf; 336*755bab6dSLutz Donnerhacke struct ip *p; 337*755bab6dSLutz Donnerhacke struct udphdr *u; 338*755bab6dSLutz Donnerhacke 339*755bab6dSLutz Donnerhacke ATF_REQUIRE(la != NULL); 340*755bab6dSLutz Donnerhacke LibAliasSetMode(la, 0, ~0); 341*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0); 342*755bab6dSLutz Donnerhacke LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING); 343*755bab6dSLutz Donnerhacke 344*755bab6dSLutz Donnerhacke pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ANY_ADDR, 0, masq, ntohs(0xabcd), IPPROTO_UDP); 345*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf != NULL); 346*755bab6dSLutz Donnerhacke /* only for fully specified links */ 347*755bab6dSLutz Donnerhacke ATF_CHECK(-1 == LibAliasRedirectDynamic(la, pf)); 348*755bab6dSLutz Donnerhacke LibAliasRedirectDelete(la, pf); 349*755bab6dSLutz Donnerhacke 350*755bab6dSLutz Donnerhacke pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP); 351*755bab6dSLutz Donnerhacke ATF_REQUIRE(pf != NULL); 352*755bab6dSLutz Donnerhacke ATF_CHECK(0 == LibAliasRedirectDynamic(la, pf)); 353*755bab6dSLutz Donnerhacke 354*755bab6dSLutz Donnerhacke p = ip_packet(0, 64); 355*755bab6dSLutz Donnerhacke UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234); 356*755bab6dSLutz Donnerhacke 357*755bab6dSLutz Donnerhacke /* clear table by keeping the address */ 358*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, ext); 359*755bab6dSLutz Donnerhacke LibAliasSetAddress(la, masq); 360*755bab6dSLutz Donnerhacke 361*755bab6dSLutz Donnerhacke /* does not work anymore */ 362*755bab6dSLutz Donnerhacke UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd); 363*755bab6dSLutz Donnerhacke 364*755bab6dSLutz Donnerhacke free(p); 365*755bab6dSLutz Donnerhacke LibAliasUninit(la); 366*755bab6dSLutz Donnerhacke } 367*755bab6dSLutz Donnerhacke 368*755bab6dSLutz Donnerhacke ATF_TP_ADD_TCS(natin) 369*755bab6dSLutz Donnerhacke { 370*755bab6dSLutz Donnerhacke /* Use "dd if=/dev/random bs=2 count=1 | od -x" to reproduce */ 371*755bab6dSLutz Donnerhacke srand(0xe859); 372*755bab6dSLutz Donnerhacke 373*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 1_portforward); 374*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 2_portoverlap); 375*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 3_redirectany); 376*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 4_redirectaddr); 377*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 5_lsnat); 378*755bab6dSLutz Donnerhacke ATF_TP_ADD_TC(natin, 6_oneshot); 379*755bab6dSLutz Donnerhacke 380*755bab6dSLutz Donnerhacke return atf_no_error(); 381*755bab6dSLutz Donnerhacke } 382