xref: /freebsd/tests/sys/netinet/libalias/3_natin.c (revision 755bab6d55e6e2df168f352f3e2fbdea87002ed8)
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