GNUnet  0.19.4
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 
35 static struct GNUNET_VPN_Handle *handle;
36 
41 
45 static char *peer_id;
46 
50 static char *service_name;
51 
55 static char *target_ip;
56 
60 static int ipv4;
61 
65 static int ipv6;
66 
70 static int tcp;
71 
75 static int udp;
76 
80 static unsigned int verbosity;
81 
85 static int ret;
86 
90 static struct GNUNET_TIME_Relative duration = { 5 * 60 * 1000 };
91 
92 
96 static void
97 do_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 
128 static void
129 allocation_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 
161 static void
162 run (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,
249  &allocation_cb,
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,
277  &allocation_cb,
278  NULL);
279  }
280  return;
281 
282 error:
284  ret = 1;
285 }
286 
287 
288 int
289 main (int argc, char *const *argv)
290 {
293  "ipv4",
294  gettext_noop (
295  "request that result should be an IPv4 address"),
296  &ipv4),
297 
299  "ipv6",
300  gettext_noop (
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",
314  gettext_noop (
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",
328  gettext_noop (
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 =
350  (GNUNET_OK == GNUNET_PROGRAM_run (argc,
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 const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static uint64_t etime
Expiration string converted to numeric value.
Definition: gnunet-abd.c:201
static char * address
GNS address for this phone.
static char buf[2048]
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:357
@ 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:562
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:1334
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:1222
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_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
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
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:177
Definition of a command line option.
A 512-bit hashcode.
The identity of the host (wraps the signing key of the peer).
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
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.