Skip to content
Snippets Groups Projects
Commit 69e192ea authored by Daniel Salzman's avatar Daniel Salzman
Browse files

Merge branch 'bitfehler/geoip-cname' into 'master'

geoip: trigger CNAME chain resolution

See merge request !1122
parents d338704f 903613b8
No related branches found
No related tags found
1 merge request!1122geoip: trigger CNAME chain resolution
Pipeline #62738 failed
......@@ -115,6 +115,8 @@ typedef struct {
size_t count, avail;
knot_rrset_t *rrsets;
knot_rrset_t *rrsigs;
knot_dname_t *cname;
} geo_view_t;
typedef struct {
......@@ -298,6 +300,7 @@ static int init_geo_view(geo_view_t *view)
if (view->rrsets == NULL) {
return KNOT_ENOMEM;
}
view->cname = NULL;
return KNOT_EOK;
}
......@@ -320,6 +323,8 @@ static void clear_geo_view(geo_view_t *view)
view->rrsets = NULL;
free(view->rrsigs);
view->rrsigs = NULL;
free(view->cname);
view->cname = NULL;
}
static int parse_origin(yp_parser_t *yp, zs_scanner_t *scanner)
......@@ -435,6 +440,18 @@ static int parse_rr(knotd_mod_t *mod, yp_parser_t *yp, zs_scanner_t *scanner,
return KNOT_EINVAL;
}
if (rr_type == KNOT_RRTYPE_CNAME && view->count > 0) {
knotd_mod_log(mod, LOG_ERR, "cannot add CNAME to view with other RRs on line %zu",
yp->line_count);
return KNOT_EINVAL;
}
if (view->cname != NULL) {
knotd_mod_log(mod, LOG_ERR, "cannot add RR to view with CNAME on line %zu",
yp->line_count);
return KNOT_EINVAL;
}
if (knot_rrtype_is_dnssec(rr_type)) {
knotd_mod_log(mod, LOG_ERR, "DNSSEC record (%s) not allowed on line %zu",
yp->key, yp->line_count);
......@@ -481,6 +498,10 @@ static int parse_rr(knotd_mod_t *mod, yp_parser_t *yp, zs_scanner_t *scanner,
}
free(input_string);
if (rr_type == KNOT_RRTYPE_CNAME) {
view->cname = knot_dname_from_str_alloc(yp->data);
}
// Add new rdata to current rrset.
return knot_rrset_add_rdata(add_rr, scanner->r_data, scanner->r_data_length, NULL);
}
......@@ -848,6 +869,12 @@ static knotd_in_state_t geoip_process(knotd_in_state_t state, knot_pkt_t *pkt,
// We've got an answer, set the AA bit.
knot_wire_set_aa(pkt->wire);
if (rr->type == KNOT_RRTYPE_CNAME && view->cname != NULL) {
// Trigger CNAME chain resolution
qdata->name = view->cname;
return KNOTD_IN_STATE_FOLLOW;
}
return KNOTD_IN_STATE_HIT;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment