void nsec3_icmtl_replay_label_add(nsec3_icmtl_replay *replay, const u8 *fqdn, dnslabel_vector_reference labels, s32 label_top) { zdb_rr_label *rr_label = zdb_rr_label_add(replay->zone, labels, label_top); u16 flags = rr_label->flags; if((flags & ZDB_RR_LABEL_UNDERDELEGATION) == 0) /** @todo !zdb_rr_label_is_glue(label) */ { /* APEX or NS+DS */ if( ((flags & ZDB_RR_LABEL_APEX) != 0) || (((flags & ZDB_RR_LABEL_DELEGATION) != 0) && (zdb_record_find(&rr_label->resource_record_set, TYPE_DS) != NULL) ) ) { treeset_node *node = treeset_avl_insert(&replay->nsec3_labels, (u8*)fqdn); if(node->data == NULL) { #ifndef NDEBUG log_debug("journal: NSEC3: queue: %{dnsname} for NSEC3 update", fqdn); #endif node->key = dnsname_dup(fqdn); node->data = rr_label; } } } }
void nsec3_icmtl_replay_nsec3param_add(nsec3_icmtl_replay *replay, const zdb_ttlrdata *ttlrdata) { assert(ttlrdata->next == NULL); treeset_node *node = treeset_avl_find(&replay->nsec3param_add, ttlrdata->rdata_pointer); if(node == NULL) { zdb_ttlrdata* clone = zdb_ttlrdata_clone(ttlrdata); treeset_node *node = treeset_avl_insert(&replay->nsec3param_add, clone->rdata_pointer); node->data = clone; /* If the node was previously deleted, don't delete it anymore */ treeset_node *added_node = treeset_avl_find(&replay->nsec3param_del, ttlrdata->rdata_pointer); if(added_node != NULL) { treeset_avl_delete(&replay->nsec3param_del, ttlrdata->rdata_pointer); zdb_ttlrdata* nsec3param = (zdb_ttlrdata*)added_node->data; treeset_avl_delete(&replay->nsec3param_del, nsec3param->rdata_pointer); zdb_ttlrdata_delete(nsec3param); } } }
void nsec_icmtl_replay_nsec_add(nsec_icmtl_replay *replay, const u8* fqdn) { treeset_node *node = treeset_avl_insert(&replay->nsec_add, (u8*)fqdn); node->key = dnsname_dup(fqdn); node->data = NULL; }
void nsec3_icmtl_replay_nsec3_add(nsec3_icmtl_replay *replay, const u8* fqdn, const zdb_ttlrdata *ttlrdata) { assert(ttlrdata->next == NULL); treeset_node *node = treeset_avl_insert(&replay->nsec3_add, (u8*)fqdn); if(node->data == NULL) { node->key = dnsname_dup(fqdn); node->data = zdb_ttlrdata_clone(ttlrdata); } else { zdb_ttlrdata_delete(node->data); node->data = zdb_ttlrdata_clone(ttlrdata); } }
void nsec3_icmtl_replay_nsec3_rrsig_del(nsec3_icmtl_replay *replay, const u8* fqdn, const zdb_ttlrdata *ttlrdata) { assert(ttlrdata->next == NULL); treeset_node *node = treeset_avl_insert(&replay->nsec3rrsig_del, (u8*)fqdn); if(node->data == NULL) { node->key = dnsname_dup(fqdn); node->data = zdb_ttlrdata_clone(ttlrdata); } else { //zdb_ttlrdata_delete(node->data); zdb_ttlrdata *newone = zdb_ttlrdata_clone(ttlrdata); newone->next = (zdb_ttlrdata*)node->data; node->data = newone; } }
void nsec3_icmtl_replay_nsec3_rrsig_add(nsec3_icmtl_replay *replay, const u8* fqdn, zdb_packed_ttlrdata *packed_ttlrdata) { treeset_node *node = treeset_avl_insert(&replay->nsec3rrsig_add, (u8*)fqdn); if(node->data == NULL) { node->key = dnsname_dup(fqdn); node->data = packed_ttlrdata; } else { //zdb_ttlrdata_delete(node->data); zdb_packed_ttlrdata **nsec3_rrsig_ptr = (zdb_packed_ttlrdata **)&node->data; zdb_packed_ttlrdata *nsec3_rrsig = (zdb_packed_ttlrdata *)node->data; while(nsec3_rrsig != NULL) { if((nsec3_rrsig->rdata_size == packed_ttlrdata->rdata_size) && (RRSIG_KEY_NATIVETAG(nsec3_rrsig) == RRSIG_KEY_NATIVETAG(packed_ttlrdata))) { /* got a match ? */ if(memcmp(&nsec3_rrsig->rdata_start[0], &packed_ttlrdata->rdata_start[0], nsec3_rrsig->rdata_size) == 0) { /* got a match ! delete the previous one (?) */ packed_ttlrdata->next = nsec3_rrsig->next; ZDB_RECORD_ZFREE(nsec3_rrsig); break; } } nsec3_rrsig_ptr = &nsec3_rrsig->next; nsec3_rrsig = nsec3_rrsig->next; } *nsec3_rrsig_ptr = packed_ttlrdata; } }