aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-vpn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpn/gnunet-vpn.c')
-rw-r--r--src/vpn/gnunet-vpn.c365
1 files changed, 0 insertions, 365 deletions
diff --git a/src/vpn/gnunet-vpn.c b/src/vpn/gnunet-vpn.c
deleted file mode 100644
index 60d631d5e..000000000
--- a/src/vpn/gnunet-vpn.c
+++ /dev/null
@@ -1,365 +0,0 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
21/**
22 * @file src/vpn/gnunet-vpn.c
23 * @brief Tool to manually request VPN tunnels to be created
24 * @author Christian Grothoff
25 */
26
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_tun_lib.h"
30#include "gnunet_vpn_service.h"
31
32
33/**
34 * Handle to vpn service.
35 */
36static struct GNUNET_VPN_Handle *handle;
37
38/**
39 * Opaque redirection request handle.
40 */
41static struct GNUNET_VPN_RedirectionRequest *request;
42
43/**
44 * Option -p: destination peer identity for service
45 */
46static char *peer_id;
47
48/**
49 * Option -s: service name (hash to get service descriptor)
50 */
51static char *service_name;
52
53/**
54 * Option -i: target IP
55 */
56static char *target_ip;
57
58/**
59 * Option -4: IPv4 requested.
60 */
61static int ipv4;
62
63/**
64 * Option -6: IPv6 requested.
65 */
66static int ipv6;
67
68/**
69 * Option -t: TCP requested.
70 */
71static int tcp;
72
73/**
74 * Option -u: UDP requested.
75 */
76static int udp;
77
78/**
79 * Selected level of verbosity.
80 */
81static unsigned int verbosity;
82
83/**
84 * Global return value.
85 */
86static int ret;
87
88/**
89 * Option '-d': duration of the mapping
90 */
91static struct GNUNET_TIME_Relative duration = { 5 * 60 * 1000 };
92
93
94/**
95 * Shutdown.
96 */
97static void
98do_disconnect (void *cls)
99{
100 if (NULL != request)
101 {
102 GNUNET_VPN_cancel_request (request);
103 request = NULL;
104 }
105 if (NULL != handle)
106 {
107 GNUNET_VPN_disconnect (handle);
108 handle = NULL;
109 }
110 GNUNET_free (peer_id);
111 GNUNET_free (service_name);
112 GNUNET_free (target_ip);
113}
114
115
116/**
117 * Callback invoked from the VPN service once a redirection is
118 * available. Provides the IP address that can now be used to
119 * reach the requested destination.
120 *
121 * @param cls closure
122 * @param af address family, AF_INET or AF_INET6; AF_UNSPEC on error;
123 * will match 'result_af' from the request
124 * @param address IP address (struct in_addr or struct in_addr6, depending on 'af')
125 * that the VPN allocated for the redirection;
126 * traffic to this IP will now be redirected to the
127 * specified target peer; NULL on error
128 */
129static void
130allocation_cb (void *cls, int af, const void *address)
131{
132 char buf[INET6_ADDRSTRLEN];
133
134 request = NULL;
135 switch (af)
136 {
137 case AF_INET6:
138 case AF_INET:
139 fprintf (stdout, "%s\n", inet_ntop (af, address, buf, sizeof(buf)));
140 break;
141
142 case AF_UNSPEC:
143 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Error creating tunnel\n"));
144 ret = 1;
145 break;
146
147 default:
148 break;
149 }
150 GNUNET_SCHEDULER_shutdown ();
151}
152
153
154/**
155 * Main function that will be run by the scheduler.
156 *
157 * @param cls closure
158 * @param args remaining command-line arguments
159 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
160 * @param cfg configuration
161 */
162static void
163run (void *cls,
164 char *const *args,
165 const char *cfgfile,
166 const struct GNUNET_CONFIGURATION_Handle *cfg)
167{
168 int dst_af;
169 int req_af;
170 struct GNUNET_PeerIdentity peer;
171 struct GNUNET_HashCode sd;
172 const void *addr;
173 struct in_addr v4;
174 struct in6_addr v6;
175 uint8_t protocol;
176 struct GNUNET_TIME_Absolute etime;
177
178 etime = GNUNET_TIME_relative_to_absolute (duration);
179 GNUNET_SCHEDULER_add_shutdown (&do_disconnect, NULL);
180 handle = GNUNET_VPN_connect (cfg);
181 if (NULL == handle)
182 goto error;
183 req_af = AF_UNSPEC;
184 if (ipv4)
185 {
186 if (ipv6)
187 {
188 fprintf (stderr,
189 _ ("Option `%s' makes no sense with option `%s'.\n"),
190 "-4",
191 "-6");
192 goto error;
193 }
194 req_af = AF_INET;
195 }
196 if (ipv6)
197 req_af = AF_INET6;
198
199 if (NULL == target_ip)
200 {
201 if (NULL == service_name)
202 {
203 fprintf (stderr, _ ("Option `%s' or `%s' is required.\n"), "-i", "-s");
204 goto error;
205 }
206 if (NULL == peer_id)
207 {
208 fprintf (stderr,
209 _ ("Option `%s' is required when using option `%s'.\n"),
210 "-p",
211 "-s");
212 goto error;
213 }
214 if (! (tcp | udp))
215 {
216 fprintf (stderr,
217 _ ("Option `%s' or `%s' is required when using option `%s'.\n"),
218 "-t",
219 "-u",
220 "-s");
221 goto error;
222 }
223 if (tcp & udp)
224 {
225 fprintf (stderr,
226 _ ("Option `%s' makes no sense with option `%s'.\n"),
227 "-t",
228 "-u");
229 goto error;
230 }
231 if (tcp)
232 protocol = IPPROTO_TCP;
233 if (udp)
234 protocol = IPPROTO_UDP;
235 if (GNUNET_OK !=
236 GNUNET_CRYPTO_eddsa_public_key_from_string (peer_id,
237 strlen (peer_id),
238 &peer.public_key))
239 {
240 fprintf (stderr, _ ("`%s' is not a valid peer identifier.\n"), peer_id);
241 goto error;
242 }
243 GNUNET_TUN_service_name_to_hash (service_name, &sd);
244 request = GNUNET_VPN_redirect_to_peer (handle,
245 req_af,
246 protocol,
247 &peer,
248 &sd,
249 etime,
250 &allocation_cb,
251 NULL);
252 }
253 else
254 {
255 if (1 != inet_pton (AF_INET6, target_ip, &v6))
256 {
257 if (1 != inet_pton (AF_INET, target_ip, &v4))
258 {
259 fprintf (stderr, _ ("`%s' is not a valid IP address.\n"), target_ip);
260 goto error;
261 }
262 else
263 {
264 dst_af = AF_INET;
265 addr = &v4;
266 }
267 }
268 else
269 {
270 dst_af = AF_INET6;
271 addr = &v6;
272 }
273 request = GNUNET_VPN_redirect_to_ip (handle,
274 req_af,
275 dst_af,
276 addr,
277 etime,
278 &allocation_cb,
279 NULL);
280 }
281 return;
282
283error:
284 GNUNET_SCHEDULER_shutdown ();
285 ret = 1;
286}
287
288
289int
290main (int argc, char *const *argv)
291{
292 struct GNUNET_GETOPT_CommandLineOption options[] =
293 { GNUNET_GETOPT_option_flag ('4',
294 "ipv4",
295 gettext_noop (
296 "request that result should be an IPv4 address"),
297 &ipv4),
298
299 GNUNET_GETOPT_option_flag ('6',
300 "ipv6",
301 gettext_noop (
302 "request that result should be an IPv6 address"),
303 &ipv6),
304
305 GNUNET_GETOPT_option_relative_time (
306 'd',
307 "duration",
308 "TIME",
309 gettext_noop ("how long should the mapping be valid for new tunnels?"),
310 &duration),
311
312 GNUNET_GETOPT_option_string ('i',
313 "ip",
314 "IP",
315 gettext_noop (
316 "destination IP for the tunnel"),
317 &target_ip),
318
319 GNUNET_GETOPT_option_string (
320 'p',
321 "peer",
322 "PEERID",
323 gettext_noop ("peer offering the service we would like to access"),
324 &peer_id),
325
326 GNUNET_GETOPT_option_string ('s',
327 "service",
328 "NAME",
329 gettext_noop (
330 "name of the service we would like to access"),
331 &service_name),
332
333 GNUNET_GETOPT_option_flag ('t',
334 "tcp",
335 gettext_noop ("service is offered via TCP"),
336 &tcp),
337
338 GNUNET_GETOPT_option_flag ('u',
339 "udp",
340 gettext_noop ("service is offered via UDP"),
341 &udp),
342
343 GNUNET_GETOPT_option_verbose (&verbosity),
344
345 GNUNET_GETOPT_OPTION_END };
346
347 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
348 return 2;
349
350 ret =
351 (GNUNET_OK == GNUNET_PROGRAM_run (argc,
352 argv,
353 "gnunet-vpn",
354 gettext_noop ("Setup tunnels via VPN."),
355 options,
356 &run,
357 NULL))
358 ? ret
359 : 1;
360 GNUNET_free_nz ((void *) argv);
361 return ret;
362}
363
364
365/* end of gnunet-vpn.c */