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