diff options
author | Cy Schubert <cy@FreeBSD.org> | 2022-06-08 14:43:13 +0000 |
---|---|---|
committer | Cy Schubert <cy@FreeBSD.org> | 2022-06-08 14:43:13 +0000 |
commit | 5f9f82264b91e041df7cba2406625146e7268ce4 (patch) | |
tree | ba7309ee547bf22115420277f45a3478aafb6397 /edns-subnet | |
parent | 3574dc0bd83e731bba79edc130c0569bf05f7af5 (diff) | |
download | src-5f9f82264b91e041df7cba2406625146e7268ce4.tar.gz src-5f9f82264b91e041df7cba2406625146e7268ce4.zip |
Diffstat (limited to 'edns-subnet')
-rw-r--r-- | edns-subnet/subnetmod.c | 30 | ||||
-rw-r--r-- | edns-subnet/subnetmod.h | 7 |
2 files changed, 24 insertions, 13 deletions
diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c index 81f0bf3ade55..25190b040d45 100644 --- a/edns-subnet/subnetmod.c +++ b/edns-subnet/subnetmod.c @@ -97,8 +97,8 @@ subnet_new_qstate(struct module_qstate *qstate, int id) } /** Add ecs struct to edns list, after parsing it to wire format. */ -static void -ecs_opt_list_append(struct ecs_data* ecs, struct edns_option** list, +void +subnet_ecs_opt_list_append(struct ecs_data* ecs, struct edns_option** list, struct module_qstate *qstate) { size_t sn_octs, sn_octs_remainder; @@ -162,17 +162,21 @@ int ecs_whitelist_check(struct query_info* qinfo, /* Address on whitelist or client query contains ECS option, we * want to sent out ECS. Only add option if it is not already * set. */ - if(!(sq->subnet_sent)) { - ecs_opt_list_append(&sq->ecs_server_out, + if(!edns_opt_list_find(qstate->edns_opts_back_out, + qstate->env->cfg->client_subnet_opcode)) { + subnet_ecs_opt_list_append(&sq->ecs_server_out, &qstate->edns_opts_back_out, qstate); - sq->subnet_sent = 1; } + sq->subnet_sent = 1; } - else if(sq->subnet_sent) { + else { /* Outgoing ECS option is set, but we don't want to sent it to * this address, remove option. */ - edns_opt_list_remove(&qstate->edns_opts_back_out, - qstate->env->cfg->client_subnet_opcode); + if(edns_opt_list_find(qstate->edns_opts_back_out, + qstate->env->cfg->client_subnet_opcode)) { + edns_opt_list_remove(&qstate->edns_opts_back_out, + qstate->env->cfg->client_subnet_opcode); + } sq->subnet_sent = 0; } return 1; @@ -227,7 +231,7 @@ subnetmod_init(struct module_env *env, int id) env->unique_mesh = 1; if(!edns_register_option(env->cfg->client_subnet_opcode, env->cfg->client_subnet_always_forward /* bypass cache */, - 0 /* no aggregation */, env)) { + 1 /* no aggregation */, env)) { log_err("subnetcache: could not register opcode"); ecs_whitelist_delete(sn_env->whitelist); slabhash_delete(sn_env->subnet_msg_cache); @@ -598,7 +602,7 @@ parse_subnet_option(struct edns_option* ecs_option, struct ecs_data* ecs) return 1; } -static void +void subnet_option_from_ss(struct sockaddr_storage *ss, struct ecs_data* ecs, struct config_file* cfg) { @@ -761,7 +765,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event, verbose(VERB_QUERY, "subnetcache: answered from cache"); qstate->ext_state[id] = module_finished; - ecs_opt_list_append(&sq->ecs_client_out, + subnet_ecs_opt_list_append(&sq->ecs_client_out, &qstate->edns_opts_front_out, qstate); return; } @@ -783,7 +787,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event, sq->ecs_server_out.subnet_source_mask = qstate->env->cfg->max_client_subnet_ipv6; /* Safe to copy completely, even if the source is limited by the - * configuration. ecs_opt_list_append() will limit the address. + * configuration. subnet_ecs_opt_list_append() will limit the address. * */ memcpy(&sq->ecs_server_out.subnet_addr, sq->ecs_client_in.subnet_addr, INET6_SIZE); @@ -807,7 +811,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event, qstate->ext_state[id] = eval_response(qstate, id, sq); if(qstate->ext_state[id] == module_finished && qstate->return_msg) { - ecs_opt_list_append(&sq->ecs_client_out, + subnet_ecs_opt_list_append(&sq->ecs_client_out, &qstate->edns_opts_front_out, qstate); } qstate->no_cache_store = sq->started_no_cache_store; diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h index 27ba2ee74129..c877692b46b1 100644 --- a/edns-subnet/subnetmod.h +++ b/edns-subnet/subnetmod.h @@ -143,4 +143,11 @@ int ecs_query_response(struct module_qstate* qstate, struct dns_msg* response, /** mark subnet msg to be deleted */ void subnet_markdel(void* key); +/** Add ecs struct to edns list, after parsing it to wire format. */ +void subnet_ecs_opt_list_append(struct ecs_data* ecs, struct edns_option** list, + struct module_qstate *qstate); + +/** Create ecs_data from the sockaddr_storage information. */ +void subnet_option_from_ss(struct sockaddr_storage *ss, struct ecs_data* ecs, + struct config_file* cfg); #endif /* SUBNETMOD_H */ |