iter_delegpt.c (256281) | iter_delegpt.c (269257) |
---|---|
1/* 2 * iterator/iter_delegpt.c - delegation point with NS and address information. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 7 unchanged lines hidden (view full) --- 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 1/* 2 * iterator/iter_delegpt.c - delegation point with NS and address information. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 7 unchanged lines hidden (view full) --- 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. | 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
34 */ 35 36/** 37 * \file 38 * 39 * This file implements the Delegation Point. It contains a list of name servers 40 * and their addresses if known. 41 */ 42#include "config.h" 43#include "iterator/iter_delegpt.h" 44#include "services/cache/dns.h" 45#include "util/regional.h" 46#include "util/data/dname.h" 47#include "util/data/packed_rrset.h" 48#include "util/data/msgreply.h" 49#include "util/net_help.h" | 34 */ 35 36/** 37 * \file 38 * 39 * This file implements the Delegation Point. It contains a list of name servers 40 * and their addresses if known. 41 */ 42#include "config.h" 43#include "iterator/iter_delegpt.h" 44#include "services/cache/dns.h" 45#include "util/regional.h" 46#include "util/data/dname.h" 47#include "util/data/packed_rrset.h" 48#include "util/data/msgreply.h" 49#include "util/net_help.h" |
50#include "ldns/rrdef.h" 51#include "ldns/sbuffer.h" |
|
50 51struct delegpt* 52delegpt_create(struct regional* region) 53{ 54 struct delegpt* dp=(struct delegpt*)regional_alloc( 55 region, sizeof(*dp)); 56 if(!dp) 57 return NULL; --- 8 unchanged lines hidden (view full) --- 66 struct delegpt_addr* a; 67 if(!copy) 68 return NULL; 69 if(!delegpt_set_name(copy, region, dp->name)) 70 return NULL; 71 copy->bogus = dp->bogus; 72 copy->has_parent_side_NS = dp->has_parent_side_NS; 73 for(ns = dp->nslist; ns; ns = ns->next) { | 52 53struct delegpt* 54delegpt_create(struct regional* region) 55{ 56 struct delegpt* dp=(struct delegpt*)regional_alloc( 57 region, sizeof(*dp)); 58 if(!dp) 59 return NULL; --- 8 unchanged lines hidden (view full) --- 68 struct delegpt_addr* a; 69 if(!copy) 70 return NULL; 71 if(!delegpt_set_name(copy, region, dp->name)) 72 return NULL; 73 copy->bogus = dp->bogus; 74 copy->has_parent_side_NS = dp->has_parent_side_NS; 75 for(ns = dp->nslist; ns; ns = ns->next) { |
74 if(!delegpt_add_ns(copy, region, ns->name, (int)ns->lame)) | 76 if(!delegpt_add_ns(copy, region, ns->name, ns->lame)) |
75 return NULL; 76 copy->nslist->resolved = ns->resolved; 77 copy->nslist->got4 = ns->got4; 78 copy->nslist->got6 = ns->got6; 79 copy->nslist->done_pside4 = ns->done_pside4; 80 copy->nslist->done_pside6 = ns->done_pside6; 81 } 82 for(a = dp->target_list; a; a = a->next_target) { --- 10 unchanged lines hidden (view full) --- 93 log_assert(!dp->dp_type_mlc); 94 dp->namelabs = dname_count_size_labels(name, &dp->namelen); 95 dp->name = regional_alloc_init(region, name, dp->namelen); 96 return dp->name != 0; 97} 98 99int 100delegpt_add_ns(struct delegpt* dp, struct regional* region, uint8_t* name, | 77 return NULL; 78 copy->nslist->resolved = ns->resolved; 79 copy->nslist->got4 = ns->got4; 80 copy->nslist->got6 = ns->got6; 81 copy->nslist->done_pside4 = ns->done_pside4; 82 copy->nslist->done_pside6 = ns->done_pside6; 83 } 84 for(a = dp->target_list; a; a = a->next_target) { --- 10 unchanged lines hidden (view full) --- 95 log_assert(!dp->dp_type_mlc); 96 dp->namelabs = dname_count_size_labels(name, &dp->namelen); 97 dp->name = regional_alloc_init(region, name, dp->namelen); 98 return dp->name != 0; 99} 100 101int 102delegpt_add_ns(struct delegpt* dp, struct regional* region, uint8_t* name, |
101 int lame) | 103 uint8_t lame) |
102{ 103 struct delegpt_ns* ns; 104 size_t len; 105 (void)dname_count_size_labels(name, &len); 106 log_assert(!dp->dp_type_mlc); 107 /* slow check for duplicates to avoid counting failures when 108 * adding the same server as a dependency twice */ 109 if(delegpt_find_ns(dp, name, len)) --- 4 unchanged lines hidden (view full) --- 114 return 0; 115 ns->next = dp->nslist; 116 ns->namelen = len; 117 dp->nslist = ns; 118 ns->name = regional_alloc_init(region, name, ns->namelen); 119 ns->resolved = 0; 120 ns->got4 = 0; 121 ns->got6 = 0; | 104{ 105 struct delegpt_ns* ns; 106 size_t len; 107 (void)dname_count_size_labels(name, &len); 108 log_assert(!dp->dp_type_mlc); 109 /* slow check for duplicates to avoid counting failures when 110 * adding the same server as a dependency twice */ 111 if(delegpt_find_ns(dp, name, len)) --- 4 unchanged lines hidden (view full) --- 116 return 0; 117 ns->next = dp->nslist; 118 ns->namelen = len; 119 dp->nslist = ns; 120 ns->name = regional_alloc_init(region, name, ns->namelen); 121 ns->resolved = 0; 122 ns->got4 = 0; 123 ns->got6 = 0; |
122 ns->lame = (uint8_t)lame; | 124 ns->lame = lame; |
123 ns->done_pside4 = 0; 124 ns->done_pside6 = 0; 125 return ns->name != 0; 126} 127 128struct delegpt_ns* 129delegpt_find_ns(struct delegpt* dp, uint8_t* name, size_t namelen) 130{ --- 20 unchanged lines hidden (view full) --- 151 p = p->next_target; 152 } 153 return NULL; 154} 155 156int 157delegpt_add_target(struct delegpt* dp, struct regional* region, 158 uint8_t* name, size_t namelen, struct sockaddr_storage* addr, | 125 ns->done_pside4 = 0; 126 ns->done_pside6 = 0; 127 return ns->name != 0; 128} 129 130struct delegpt_ns* 131delegpt_find_ns(struct delegpt* dp, uint8_t* name, size_t namelen) 132{ --- 20 unchanged lines hidden (view full) --- 153 p = p->next_target; 154 } 155 return NULL; 156} 157 158int 159delegpt_add_target(struct delegpt* dp, struct regional* region, 160 uint8_t* name, size_t namelen, struct sockaddr_storage* addr, |
159 socklen_t addrlen, int bogus, int lame) | 161 socklen_t addrlen, uint8_t bogus, uint8_t lame) |
160{ 161 struct delegpt_ns* ns = delegpt_find_ns(dp, name, namelen); 162 log_assert(!dp->dp_type_mlc); 163 if(!ns) { 164 /* ignore it */ 165 return 1; 166 } 167 if(!lame) { 168 if(addr_is_ip6(addr, addrlen)) 169 ns->got6 = 1; 170 else ns->got4 = 1; 171 if(ns->got4 && ns->got6) 172 ns->resolved = 1; 173 } 174 return delegpt_add_addr(dp, region, addr, addrlen, bogus, lame); 175} 176 177int 178delegpt_add_addr(struct delegpt* dp, struct regional* region, | 162{ 163 struct delegpt_ns* ns = delegpt_find_ns(dp, name, namelen); 164 log_assert(!dp->dp_type_mlc); 165 if(!ns) { 166 /* ignore it */ 167 return 1; 168 } 169 if(!lame) { 170 if(addr_is_ip6(addr, addrlen)) 171 ns->got6 = 1; 172 else ns->got4 = 1; 173 if(ns->got4 && ns->got6) 174 ns->resolved = 1; 175 } 176 return delegpt_add_addr(dp, region, addr, addrlen, bogus, lame); 177} 178 179int 180delegpt_add_addr(struct delegpt* dp, struct regional* region, |
179 struct sockaddr_storage* addr, socklen_t addrlen, int bogus, 180 int lame) | 181 struct sockaddr_storage* addr, socklen_t addrlen, uint8_t bogus, 182 uint8_t lame) |
181{ 182 struct delegpt_addr* a; 183 log_assert(!dp->dp_type_mlc); 184 /* check for duplicates */ 185 if((a = delegpt_find_addr(dp, addr, addrlen))) { 186 if(bogus) 187 a->bogus = bogus; 188 if(!lame) --- 10 unchanged lines hidden (view full) --- 199 a->next_result = 0; 200 a->next_usable = dp->usable_list; 201 dp->usable_list = a; 202 memcpy(&a->addr, addr, addrlen); 203 a->addrlen = addrlen; 204 a->attempts = 0; 205 a->bogus = bogus; 206 a->lame = lame; | 183{ 184 struct delegpt_addr* a; 185 log_assert(!dp->dp_type_mlc); 186 /* check for duplicates */ 187 if((a = delegpt_find_addr(dp, addr, addrlen))) { 188 if(bogus) 189 a->bogus = bogus; 190 if(!lame) --- 10 unchanged lines hidden (view full) --- 201 a->next_result = 0; 202 a->next_usable = dp->usable_list; 203 dp->usable_list = a; 204 memcpy(&a->addr, addr, addrlen); 205 a->addrlen = addrlen; 206 a->attempts = 0; 207 a->bogus = bogus; 208 a->lame = lame; |
209 a->dnsseclame = 0; |
|
207 return 1; 208} 209 210void 211delegpt_count_ns(struct delegpt* dp, size_t* numns, size_t* missing) 212{ 213 struct delegpt_ns* ns; 214 *numns = 0; --- 156 unchanged lines hidden (view full) --- 371 return NULL; 372 } 373 } 374 return dp; 375} 376 377int 378delegpt_rrset_add_ns(struct delegpt* dp, struct regional* region, | 210 return 1; 211} 212 213void 214delegpt_count_ns(struct delegpt* dp, size_t* numns, size_t* missing) 215{ 216 struct delegpt_ns* ns; 217 *numns = 0; --- 156 unchanged lines hidden (view full) --- 374 return NULL; 375 } 376 } 377 return dp; 378} 379 380int 381delegpt_rrset_add_ns(struct delegpt* dp, struct regional* region, |
379 struct ub_packed_rrset_key* ns_rrset, int lame) | 382 struct ub_packed_rrset_key* ns_rrset, uint8_t lame) |
380{ 381 struct packed_rrset_data* nsdata = (struct packed_rrset_data*) 382 ns_rrset->entry.data; 383 size_t i; 384 log_assert(!dp->dp_type_mlc); 385 if(nsdata->security == sec_status_bogus) 386 dp->bogus = 1; 387 for(i=0; i<nsdata->count; i++) { 388 if(nsdata->rr_len[i] < 2+1) continue; /* len + root label */ 389 if(dname_valid(nsdata->rr_data[i]+2, nsdata->rr_len[i]-2) != | 383{ 384 struct packed_rrset_data* nsdata = (struct packed_rrset_data*) 385 ns_rrset->entry.data; 386 size_t i; 387 log_assert(!dp->dp_type_mlc); 388 if(nsdata->security == sec_status_bogus) 389 dp->bogus = 1; 390 for(i=0; i<nsdata->count; i++) { 391 if(nsdata->rr_len[i] < 2+1) continue; /* len + root label */ 392 if(dname_valid(nsdata->rr_data[i]+2, nsdata->rr_len[i]-2) != |
390 (size_t)ldns_read_uint16(nsdata->rr_data[i])) | 393 (size_t)sldns_read_uint16(nsdata->rr_data[i])) |
391 continue; /* bad format */ 392 /* add rdata of NS (= wirefmt dname), skip rdatalen bytes */ 393 if(!delegpt_add_ns(dp, region, nsdata->rr_data[i]+2, lame)) 394 return 0; 395 } 396 return 1; 397} 398 399int 400delegpt_add_rrset_A(struct delegpt* dp, struct regional* region, | 394 continue; /* bad format */ 395 /* add rdata of NS (= wirefmt dname), skip rdatalen bytes */ 396 if(!delegpt_add_ns(dp, region, nsdata->rr_data[i]+2, lame)) 397 return 0; 398 } 399 return 1; 400} 401 402int 403delegpt_add_rrset_A(struct delegpt* dp, struct regional* region, |
401 struct ub_packed_rrset_key* ak, int lame) | 404 struct ub_packed_rrset_key* ak, uint8_t lame) |
402{ 403 struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; 404 size_t i; 405 struct sockaddr_in sa; 406 socklen_t len = (socklen_t)sizeof(sa); 407 log_assert(!dp->dp_type_mlc); 408 memset(&sa, 0, len); 409 sa.sin_family = AF_INET; --- 7 unchanged lines hidden (view full) --- 417 len, (d->security==sec_status_bogus), lame)) 418 return 0; 419 } 420 return 1; 421} 422 423int 424delegpt_add_rrset_AAAA(struct delegpt* dp, struct regional* region, | 405{ 406 struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; 407 size_t i; 408 struct sockaddr_in sa; 409 socklen_t len = (socklen_t)sizeof(sa); 410 log_assert(!dp->dp_type_mlc); 411 memset(&sa, 0, len); 412 sa.sin_family = AF_INET; --- 7 unchanged lines hidden (view full) --- 420 len, (d->security==sec_status_bogus), lame)) 421 return 0; 422 } 423 return 1; 424} 425 426int 427delegpt_add_rrset_AAAA(struct delegpt* dp, struct regional* region, |
425 struct ub_packed_rrset_key* ak, int lame) | 428 struct ub_packed_rrset_key* ak, uint8_t lame) |
426{ 427 struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; 428 size_t i; 429 struct sockaddr_in6 sa; 430 socklen_t len = (socklen_t)sizeof(sa); 431 log_assert(!dp->dp_type_mlc); 432 memset(&sa, 0, len); 433 sa.sin6_family = AF_INET6; --- 7 unchanged lines hidden (view full) --- 441 len, (d->security==sec_status_bogus), lame)) 442 return 0; 443 } 444 return 1; 445} 446 447int 448delegpt_add_rrset(struct delegpt* dp, struct regional* region, | 429{ 430 struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; 431 size_t i; 432 struct sockaddr_in6 sa; 433 socklen_t len = (socklen_t)sizeof(sa); 434 log_assert(!dp->dp_type_mlc); 435 memset(&sa, 0, len); 436 sa.sin6_family = AF_INET6; --- 7 unchanged lines hidden (view full) --- 444 len, (d->security==sec_status_bogus), lame)) 445 return 0; 446 } 447 return 1; 448} 449 450int 451delegpt_add_rrset(struct delegpt* dp, struct regional* region, |
449 struct ub_packed_rrset_key* rrset, int lame) | 452 struct ub_packed_rrset_key* rrset, uint8_t lame) |
450{ 451 if(!rrset) 452 return 1; 453 if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_NS) 454 return delegpt_rrset_add_ns(dp, region, rrset, lame); 455 else if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_A) 456 return delegpt_add_rrset_A(dp, region, rrset, lame); 457 else if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_AAAA) --- 85 unchanged lines hidden (view full) --- 543int delegpt_set_name_mlc(struct delegpt* dp, uint8_t* name) 544{ 545 log_assert(dp->dp_type_mlc); 546 dp->namelabs = dname_count_size_labels(name, &dp->namelen); 547 dp->name = memdup(name, dp->namelen); 548 return (dp->name != NULL); 549} 550 | 453{ 454 if(!rrset) 455 return 1; 456 if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_NS) 457 return delegpt_rrset_add_ns(dp, region, rrset, lame); 458 else if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_A) 459 return delegpt_add_rrset_A(dp, region, rrset, lame); 460 else if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_AAAA) --- 85 unchanged lines hidden (view full) --- 546int delegpt_set_name_mlc(struct delegpt* dp, uint8_t* name) 547{ 548 log_assert(dp->dp_type_mlc); 549 dp->namelabs = dname_count_size_labels(name, &dp->namelen); 550 dp->name = memdup(name, dp->namelen); 551 return (dp->name != NULL); 552} 553 |
551int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, int lame) | 554int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, uint8_t lame) |
552{ 553 struct delegpt_ns* ns; 554 size_t len; 555 (void)dname_count_size_labels(name, &len); 556 log_assert(dp->dp_type_mlc); 557 /* slow check for duplicates to avoid counting failures when 558 * adding the same server as a dependency twice */ 559 if(delegpt_find_ns(dp, name, len)) --- 14 unchanged lines hidden (view full) --- 574 ns->got6 = 0; 575 ns->lame = (uint8_t)lame; 576 ns->done_pside4 = 0; 577 ns->done_pside6 = 0; 578 return 1; 579} 580 581int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr, | 555{ 556 struct delegpt_ns* ns; 557 size_t len; 558 (void)dname_count_size_labels(name, &len); 559 log_assert(dp->dp_type_mlc); 560 /* slow check for duplicates to avoid counting failures when 561 * adding the same server as a dependency twice */ 562 if(delegpt_find_ns(dp, name, len)) --- 14 unchanged lines hidden (view full) --- 577 ns->got6 = 0; 578 ns->lame = (uint8_t)lame; 579 ns->done_pside4 = 0; 580 ns->done_pside6 = 0; 581 return 1; 582} 583 584int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr, |
582 socklen_t addrlen, int bogus, int lame) | 585 socklen_t addrlen, uint8_t bogus, uint8_t lame) |
583{ 584 struct delegpt_addr* a; 585 log_assert(dp->dp_type_mlc); 586 /* check for duplicates */ 587 if((a = delegpt_find_addr(dp, addr, addrlen))) { 588 if(bogus) 589 a->bogus = bogus; 590 if(!lame) --- 9 unchanged lines hidden (view full) --- 600 a->next_result = 0; 601 a->next_usable = dp->usable_list; 602 dp->usable_list = a; 603 memcpy(&a->addr, addr, addrlen); 604 a->addrlen = addrlen; 605 a->attempts = 0; 606 a->bogus = bogus; 607 a->lame = lame; | 586{ 587 struct delegpt_addr* a; 588 log_assert(dp->dp_type_mlc); 589 /* check for duplicates */ 590 if((a = delegpt_find_addr(dp, addr, addrlen))) { 591 if(bogus) 592 a->bogus = bogus; 593 if(!lame) --- 9 unchanged lines hidden (view full) --- 603 a->next_result = 0; 604 a->next_usable = dp->usable_list; 605 dp->usable_list = a; 606 memcpy(&a->addr, addr, addrlen); 607 a->addrlen = addrlen; 608 a->attempts = 0; 609 a->bogus = bogus; 610 a->lame = lame; |
611 a->dnsseclame = 0; |
|
608 return 1; 609} 610 611int delegpt_add_target_mlc(struct delegpt* dp, uint8_t* name, size_t namelen, | 612 return 1; 613} 614 615int delegpt_add_target_mlc(struct delegpt* dp, uint8_t* name, size_t namelen, |
612 struct sockaddr_storage* addr, socklen_t addrlen, int bogus, int lame) | 616 struct sockaddr_storage* addr, socklen_t addrlen, uint8_t bogus, 617 uint8_t lame) |
613{ 614 struct delegpt_ns* ns = delegpt_find_ns(dp, name, namelen); 615 log_assert(dp->dp_type_mlc); 616 if(!ns) { 617 /* ignore it */ 618 return 1; 619 } 620 if(!lame) { --- 20 unchanged lines hidden --- | 618{ 619 struct delegpt_ns* ns = delegpt_find_ns(dp, name, namelen); 620 log_assert(dp->dp_type_mlc); 621 if(!ns) { 622 /* ignore it */ 623 return 1; 624 } 625 if(!lame) { --- 20 unchanged lines hidden --- |