GNUnet 0.21.1
gnunet-vpn.c
Go to the documentation of this file.
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
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_vpn_service.h"
30
31
36
41
45static char *peer_id;
46
50static char *service_name;
51
55static char *target_ip;
56
60static int ipv4;
61
65static int ipv6;
66
70static int tcp;
71
75static int udp;
76
80static unsigned int verbosity;
81
85static int ret;
86
90static struct GNUNET_TIME_Relative duration = { 5 * 60 * 1000 };
91
92
96static void
97do_disconnect (void *cls)
98{
99 if (NULL != request)
100 {
102 request = NULL;
103 }
104 if (NULL != handle)
105 {
107 handle = NULL;
108 }
112}
113
114
128static void
129allocation_cb (void *cls, int af, const void *address)
130{
131 char buf[INET6_ADDRSTRLEN];
132
133 request = NULL;
134 switch (af)
135 {
136 case AF_INET6:
137 case AF_INET:
138 fprintf (stdout, "%s\n", inet_ntop (af, address, buf, sizeof(buf)));
139 break;
140
141 case AF_UNSPEC:
142 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Error creating tunnel\n"));
143 ret = 1;
144 break;
145
146 default:
147 break;
148 }
150}
151
152
161static void
162run (void *cls,
163 char *const *args,
164 const char *cfgfile,
165 const struct GNUNET_CONFIGURATION_Handle *cfg)
166{
167 int dst_af;
168 int req_af;
169 struct GNUNET_PeerIdentity peer;
170 struct GNUNET_HashCode sd;
171 const void *addr;
172 struct in_addr v4;
173 struct in6_addr v6;
174 uint8_t protocol;
176
180 if (NULL == handle)
181 goto error;
182 req_af = AF_UNSPEC;
183 if (ipv4)
184 {
185 if (ipv6)
186 {
187 fprintf (stderr,
188 _ ("Option `%s' makes no sense with option `%s'.\n"),
189 "-4",
190 "-6");
191 goto error;
192 }
193 req_af = AF_INET;
194 }
195 if (ipv6)
196 req_af = AF_INET6;
197
198 if (NULL == target_ip)
199 {
200 if (NULL == service_name)
201 {
202 fprintf (stderr, _ ("Option `%s' or `%s' is required.\n"), "-i", "-s");
203 goto error;
204 }
205 if (NULL == peer_id)
206 {
207 fprintf (stderr,
208 _ ("Option `%s' is required when using option `%s'.\n"),
209 "-p",
210 "-s");
211 goto error;
212 }
213 if (! (tcp | udp))
214 {
215 fprintf (stderr,
216 _ ("Option `%s' or `%s' is required when using option `%s'.\n"),
217 "-t",
218 "-u",
219 "-s");
220 goto error;
221 }
222 if (tcp & udp)
223 {
224 fprintf (stderr,
225 _ ("Option `%s' makes no sense with option `%s'.\n"),
226 "-t",
227 "-u");
228 goto error;
229 }
230 if (tcp)
231 protocol = IPPROTO_TCP;
232 if (udp)
233 protocol = IPPROTO_UDP;
234 if (GNUNET_OK !=
236 strlen (peer_id),
237 &peer.public_key))
238 {
239 fprintf (stderr, _ ("`%s' is not a valid peer identifier.\n"), peer_id);
240 goto error;
241 }
244 req_af,
245 protocol,
246 &peer,
247 &sd,
248 etime,
250 NULL);
251 }
252 else
253 {
254 if (1 != inet_pton (AF_INET6, target_ip, &v6))
255 {
256 if (1 != inet_pton (AF_INET, target_ip, &v4))
257 {
258 fprintf (stderr, _ ("`%s' is not a valid IP address.\n"), target_ip);
259 goto error;
260 }
261 else
262 {
263 dst_af = AF_INET;
264 addr = &v4;
265 }
266 }
267 else
268 {
269 dst_af = AF_INET6;
270 addr = &v6;
271 }
273 req_af,
274 dst_af,
275 addr,
276 etime,
278 NULL);
279 }
280 return;
281
282error:
284 ret = 1;
285}
286
287
288int
289main (int argc, char *const *argv)
290{
293 "ipv4",
295 "request that result should be an IPv4 address"),
296 &ipv4),
297
299 "ipv6",
301 "request that result should be an IPv6 address"),
302 &ipv6),
303
305 'd',
306 "duration",
307 "TIME",
308 gettext_noop ("how long should the mapping be valid for new tunnels?"),
309 &duration),
310
312 "ip",
313 "IP",
315 "destination IP for the tunnel"),
316 &target_ip),
317
319 'p',
320 "peer",
321 "PEERID",
322 gettext_noop ("peer offering the service we would like to access"),
323 &peer_id),
324
326 "service",
327 "NAME",
329 "name of the service we would like to access"),
330 &service_name),
331
333 "tcp",
334 gettext_noop ("service is offered via TCP"),
335 &tcp),
336
338 "udp",
339 gettext_noop ("service is offered via UDP"),
340 &udp),
341
343
345
346 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
347 return 2;
348
349 ret =
351 argv,
352 "gnunet-vpn",
353 gettext_noop ("Setup tunnels via VPN."),
354 options,
355 &run,
356 NULL))
357 ? ret
358 : 1;
359 GNUNET_free_nz ((void *) argv);
360 return ret;
361}
362
363
364/* end of gnunet-vpn.c */
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define gettext_noop(String)
Definition: gettext.h:70
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
static char * address
GNS address for this phone.
static uint64_t etime
Expiration string converted to numeric value.
static void do_disconnect(void *cls)
Shutdown.
Definition: gnunet-vpn.c:97
static unsigned int verbosity
Selected level of verbosity.
Definition: gnunet-vpn.c:80
static char * target_ip
Option -i: target IP.
Definition: gnunet-vpn.c:55
static void allocation_cb(void *cls, int af, const void *address)
Callback invoked from the VPN service once a redirection is available.
Definition: gnunet-vpn.c:129
static char * peer_id
Option -p: destination peer identity for service.
Definition: gnunet-vpn.c:45
static int ret
Global return value.
Definition: gnunet-vpn.c:85
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:50
static struct GNUNET_TIME_Relative duration
Option '-d': duration of the mapping.
Definition: gnunet-vpn.c:90
static int ipv4
Option -4: IPv4 requested.
Definition: gnunet-vpn.c:60
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Main function that will be run by the scheduler.
Definition: gnunet-vpn.c:162
int main(int argc, char *const *argv)
Definition: gnunet-vpn.c:289
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:75
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:65
static struct GNUNET_VPN_RedirectionRequest * request
Opaque redirection request handle.
Definition: gnunet-vpn.c:40
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
static int tcp
Option -t: TCP requested.
Definition: gnunet-vpn.c:70
API to access the VPN service.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_relative_time(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_TIME_Relative *val)
Allow user to specify a struct GNUNET_TIME_Relative (using human-readable "fancy" time).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_verbose(unsigned int *level)
Define the '-V' verbosity option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
#define GNUNET_log(kind,...)
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_eddsa_public_key_from_string(const char *enc, size_t enclen, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Convert a string representing a public key to a public key.
Definition: crypto_ecc.c:358
@ GNUNET_OK
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_free_nz(ptr)
Wrapper around free.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:400
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1340
enum GNUNET_GenericReturnValue GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1230
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:316
void GNUNET_TUN_service_name_to_hash(const char *service_name, struct GNUNET_HashCode *hc)
Hash the service name of a hosted service to the hash code that is used to identify the service on th...
Definition: regex.c:772
struct GNUNET_VPN_Handle * GNUNET_VPN_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the VPN service.
Definition: vpn_api.c:490
struct GNUNET_VPN_RedirectionRequest * GNUNET_VPN_redirect_to_peer(struct GNUNET_VPN_Handle *vh, int result_af, uint8_t protocol, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HashCode *serv, struct GNUNET_TIME_Absolute expiration_time, GNUNET_VPN_AllocationCallback cb, void *cb_cls)
Tell the VPN that a forwarding to a particular peer offering a particular service is requested.
Definition: vpn_api.c:388
struct GNUNET_VPN_RedirectionRequest * GNUNET_VPN_redirect_to_ip(struct GNUNET_VPN_Handle *vh, int result_af, int addr_af, const void *addr, struct GNUNET_TIME_Absolute expiration_time, GNUNET_VPN_AllocationCallback cb, void *cb_cls)
Tell the VPN that forwarding to the Internet via some exit node is requested.
Definition: vpn_api.c:439
void GNUNET_VPN_cancel_request(struct GNUNET_VPN_RedirectionRequest *rr)
Cancel redirection request with the service.
Definition: vpn_api.c:375
void GNUNET_VPN_disconnect(struct GNUNET_VPN_Handle *vh)
Disconnect from the VPN service.
Definition: vpn_api.c:512
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
Definition of a command line option.
A 512-bit hashcode.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_CRYPTO_EddsaPublicKey public_key
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
Opaque VPN handle.
Definition: vpn_api.c:35
Opaque redirection request handle.
Definition: vpn_api.c:77