mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Add edns-client-tag-opcode option
This commit is contained in:
parent
e41daa954e
commit
7da369e85a
13 changed files with 2603 additions and 2548 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
23 September 2020: Ralph
|
23 September 2020: Ralph
|
||||||
- Fix edns-client-tags get_option typo
|
- Fix edns-client-tags get_option typo
|
||||||
|
- Add edns-client-tag-opcode option
|
||||||
|
|
||||||
21 September 2020: Ralph
|
21 September 2020: Ralph
|
||||||
- Fix #304: dnstap logging not recovering after dnstap process restarts
|
- Fix #304: dnstap logging not recovering after dnstap process restarts
|
||||||
|
|
|
||||||
|
|
@ -1538,6 +1538,10 @@ Include an edns-client-tag option in queries with destination address matching
|
||||||
the configured IP netblock. This configuration option can be used multiple
|
the configured IP netblock. This configuration option can be used multiple
|
||||||
times. The most specific match will be used. The tag data is configured in
|
times. The most specific match will be used. The tag data is configured in
|
||||||
decimal format, from 0 to 65535.
|
decimal format, from 0 to 65535.
|
||||||
|
.TP 5
|
||||||
|
.B edns\-client\-tag\-opcode: \fI<opcode>
|
||||||
|
EDNS0 option code for the edns-client-tag option, from 0 to 65535. Default is
|
||||||
|
16, as assigned by IANA.
|
||||||
.SS "Remote Control Options"
|
.SS "Remote Control Options"
|
||||||
In the
|
In the
|
||||||
.B remote\-control:
|
.B remote\-control:
|
||||||
|
|
|
||||||
|
|
@ -2107,7 +2107,7 @@ outnet_serviced_query(struct outside_network* outnet,
|
||||||
addr, addrlen))) {
|
addr, addrlen))) {
|
||||||
uint16_t client_tag = htons(client_tag_addr->tag_data);
|
uint16_t client_tag = htons(client_tag_addr->tag_data);
|
||||||
edns_opt_list_append(&qstate->edns_opts_back_out,
|
edns_opt_list_append(&qstate->edns_opts_back_out,
|
||||||
LDNS_EDNS_CLIENT_TAG, 2,
|
env->edns_tags->client_tag_opcode, 2,
|
||||||
(uint8_t*)&client_tag, qstate->region);
|
(uint8_t*)&client_tag, qstate->region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1232,7 +1232,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||||
addr, addrlen))) {
|
addr, addrlen))) {
|
||||||
uint16_t client_tag = htons(client_tag_addr->tag_data);
|
uint16_t client_tag = htons(client_tag_addr->tag_data);
|
||||||
edns_opt_list_append(&qstate->edns_opts_back_out,
|
edns_opt_list_append(&qstate->edns_opts_back_out,
|
||||||
LDNS_EDNS_CLIENT_TAG, 2,
|
env->edns_tags->client_tag_opcode, 2,
|
||||||
(uint8_t*)&client_tag, qstate->region);
|
(uint8_t*)&client_tag, qstate->region);
|
||||||
}
|
}
|
||||||
edns.opt_list = qstate->edns_opts_back_out;
|
edns.opt_list = qstate->edns_opts_back_out;
|
||||||
|
|
|
||||||
|
|
@ -322,6 +322,7 @@ config_create(void)
|
||||||
cfg->shm_enable = 0;
|
cfg->shm_enable = 0;
|
||||||
cfg->shm_key = 11777;
|
cfg->shm_key = 11777;
|
||||||
cfg->edns_client_tags = NULL;
|
cfg->edns_client_tags = NULL;
|
||||||
|
cfg->edns_client_tag_opcode = LDNS_EDNS_CLIENT_TAG;
|
||||||
cfg->dnscrypt = 0;
|
cfg->dnscrypt = 0;
|
||||||
cfg->dnscrypt_port = 0;
|
cfg->dnscrypt_port = 0;
|
||||||
cfg->dnscrypt_provider = NULL;
|
cfg->dnscrypt_provider = NULL;
|
||||||
|
|
|
||||||
|
|
@ -564,6 +564,8 @@ struct config_file {
|
||||||
|
|
||||||
/** list of EDNS client tag entries, linked list */
|
/** list of EDNS client tag entries, linked list */
|
||||||
struct config_str2list* edns_client_tags;
|
struct config_str2list* edns_client_tags;
|
||||||
|
/** EDNS opcode to use for EDNS client tags */
|
||||||
|
uint16_t edns_client_tag_opcode;
|
||||||
|
|
||||||
/** DNSCrypt */
|
/** DNSCrypt */
|
||||||
/** true to enable dnscrypt */
|
/** true to enable dnscrypt */
|
||||||
|
|
|
||||||
2614
util/configlexer.c
2614
util/configlexer.c
File diff suppressed because it is too large
Load diff
|
|
@ -524,6 +524,7 @@ name-v6{COLON} { YDVAR(1, VAR_IPSET_NAME_V6) }
|
||||||
udp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
|
udp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
|
||||||
tcp-connection-limit{COLON} { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
|
tcp-connection-limit{COLON} { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
|
||||||
edns-client-tag{COLON} { YDVAR(2, VAR_EDNS_CLIENT_TAG) }
|
edns-client-tag{COLON} { YDVAR(2, VAR_EDNS_CLIENT_TAG) }
|
||||||
|
edns-client-tag-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_TAG_OPCODE) }
|
||||||
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
|
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
|
||||||
|
|
||||||
/* Quoted strings. Strip leading and ending quotes */
|
/* Quoted strings. Strip leading and ending quotes */
|
||||||
|
|
|
||||||
2499
util/configparser.c
2499
util/configparser.c
File diff suppressed because it is too large
Load diff
|
|
@ -344,7 +344,8 @@ extern int yydebug;
|
||||||
VAR_RPZ_LOG_NAME = 550,
|
VAR_RPZ_LOG_NAME = 550,
|
||||||
VAR_DYNLIB = 551,
|
VAR_DYNLIB = 551,
|
||||||
VAR_DYNLIB_FILE = 552,
|
VAR_DYNLIB_FILE = 552,
|
||||||
VAR_EDNS_CLIENT_TAG = 553
|
VAR_EDNS_CLIENT_TAG = 553,
|
||||||
|
VAR_EDNS_CLIENT_TAG_OPCODE = 554
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/* Tokens. */
|
/* Tokens. */
|
||||||
|
|
@ -644,6 +645,7 @@ extern int yydebug;
|
||||||
#define VAR_DYNLIB 551
|
#define VAR_DYNLIB 551
|
||||||
#define VAR_DYNLIB_FILE 552
|
#define VAR_DYNLIB_FILE 552
|
||||||
#define VAR_EDNS_CLIENT_TAG 553
|
#define VAR_EDNS_CLIENT_TAG 553
|
||||||
|
#define VAR_EDNS_CLIENT_TAG_OPCODE 554
|
||||||
|
|
||||||
/* Value type. */
|
/* Value type. */
|
||||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
|
|
@ -653,7 +655,7 @@ union YYSTYPE
|
||||||
|
|
||||||
char* str;
|
char* str;
|
||||||
|
|
||||||
#line 657 "util/configparser.h"
|
#line 659 "util/configparser.h"
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef union YYSTYPE YYSTYPE;
|
typedef union YYSTYPE YYSTYPE;
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,7 @@ extern struct config_parser_state* cfg_parser;
|
||||||
%token VAR_IPSET VAR_IPSET_NAME_V4 VAR_IPSET_NAME_V6
|
%token VAR_IPSET VAR_IPSET_NAME_V4 VAR_IPSET_NAME_V6
|
||||||
%token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE
|
%token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE
|
||||||
%token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME
|
%token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME
|
||||||
%token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_TAG
|
%token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_TAG VAR_EDNS_CLIENT_TAG_OPCODE
|
||||||
|
|
||||||
%%
|
%%
|
||||||
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
|
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
|
||||||
|
|
@ -291,7 +291,8 @@ content_server: server_num_threads | server_verbosity | server_port |
|
||||||
server_unknown_server_time_limit | server_log_tag_queryreply |
|
server_unknown_server_time_limit | server_log_tag_queryreply |
|
||||||
server_stream_wait_size | server_tls_ciphers |
|
server_stream_wait_size | server_tls_ciphers |
|
||||||
server_tls_ciphersuites | server_tls_session_ticket_keys |
|
server_tls_ciphersuites | server_tls_session_ticket_keys |
|
||||||
server_tls_use_sni | server_edns_client_tag
|
server_tls_use_sni | server_edns_client_tag |
|
||||||
|
server_edns_client_tag_opcode
|
||||||
;
|
;
|
||||||
stubstart: VAR_STUB_ZONE
|
stubstart: VAR_STUB_ZONE
|
||||||
{
|
{
|
||||||
|
|
@ -2479,6 +2480,17 @@ server_edns_client_tag: VAR_EDNS_CLIENT_TAG STRING_ARG STRING_ARG
|
||||||
"edns-client-tag");
|
"edns-client-tag");
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
server_edns_client_tag_opcode: VAR_EDNS_CLIENT_TAG_OPCODE STRING_ARG
|
||||||
|
{
|
||||||
|
OUTYY(("P(edns_client_tag_opcode:%s)\n", $2));
|
||||||
|
if(atoi($2) == 0 && strcmp($2, "0") != 0)
|
||||||
|
yyerror("option code expected");
|
||||||
|
else if(atoi($2) > 65535 || atoi($2) < 0)
|
||||||
|
yyerror("option code must be in interval [0, 65535]");
|
||||||
|
else cfg_parser->cfg->edns_client_tag_opcode = atoi($2);
|
||||||
|
|
||||||
|
}
|
||||||
|
;
|
||||||
stub_name: VAR_NAME STRING_ARG
|
stub_name: VAR_NAME STRING_ARG
|
||||||
{
|
{
|
||||||
OUTYY(("P(name:%s)\n", $2));
|
OUTYY(("P(name:%s)\n", $2));
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ int edns_tags_apply_cfg(struct edns_tags* edns_tags,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
edns_tags->client_tag_opcode = config->edns_client_tag_opcode;
|
||||||
|
|
||||||
addr_tree_init_parents(&edns_tags->client_tags);
|
addr_tree_init_parents(&edns_tags->client_tags);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,8 @@ struct edns_tags {
|
||||||
/** Tree of EDNS client tags to use in upstream queries, per address
|
/** Tree of EDNS client tags to use in upstream queries, per address
|
||||||
* prefix. Contains nodes of type edns_tag_addr. */
|
* prefix. Contains nodes of type edns_tag_addr. */
|
||||||
rbtree_type client_tags;
|
rbtree_type client_tags;
|
||||||
|
/** EDNS opcode to use for client tags */
|
||||||
|
uint16_t client_tag_opcode;
|
||||||
/** region to allocate tree nodes in */
|
/** region to allocate tree nodes in */
|
||||||
struct regional* region;
|
struct regional* region;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue