static int net_tls(lua_State *L)
{
- struct worker_ctx *worker = wrk_luaget(L);
- if (!worker) {
+ struct engine *engine = engine_luaget(L);
+ if (!engine) {
+ return 0;
+ }
+ struct network *net = &engine->net;
+ if (!net) {
return 0;
}
if (lua_gettop(L) == 0) {
- lua_pushfstring(L, "(\"%s\", \"%s\")", worker->tls_credentials->tls_cert, worker->tls_credentials->tls_key);
+ lua_pushfstring(L, "(\"%s\", \"%s\")", net->tls_credentials->tls_cert, net->tls_credentials->tls_key);
return 1;
}
lua_error(L);
}
- int r = tls_certificate_set(worker, lua_tostring(L, 1), lua_tostring(L, 2));
+ int r = tls_certificate_set(net, lua_tostring(L, 1), lua_tostring(L, 2));
if (r != 0) {
lua_pushstring(L, strerror(ENOMEM));
lua_error(L);
#include "daemon/network.h"
#include "daemon/worker.h"
#include "daemon/io.h"
+#include "daemon/tls.h"
/* libuv 1.7.0+ is able to support SO_REUSEPORT for loadbalancing */
#if defined(UV_VERSION_HEX)
map_walk(&net->endpoints, close_key, 0);
map_walk(&net->endpoints, free_key, 0);
map_clear(&net->endpoints);
+ tls_credentials_free(net->tls_credentials);
+ net->tls_credentials = NULL;
}
}
/* @endcond */
struct network {
- uv_loop_t *loop;
- map_t endpoints;
+ uv_loop_t *loop;
+ map_t endpoints;
+ struct tls_credentials *tls_credentials;
};
void network_init(struct network *net, uv_loop_t *loop);
ssize_t nread;
ssize_t consumed;
uint8_t recv_buf[4096];
- struct tls_credentials_t *credentials;
+ struct tls_credentials *credentials;
};
/** @internal Debugging facility. */
struct tls_ctx_t *tls_new(struct worker_ctx *worker)
{
assert(worker != NULL);
- if (!worker->tls_credentials) {
+ struct network *net = &worker->engine->net;
+ if (!net->tls_credentials) {
kr_log_error("[tls] x509 credentials are missing; no TLS\n");
return NULL;
}
tls_free(tls);
return NULL;
}
- tls->credentials = tls_credentials_reserve(worker);
+ tls->credentials = tls_credentials_reserve(net->tls_credentials);
err = gnutls_credentials_set(tls->session, GNUTLS_CRD_CERTIFICATE, tls->credentials->credentials);
if (err < 0) {
kr_log_error("[tls] gnutls_credentials_set(): %s (%d)\n", gnutls_strerror_name(err), err);
return kr_ok();
}
-int tls_certificate_set(struct worker_ctx *worker, const char *tls_cert, const char *tls_key)
+int tls_certificate_set(struct network *net, const char *tls_cert, const char *tls_key)
{
- if (!worker) {
+ if (!net) {
return kr_error(EINVAL);
}
- struct tls_credentials_t *tls_credentials = calloc(1, sizeof(*tls_credentials));
+ struct tls_credentials *tls_credentials = calloc(1, sizeof(*tls_credentials));
if (tls_credentials == NULL) {
return kr_error(ENOMEM);
}
return kr_error(EINVAL);
}
// Exchange the x509 credentials
- struct tls_credentials_t *old_credentials = worker->tls_credentials;
+ struct tls_credentials *old_credentials = net->tls_credentials;
// Start using the new x509_credentials
- worker->tls_credentials = tls_credentials;
+ net->tls_credentials = tls_credentials;
if (old_credentials) {
err = tls_credentials_release(old_credentials);
return kr_ok();
}
-struct tls_credentials_t *tls_credentials_reserve(struct worker_ctx *worker) {
- worker->tls_credentials->count++;
- return worker->tls_credentials;
+struct tls_credentials *tls_credentials_reserve(struct tls_credentials *tls_credentials) {
+ if (!tls_credentials) {
+ return NULL;
+ }
+ tls_credentials->count++;
+ return tls_credentials;
}
-int tls_credentials_release(struct tls_credentials_t *tls_credentials) {
+int tls_credentials_release(struct tls_credentials *tls_credentials) {
if (!tls_credentials) {
return kr_error(EINVAL);
}
return kr_ok();
}
-void tls_credentials_free(struct tls_credentials_t *tls_credentials) {
+void tls_credentials_free(struct tls_credentials *tls_credentials) {
if (!tls_credentials) {
return;
}
#include <libknot/packet/pkt.h>
struct tls_ctx_t;
-struct tls_credentials_t;
-struct tls_credentials_t {
+struct tls_credentials;
+struct tls_credentials {
int count;
char *tls_cert;
char *tls_key;
int tls_push(struct qr_task *task, uv_handle_t* handle, knot_pkt_t * pkt);
int tls_process(struct worker_ctx *worker, uv_stream_t *handle, const uint8_t *buf, ssize_t nread);
-int tls_certificate_set(struct worker_ctx *worker, const char *tls_cert, const char *tls_key);
-int tls_credentials_release(struct tls_credentials_t *tls_credentials);
-void tls_credentials_free(struct tls_credentials_t *tls_credentials);
-struct tls_credentials_t *tls_credentials_reserve(struct worker_ctx *worker);
+int tls_certificate_set(struct network *net, const char *tls_cert, const char *tls_key);
+int tls_credentials_release(struct tls_credentials *tls_credentials);
+void tls_credentials_free(struct tls_credentials *tls_credentials);
+struct tls_credentials *tls_credentials_reserve(struct tls_credentials *worker);
worker->pkt_pool.alloc = (knot_mm_alloc_t) mp_alloc;
worker->outgoing = map_make();
worker->tcp_pipeline_max = MAX_PIPELINED;
- worker->tls_credentials = NULL;
return kr_ok();
}
mp_delete(worker->pkt_pool.ctx);
worker->pkt_pool.ctx = NULL;
map_clear(&worker->outgoing);
- tls_credentials_free(worker->tls_credentials);
- worker->tls_credentials = NULL;
}
#undef DEBUG_MSG
/** @cond internal Freelist of available mempools. */
typedef array_t(void *) mp_freelist_t;
-struct tls_credentials_t;
+struct tls_credentials;
/**
* Query resolution worker.
mp_freelist_t pool_ioreq;
mp_freelist_t pool_sessions;
knot_mm_t pkt_pool;
- struct tls_credentials_t *tls_credentials;
};
/* Worker callback */