GNUnet 0.21.1
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 348 of file vpn_api.c.

349{
351
353 vh->mq = NULL;
354 vh->request_id_gen = 0;
355 for (rr = vh->rr_head; NULL != rr; rr = rr->next)
356 rr->request_id = 0;
360 vh->backoff, 2),
365 vh);
366}
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:683
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:1278
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:343
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:531
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:351
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
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:484
struct GNUNET_TIME_Relative backoff
How long do we wait until we try to reconnect?
Definition: vpn_api.c:64
uint64_t request_id_gen
ID of the last request that was submitted to the service.
Definition: vpn_api.c:69
struct GNUNET_SCHEDULER_Task * rt
Identifier of a reconnect task.
Definition: vpn_api.c:59
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition: vpn_api.c:44
struct GNUNET_VPN_RedirectionRequest * rr_head
Head of list of active redirection requests.
Definition: vpn_api.c:49
Opaque redirection request handle.
Definition: vpn_api.c:77
struct GNUNET_VPN_Handle * vh
Pointer to the VPN struct.
Definition: vpn_api.c:91
uint64_t request_id
non-zero if this request has been sent to the service.
Definition: vpn_api.c:127
struct GNUNET_VPN_RedirectionRequest * next
Element in DLL.
Definition: vpn_api.c:81
static void connect_task(void *cls)
Connect to the VPN service and start again to transmit our requests.
Definition: vpn_api.c:317

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, GNUNET_VPN_Handle::rt, and GNUNET_VPN_RedirectionRequest::vh.

Referenced by mq_error_handler().

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 164 of file vpn_api.c.

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

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, RedirectToIpResponseMessage::header, consensus-simulation::int, RedirectToIpResponseMessage::request_id, RedirectToIpResponseMessage::result_af, and GNUNET_MessageHeader::size.

◆ 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 207 of file vpn_api.c.

209{
210 struct GNUNET_VPN_Handle *vh = cls;
212 int af;
213
214 af = (int) ntohl (rm->result_af);
215 for (rr = vh->rr_head; NULL != rr; rr = rr->next)
216 {
217 if (rr->request_id == rm->request_id)
218 {
220 vh->rr_tail,
221 rr);
222 rr->cb (rr->cb_cls,
223 af,
224 (af == AF_UNSPEC) ? NULL : &rm[1]);
225 GNUNET_free (rr);
226 break;
227 }
228 }
229}
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_free(ptr)
Wrapper around free.
Opaque VPN handle.
Definition: vpn_api.c:35
struct GNUNET_VPN_RedirectionRequest * rr_tail
Tail of list of active redirection requests.
Definition: vpn_api.c:54
GNUNET_VPN_AllocationCallback cb
Function to call with the designated IP address.
Definition: vpn_api.c:102
void * cb_cls
Closure for cb.
Definition: vpn_api.c:107

References GNUNET_VPN_RedirectionRequest::cb, GNUNET_VPN_RedirectionRequest::cb_cls, GNUNET_CONTAINER_DLL_remove, GNUNET_free, consensus-simulation::int, GNUNET_VPN_RedirectionRequest::next, RedirectToIpResponseMessage::request_id, GNUNET_VPN_RedirectionRequest::request_id, RedirectToIpResponseMessage::result_af, GNUNET_VPN_Handle::rr_head, GNUNET_VPN_Handle::rr_tail, and GNUNET_VPN_RedirectionRequest::vh.

◆ 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 238 of file vpn_api.c.

239{
240 struct GNUNET_VPN_Handle *vh = rr->vh;
241 struct RedirectToIpRequestMessage *rip;
243 struct GNUNET_MQ_Envelope *env;
244 size_t alen;
245
246 if (NULL == vh->mq)
247 return;
248 if (NULL == rr->addr)
249 {
250 env = GNUNET_MQ_msg (rs,
252 rs->reserved = htonl (0);
254 rs->protocol = htonl (rr->protocol);
255 rs->result_af = htonl (rr->result_af);
256 rs->target = rr->peer;
257 rs->service_descriptor = rr->serv;
258 rs->request_id = rr->request_id = ++vh->request_id_gen;
259 }
260 else
261 {
262 switch (rr->addr_af)
263 {
264 case AF_INET:
265 alen = sizeof(struct in_addr);
266 break;
267
268 case AF_INET6:
269 alen = sizeof(struct in6_addr);
270 break;
271
272 default:
273 GNUNET_assert (0);
274 return;
275 }
277 alen,
279 rip->reserved = htonl (0);
281 rip->result_af = htonl (rr->result_af);
282 rip->addr_af = htonl (rr->addr_af);
283 rip->request_id = rr->request_id = ++vh->request_id_gen;
284 GNUNET_memcpy (&rip[1],
285 rr->addr,
286 alen);
287 }
288 GNUNET_MQ_send (vh->mq,
289 env);
290}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
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:304
#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:63
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#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...
#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.
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:638
const void * addr
Target IP address for the redirection, or NULL for redirection to service.
Definition: vpn_api.c:97
struct GNUNET_PeerIdentity peer
For service redirection, identity of the peer offering the service.
Definition: vpn_api.c:112
uint8_t protocol
For service redirection, IPPROT_UDP or IPPROTO_TCP.
Definition: vpn_api.c:142
struct GNUNET_TIME_Absolute expiration_time
At what time should the created service mapping expire?
Definition: vpn_api.c:122
int addr_af
Address family of addr.
Definition: vpn_api.c:137
int result_af
Desired address family for the result.
Definition: vpn_api.c:132
struct GNUNET_HashCode serv
For service redirection, service descriptor.
Definition: vpn_api.c:117
Message send by the VPN client to the VPN service requesting the setup of a redirection from some IP ...
Definition: vpn.h:39
uint64_t request_id
Unique ID to match a future response to this request.
Definition: vpn.h:69
uint32_t reserved
Always zero.
Definition: vpn.h:48
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
int32_t result_af
Address family desired for the result (AF_INET or AF_INET6 or AF_UNSPEC, in nbo)
Definition: vpn.h:58
Message send by the VPN client to the VPN service requesting the setup of a redirection from some IP ...
Definition: vpn.h:81
int32_t result_af
Address family desired for the result (AF_INET or AF_INET6 or AF_UNSPEC, in nbo)
Definition: vpn.h:105
struct GNUNET_TIME_AbsoluteNBO expiration_time
How long should the redirection be maintained at most?
Definition: vpn.h:95
struct GNUNET_PeerIdentity target
Target peer offering the service.
Definition: vpn.h:110
uint64_t request_id
Unique ID to match a future response to this request.
Definition: vpn.h:121
uint32_t reserved
Always zero.
Definition: vpn.h:90
struct GNUNET_HashCode service_descriptor
Service descriptor identifying the service.
Definition: vpn.h:115
int32_t protocol
Desired protocol (IPPROTO_UDP or IPPROTO_TCP)
Definition: vpn.h:100

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().

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 302 of file vpn_api.c.

304{
305 struct GNUNET_VPN_Handle *vh = cls;
306
307 reconnect (vh);
308}
static void reconnect(struct GNUNET_VPN_Handle *vh)
Disconnect from the service (communication error) and reconnect later.
Definition: vpn_api.c:348

References reconnect().

Referenced by connect_task().

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 317 of file vpn_api.c.

318{
319 struct GNUNET_VPN_Handle *vh = cls;
321 GNUNET_MQ_hd_var_size (use_ip,
324 cls),
326 };
328
329 vh->rt = NULL;
331 "vpn",
332 handlers,
334 vh);
335 if (NULL == vh->mq)
336 return;
337 for (rr = vh->rr_head; NULL != rr; rr = rr->next)
338 send_request (rr);
339}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
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:1057
void * cls
Closure for mv and cb.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_VPN_CLIENT_USE_IP
VPN service responds to client with an IP to use for the requested redirection.
Message handler for a specific message type.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we use.
Definition: vpn_api.c:39
Response from the VPN service to a VPN client informing about the IP that was assigned for the reques...
Definition: vpn.h:130
static void send_request(struct GNUNET_VPN_RedirectionRequest *rr)
Add a request to our request queue and transmit it.
Definition: vpn_api.c:238
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:302

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

Referenced by GNUNET_VPN_connect(), and reconnect().

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