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;