GNUnet  0.10.x
Data Structures | Macros | Functions
dnsstub.c File Reference
#include "platform.h"
#include "gnunet_util_lib.h"
Include dependency graph for dnsstub.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_DNSSTUB_RequestSocket
 UDP socket we are using for sending DNS requests to the Internet. More...
 
struct  DnsServer
 DNS Server used for resolution. More...
 
struct  GNUNET_DNSSTUB_Context
 Handle to the stub resolver. More...
 

Macros

#define DNS_RETRANSMIT_DELAY   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250)
 Timeout for retrying DNS queries. More...
 

Functions

static void cleanup_rs (struct GNUNET_DNSSTUB_RequestSocket *rs)
 We're done with a struct GNUNET_DNSSTUB_RequestSocket, close it for now. More...
 
static struct GNUNET_NETWORK_Handleopen_socket (int af)
 Open source port for sending DNS requests. More...
 
static struct GNUNET_DNSSTUB_RequestSocketget_request_socket (struct GNUNET_DNSSTUB_Context *ctx)
 Get a socket of the specified address family to send out a UDP DNS request to the Internet. More...
 
static int do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs, struct GNUNET_NETWORK_Handle *dnsout)
 Actually do the reading of a DNS packet from our UDP socket and see if we have a valid, matching, pending request. More...
 
static void read_response (void *cls)
 Read a DNS response from the (unhindered) UDP-Socket. More...
 
static void schedule_read (struct GNUNET_DNSSTUB_RequestSocket *rs)
 Schedule read_response() task for rs. More...
 
static void transmit_query (void *cls)
 Task to (re)transmit the DNS query, possibly repeatedly until we succeed. More...
 
struct GNUNET_DNSSTUB_RequestSocketGNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx, const void *request, size_t request_len, GNUNET_DNSSTUB_ResultCallback rc, void *rc_cls)
 Perform DNS resolution using our default IP from init. More...
 
void GNUNET_DNSSTUB_resolve_cancel (struct GNUNET_DNSSTUB_RequestSocket *rs)
 Cancel DNS resolution. More...
 
struct GNUNET_DNSSTUB_ContextGNUNET_DNSSTUB_start (unsigned int num_sockets)
 Start a DNS stub resolver. More...
 
int GNUNET_DNSSTUB_add_dns_ip (struct GNUNET_DNSSTUB_Context *ctx, const char *dns_ip)
 Add nameserver for use by the DNSSTUB. More...
 
int GNUNET_DNSSTUB_add_dns_sa (struct GNUNET_DNSSTUB_Context *ctx, const struct sockaddr *sa)
 Add nameserver for use by the DNSSTUB. More...
 
void GNUNET_DNSSTUB_set_retry (struct GNUNET_DNSSTUB_Context *ctx, struct GNUNET_TIME_Relative retry_freq)
 How long should we try requests before timing out? Only effective for requests issued after this call. More...
 
void GNUNET_DNSSTUB_stop (struct GNUNET_DNSSTUB_Context *ctx)
 Cleanup DNSSTUB resolver. More...
 

Macro Definition Documentation

◆ DNS_RETRANSMIT_DELAY

#define DNS_RETRANSMIT_DELAY   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 250)

Timeout for retrying DNS queries.

Definition at line 31 of file dnsstub.c.

Referenced by GNUNET_DNSSTUB_start().

Function Documentation

◆ cleanup_rs()

static void cleanup_rs ( struct GNUNET_DNSSTUB_RequestSocket rs)
static

We're done with a struct GNUNET_DNSSTUB_RequestSocket, close it for now.

Parameters
rsrequest socket to clean up

Definition at line 155 of file dnsstub.c.

References GNUNET_DNSSTUB_RequestSocket::dnsout4, GNUNET_DNSSTUB_RequestSocket::dnsout6, GNUNET_free, GNUNET_NETWORK_socket_close(), GNUNET_SCHEDULER_cancel(), GNUNET_DNSSTUB_RequestSocket::read_task, GNUNET_DNSSTUB_RequestSocket::request, and GNUNET_DNSSTUB_RequestSocket::retry_task.

Referenced by GNUNET_DNSSTUB_stop().

156 {
157  if (NULL != rs->dnsout4)
158  {
160  rs->dnsout4 = NULL;
161  }
162  if (NULL != rs->dnsout6)
163  {
165  rs->dnsout6 = NULL;
166  }
167  if (NULL != rs->read_task)
168  {
170  rs->read_task = NULL;
171  }
172  if (NULL != rs->retry_task)
173  {
175  rs->retry_task = NULL;
176  }
177  if (NULL != rs->request)
178  {
179  GNUNET_free(rs->request);
180  rs->request = NULL;
181  }
182 }
struct GNUNET_SCHEDULER_Task * read_task
Task for reading from dnsout4 and dnsout6.
Definition: dnsstub.c:68
struct GNUNET_NETWORK_Handle * dnsout6
UDP socket we use for this request for IPv6.
Definition: dnsstub.c:53
void * request
Query we sent to addr.
Definition: dnsstub.c:88
struct GNUNET_NETWORK_Handle * dnsout4
UDP socket we use for this request for IPv4.
Definition: dnsstub.c:48
struct GNUNET_SCHEDULER_Task * retry_task
Task for retrying transmission of the query.
Definition: dnsstub.c:73
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:548
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ open_socket()

static struct GNUNET_NETWORK_Handle* open_socket ( int  af)
static

Open source port for sending DNS requests.

Parameters
afAF_INET or AF_INET6
Returns
GNUNET_OK on success

Definition at line 192 of file dnsstub.c.

References _, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NETWORK_socket_bind(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_create(), GNUNET_OK, and ret.

Referenced by transmit_query().

193 {
194  struct sockaddr_in a4;
195  struct sockaddr_in6 a6;
196  struct sockaddr *sa;
197  socklen_t alen;
198  struct GNUNET_NETWORK_Handle *ret;
199 
200  ret = GNUNET_NETWORK_socket_create(af, SOCK_DGRAM, 0);
201  if (NULL == ret)
202  return NULL;
203  switch (af)
204  {
205  case AF_INET:
206  memset(&a4, 0, alen = sizeof(struct sockaddr_in));
207  sa = (struct sockaddr *)&a4;
208  break;
209 
210  case AF_INET6:
211  memset(&a6, 0, alen = sizeof(struct sockaddr_in6));
212  sa = (struct sockaddr *)&a6;
213  break;
214 
215  default:
216  GNUNET_break(0);
218  return NULL;
219  }
220  sa->sa_family = af;
221  if (GNUNET_OK != GNUNET_NETWORK_socket_bind(ret, sa, alen))
222  {
224  _("Could not bind to any port: %s\n"),
225  strerror(errno));
227  return NULL;
228  }
229  return ret;
230 }
int GNUNET_NETWORK_socket_bind(struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, socklen_t address_len)
Bind a socket to a particular address.
Definition: network.c:474
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define GNUNET_log(kind,...)
handle to a socket
Definition: network.c:46
int af
Address family / domain.
Definition: network.c:52
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:548
struct GNUNET_NETWORK_Handle * GNUNET_NETWORK_socket_create(int domain, int type, int protocol)
Create a new socket.
Definition: network.c:900
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_request_socket()

static struct GNUNET_DNSSTUB_RequestSocket* get_request_socket ( struct GNUNET_DNSSTUB_Context ctx)
static

Get a socket of the specified address family to send out a UDP DNS request to the Internet.

Parameters
ctxthe DNSSTUB context
Returns
NULL on error

Definition at line 241 of file dnsstub.c.

References GNUNET_DNSSTUB_RequestSocket::ctx, GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_CRYPTO_random_u32(), GNUNET_free, GNUNET_SCHEDULER_cancel(), GNUNET_DNSSTUB_Context::num_sockets, GNUNET_DNSSTUB_RequestSocket::rc, GNUNET_DNSSTUB_RequestSocket::rc_cls, GNUNET_DNSSTUB_RequestSocket::read_task, GNUNET_DNSSTUB_RequestSocket::request, GNUNET_DNSSTUB_RequestSocket::retry_task, and GNUNET_DNSSTUB_Context::sockets.

Referenced by GNUNET_DNSSTUB_resolve().

242 {
243  struct GNUNET_DNSSTUB_RequestSocket *rs;
244 
245  for (unsigned int i = 0; i < 256; i++)
246  {
248  ctx->num_sockets)];
249  if (NULL == rs->rc)
250  break;
251  }
252  if (NULL != rs->rc)
253  {
254  /* signal "failure" */
255  rs->rc(rs->rc_cls, NULL, 0);
256  rs->rc = NULL;
257  }
258  if (NULL != rs->read_task)
259  {
261  rs->read_task = NULL;
262  }
263  if (NULL != rs->retry_task)
264  {
266  rs->retry_task = NULL;
267  }
268  if (NULL != rs->request)
269  {
270  GNUNET_free(rs->request);
271  rs->request = NULL;
272  }
273  rs->ctx = ctx;
274  return rs;
275 }
struct GNUNET_SCHEDULER_Task * read_task
Task for reading from dnsout4 and dnsout6.
Definition: dnsstub.c:68
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
GNUNET_DNSSTUB_ResultCallback rc
Function to call with result.
Definition: dnsstub.c:58
void * request
Query we sent to addr.
Definition: dnsstub.c:88
struct GNUNET_DNSSTUB_Context * ctx
Context this request executes in.
Definition: dnsstub.c:83
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
unsigned int num_sockets
Length of sockets array.
Definition: dnsstub.c:145
Randomness for IVs etc.
struct GNUNET_DNSSTUB_RequestSocket * sockets
Array of all open sockets for DNS requests.
Definition: dnsstub.c:125
void * rc_cls
Closure for rc.
Definition: dnsstub.c:63
struct GNUNET_SCHEDULER_Task * retry_task
Task for retrying transmission of the query.
Definition: dnsstub.c:73
UDP socket we are using for sending DNS requests to the Internet.
Definition: dnsstub.c:44
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_dns_read()

static int do_dns_read ( struct GNUNET_DNSSTUB_RequestSocket rs,
struct GNUNET_NETWORK_Handle dnsout 
)
static

Actually do the reading of a DNS packet from our UDP socket and see if we have a valid, matching, pending request.

Parameters
rsrequest socket with callback details
dnsoutsocket to read from
Returns
GNUNET_OK on success, GNUNET_NO on drop, GNUNET_SYSERR on IO-errors (closed socket)

Definition at line 287 of file dnsstub.c.

References _, buf, GNUNET_DNSSTUB_RequestSocket::ctx, GNUNET_DNSSTUB_Context::dns_head, ds, GNUNET_ALIGN, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_log_strerror, GNUNET_MIN, GNUNET_NETWORK_get_fd(), GNUNET_NETWORK_socket_close(), GNUNET_NETWORK_socket_recvfrom(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, len, GNUNET_DNSSTUB_RequestSocket::rc, GNUNET_DNSSTUB_RequestSocket::rc_cls, and read_response().

Referenced by read_response().

289 {
290  struct GNUNET_DNSSTUB_Context *ctx = rs->ctx;
291  ssize_t r;
292  int len;
293 
294  if (0 != ioctl(GNUNET_NETWORK_get_fd(dnsout), FIONREAD, &len))
295  {
296  /* conservative choice: */
297  len = UINT16_MAX;
298  }
299 
300  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Receiving %d byte DNS reply\n", len);
301  {
302  unsigned char buf[len] GNUNET_ALIGN;
303  int found;
304  struct sockaddr_storage addr;
305  socklen_t addrlen;
306  struct GNUNET_TUN_DnsHeader *dns;
307 
308  addrlen = sizeof(addr);
309  memset(&addr, 0, sizeof(addr));
311  buf,
312  sizeof(buf),
313  (struct sockaddr *)&addr,
314  &addrlen);
315  if (-1 == r)
316  {
319  return GNUNET_SYSERR;
320  }
321  found = GNUNET_NO;
322  for (struct DnsServer *ds = ctx->dns_head; NULL != ds; ds = ds->next)
323  {
324  if (0 == memcmp(&addr,
325  &ds->ss,
326  GNUNET_MIN(sizeof(struct sockaddr_storage), addrlen)))
327  {
328  found = GNUNET_YES;
329  break;
330  }
331  }
332  if (GNUNET_NO == found)
333  {
335  "Received DNS response from server we never asked (ignored)");
336  return GNUNET_NO;
337  }
338  if (sizeof(struct GNUNET_TUN_DnsHeader) > (size_t)r)
339  {
341  _("Received DNS response that is too small (%u bytes)"),
342  (unsigned int)r);
343  return GNUNET_NO;
344  }
345  dns = (struct GNUNET_TUN_DnsHeader *)buf;
346  if (NULL == rs->rc)
347  {
349  "Request timeout or cancelled; ignoring reply\n");
350  return GNUNET_NO;
351  }
352  rs->rc(rs->rc_cls, dns, r);
353  }
354  return GNUNET_OK;
355 }
int GNUNET_NETWORK_get_fd(const struct GNUNET_NETWORK_Handle *desc)
Return file descriptor for this network handle.
Definition: network.c:1068
struct DnsServer * dns_head
DLL of DNS resolvers we use.
Definition: dnsstub.c:130
GNUNET_DNSSTUB_ResultCallback rc
Function to call with result.
Definition: dnsstub.c:58
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
struct GNUNET_DNSSTUB_Context * ctx
Context this request executes in.
Definition: dnsstub.c:83
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
DNS Server used for resolution.
Definition: dnsstub.c:100
#define GNUNET_MIN(a, b)
Definition: gnunet_common.h:80
static char buf[2048]
Handle to the stub resolver.
Definition: dnsstub.c:121
void * rc_cls
Closure for rc.
Definition: dnsstub.c:63
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define GNUNET_ALIGN
gcc-ism to force alignment; we use this to align char-arrays that may then be cast to &#39;struct&#39;s...
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
static struct GNUNET_FS_DirScanner * ds
Handle to the directory scanner (for recursive insertions).
ssize_t GNUNET_NETWORK_socket_recvfrom(const struct GNUNET_NETWORK_Handle *desc, void *buffer, size_t length, struct sockaddr *src_addr, socklen_t *addrlen)
Read data from a socket (always non-blocking).
Definition: network.c:742
int GNUNET_NETWORK_socket_close(struct GNUNET_NETWORK_Handle *desc)
Close a socket.
Definition: network.c:548
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_response()

static void read_response ( void *  cls)
static

Read a DNS response from the (unhindered) UDP-Socket.

Parameters
clssocket to read from
clsstruct GNUNET_DNSSTUB_RequestSocket to read from

Definition at line 401 of file dnsstub.c.

References GNUNET_DNSSTUB_RequestSocket::dnsout4, GNUNET_DNSSTUB_RequestSocket::dnsout6, do_dns_read(), GNUNET_NETWORK_fdset_isset(), GNUNET_SCHEDULER_get_task_context(), GNUNET_SYSERR, GNUNET_SCHEDULER_TaskContext::read_ready, GNUNET_DNSSTUB_RequestSocket::read_task, schedule_read(), and tc.

Referenced by do_dns_read(), and schedule_read().

402 {
403  struct GNUNET_DNSSTUB_RequestSocket *rs = cls;
404  const struct GNUNET_SCHEDULER_TaskContext *tc;
405 
406  rs->read_task = NULL;
408  /* read and process ready sockets */
409  if ((NULL != rs->dnsout4) &&
411  (GNUNET_SYSERR == do_dns_read(rs, rs->dnsout4)))
412  rs->dnsout4 = NULL;
413  if ((NULL != rs->dnsout6) &&
415  (GNUNET_SYSERR == do_dns_read(rs, rs->dnsout6)))
416  rs->dnsout6 = NULL;
417  /* re-schedule read task */
418  schedule_read(rs);
419 }
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:737
struct GNUNET_SCHEDULER_Task * read_task
Task for reading from dnsout4 and dnsout6.
Definition: dnsstub.c:68
struct GNUNET_NETWORK_Handle * dnsout6
UDP socket we use for this request for IPv6.
Definition: dnsstub.c:53
Context information passed to each scheduler task.
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:410
const struct GNUNET_NETWORK_FDSet * read_ready
Set of file descriptors ready for reading; note that additional bits may be set that were not in the ...
static int do_dns_read(struct GNUNET_DNSSTUB_RequestSocket *rs, struct GNUNET_NETWORK_Handle *dnsout)
Actually do the reading of a DNS packet from our UDP socket and see if we have a valid, matching, pending request.
Definition: dnsstub.c:287
static void schedule_read(struct GNUNET_DNSSTUB_RequestSocket *rs)
Schedule read_response() task for rs.
Definition: dnsstub.c:373
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_NETWORK_Handle * dnsout4
UDP socket we use for this request for IPv4.
Definition: dnsstub.c:48
UDP socket we are using for sending DNS requests to the Internet.
Definition: dnsstub.c:44
int GNUNET_NETWORK_fdset_isset(const struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_NETWORK_Handle *desc)
Check whether a socket is part of the fd set.
Definition: network.c:1017
Here is the call graph for this function:
Here is the caller graph for this function:

◆ schedule_read()

static void schedule_read ( struct GNUNET_DNSSTUB_RequestSocket rs)
static

Schedule read_response() task for rs.

Parameters
rsrequest to schedule read operation for

Definition at line 373 of file dnsstub.c.

References GNUNET_DNSSTUB_RequestSocket::dnsout4, GNUNET_DNSSTUB_RequestSocket::dnsout6, GNUNET_NETWORK_fdset_create(), GNUNET_NETWORK_fdset_destroy(), GNUNET_NETWORK_fdset_set(), GNUNET_SCHEDULER_add_select(), GNUNET_SCHEDULER_cancel(), GNUNET_SCHEDULER_PRIORITY_DEFAULT, GNUNET_TIME_UNIT_FOREVER_REL, read_response(), and GNUNET_DNSSTUB_RequestSocket::read_task.

Referenced by read_response(), and transmit_query().

374 {
375  struct GNUNET_NETWORK_FDSet *rset;
376 
377  if (NULL != rs->read_task)
380  if (NULL != rs->dnsout4)
382  if (NULL != rs->dnsout6)
384  rs->read_task =
387  rset,
388  NULL,
389  &read_response,
390  rs);
392 }
struct GNUNET_SCHEDULER_Task * read_task
Task for reading from dnsout4 and dnsout6.
Definition: dnsstub.c:68
struct GNUNET_NETWORK_Handle * dnsout6
UDP socket we use for this request for IPv6.
Definition: dnsstub.c:53
void GNUNET_NETWORK_fdset_destroy(struct GNUNET_NETWORK_FDSet *fds)
Releases the associated memory of an fd set.
Definition: network.c:1254
static void read_response(void *cls)
Read a DNS response from the (unhindered) UDP-Socket.
Definition: dnsstub.c:401
struct GNUNET_NETWORK_FDSet * GNUNET_NETWORK_fdset_create(void)
Creates an fd set.
Definition: network.c:1238
collection of IO descriptors
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_select(enum GNUNET_SCHEDULER_Priority prio, struct GNUNET_TIME_Relative delay, const struct GNUNET_NETWORK_FDSet *rs, const struct GNUNET_NETWORK_FDSet *ws, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when any of the specified file descriptor set...
Definition: scheduler.c:1784
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
void GNUNET_NETWORK_fdset_set(struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_NETWORK_Handle *desc)
Add a socket to the FD set.
Definition: network.c:999
struct GNUNET_NETWORK_Handle * dnsout4
UDP socket we use for this request for IPv4.
Definition: dnsstub.c:48
Run with the default priority (normal P2P operations).
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_query()

static void transmit_query ( void *  cls)
static

Task to (re)transmit the DNS query, possibly repeatedly until we succeed.

Parameters
clsour struct GNUNET_DNSSTUB_RequestSocket *

Definition at line 429 of file dnsstub.c.

References _, GNUNET_DNSSTUB_RequestSocket::ctx, GNUNET_DNSSTUB_Context::dns_head, GNUNET_DNSSTUB_RequestSocket::dnsout4, GNUNET_DNSSTUB_RequestSocket::dnsout6, ds, GNUNET_DNSSTUB_RequestSocket::ds_pos, GNUNET_a2s(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_NETWORK_socket_sendto(), GNUNET_SCHEDULER_add_delayed(), GNUNET_SYSERR, DnsServer::next, open_socket(), GNUNET_DNSSTUB_RequestSocket::request, GNUNET_DNSSTUB_RequestSocket::request_len, GNUNET_DNSSTUB_Context::retry_freq, GNUNET_DNSSTUB_RequestSocket::retry_task, schedule_read(), and DnsServer::ss.

Referenced by GNUNET_DNSSTUB_resolve().

430 {
431  struct GNUNET_DNSSTUB_RequestSocket *rs = cls;
432  struct GNUNET_DNSSTUB_Context *ctx = rs->ctx;
433  const struct sockaddr *sa;
434  socklen_t salen;
435  struct DnsServer *ds;
436  struct GNUNET_NETWORK_Handle *dnsout;
437 
438  rs->retry_task =
440  ds = rs->ds_pos;
441  rs->ds_pos = ds->next;
442  if (NULL == rs->ds_pos)
443  rs->ds_pos = ctx->dns_head;
444  GNUNET_assert(NULL != ds);
445  dnsout = NULL;
446  switch (ds->ss.ss_family)
447  {
448  case AF_INET:
449  if (NULL == rs->dnsout4)
450  rs->dnsout4 = open_socket(AF_INET);
451  dnsout = rs->dnsout4;
452  sa = (const struct sockaddr *)&ds->ss;
453  salen = sizeof(struct sockaddr_in);
454  break;
455 
456  case AF_INET6:
457  if (NULL == rs->dnsout6)
458  rs->dnsout6 = open_socket(AF_INET6);
459  dnsout = rs->dnsout6;
460  sa = (const struct sockaddr *)&ds->ss;
461  salen = sizeof(struct sockaddr_in6);
462  break;
463 
464  default:
465  return;
466  }
467  if (NULL == dnsout)
468  {
470  "Unable to use configure DNS server, skipping\n");
471  return;
472  }
474  rs->request,
475  rs->request_len,
476  sa,
477  salen))
479  _("Failed to send DNS request to %s: %s\n"),
480  GNUNET_a2s(sa, salen),
481  strerror(errno));
482  else
484  _("Sent DNS request to %s\n"),
485  GNUNET_a2s(sa, salen));
486  schedule_read(rs);
487 }
struct GNUNET_NETWORK_Handle * dnsout6
UDP socket we use for this request for IPv6.
Definition: dnsstub.c:53
struct DnsServer * dns_head
DLL of DNS resolvers we use.
Definition: dnsstub.c:130
static void transmit_query(void *cls)
Task to (re)transmit the DNS query, possibly repeatedly until we succeed.
Definition: dnsstub.c:429
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void * request
Query we sent to addr.
Definition: dnsstub.c:88
size_t request_len
Number of bytes in request.
Definition: dnsstub.c:93
struct sockaddr_storage ss
IP address of the DNS resolver.
Definition: dnsstub.c:114
struct GNUNET_DNSSTUB_Context * ctx
Context this request executes in.
Definition: dnsstub.c:83
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
struct DnsServer * next
Kept in a DLL.
Definition: dnsstub.c:104
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
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:1237
struct DnsServer * ds_pos
Next address we sent the DNS request to.
Definition: dnsstub.c:78
static struct GNUNET_NETWORK_Handle * open_socket(int af)
Open source port for sending DNS requests.
Definition: dnsstub.c:192
DNS Server used for resolution.
Definition: dnsstub.c:100
ssize_t GNUNET_NETWORK_socket_sendto(const struct GNUNET_NETWORK_Handle *desc, const void *message, size_t length, const struct sockaddr *dest_addr, socklen_t dest_len)
Send data to a particular destination (always non-blocking).
Definition: network.c:838
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages)...
Handle to the stub resolver.
Definition: dnsstub.c:121
static void schedule_read(struct GNUNET_DNSSTUB_RequestSocket *rs)
Schedule read_response() task for rs.
Definition: dnsstub.c:373
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_NETWORK_Handle * dnsout4
UDP socket we use for this request for IPv4.
Definition: dnsstub.c:48
#define GNUNET_log(kind,...)
struct GNUNET_SCHEDULER_Task * retry_task
Task for retrying transmission of the query.
Definition: dnsstub.c:73
handle to a socket
Definition: network.c:46
struct GNUNET_TIME_Relative retry_freq
How frequently do we retry requests?
Definition: dnsstub.c:140
static struct GNUNET_FS_DirScanner * ds
Handle to the directory scanner (for recursive insertions).
UDP socket we are using for sending DNS requests to the Internet.
Definition: dnsstub.c:44
Here is the call graph for this function:
Here is the caller graph for this function: