Mercurial > hg > nginx
annotate src/core/ngx_resolver.h @ 5476:950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 06 Dec 2013 14:30:28 +0400 |
parents | 07dd5bd222ac |
children | 98876ce2a7fd |
rev | line source |
---|---|
1649 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
1649 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 | |
11 | |
12 #ifndef _NGX_RESOLVER_H_INCLUDED_ | |
13 #define _NGX_RESOLVER_H_INCLUDED_ | |
14 | |
15 | |
16 #define NGX_RESOLVE_A 1 | |
17 #define NGX_RESOLVE_CNAME 5 | |
18 #define NGX_RESOLVE_PTR 12 | |
19 #define NGX_RESOLVE_MX 15 | |
20 #define NGX_RESOLVE_TXT 16 | |
1965 | 21 #define NGX_RESOLVE_DNAME 39 |
1649 | 22 |
23 #define NGX_RESOLVE_FORMERR 1 | |
24 #define NGX_RESOLVE_SERVFAIL 2 | |
25 #define NGX_RESOLVE_NXDOMAIN 3 | |
26 #define NGX_RESOLVE_NOTIMP 4 | |
27 #define NGX_RESOLVE_REFUSED 5 | |
28 #define NGX_RESOLVE_TIMEDOUT NGX_ETIMEDOUT | |
29 | |
30 | |
1683
1e0b028055ec
allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents:
1649
diff
changeset
|
31 #define NGX_NO_RESOLVER (void *) -1 |
1e0b028055ec
allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents:
1649
diff
changeset
|
32 |
1969 | 33 #define NGX_RESOLVER_MAX_RECURSION 50 |
34 | |
1683
1e0b028055ec
allow to use IP addresses without defined resolver
Igor Sysoev <igor@sysoev.ru>
parents:
1649
diff
changeset
|
35 |
1649 | 36 typedef struct { |
37 ngx_connection_t *connection; | |
38 struct sockaddr *sockaddr; | |
39 socklen_t socklen; | |
40 ngx_str_t server; | |
3408
71193a456616
add context to a resolver log
Igor Sysoev <igor@sysoev.ru>
parents:
3269
diff
changeset
|
41 ngx_log_t log; |
1649 | 42 } ngx_udp_connection_t; |
43 | |
44 | |
45 typedef struct ngx_resolver_ctx_s ngx_resolver_ctx_t; | |
46 | |
47 typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx); | |
48 | |
49 | |
50 typedef struct { | |
51 ngx_rbtree_node_t node; | |
52 ngx_queue_t queue; | |
53 | |
54 /* PTR: resolved name, A: name to resolve */ | |
55 u_char *name; | |
56 | |
5476
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
57 #if (NGX_HAVE_INET6) |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
58 /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */ |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
59 struct in6_addr addr6; |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
60 #endif |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
61 |
1649 | 62 u_short nlen; |
63 u_short qlen; | |
64 | |
65 u_char *query; | |
66 | |
67 union { | |
68 in_addr_t addr; | |
69 in_addr_t *addrs; | |
70 u_char *cname; | |
71 } u; | |
72 | |
73 u_short naddrs; | |
74 u_short cnlen; | |
75 | |
76 time_t expire; | |
77 time_t valid; | |
78 | |
79 ngx_resolver_ctx_t *waiting; | |
80 } ngx_resolver_node_t; | |
81 | |
82 | |
83 typedef struct { | |
84 /* has to be pointer because of "incomplete type" */ | |
85 ngx_event_t *event; | |
4225
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
86 void *dummy; |
1649 | 87 ngx_log_t *log; |
88 | |
89 /* ident must be after 3 pointers */ | |
90 ngx_int_t ident; | |
91 | |
4225
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
92 /* simple round robin DNS peers balancer */ |
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
93 ngx_array_t udp_connections; |
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
94 ngx_uint_t last_connection; |
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
95 |
1649 | 96 ngx_rbtree_t name_rbtree; |
97 ngx_rbtree_node_t name_sentinel; | |
98 | |
99 ngx_rbtree_t addr_rbtree; | |
100 ngx_rbtree_node_t addr_sentinel; | |
101 | |
102 ngx_queue_t name_resend_queue; | |
103 ngx_queue_t addr_resend_queue; | |
104 | |
105 ngx_queue_t name_expire_queue; | |
106 ngx_queue_t addr_expire_queue; | |
107 | |
5476
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
108 #if (NGX_HAVE_INET6) |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
109 ngx_rbtree_t addr6_rbtree; |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
110 ngx_rbtree_node_t addr6_sentinel; |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
111 ngx_queue_t addr6_resend_queue; |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
112 ngx_queue_t addr6_expire_queue; |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
113 #endif |
950c9ed3e66f
Resolver: implemented IPv6 address to name resolving.
Ruslan Ermilov <ru@nginx.com>
parents:
5475
diff
changeset
|
114 |
1649 | 115 time_t resend_timeout; |
116 time_t expire; | |
117 time_t valid; | |
118 | |
119 ngx_uint_t log_level; | |
120 } ngx_resolver_t; | |
121 | |
122 | |
123 struct ngx_resolver_ctx_s { | |
124 ngx_resolver_ctx_t *next; | |
125 ngx_resolver_t *resolver; | |
126 ngx_udp_connection_t *udp_connection; | |
127 | |
128 /* ident must be after 3 pointers */ | |
129 ngx_int_t ident; | |
130 | |
131 ngx_int_t state; | |
132 ngx_int_t type; | |
133 ngx_str_t name; | |
134 | |
135 ngx_uint_t naddrs; | |
5475
07dd5bd222ac
Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
136 ngx_addr_t *addrs; |
07dd5bd222ac
Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
137 ngx_addr_t addr; |
07dd5bd222ac
Changed resolver API to use ngx_addr_t.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
138 struct sockaddr_in sin; |
1649 | 139 |
140 ngx_resolver_handler_pt handler; | |
141 void *data; | |
142 ngx_msec_t timeout; | |
143 | |
144 ngx_uint_t quick; /* unsigned quick:1; */ | |
1969 | 145 ngx_uint_t recursion; |
1649 | 146 ngx_event_t *event; |
147 }; | |
148 | |
149 | |
4225
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
150 ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, |
016352c19049
Support of several servers in the "resolver" directive.
Igor Sysoev <igor@sysoev.ru>
parents:
3408
diff
changeset
|
151 ngx_uint_t n); |
1649 | 152 ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r, |
153 ngx_resolver_ctx_t *temp); | |
154 ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx); | |
155 void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx); | |
156 ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx); | |
157 void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx); | |
158 char *ngx_resolver_strerror(ngx_int_t err); | |
159 | |
160 | |
161 #endif /* _NGX_RESOLVER_H_INCLUDED_ */ |