#include "daemon/io.h"
-#include <assert.h>
#include <contrib/ucw/lib.h>
#include <contrib/ucw/mempool.h>
#include <libknot/errcode.h>
if (session_flags(s)->outgoing) {
const struct sockaddr *peer = session_get_peer(s);
- assert(peer->sa_family != AF_UNSPEC);
+ if (!kr_assume(peer->sa_family != AF_UNSPEC))
+ return;
if (kr_sockaddr_cmp(peer, addr) != 0) {
kr_log_verbose("[io] <= ignoring UDP from unexpected address '%s'\n",
kr_straddr(addr));
}
ssize_t consumed = session_wirebuf_consume(s, (const uint8_t *)buf->base,
nread);
- assert(consumed == nread); (void)consumed;
+ (void)!kr_assume(consumed == nread);
session_wirebuf_process(s, addr);
session_wirebuf_discard(s);
mp_flush(the_worker->pkt_pool.ctx);
check_bufsize(h);
/* Handle is already created, just create context. */
struct session *s = session_new(h, false, false);
- assert(s);
+ kr_require(s);
session_flags(s)->outgoing = false;
int socklen = sizeof(union inaddr);
{
struct session *s = timer->data;
- assert(!session_flags(s)->closing);
+ if (!kr_assume(!session_flags(s)->closing))
+ return;
if (!session_tasklist_is_empty(s)) {
int finalized = session_tasklist_finalize_expired(s);
static void tcp_recv(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf)
{
struct session *s = handle->data;
- assert(s && session_get_handle(s) == (uv_handle_t *)handle &&
- handle->type == UV_TCP);
+ if (!kr_assume(s && session_get_handle(s) == (uv_handle_t *)handle && handle->type == UV_TCP))
+ return;
if (session_flags(s)->closing) {
return;
/* data points to start of the free space in session wire buffer.
Simple increase internal counter. */
consumed = session_wirebuf_consume(s, data, data_len);
- assert(consumed == data_len);
+ (void)!kr_assume(consumed == data_len);
int ret = session_wirebuf_process(s, session_get_peer(s));
if (ret < 0) {
{
struct tls_ctx *ctx = session_tls_get_server_ctx(session);
ssize_t sent = 0;
- assert(ctx);
+ kr_require(ctx);
sent = gnutls_record_send(ctx->c.tls_session, buf, len);
if (sent < 0) {
/* struct session was allocated \ borrowed from memory pool. */
struct session *s = client->data;
- assert(session_flags(s)->outgoing == false);
- assert(session_flags(s)->has_tls == tls);
+ kr_require(session_flags(s)->outgoing == false);
+ kr_require(session_flags(s)->has_tls == tls);
if (uv_accept(master, (uv_stream_t *)client) != 0) {
/* close session, close underlying uv handles and
}
xdp_handle_data_t *xhd = handle->data;
- assert(xhd && xhd->session && xhd->socket);
+ kr_require(xhd && xhd->session && xhd->socket);
uint32_t rcvd;
knot_xdp_msg_t msgs[XDP_RX_BATCH_SIZE];
int ret = knot_xdp_recv(xhd->socket, msgs, XDP_RX_BATCH_SIZE, &rcvd
, NULL
#endif
);
- if (ret == KNOT_EOK) {
+ if (kr_assume(ret == KNOT_EOK)) {
kr_log_verbose("[xdp] poll triggered, processing a batch of %d packets\n",
(int)rcvd);
- } else {
+ } else { /* ATM other error codes can only be returned when called incorrectly */
kr_log_error("[xdp] knot_xdp_recv(): %d, %s\n", ret, knot_strerror(ret));
- assert(false); // ATM it can only be returned when called incorrectly
return;
}
- assert(rcvd <= XDP_RX_BATCH_SIZE);
+ kr_require(rcvd <= XDP_RX_BATCH_SIZE);
for (int i = 0; i < rcvd; ++i) {
const knot_xdp_msg_t *msg = &msgs[i];
- assert(msg->payload.iov_len <= KNOT_WIRE_MAX_PKTSIZE);
+ kr_require(msg->payload.iov_len <= KNOT_WIRE_MAX_PKTSIZE);
knot_pkt_t *kpkt = knot_pkt_new(msg->payload.iov_base, msg->payload.iov_len,
&the_worker->pkt_pool);
if (kpkt == NULL) {
/// Warn if the XDP program is running in emulated mode (XDP_SKB)
static void xdp_warn_mode(const char *ifname)
{
- assert(ifname);
+ if (!kr_assume(ifname))
+ return;
+
const unsigned if_index = if_nametoindex(ifname);
if (!if_index) {
kr_log_info("[xdp] warning: interface %s, unexpected error when converting its name: %s\n",
if (!ret) xdp_warn_mode(ifname);
if (!ret) ret = uv_idle_init(loop, &xhd->tx_waker);
- if (ret) {
+ if (ret || !kr_assume(xhd->socket)) {
free(xhd);
- return kr_error(ret);
+ return ret == 0 ? kr_error(EINVAL) : kr_error(ret);
}
- assert(xhd->socket);
xhd->tx_waker.data = xhd->socket;
ep->fd = knot_xdp_socket_fd(xhd->socket); // probably not useful
// beware: this sets poll_handle->data
xhd->session = session_new(ep->handle, false, false);
- assert(!session_flags(xhd->session)->outgoing);
+ kr_require(!session_flags(xhd->session)->outgoing);
session_get_sockname(xhd->session)->sa_family = AF_XDP; // to have something in there
ep->handle->data = xhd;
knot_xdp_deinit(xhd->socket);
free(xhd);
#else
- assert(false);
+ (void)!kr_assume(false);
#endif
}
}
case UV_TCP:
return uv_read_start((uv_stream_t *)handle, &handle_getbuf, &tcp_recv);
default:
- assert(!EINVAL);
+ (void)!kr_assume(false);
return kr_error(EINVAL);
}
}