Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 5478:3cb3175a6fef
The "ipv6=" boolean parameter of the "resolver" directive.
When set to "off", only IPv4 addresses will be resolved,
and no AAAA queries are ever sent.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Mon, 09 Dec 2013 10:53:30 +0400 |
parents | 98876ce2a7fd |
children | c0d6eae5a1c5 |
comparison
equal
deleted
inserted
replaced
5477:98876ce2a7fd | 5478:3cb3175a6fef |
---|---|
141 | 141 |
142 ngx_queue_init(&r->name_expire_queue); | 142 ngx_queue_init(&r->name_expire_queue); |
143 ngx_queue_init(&r->addr_expire_queue); | 143 ngx_queue_init(&r->addr_expire_queue); |
144 | 144 |
145 #if (NGX_HAVE_INET6) | 145 #if (NGX_HAVE_INET6) |
146 r->ipv6 = 1; | |
147 | |
146 ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel, | 148 ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel, |
147 ngx_resolver_rbtree_insert_addr6_value); | 149 ngx_resolver_rbtree_insert_addr6_value); |
148 | 150 |
149 ngx_queue_init(&r->addr6_resend_queue); | 151 ngx_queue_init(&r->addr6_resend_queue); |
150 | 152 |
185 return NULL; | 187 return NULL; |
186 } | 188 } |
187 | 189 |
188 continue; | 190 continue; |
189 } | 191 } |
192 | |
193 #if (NGX_HAVE_INET6) | |
194 if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) { | |
195 | |
196 if (ngx_strcmp(&names[i].data[5], "on") == 0) { | |
197 r->ipv6 = 1; | |
198 | |
199 } else if (ngx_strcmp(&names[i].data[5], "off") == 0) { | |
200 r->ipv6 = 0; | |
201 | |
202 } else { | |
203 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
204 "invalid parameter: %V", &names[i]); | |
205 return NULL; | |
206 } | |
207 | |
208 continue; | |
209 } | |
210 #endif | |
190 | 211 |
191 ngx_memzero(&u, sizeof(ngx_url_t)); | 212 ngx_memzero(&u, sizeof(ngx_url_t)); |
192 | 213 |
193 u.url = names[i]; | 214 u.url = names[i]; |
194 u.default_port = 53; | 215 u.default_port = 53; |
621 return NGX_OK; | 642 return NGX_OK; |
622 } | 643 } |
623 | 644 |
624 rn->naddrs = (u_short) -1; | 645 rn->naddrs = (u_short) -1; |
625 #if (NGX_HAVE_INET6) | 646 #if (NGX_HAVE_INET6) |
626 rn->naddrs6 = (u_short) -1; | 647 rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0; |
627 #endif | 648 #endif |
628 | 649 |
629 if (ngx_resolver_send_query(r, rn) != NGX_OK) { | 650 if (ngx_resolver_send_query(r, rn) != NGX_OK) { |
630 goto failed; | 651 goto failed; |
631 } | 652 } |
2421 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) | 2442 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) |
2422 { | 2443 { |
2423 u_char *p, *s; | 2444 u_char *p, *s; |
2424 size_t len, nlen; | 2445 size_t len, nlen; |
2425 ngx_uint_t ident; | 2446 ngx_uint_t ident; |
2447 #if (NGX_HAVE_INET6) | |
2448 ngx_resolver_t *r; | |
2449 #endif | |
2426 ngx_resolver_qs_t *qs; | 2450 ngx_resolver_qs_t *qs; |
2427 ngx_resolver_hdr_t *query; | 2451 ngx_resolver_hdr_t *query; |
2428 | 2452 |
2429 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1; | 2453 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1; |
2430 | 2454 |
2431 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); | 2455 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); |
2432 | 2456 |
2433 #if (NGX_HAVE_INET6) | 2457 #if (NGX_HAVE_INET6) |
2434 p = ngx_resolver_alloc(ctx->resolver, len * 2); | 2458 r = ctx->resolver; |
2459 | |
2460 p = ngx_resolver_alloc(ctx->resolver, r->ipv6 ? len * 2 : len); | |
2435 #else | 2461 #else |
2436 p = ngx_resolver_alloc(ctx->resolver, len); | 2462 p = ngx_resolver_alloc(ctx->resolver, len); |
2437 #endif | 2463 #endif |
2438 if (p == NULL) { | 2464 if (p == NULL) { |
2439 return NGX_ERROR; | 2465 return NGX_ERROR; |
2441 | 2467 |
2442 rn->qlen = (u_short) len; | 2468 rn->qlen = (u_short) len; |
2443 rn->query = p; | 2469 rn->query = p; |
2444 | 2470 |
2445 #if (NGX_HAVE_INET6) | 2471 #if (NGX_HAVE_INET6) |
2446 rn->query6 = p + len; | 2472 if (r->ipv6) { |
2473 rn->query6 = p + len; | |
2474 } | |
2447 #endif | 2475 #endif |
2448 | 2476 |
2449 query = (ngx_resolver_hdr_t *) p; | 2477 query = (ngx_resolver_hdr_t *) p; |
2450 | 2478 |
2451 ident = ngx_random(); | 2479 ident = ngx_random(); |
2507 } | 2535 } |
2508 | 2536 |
2509 *p = (u_char) len; | 2537 *p = (u_char) len; |
2510 | 2538 |
2511 #if (NGX_HAVE_INET6) | 2539 #if (NGX_HAVE_INET6) |
2540 if (!r->ipv6) { | |
2541 return NGX_OK; | |
2542 } | |
2543 | |
2512 p = rn->query6; | 2544 p = rn->query6; |
2513 | 2545 |
2514 ngx_memcpy(p, rn->query, rn->qlen); | 2546 ngx_memcpy(p, rn->query, rn->qlen); |
2515 | 2547 |
2516 query = (ngx_resolver_hdr_t *) p; | 2548 query = (ngx_resolver_hdr_t *) p; |