GNUnet  0.10.x
Data Structures | Functions
vpn_api.c File Reference

library to access the VPN service and tell it how to redirect traffic More...

#include "platform.h"
#include "gnunet_vpn_service.h"
#include "vpn.h"
Include dependency graph for vpn_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_VPN_Handle
 Opaque VPN handle. More...
 
struct  GNUNET_VPN_RedirectionRequest
 Opaque redirection request handle. More...
 

Functions

static void reconnect (struct GNUNET_VPN_Handle *vh)
 Disconnect from the service (communication error) and reconnect later. More...
 
static int check_use_ip (void *cls, const struct RedirectToIpResponseMessage *rm)
 Check a GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP message from the VPN service. More...
 
static void handle_use_ip (void *cls, const struct RedirectToIpResponseMessage *rm)
 Handle a GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP message from the VPN service. More...
 
static void send_request (struct GNUNET_VPN_RedirectionRequest *rr)
 Add a request to our request queue and transmit it. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
static void connect_task (void *cls)
 Connect to the VPN service and start again to transmit our requests. More...
 
void GNUNET_VPN_cancel_request (struct GNUNET_VPN_RedirectionRequest *rr)
 Cancel redirection request with the service. More...
 
struct GNUNET_VPN_RedirectionRequestGNUNET_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. More...
 
struct GNUNET_VPN_RedirectionRequestGNUNET_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. More...
 
struct GNUNET_VPN_HandleGNUNET_VPN_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Connect to the VPN service. More...
 
void GNUNET_VPN_disconnect (struct GNUNET_VPN_Handle *vh)
 Disconnect from the VPN service. More...
 

Detailed Description

library to access the VPN service and tell it how to redirect traffic

Author
Christian Grothoff

Definition in file vpn_api.c.

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_VPN_Handle vh)
static

Disconnect from the service (communication error) and reconnect later.

Parameters
vhhandle to reconnect.

Definition at line 345 of file vpn_api.c.

References GNUNET_VPN_Handle::backoff, connect_task(), GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_relative_max(), GNUNET_TIME_relative_min(), GNUNET_TIME_relative_multiply(), GNUNET_TIME_relative_saturating_multiply(), GNUNET_TIME_UNIT_MILLISECONDS, GNUNET_TIME_UNIT_SECONDS, GNUNET_VPN_Handle::mq, GNUNET_VPN_RedirectionRequest::next, GNUNET_VPN_RedirectionRequest::request_id, GNUNET_VPN_Handle::request_id_gen, GNUNET_VPN_Handle::rr_head, and GNUNET_VPN_Handle::rt.

Referenced by mq_error_handler().

346 {
348 
349  GNUNET_MQ_destroy (vh->mq);
350  vh->mq = NULL;
351  vh->request_id_gen = 0;
352  for (rr = vh->rr_head; NULL != rr; rr = rr->next)
353  rr->request_id = 0;
358  &connect_task,
359  vh);
360 }
struct GNUNET_SCHEDULER_Task * rt
Identifier of a reconnect task.
Definition: vpn_api.c:59
uint64_t request_id_gen
ID of the last request that was submitted to the service.
Definition: vpn_api.c:69
struct GNUNET_VPN_RedirectionRequest * next
Element in DLL.
Definition: vpn_api.c:82
struct GNUNET_TIME_Relative GNUNET_TIME_relative_max(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the maximum of two relative time values.
Definition: time.c:286
#define GNUNET_TIME_UNIT_SECONDS
One second.
static void connect_task(void *cls)
Connect to the VPN service and start again to transmit our requests.
Definition: vpn_api.c:314
uint64_t request_id
non-zero if this request has been sent to the service.
Definition: vpn_api.c:128
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition: vpn_api.c:44
struct GNUNET_TIME_Relative backoff
How long do we wait until we try to reconnect?
Definition: vpn_api.c:64
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1246
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:439
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
Definition: time.c:271
Opaque redirection request handle.
Definition: vpn_api.c:77
struct GNUNET_VPN_RedirectionRequest * rr_head
Head of list of active redirection requests.
Definition: vpn_api.c:49
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
struct GNUNET_TIME_Relative GNUNET_TIME_relative_saturating_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Saturating multiply relative time by a given factor.
Definition: time.c:499
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_use_ip()

static int check_use_ip ( void *  cls,
const struct RedirectToIpResponseMessage rm 
)
static

Check a GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP message from the VPN service.

Parameters
clsthe struct GNUNET_VPN_Handle
rmmessage received
Returns
GNUNET_OK if rm is well-formed

Definition at line 166 of file vpn_api.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, RedirectToIpResponseMessage::header, RedirectToIpResponseMessage::request_id, RedirectToIpResponseMessage::result_af, and GNUNET_MessageHeader::size.

168 {
169  size_t alen;
170  int af;
171 
172  af = (int) ntohl (rm->result_af);
173  switch (af)
174  {
175  case AF_UNSPEC:
176  alen = 0;
177  break;
178  case AF_INET:
179  alen = sizeof (struct in_addr);
180  break;
181  case AF_INET6:
182  alen = sizeof (struct in6_addr);
183  break;
184  default:
185  GNUNET_break (0);
186  return GNUNET_SYSERR;
187  }
188  if ( (ntohs (rm->header.size) != alen + sizeof (*rm)) ||
189  (0 == rm->request_id) )
190  {
191  GNUNET_break (0);
192  return GNUNET_SYSERR;
193  }
194  return GNUNET_OK;
195 }
uint64_t request_id
Unique ID to match the response to a request.
Definition: vpn.h:148
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP.
Definition: vpn.h:137
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
int32_t result_af
Address family of the allocated address that follows; will match "result_af" from the request...
Definition: vpn.h:143

◆ handle_use_ip()

static void handle_use_ip ( void *  cls,
const struct RedirectToIpResponseMessage rm 
)
static

Handle a GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP message from the VPN service.

Parameters
clsthe struct GNUNET_VPN_Handle
rmmessage received

Definition at line 206 of file vpn_api.c.

References GNUNET_VPN_RedirectionRequest::cb, GNUNET_VPN_RedirectionRequest::cb_cls, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_VPN_RedirectionRequest::next, GNUNET_VPN_RedirectionRequest::request_id, RedirectToIpResponseMessage::request_id, RedirectToIpResponseMessage::result_af, GNUNET_VPN_Handle::rr_head, and GNUNET_VPN_Handle::rr_tail.

208 {
209  struct GNUNET_VPN_Handle *vh = cls;
211  int af;
212 
213  af = (int) ntohl (rm->result_af);
214  for (rr = vh->rr_head; NULL != rr; rr = rr->next)
215  {
216  if (rr->request_id == rm->request_id)
217  {
219  vh->rr_tail,
220  rr);
221  rr->cb (rr->cb_cls,
222  af,
223  (af == AF_UNSPEC) ? NULL : &rm[1]);
224  GNUNET_free (rr);
225  break;
226  }
227  }
228 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_VPN_RedirectionRequest * next
Element in DLL.
Definition: vpn_api.c:82
uint64_t request_id
Unique ID to match the response to a request.
Definition: vpn.h:148
uint64_t request_id
non-zero if this request has been sent to the service.
Definition: vpn_api.c:128
Opaque VPN handle.
Definition: vpn_api.c:34
GNUNET_VPN_AllocationCallback cb
Function to call with the designated IP address.
Definition: vpn_api.c:103
struct GNUNET_VPN_RedirectionRequest * rr_tail
Tail of list of active redirection requests.
Definition: vpn_api.c:54
int32_t result_af
Address family of the allocated address that follows; will match "result_af" from the request...
Definition: vpn.h:143
Opaque redirection request handle.
Definition: vpn_api.c:77
void * cb_cls
Closure for cb.
Definition: vpn_api.c:108
struct GNUNET_VPN_RedirectionRequest * rr_head
Head of list of active redirection requests.
Definition: vpn_api.c:49
#define GNUNET_free(ptr)
Wrapper around free.

◆ send_request()

static void send_request ( struct GNUNET_VPN_RedirectionRequest rr)
static

Add a request to our request queue and transmit it.

Parameters
rrrequest to queue and transmit.

Definition at line 237 of file vpn_api.c.

References GNUNET_VPN_RedirectionRequest::addr, RedirectToIpRequestMessage::addr_af, GNUNET_VPN_RedirectionRequest::addr_af, env, RedirectToIpRequestMessage::expiration_time, RedirectToServiceRequestMessage::expiration_time, GNUNET_VPN_RedirectionRequest::expiration_time, GNUNET_assert, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_VPN_CLIENT_REDIRECT_TO_IP, GNUNET_MESSAGE_TYPE_VPN_CLIENT_REDIRECT_TO_SERVICE, GNUNET_MQ_msg, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_TIME_absolute_hton(), GNUNET_VPN_Handle::mq, GNUNET_VPN_RedirectionRequest::peer, RedirectToServiceRequestMessage::protocol, GNUNET_VPN_RedirectionRequest::protocol, RedirectToIpRequestMessage::request_id, RedirectToServiceRequestMessage::request_id, GNUNET_VPN_RedirectionRequest::request_id, GNUNET_VPN_Handle::request_id_gen, RedirectToIpRequestMessage::reserved, RedirectToServiceRequestMessage::reserved, RedirectToIpRequestMessage::result_af, RedirectToServiceRequestMessage::result_af, GNUNET_VPN_RedirectionRequest::result_af, GNUNET_VPN_RedirectionRequest::serv, RedirectToServiceRequestMessage::service_descriptor, RedirectToServiceRequestMessage::target, and GNUNET_VPN_RedirectionRequest::vh.

Referenced by connect_task(), GNUNET_VPN_redirect_to_ip(), and GNUNET_VPN_redirect_to_peer().

238 {
239  struct GNUNET_VPN_Handle *vh = rr->vh;
240  struct RedirectToIpRequestMessage *rip;
242  struct GNUNET_MQ_Envelope *env;
243  size_t alen;
244 
245  if (NULL == vh->mq)
246  return;
247  if (NULL == rr->addr)
248  {
249  env = GNUNET_MQ_msg (rs,
251  rs->reserved = htonl (0);
253  rs->protocol = htonl (rr->protocol);
254  rs->result_af = htonl (rr->result_af);
255  rs->target = rr->peer;
256  rs->service_descriptor = rr->serv;
257  rs->request_id = rr->request_id = ++vh->request_id_gen;
258  }
259  else
260  {
261  switch (rr->addr_af)
262  {
263  case AF_INET:
264  alen = sizeof (struct in_addr);
265  break;
266  case AF_INET6:
267  alen = sizeof (struct in6_addr);
268  break;
269  default:
270  GNUNET_assert (0);
271  return;
272  }
273  env = GNUNET_MQ_msg_extra (rip,
274  alen,
276  rip->reserved = htonl (0);
278  rip->result_af = htonl (rr->result_af);
279  rip->addr_af = htonl (rr->addr_af);
280  rip->request_id = rr->request_id = ++vh->request_id_gen;
281  GNUNET_memcpy (&rip[1],
282  rr->addr,
283  alen);
284  }
285  GNUNET_MQ_send (vh->mq,
286  env);
287 }
struct GNUNET_HashCode service_descriptor
Service descriptor identifying the service.
Definition: vpn.h:116
int result_af
Desired address family for the result.
Definition: vpn_api.c:133
uint64_t request_id_gen
ID of the last request that was submitted to the service.
Definition: vpn_api.c:69
struct GNUNET_PeerIdentity target
Target peer offering the service.
Definition: vpn.h:111
#define GNUNET_MESSAGE_TYPE_VPN_CLIENT_REDIRECT_TO_SERVICE
Client asks VPN service to setup an IP to redirect traffic to some peer offering a service...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_PeerIdentity peer
For service redirection, identity of the peer offering the service.
Definition: vpn_api.c:113
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
int32_t result_af
Address family desired for the result (AF_INET or AF_INET6 or AF_UNSPEC, in nbo)
Definition: vpn.h:106
int32_t protocol
Desired protocol (IPPROTO_UDP or IPPROTO_TCP)
Definition: vpn.h:101
uint64_t request_id
non-zero if this request has been sent to the service.
Definition: vpn_api.c:128
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition: vpn_api.c:44
Message send by the VPN client to the VPN service requesting the setup of a redirection from some IP ...
Definition: vpn.h:38
struct GNUNET_TIME_Absolute expiration_time
At what time should the created service mapping expire?
Definition: vpn_api.c:123
Opaque VPN handle.
Definition: vpn_api.c:34
uint32_t reserved
Always zero.
Definition: vpn.h:48
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
#define GNUNET_memcpy(dst, src, n)
#define GNUNET_MESSAGE_TYPE_VPN_CLIENT_REDIRECT_TO_IP
Client asks VPN service to setup an IP to redirect traffic via an exit node to some global IP address...
int32_t result_af
Address family desired for the result (AF_INET or AF_INET6 or AF_UNSPEC, in nbo)
Definition: vpn.h:58
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
uint32_t reserved
Always zero.
Definition: vpn.h:91
struct GNUNET_TIME_AbsoluteNBO expiration_time
How long should the redirection be maintained at most?
Definition: vpn.h:96
uint64_t request_id
Unique ID to match a future response to this request.
Definition: vpn.h:122
int32_t addr_af
Address family used for the destination address (AF_INET or AF_INET6, in nbo)
Definition: vpn.h:63
struct GNUNET_TIME_AbsoluteNBO expiration_time
How long should the redirection be maintained at most?
Definition: vpn.h:53
uint8_t protocol
For service redirection, IPPROT_UDP or IPPROTO_TCP.
Definition: vpn_api.c:143
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
int addr_af
Address family of addr.
Definition: vpn_api.c:138
uint64_t request_id
Unique ID to match a future response to this request.
Definition: vpn.h:69
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:654
struct GNUNET_HashCode serv
For service redirection, service descriptor.
Definition: vpn_api.c:118
Message send by the VPN client to the VPN service requesting the setup of a redirection from some IP ...
Definition: vpn.h:81
const void * addr
Target IP address for the redirection, or NULL for redirection to service.
Definition: vpn_api.c:98
struct GNUNET_VPN_Handle * vh
Pointer to the VPN struct.
Definition: vpn_api.c:92
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_VPN_Handle *
errorerror code

Definition at line 299 of file vpn_api.c.

References reconnect().

Referenced by connect_task().

301 {
302  struct GNUNET_VPN_Handle *vh = cls;
303 
304  reconnect (vh);
305 }
Opaque VPN handle.
Definition: vpn_api.c:34
static void reconnect(struct GNUNET_VPN_Handle *vh)
Disconnect from the service (communication error) and reconnect later.
Definition: vpn_api.c:345
Here is the call graph for this function:
Here is the caller graph for this function:

◆ connect_task()

static void connect_task ( void *  cls)
static

Connect to the VPN service and start again to transmit our requests.

Parameters
clsthe struct GNUNET_VPN_Handle *

Definition at line 314 of file vpn_api.c.

References GNUNET_VPN_Handle::cfg, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_VPN_Handle::mq, mq_error_handler(), GNUNET_VPN_RedirectionRequest::next, GNUNET_VPN_Handle::rr_head, GNUNET_VPN_Handle::rt, and send_request().

Referenced by GNUNET_VPN_connect(), and reconnect().

315 {
316  struct GNUNET_VPN_Handle *vh = cls;
318  GNUNET_MQ_hd_var_size (use_ip,
321  cls),
323  };
325 
326  vh->rt = NULL;
327  vh->mq = GNUNET_CLIENT_connect (vh->cfg,
328  "vpn",
329  handlers,
331  vh);
332  if (NULL == vh->mq)
333  return;
334  for (rr = vh->rr_head; NULL != rr; rr = rr->next)
335  send_request (rr);
336 }
Response from the VPN service to a VPN client informing about the IP that was assigned for the reques...
Definition: vpn.h:131
struct GNUNET_SCHEDULER_Task * rt
Identifier of a reconnect task.
Definition: vpn_api.c:59
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:901
struct GNUNET_VPN_RedirectionRequest * next
Element in DLL.
Definition: vpn_api.c:82
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition: vpn_api.c:44
Opaque VPN handle.
Definition: vpn_api.c:34
#define GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP
VPN service responds to client with an IP to use for the requested redirection.
void * cls
Closure for mv and cb.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
Message handler for a specific message type.
Opaque redirection request handle.
Definition: vpn_api.c:77
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
Definition: vpn_api.c:299
struct GNUNET_VPN_RedirectionRequest * rr_head
Head of list of active redirection requests.
Definition: vpn_api.c:49
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we use.
Definition: vpn_api.c:39
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
static void send_request(struct GNUNET_VPN_RedirectionRequest *rr)
Add a request to our request queue and transmit it.
Definition: vpn_api.c:237
Here is the call graph for this function:
Here is the caller graph for this function: