xref: /freebsd/tests/sys/netinet/libalias/3_natin.c (revision b3dc6f137b8d626c4415a5fa9c9874ac4ca78658)
1755bab6dSLutz Donnerhacke /*
2755bab6dSLutz Donnerhacke  * SPDX-License-Identifier: BSD-3-Clause
3755bab6dSLutz Donnerhacke  *
4755bab6dSLutz Donnerhacke  * Copyright 2021 Lutz Donnerhacke
5755bab6dSLutz Donnerhacke  *
6755bab6dSLutz Donnerhacke  * Redistribution and use in source and binary forms, with or without
7755bab6dSLutz Donnerhacke  * modification, are permitted provided that the following conditions
8755bab6dSLutz Donnerhacke  * are met:
9755bab6dSLutz Donnerhacke  *
10755bab6dSLutz Donnerhacke  * 1. Redistributions of source code must retain the above copyright
11755bab6dSLutz Donnerhacke  *    notice, this list of conditions and the following disclaimer.
12755bab6dSLutz Donnerhacke  * 2. Redistributions in binary form must reproduce the above
13755bab6dSLutz Donnerhacke  *    copyright notice, this list of conditions and the following
14755bab6dSLutz Donnerhacke  *    disclaimer in the documentation and/or other materials provided
15755bab6dSLutz Donnerhacke  *    with the distribution.
16755bab6dSLutz Donnerhacke  * 3. Neither the name of the copyright holder nor the names of its
17755bab6dSLutz Donnerhacke  *    contributors may be used to endorse or promote products derived
18755bab6dSLutz Donnerhacke  *    from this software without specific prior written permission.
19755bab6dSLutz Donnerhacke  *
20755bab6dSLutz Donnerhacke  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
21755bab6dSLutz Donnerhacke  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
22755bab6dSLutz Donnerhacke  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23755bab6dSLutz Donnerhacke  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24755bab6dSLutz Donnerhacke  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25755bab6dSLutz Donnerhacke  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26755bab6dSLutz Donnerhacke  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27755bab6dSLutz Donnerhacke  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28755bab6dSLutz Donnerhacke  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29755bab6dSLutz Donnerhacke  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30755bab6dSLutz Donnerhacke  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
31755bab6dSLutz Donnerhacke  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32755bab6dSLutz Donnerhacke  * SUCH DAMAGE.
33755bab6dSLutz Donnerhacke  */
34755bab6dSLutz Donnerhacke #include <atf-c.h>
35755bab6dSLutz Donnerhacke #include <alias.h>
36755bab6dSLutz Donnerhacke #include <stdio.h>
37755bab6dSLutz Donnerhacke #include <stdlib.h>
38755bab6dSLutz Donnerhacke 
39755bab6dSLutz Donnerhacke #include "util.h"
40755bab6dSLutz Donnerhacke 
41755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(1_portforward);
42755bab6dSLutz Donnerhacke ATF_TC_BODY(1_portforward, dummy)
43755bab6dSLutz Donnerhacke {
44755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
45755bab6dSLutz Donnerhacke 	struct alias_link *pf1, *pf2, *pf3, *pf4;
46755bab6dSLutz Donnerhacke 	struct ip *p;
47755bab6dSLutz Donnerhacke 	struct udphdr *u;
48755bab6dSLutz Donnerhacke 
49755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
50755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
51755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0);
52755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING);
53755bab6dSLutz Donnerhacke 
54755bab6dSLutz Donnerhacke 	/*
55755bab6dSLutz Donnerhacke 	 * Fully specified
56755bab6dSLutz Donnerhacke 	 */
57755bab6dSLutz Donnerhacke 	pf1 = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
58755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf1 != NULL);
59755bab6dSLutz Donnerhacke 
60755bab6dSLutz Donnerhacke 	p = ip_packet(0, 64);
61755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
62755bab6dSLutz Donnerhacke 	/* try again */
63755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
64755bab6dSLutz Donnerhacke 	/* different source */
65755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, pub, 0x5678, masq, 0xabcd);
66755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0xdead, masq, 0xabcd);
67755bab6dSLutz Donnerhacke 
68755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
69755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
70755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
71755bab6dSLutz Donnerhacke 
72755bab6dSLutz Donnerhacke 	/* delete and try again */
73755bab6dSLutz Donnerhacke 	LibAliasRedirectDelete(la, pf1);
74755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd);
75755bab6dSLutz Donnerhacke 
76755bab6dSLutz Donnerhacke 	/*
77755bab6dSLutz Donnerhacke 	 * Any external port
78755bab6dSLutz Donnerhacke 	 */
79755bab6dSLutz Donnerhacke 	pf2 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP);
80755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf2 != NULL);
81755bab6dSLutz Donnerhacke 
82755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234);
83755bab6dSLutz Donnerhacke 	/* try again */
84755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234);
85755bab6dSLutz Donnerhacke 	/* different source */
86755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, pub, 0x5678, masq, 0xabcd);
87755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0xdead, masq, 0xabcd, prv2, 0x1234);
88755bab6dSLutz Donnerhacke 
89755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
90755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
91755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
92755bab6dSLutz Donnerhacke 
93755bab6dSLutz Donnerhacke 	/* delete and try again */
94755bab6dSLutz Donnerhacke 	LibAliasRedirectDelete(la, pf2);
95755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd);
96755bab6dSLutz Donnerhacke 
97755bab6dSLutz Donnerhacke 	/*
98755bab6dSLutz Donnerhacke 	 * Any external host
99755bab6dSLutz Donnerhacke 	 */
100755bab6dSLutz Donnerhacke 	pf3 = LibAliasRedirectPort(la, prv3, ntohs(0x1234), ANY_ADDR, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
101755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf3 != NULL);
102755bab6dSLutz Donnerhacke 
103755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x1234);
104755bab6dSLutz Donnerhacke 	/* try again */
105755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x1234);
106755bab6dSLutz Donnerhacke 	/* different source */
107755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234);
108755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0xdead, masq, 0xabcd);
109755bab6dSLutz Donnerhacke 
110755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
111755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
112755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
113755bab6dSLutz Donnerhacke 
114755bab6dSLutz Donnerhacke 	/* delete and try again */
115*b3dc6f13SLutz Donnerhacke 	LibAliasRedirectDelete(la, pf3);
116755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd);
117755bab6dSLutz Donnerhacke 
118755bab6dSLutz Donnerhacke 	/*
119755bab6dSLutz Donnerhacke 	 * Any external host, any port
120755bab6dSLutz Donnerhacke 	 */
121755bab6dSLutz Donnerhacke 	pf4 = LibAliasRedirectPort(la, cgn, ntohs(0x1234), ANY_ADDR, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP);
122755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf4 != NULL);
123755bab6dSLutz Donnerhacke 
124755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, cgn, 0x1234);
125755bab6dSLutz Donnerhacke 	/* try again */
126755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, cgn, 0x1234);
127755bab6dSLutz Donnerhacke 	/* different source */
128755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, cgn, 0x1234);
129755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0xdead, masq, 0xabcd, cgn, 0x1234);
130755bab6dSLutz Donnerhacke 
131755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
132755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
133755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
134755bab6dSLutz Donnerhacke 
135755bab6dSLutz Donnerhacke 	/* delete and try again */
136*b3dc6f13SLutz Donnerhacke 	LibAliasRedirectDelete(la, pf4);
137755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd);
138755bab6dSLutz Donnerhacke 
139755bab6dSLutz Donnerhacke 	free(p);
140755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
141755bab6dSLutz Donnerhacke }
142755bab6dSLutz Donnerhacke 
143755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(2_portoverlap);
144755bab6dSLutz Donnerhacke ATF_TC_BODY(2_portoverlap, dummy)
145755bab6dSLutz Donnerhacke {
146755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
147755bab6dSLutz Donnerhacke 	struct alias_link *pf1, *pf2, *pf3, *pf4;
148755bab6dSLutz Donnerhacke 	struct ip *p;
149755bab6dSLutz Donnerhacke 	struct udphdr *u;
150755bab6dSLutz Donnerhacke 
151755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
152755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
153755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0);
154755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING);
155755bab6dSLutz Donnerhacke 
156755bab6dSLutz Donnerhacke 	/*
157755bab6dSLutz Donnerhacke 	 * Fully specified
158755bab6dSLutz Donnerhacke 	 */
159755bab6dSLutz Donnerhacke 	pf1 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
160755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf1 != NULL);
161755bab6dSLutz Donnerhacke 
162755bab6dSLutz Donnerhacke 	p = ip_packet(0, 64);
163755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv2, 0x1234);
164755bab6dSLutz Donnerhacke 
165755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
166755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
167755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
168755bab6dSLutz Donnerhacke 
169755bab6dSLutz Donnerhacke 	/*
170755bab6dSLutz Donnerhacke 	 * Fully specified (override)
171755bab6dSLutz Donnerhacke 	 */
172755bab6dSLutz Donnerhacke 	pf1 = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
173755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf1 != NULL);
174755bab6dSLutz Donnerhacke 
175755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
176755bab6dSLutz Donnerhacke 
177755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
178755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
179755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
180755bab6dSLutz Donnerhacke 
181755bab6dSLutz Donnerhacke 	/*
182755bab6dSLutz Donnerhacke 	 * Any external port
183755bab6dSLutz Donnerhacke 	 */
184755bab6dSLutz Donnerhacke 	pf2 = LibAliasRedirectPort(la, prv2, ntohs(0x1234), ext, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP);
185755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf2 != NULL);
186755bab6dSLutz Donnerhacke 
187755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234);
188755bab6dSLutz Donnerhacke 	/* more specific rule wins */
189755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
190755bab6dSLutz Donnerhacke 
191755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
192755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
193755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
194755bab6dSLutz Donnerhacke 
195755bab6dSLutz Donnerhacke 	/*
196755bab6dSLutz Donnerhacke 	 * Any external host
197755bab6dSLutz Donnerhacke 	 */
198755bab6dSLutz Donnerhacke 	pf3 = LibAliasRedirectPort(la, prv3, ntohs(0x1234), ANY_ADDR, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
199755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf3 != NULL);
200755bab6dSLutz Donnerhacke 
201755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234);
202755bab6dSLutz Donnerhacke 	/* more specific rule wins */
203755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234);
204755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
205755bab6dSLutz Donnerhacke 
206755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
207755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
208755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
209755bab6dSLutz Donnerhacke 
210755bab6dSLutz Donnerhacke 	/*
211755bab6dSLutz Donnerhacke 	 * Any external host, any port
212755bab6dSLutz Donnerhacke 	 */
213755bab6dSLutz Donnerhacke 	pf4 = LibAliasRedirectPort(la, cgn, ntohs(0x1234), ANY_ADDR, ntohs(0), masq, ntohs(0xabcd), IPPROTO_UDP);
214755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf4 != NULL);
215755bab6dSLutz Donnerhacke 
216755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, prv1, 0x5679, masq, 0xabcd, cgn, 0x1234);
217755bab6dSLutz Donnerhacke 	/* more specific rule wins */
218755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, pub, 0x5678, masq, 0xabcd, prv3, 0x1234);
219755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x1234);
220755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
221755bab6dSLutz Donnerhacke 
222755bab6dSLutz Donnerhacke 	free(p);
223755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
224755bab6dSLutz Donnerhacke }
225755bab6dSLutz Donnerhacke 
226755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(3_redirectany);
227755bab6dSLutz Donnerhacke ATF_TC_BODY(3_redirectany, dummy)
228755bab6dSLutz Donnerhacke {
229755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
230755bab6dSLutz Donnerhacke 	struct alias_link *pf;
231755bab6dSLutz Donnerhacke 	struct ip *p;
232755bab6dSLutz Donnerhacke 	struct udphdr *u;
233755bab6dSLutz Donnerhacke 
234755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
235755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, ~0);
236755bab6dSLutz Donnerhacke 	p = ip_packet(0, 64);
237755bab6dSLutz Donnerhacke 
238755bab6dSLutz Donnerhacke 	pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ANY_ADDR, 0, ANY_ADDR, ntohs(0xabcd), IPPROTO_UDP);
239755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf != NULL);
240755bab6dSLutz Donnerhacke 
241755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
242755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
243755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, pub, 0x5678, pub, 0xabcd);
244755bab6dSLutz Donnerhacke 
245755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, pub);
246755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, pub, 0x5679, pub, 0xabcd, prv1, 0x1234);
247755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5679, masq, 0xabcd);
248755bab6dSLutz Donnerhacke 
249755bab6dSLutz Donnerhacke 	free(p);
250755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
251755bab6dSLutz Donnerhacke }
252755bab6dSLutz Donnerhacke 
253755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(4_redirectaddr);
254755bab6dSLutz Donnerhacke ATF_TC_BODY(4_redirectaddr, dummy)
255755bab6dSLutz Donnerhacke {
256755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
257755bab6dSLutz Donnerhacke 	struct alias_link *pf1, *pf2;
258755bab6dSLutz Donnerhacke 	struct ip *p;
259755bab6dSLutz Donnerhacke 
260755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
261755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
262755bab6dSLutz Donnerhacke 	pf1 = LibAliasRedirectAddr(la, prv1, pub);
263755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf1 != NULL);
264755bab6dSLutz Donnerhacke 
265755bab6dSLutz Donnerhacke 	p = ip_packet(254, 64);
266755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, pub, prv1);
267755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, masq, masq);
268755bab6dSLutz Donnerhacke 
269755bab6dSLutz Donnerhacke 	pf2 = LibAliasRedirectAddr(la, prv2, pub);
270755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf2 != NULL);
271755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, pub, prv1);
272755bab6dSLutz Donnerhacke 	p->ip_p = 253;		       /* new flows */
273755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, pub, prv2);
274755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, masq, masq);
275755bab6dSLutz Donnerhacke 
276755bab6dSLutz Donnerhacke 	p->ip_p = 252;		       /* new flows */
277755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv1, ext, pub);
278755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv2, ext, pub);
279755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv3, ext, masq);
280755bab6dSLutz Donnerhacke 
281755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, ~0);
282755bab6dSLutz Donnerhacke 	p->ip_p = 251;		       /* new flows */
283755bab6dSLutz Donnerhacke 	UNNAT_FAIL(p, ext, pub);
284755bab6dSLutz Donnerhacke 	UNNAT_FAIL(p, ext, masq);
285755bab6dSLutz Donnerhacke 
286755bab6dSLutz Donnerhacke 	/* unhide older version */
287755bab6dSLutz Donnerhacke 	LibAliasRedirectDelete(la, pf2);
288755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, 0, ~0);
289755bab6dSLutz Donnerhacke 	p->ip_p = 250;		       /* new flows */
290755bab6dSLutz Donnerhacke 	UNNAT_CHECK(p, ext, pub, prv1);
291755bab6dSLutz Donnerhacke 
292755bab6dSLutz Donnerhacke 	p->ip_p = 249;		       /* new flows */
293755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv1, ext, pub);
294755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv2, ext, masq);
295755bab6dSLutz Donnerhacke 	NAT_CHECK(p, prv3, ext, masq);
296755bab6dSLutz Donnerhacke 
297755bab6dSLutz Donnerhacke 	free(p);
298755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
299755bab6dSLutz Donnerhacke }
300755bab6dSLutz Donnerhacke 
301755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(5_lsnat);
302755bab6dSLutz Donnerhacke ATF_TC_BODY(5_lsnat, dummy)
303755bab6dSLutz Donnerhacke {
304755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
305755bab6dSLutz Donnerhacke 	struct alias_link *pf;
306755bab6dSLutz Donnerhacke 	struct ip *p;
307755bab6dSLutz Donnerhacke 	struct udphdr *u;
308755bab6dSLutz Donnerhacke 
309755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
310755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, 0, ~0);
311755bab6dSLutz Donnerhacke 	p = ip_packet(0, 64);
312755bab6dSLutz Donnerhacke 
313755bab6dSLutz Donnerhacke 	pf = LibAliasRedirectPort(la, cgn, ntohs(0xdead), ANY_ADDR, 0, masq, ntohs(0xabcd), IPPROTO_UDP);
314755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf != NULL);
315755bab6dSLutz Donnerhacke 
316755bab6dSLutz Donnerhacke 	ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv1, ntohs(0x1234)));
317755bab6dSLutz Donnerhacke 	ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv2, ntohs(0x2345)));
318755bab6dSLutz Donnerhacke 	ATF_REQUIRE(0 == LibAliasAddServer(la, pf, prv3, ntohs(0x3456)));
319755bab6dSLutz Donnerhacke 
320755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv3, 0x3456);
321755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5679, masq, 0xabcd, prv2, 0x2345);
322755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x567a, masq, 0xabcd, prv1, 0x1234);
323755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x567b, masq, 0xabcd, prv3, 0x3456);
324755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x567c, masq, 0xabcd, prv2, 0x2345);
325755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x567d, masq, 0xabcd, prv1, 0x1234);
326755bab6dSLutz Donnerhacke 
327755bab6dSLutz Donnerhacke 	free(p);
328755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
329755bab6dSLutz Donnerhacke }
330755bab6dSLutz Donnerhacke 
331755bab6dSLutz Donnerhacke ATF_TC_WITHOUT_HEAD(6_oneshot);
332755bab6dSLutz Donnerhacke ATF_TC_BODY(6_oneshot, dummy)
333755bab6dSLutz Donnerhacke {
334755bab6dSLutz Donnerhacke 	struct libalias *la = LibAliasInit(NULL);
335755bab6dSLutz Donnerhacke 	struct alias_link *pf;
336755bab6dSLutz Donnerhacke 	struct ip *p;
337755bab6dSLutz Donnerhacke 	struct udphdr *u;
338755bab6dSLutz Donnerhacke 
339755bab6dSLutz Donnerhacke 	ATF_REQUIRE(la != NULL);
340755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, 0, ~0);
341755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_RESET_ON_ADDR_CHANGE, ~0);
342755bab6dSLutz Donnerhacke 	LibAliasSetMode(la, PKT_ALIAS_DENY_INCOMING, PKT_ALIAS_DENY_INCOMING);
343755bab6dSLutz Donnerhacke 
344755bab6dSLutz Donnerhacke 	pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ANY_ADDR, 0, masq, ntohs(0xabcd), IPPROTO_UDP);
345755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf != NULL);
346755bab6dSLutz Donnerhacke 	/* only for fully specified links */
347755bab6dSLutz Donnerhacke 	ATF_CHECK(-1 == LibAliasRedirectDynamic(la, pf));
348755bab6dSLutz Donnerhacke 	LibAliasRedirectDelete(la, pf);
349755bab6dSLutz Donnerhacke 
350755bab6dSLutz Donnerhacke 	pf = LibAliasRedirectPort(la, prv1, ntohs(0x1234), ext, ntohs(0x5678), masq, ntohs(0xabcd), IPPROTO_UDP);
351755bab6dSLutz Donnerhacke 	ATF_REQUIRE(pf != NULL);
352755bab6dSLutz Donnerhacke 	ATF_CHECK(0 == LibAliasRedirectDynamic(la, pf));
353755bab6dSLutz Donnerhacke 
354755bab6dSLutz Donnerhacke 	p = ip_packet(0, 64);
355755bab6dSLutz Donnerhacke 	UDP_UNNAT_CHECK(p, u, ext, 0x5678, masq, 0xabcd, prv1, 0x1234);
356755bab6dSLutz Donnerhacke 
357755bab6dSLutz Donnerhacke 	/* clear table by keeping the address */
358755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, ext);
359755bab6dSLutz Donnerhacke 	LibAliasSetAddress(la, masq);
360755bab6dSLutz Donnerhacke 
361755bab6dSLutz Donnerhacke 	/* does not work anymore */
362755bab6dSLutz Donnerhacke 	UDP_UNNAT_FAIL(p, u, ext, 0x5678, masq, 0xabcd);
363755bab6dSLutz Donnerhacke 
364755bab6dSLutz Donnerhacke 	free(p);
365755bab6dSLutz Donnerhacke 	LibAliasUninit(la);
366755bab6dSLutz Donnerhacke }
367755bab6dSLutz Donnerhacke 
ATF_TP_ADD_TCS(natin)368755bab6dSLutz Donnerhacke ATF_TP_ADD_TCS(natin)
369755bab6dSLutz Donnerhacke {
370755bab6dSLutz Donnerhacke 	/* Use "dd if=/dev/random bs=2 count=1 | od -x" to reproduce */
371755bab6dSLutz Donnerhacke 	srand(0xe859);
372755bab6dSLutz Donnerhacke 
373755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 1_portforward);
374755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 2_portoverlap);
375755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 3_redirectany);
376755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 4_redirectaddr);
377755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 5_lsnat);
378755bab6dSLutz Donnerhacke 	ATF_TP_ADD_TC(natin, 6_oneshot);
379755bab6dSLutz Donnerhacke 
380755bab6dSLutz Donnerhacke 	return atf_no_error();
381755bab6dSLutz Donnerhacke }
382