GNUnet  0.19.2
gnunet-vpn.c File Reference

Tool to manually request VPN tunnels to be created. More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_vpn_service.h"
Include dependency graph for gnunet-vpn.c:

Go to the source code of this file.

Functions

static void do_disconnect (void *cls)
 Shutdown. More...
 
static void allocation_cb (void *cls, int af, const void *address)
 Callback invoked from the VPN service once a redirection is available. More...
 
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. More...
 
int main (int argc, char *const *argv)
 

Variables

static struct GNUNET_VPN_Handlehandle
 Handle to vpn service. More...
 
static struct GNUNET_VPN_RedirectionRequestrequest
 Opaque redirection request handle. More...
 
static char * peer_id
 Option -p: destination peer identity for service. More...
 
static char * service_name
 Option -s: service name (hash to get service descriptor) More...
 
static char * target_ip
 Option -i: target IP. More...
 
static int ipv4
 Option -4: IPv4 requested. More...
 
static int ipv6
 Option -6: IPv6 requested. More...
 
static int tcp
 Option -t: TCP requested. More...
 
static int udp
 Option -u: UDP requested. More...
 
static unsigned int verbosity
 Selected level of verbosity. More...
 
static int ret
 Global return value. More...
 
static struct GNUNET_TIME_Relative duration = { 5 * 60 * 1000 }
 Option '-d': duration of the mapping. More...
 

Detailed Description

Tool to manually request VPN tunnels to be created.

Author
Christian Grothoff

Definition in file gnunet-vpn.c.

Function Documentation

◆ do_disconnect()

static void do_disconnect ( void *  cls)
static

Shutdown.

Definition at line 97 of file gnunet-vpn.c.

98 {
99  if (NULL != request)
100  {
102  request = NULL;
103  }
104  if (NULL != handle)
105  {
107  handle = NULL;
108  }
112 }
static char * target_ip
Option -i: target IP.
Definition: gnunet-vpn.c:55
static char * peer_id
Option -p: destination peer identity for service.
Definition: gnunet-vpn.c:45
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:50
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
#define GNUNET_free(ptr)
Wrapper around free.
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

References GNUNET_free, GNUNET_VPN_cancel_request(), GNUNET_VPN_disconnect(), handle, peer_id, request, service_name, and target_ip.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ allocation_cb()

static void allocation_cb ( void *  cls,
int  af,
const void *  address 
)
static

Callback invoked from the VPN service once a redirection is available.

Provides the IP address that can now be used to reach the requested destination.

Parameters
clsclosure
afaddress family, AF_INET or AF_INET6; AF_UNSPEC on error; will match 'result_af' from the request
addressIP address (struct in_addr or struct in_addr6, depending on 'af') that the VPN allocated for the redirection; traffic to this IP will now be redirected to the specified target peer; NULL on error

Definition at line 129 of file gnunet-vpn.c.

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 }
static char * address
GNS address for this phone.
static char buf[2048]
static int ret
Global return value.
Definition: gnunet-vpn.c:85
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_ERROR
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:534
#define _(String)
GNU gettext support macro.
Definition: platform.h:177

References _, address, buf, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_shutdown(), request, and ret.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)
static

Main function that will be run by the scheduler.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 162 of file gnunet-vpn.c.

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 }
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 void do_disconnect(void *cls)
Shutdown.
Definition: gnunet-vpn.c:97
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 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 int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:75
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:65
static int tcp
Option -t: TCP requested.
Definition: gnunet-vpn.c:70
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
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:1303
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
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
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.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.

References _, allocation_cb(), cfg, do_disconnect(), duration, etime, GNUNET_CRYPTO_eddsa_public_key_from_string(), GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_TIME_relative_to_absolute(), GNUNET_TUN_service_name_to_hash(), GNUNET_VPN_connect(), GNUNET_VPN_redirect_to_ip(), GNUNET_VPN_redirect_to_peer(), handle, ipv4, ipv6, peer, peer_id, request, ret, service_name, target_ip, tcp, and udp.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *const *  argv 
)

Definition at line 289 of file gnunet-vpn.c.

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 }
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 unsigned int verbosity
Selected level of verbosity.
Definition: gnunet-vpn.c:80
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
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_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
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
Definition of a command line option.

References duration, gettext_noop, GNUNET_free_nz, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_relative_time(), GNUNET_GETOPT_option_string(), GNUNET_GETOPT_option_verbose(), GNUNET_OK, GNUNET_PROGRAM_run(), GNUNET_STRINGS_get_utf8_args(), ipv4, ipv6, options, peer_id, ret, run(), service_name, target_ip, tcp, udp, and verbosity.

Here is the call graph for this function:

Variable Documentation

◆ handle

struct GNUNET_VPN_Handle* handle
static

Handle to vpn service.

Definition at line 35 of file gnunet-vpn.c.

Referenced by do_disconnect(), and run().

◆ request

◆ peer_id

char* peer_id
static

Option -p: destination peer identity for service.

Definition at line 45 of file gnunet-vpn.c.

Referenced by do_disconnect(), main(), and run().

◆ service_name

◆ target_ip

char* target_ip
static

Option -i: target IP.

Definition at line 55 of file gnunet-vpn.c.

Referenced by do_disconnect(), main(), and run().

◆ ipv4

◆ ipv6

◆ tcp

int tcp
static

◆ udp

◆ verbosity

unsigned int verbosity
static

Selected level of verbosity.

Definition at line 80 of file gnunet-vpn.c.

Referenced by main().

◆ ret

int ret
static

Global return value.

Definition at line 85 of file gnunet-vpn.c.

Referenced by allocation_cb(), main(), and run().

◆ duration

struct GNUNET_TIME_Relative duration = { 5 * 60 * 1000 }
static

Option '-d': duration of the mapping.

Definition at line 85 of file gnunet-vpn.c.

Referenced by main(), and run().