src/core/ngx_resolver.h - nginx-1.7.10

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. #ifndef _NGX_RESOLVER_H_INCLUDED_
  8. #define _NGX_RESOLVER_H_INCLUDED_


  9. #define NGX_RESOLVE_A         1
  10. #define NGX_RESOLVE_CNAME     5
  11. #define NGX_RESOLVE_PTR       12
  12. #define NGX_RESOLVE_MX        15
  13. #define NGX_RESOLVE_TXT       16
  14. #if (NGX_HAVE_INET6)
  15. #define NGX_RESOLVE_AAAA      28
  16. #endif
  17. #define NGX_RESOLVE_DNAME     39

  18. #define NGX_RESOLVE_FORMERR   1
  19. #define NGX_RESOLVE_SERVFAIL  2
  20. #define NGX_RESOLVE_NXDOMAIN  3
  21. #define NGX_RESOLVE_NOTIMP    4
  22. #define NGX_RESOLVE_REFUSED   5
  23. #define NGX_RESOLVE_TIMEDOUT  NGX_ETIMEDOUT


  24. #define NGX_NO_RESOLVER       (void *) -1

  25. #define NGX_RESOLVER_MAX_RECURSION    50


  26. typedef struct {
  27.     ngx_connection_t         *connection;
  28.     struct sockaddr          *sockaddr;
  29.     socklen_t                 socklen;
  30.     ngx_str_t                 server;
  31.     ngx_log_t                 log;
  32. } ngx_udp_connection_t;


  33. typedef struct ngx_resolver_ctx_s  ngx_resolver_ctx_t;

  34. typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx);


  35. typedef struct {
  36.     /* PTR: resolved name, A: name to resolve */
  37.     u_char                   *name;

  38.     ngx_queue_t               queue;

  39.     /* event ident must be after 3 pointers as in ngx_connection_t */
  40.     ngx_int_t                 ident;

  41.     ngx_rbtree_node_t         node;

  42. #if (NGX_HAVE_INET6)
  43.     /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */
  44.     struct in6_addr           addr6;
  45. #endif

  46.     u_short                   nlen;
  47.     u_short                   qlen;

  48.     u_char                   *query;
  49. #if (NGX_HAVE_INET6)
  50.     u_char                   *query6;
  51. #endif

  52.     union {
  53.         in_addr_t             addr;
  54.         in_addr_t            *addrs;
  55.         u_char               *cname;
  56.     } u;

  57.     u_char                    code;
  58.     u_short                   naddrs;
  59.     u_short                   cnlen;

  60. #if (NGX_HAVE_INET6)
  61.     union {
  62.         struct in6_addr       addr6;
  63.         struct in6_addr      *addrs6;
  64.     } u6;

  65.     u_short                   naddrs6;
  66. #endif

  67.     time_t                    expire;
  68.     time_t                    valid;
  69.     uint32_t                  ttl;

  70.     ngx_resolver_ctx_t       *waiting;
  71. } ngx_resolver_node_t;


  72. typedef struct {
  73.     /* has to be pointer because of "incomplete type" */
  74.     ngx_event_t              *event;
  75.     void                     *dummy;
  76.     ngx_log_t                *log;

  77.     /* event ident must be after 3 pointers as in ngx_connection_t */
  78.     ngx_int_t                 ident;

  79.     /* simple round robin DNS peers balancer */
  80.     ngx_array_t               udp_connections;
  81.     ngx_uint_t                last_connection;

  82.     ngx_rbtree_t              name_rbtree;
  83.     ngx_rbtree_node_t         name_sentinel;

  84.     ngx_rbtree_t              addr_rbtree;
  85.     ngx_rbtree_node_t         addr_sentinel;

  86.     ngx_queue_t               name_resend_queue;
  87.     ngx_queue_t               addr_resend_queue;

  88.     ngx_queue_t               name_expire_queue;
  89.     ngx_queue_t               addr_expire_queue;

  90. #if (NGX_HAVE_INET6)
  91.     ngx_uint_t                ipv6;                 /* unsigned  ipv6:1; */
  92.     ngx_rbtree_t              addr6_rbtree;
  93.     ngx_rbtree_node_t         addr6_sentinel;
  94.     ngx_queue_t               addr6_resend_queue;
  95.     ngx_queue_t               addr6_expire_queue;
  96. #endif

  97.     time_t                    resend_timeout;
  98.     time_t                    expire;
  99.     time_t                    valid;

  100.     ngx_uint_t                log_level;
  101. } ngx_resolver_t;


  102. struct ngx_resolver_ctx_s {
  103.     ngx_resolver_ctx_t       *next;
  104.     ngx_resolver_t           *resolver;
  105.     ngx_udp_connection_t     *udp_connection;

  106.     ngx_int_t                 state;
  107.     ngx_str_t                 name;

  108.     ngx_uint_t                naddrs;
  109.     ngx_addr_t               *addrs;
  110.     ngx_addr_t                addr;
  111.     struct sockaddr_in        sin;

  112.     ngx_resolver_handler_pt   handler;
  113.     void                     *data;
  114.     ngx_msec_t                timeout;

  115.     ngx_uint_t                quick;  /* unsigned  quick:1; */
  116.     ngx_uint_t                recursion;
  117.     ngx_event_t              *event;
  118. };


  119. ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names,
  120.     ngx_uint_t n);
  121. ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r,
  122.     ngx_resolver_ctx_t *temp);
  123. ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx);
  124. void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx);
  125. ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx);
  126. void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx);
  127. char *ngx_resolver_strerror(ngx_int_t err);


  128. #endif /* _NGX_RESOLVER_H_INCLUDED_ */