src/core/ngx_resolver.h - nginx source code

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_SRV       33
  18. #define NGX_RESOLVE_DNAME     39

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


  25. #define NGX_NO_RESOLVER       (void *) -1

  26. #define NGX_RESOLVER_MAX_RECURSION    50


  27. typedef struct ngx_resolver_s  ngx_resolver_t;


  28. typedef struct {
  29.     ngx_connection_t         *udp;
  30.     ngx_connection_t         *tcp;
  31.     struct sockaddr          *sockaddr;
  32.     socklen_t                 socklen;
  33.     ngx_str_t                 server;
  34.     ngx_log_t                 log;
  35.     ngx_buf_t                *read_buf;
  36.     ngx_buf_t                *write_buf;
  37.     ngx_resolver_t           *resolver;
  38. } ngx_resolver_connection_t;


  39. typedef struct ngx_resolver_ctx_s  ngx_resolver_ctx_t;

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


  41. typedef struct {
  42.     struct sockaddr          *sockaddr;
  43.     socklen_t                 socklen;
  44.     ngx_str_t                 name;
  45.     u_short                   priority;
  46.     u_short                   weight;
  47. } ngx_resolver_addr_t;


  48. typedef struct {
  49.     ngx_str_t                 name;
  50.     u_short                   priority;
  51.     u_short                   weight;
  52.     u_short                   port;
  53. } ngx_resolver_srv_t;


  54. typedef struct {
  55.     ngx_str_t                 name;
  56.     u_short                   priority;
  57.     u_short                   weight;
  58.     u_short                   port;

  59.     ngx_resolver_ctx_t       *ctx;
  60.     ngx_int_t                 state;

  61.     ngx_uint_t                naddrs;
  62.     ngx_addr_t               *addrs;
  63. } ngx_resolver_srv_name_t;


  64. typedef struct {
  65.     ngx_rbtree_node_t         node;
  66.     ngx_queue_t               queue;

  67.     /* PTR: resolved name, A: name to resolve */
  68.     u_char                   *name;

  69. #if (NGX_HAVE_INET6)
  70.     /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */
  71.     struct in6_addr           addr6;
  72. #endif

  73.     u_short                   nlen;
  74.     u_short                   qlen;

  75.     u_char                   *query;
  76. #if (NGX_HAVE_INET6)
  77.     u_char                   *query6;
  78. #endif

  79.     union {
  80.         in_addr_t             addr;
  81.         in_addr_t            *addrs;
  82.         u_char               *cname;
  83.         ngx_resolver_srv_t   *srvs;
  84.     } u;

  85.     u_char                    code;
  86.     u_short                   naddrs;
  87.     u_short                   nsrvs;
  88.     u_short                   cnlen;

  89. #if (NGX_HAVE_INET6)
  90.     union {
  91.         struct in6_addr       addr6;
  92.         struct in6_addr      *addrs6;
  93.     } u6;

  94.     u_short                   naddrs6;
  95. #endif

  96.     time_t                    expire;
  97.     time_t                    valid;
  98.     uint32_t                  ttl;

  99.     unsigned                  tcp:1;
  100. #if (NGX_HAVE_INET6)
  101.     unsigned                  tcp6:1;
  102. #endif

  103.     ngx_uint_t                last_connection;

  104.     ngx_resolver_ctx_t       *waiting;
  105. } ngx_resolver_node_t;


  106. struct ngx_resolver_s {
  107.     /* has to be pointer because of "incomplete type" */
  108.     ngx_event_t              *event;
  109.     void                     *dummy;
  110.     ngx_log_t                *log;

  111.     /* event ident must be after 3 pointers as in ngx_connection_t */
  112.     ngx_int_t                 ident;

  113.     /* simple round robin DNS peers balancer */
  114.     ngx_array_t               connections;
  115.     ngx_uint_t                last_connection;

  116.     ngx_rbtree_t              name_rbtree;
  117.     ngx_rbtree_node_t         name_sentinel;

  118.     ngx_rbtree_t              srv_rbtree;
  119.     ngx_rbtree_node_t         srv_sentinel;

  120.     ngx_rbtree_t              addr_rbtree;
  121.     ngx_rbtree_node_t         addr_sentinel;

  122.     ngx_queue_t               name_resend_queue;
  123.     ngx_queue_t               srv_resend_queue;
  124.     ngx_queue_t               addr_resend_queue;

  125.     ngx_queue_t               name_expire_queue;
  126.     ngx_queue_t               srv_expire_queue;
  127.     ngx_queue_t               addr_expire_queue;

  128.     unsigned                  ipv4:1;

  129. #if (NGX_HAVE_INET6)
  130.     unsigned                  ipv6:1;
  131.     ngx_rbtree_t              addr6_rbtree;
  132.     ngx_rbtree_node_t         addr6_sentinel;
  133.     ngx_queue_t               addr6_resend_queue;
  134.     ngx_queue_t               addr6_expire_queue;
  135. #endif

  136.     time_t                    resend_timeout;
  137.     time_t                    tcp_timeout;
  138.     time_t                    expire;
  139.     time_t                    valid;

  140.     ngx_uint_t                log_level;
  141. };


  142. struct ngx_resolver_ctx_s {
  143.     ngx_resolver_ctx_t       *next;
  144.     ngx_resolver_t           *resolver;
  145.     ngx_resolver_node_t      *node;

  146.     /* event ident must be after 3 pointers as in ngx_connection_t */
  147.     ngx_int_t                 ident;

  148.     ngx_int_t                 state;
  149.     ngx_str_t                 name;
  150.     ngx_str_t                 service;

  151.     time_t                    valid;
  152.     ngx_uint_t                naddrs;
  153.     ngx_resolver_addr_t      *addrs;
  154.     ngx_resolver_addr_t       addr;
  155.     struct sockaddr_in        sin;

  156.     ngx_uint_t                count;
  157.     ngx_uint_t                nsrvs;
  158.     ngx_resolver_srv_name_t  *srvs;

  159.     ngx_resolver_handler_pt   handler;
  160.     void                     *data;
  161.     ngx_msec_t                timeout;

  162.     unsigned                  quick:1;
  163.     unsigned                  async:1;
  164.     unsigned                  cancelable:1;
  165.     ngx_uint_t                recursion;
  166.     ngx_event_t              *event;
  167. };


  168. ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names,
  169.     ngx_uint_t n);
  170. ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r,
  171.     ngx_resolver_ctx_t *temp);
  172. ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx);
  173. void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx);
  174. ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx);
  175. void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx);
  176. char *ngx_resolver_strerror(ngx_int_t err);


  177. #endif /* _NGX_RESOLVER_H_INCLUDED_ */