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

dnsproxy: refactor configuration + add catch-nxdomain option

parent bd3360db
No related branches found
No related tags found
1 merge request!415Dnsproxy fix
......@@ -184,7 +184,8 @@ const yp_item_t conf_scheme[] = {
/* MODULES */
{ C_MOD_SYNTH_RECORD, YP_TGRP, YP_VGRP = { scheme_mod_synth_record }, YP_FMULTI,
{ check_mod_synth_record } },
{ C_MOD_DNSPROXY, YP_TGRP, YP_VGRP = { scheme_mod_dnsproxy }, YP_FMULTI },
{ C_MOD_DNSPROXY, YP_TGRP, YP_VGRP = { scheme_mod_dnsproxy }, YP_FMULTI,
{ check_mod_dnsproxy } },
#if HAVE_ROSEDB
{ C_MOD_ROSEDB, YP_TGRP, YP_VGRP = { scheme_mod_rosedb }, YP_FMULTI },
#endif
......
......@@ -21,20 +21,39 @@
#include "knot/nameserver/process_query.h"
/* Module configuration scheme. */
#define MOD_REMOTE "\x06""remote"
#define MOD_REMOTE "\x06""remote"
#define MOD_CATCH_NXDOMAIN "\x0E""catch-nxdomain"
const yp_item_t scheme_mod_dnsproxy[] = {
{ C_ID, YP_TSTR, YP_VNONE },
{ MOD_REMOTE, YP_TADDR, YP_VADDR = { 53 } },
{ C_COMMENT, YP_TSTR, YP_VNONE },
{ C_ID, YP_TSTR, YP_VNONE },
{ MOD_REMOTE, YP_TREF, YP_VREF = { C_RMT }, YP_FNONE, { check_ref } },
{ MOD_CATCH_NXDOMAIN, YP_TBOOL, YP_VNONE },
{ C_COMMENT, YP_TSTR, YP_VNONE },
{ NULL }
};
int check_mod_dnsproxy(conf_check_t *args)
{
const char *err_str = "no remote server specified";
conf_val_t rmt = conf_rawid_get_txn(args->conf, args->txn, C_MOD_DNSPROXY,
MOD_REMOTE, args->previous->id,
args->previous->id_len);
if (rmt.code != KNOT_EOK) {
*args->err_str = err_str;
return KNOT_EINVAL;
}
return KNOT_EOK;
}
/* Defines. */
#define MODULE_ERR(msg, ...) log_error("module 'dnsproxy', " msg, ##__VA_ARGS__)
struct dnsproxy {
struct sockaddr_storage remote;
conf_remote_t remote;
bool catch_nxdomain;
};
static int dnsproxy_fwd(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
......@@ -62,8 +81,9 @@ static int dnsproxy_fwd(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
bool is_tcp = net_is_connected(qdata->param->socket);
struct knot_request *req;
req = knot_request_make(re.mm, (const struct sockaddr *)&proxy->remote,
NULL, qdata->query, is_tcp ? 0 : KNOT_RQ_UDP);
const struct sockaddr *dst = (const struct sockaddr *)&proxy->remote.addr;
const struct sockaddr *src = (const struct sockaddr *)&proxy->remote.via;
req = knot_request_make(re.mm, dst, src, qdata->query, is_tcp ? 0 : KNOT_RQ_UDP);
if (req == NULL) {
return state; /* Ignore, not enough memory. */
}
......@@ -103,15 +123,10 @@ int dnsproxy_load(struct query_plan *plan, struct query_module *self)
memset(proxy, 0, sizeof(struct dnsproxy));
conf_val_t val = conf_mod_get(self->config, MOD_REMOTE, self->id);
if (val.code != KNOT_EOK) {
if (val.code == KNOT_EINVAL) {
MODULE_ERR("no remote proxy address for '%s'",
self->id->data);
}
mm_free(self->mm, proxy);
return val.code;
}
proxy->remote = conf_addr(&val, NULL);
proxy->remote = conf_remote(self->config, &val, 0);
val = conf_mod_get(self->config, MOD_CATCH_NXDOMAIN, self->id);
proxy->catch_nxdomain = conf_bool(&val);
self->ctx = proxy;
......
......@@ -38,6 +38,7 @@
/*! \brief Module scheme. */
#define C_MOD_DNSPROXY "\x0C""mod-dnsproxy"
extern const yp_item_t scheme_mod_dnsproxy[];
int check_mod_dnsproxy(conf_check_t *args);
/*! \brief Module interface. */
int dnsproxy_load(struct query_plan *plan, struct query_module *self);
......
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