]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
knotd: add XDP message context to qdata, fix module queryacl
authorDaniel Salzman <daniel.salzman@nic.cz>
Fri, 10 Apr 2020 16:16:28 +0000 (18:16 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Tue, 21 Apr 2020 16:43:10 +0000 (18:43 +0200)
src/knot/include/module.h
src/knot/modules/queryacl/queryacl.c
src/knot/modules/stats/stats.c
src/knot/server/udp-handler.c
src/libknot/xdp/xdp.h

index 4020cf4b369a974aac287fdfb7f6917116fb124c..9ca02028d69d0dfca3d332b56a76597ae7a7be82 100644 (file)
@@ -36,7 +36,7 @@
 /*** Query module API. ***/
 
 /*! Current module ABI version. */
-#define KNOTD_MOD_ABI_VERSION  200
+#define KNOTD_MOD_ABI_VERSION  300
 /*! Module configuration name prefix. */
 #define KNOTD_MOD_NAME_PREFIX  "mod-"
 
@@ -380,7 +380,6 @@ typedef enum {
        KNOTD_QUERY_FLAG_LIMIT_ANY  = 1 << 2, /*!< Limit ANY QTYPE (respond with TC=1). */
        KNOTD_QUERY_FLAG_LIMIT_SIZE = 1 << 3, /*!< Apply UDP size limit. */
        KNOTD_QUERY_FLAG_COOKIE     = 1 << 4, /*!< Valid DNS Cookie indication. */
-       KNOTD_QUERY_FLAG_XDP        = 1 << 5, /*!< Processing over XDP indication. */
 } knotd_query_flag_t;
 
 /*! Query processing data context parameters. */
@@ -390,6 +389,7 @@ typedef struct {
        int socket;                            /*!< Current network socket. */
        unsigned thread_id;                    /*!< Current thread id. */
        void *server;                          /*!< Server object private item. */
+       struct knot_xdp_msg *xdp_msg;          /*!< Possible XDP message context. */
 } knotd_qdata_params_t;
 
 /*! Query processing data context. */
index 38a4f3c75e4e64c9e627f223b9bd57f629be84c2..03633ffb27148ab31d50cb24b4c655f1be1ff596 100644 (file)
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2018 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2020 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -43,14 +43,6 @@ static knotd_state_t queryacl_process(knotd_state_t state, knot_pkt_t *pkt,
                return state;
        }
 
-       // Get interface address.
-       struct sockaddr_storage iface;
-       socklen_t iface_len = sizeof(iface);
-       if (getsockname(qdata->params->socket, (struct sockaddr *)&iface, &iface_len) != 0) {
-               knotd_mod_log(mod, LOG_ERR, "failed to get interface address");
-               return KNOTD_STATE_FAIL;
-       }
-
        if (ctx->allow_addr.count > 0) {
                if (!knotd_conf_addr_range_match(&ctx->allow_addr, qdata->params->remote)) {
                        qdata->rcode = KNOT_RCODE_NOTAUTH;
@@ -59,7 +51,27 @@ static knotd_state_t queryacl_process(knotd_state_t state, knot_pkt_t *pkt,
        }
 
        if (ctx->allow_iface.count > 0) {
-               if (!knotd_conf_addr_range_match(&ctx->allow_iface, &iface)) {
+               struct sockaddr_storage iface;
+               socklen_t iface_len = sizeof(iface);
+               struct sockaddr_storage *iface_ptr;
+
+               if (qdata->params->xdp_msg != NULL) {
+#ifdef ENABLE_XDP
+                       iface_ptr = (struct sockaddr_storage *)&qdata->params->xdp_msg->ip_to;
+#else
+                       assert(0);
+                       return KNOTD_STATE_FAIL;
+#endif
+               } else {
+                       if (getsockname(qdata->params->socket, (struct sockaddr *)&iface,
+                                       &iface_len) != 0) {
+                               knotd_mod_log(mod, LOG_ERR, "failed to get interface address");
+                               return KNOTD_STATE_FAIL;
+                       }
+                       iface_ptr = &iface;
+               }
+
+               if (!knotd_conf_addr_range_match(&ctx->allow_iface, iface_ptr)) {
                        qdata->rcode = KNOT_RCODE_NOTAUTH;
                        return KNOTD_STATE_FAIL;
                }
index fccf7c39dfa8b584e815bab247ad2ce2ae02f731..84d9d77f26fee7bbbea4ac5501f5b30ba2987823 100644 (file)
@@ -490,7 +490,7 @@ static knotd_state_t update_counters(knotd_state_t state, knot_pkt_t *pkt,
 
        // Count the request protocol.
        if (stats->protocol) {
-               bool xdp = qdata->params->flags & KNOTD_QUERY_FLAG_XDP;
+               bool xdp = qdata->params->xdp_msg != NULL;
                if (qdata->params->remote->ss_family == AF_INET) {
                        if (qdata->params->flags & KNOTD_QUERY_FLAG_LIMIT_SIZE) {
                                if (xdp) {
index 74a16e0405880dec0bbbb6be3028a31df199a7b7..72ecee7885b95256b32bedc702bef016766b28a4 100644 (file)
@@ -59,17 +59,17 @@ static bool udp_state_active(int state)
 }
 
 static void udp_handle(udp_context_t *udp, int fd, struct sockaddr_storage *ss,
-                       struct iovec *rx, struct iovec *tx, bool use_xdp)
+                       struct iovec *rx, struct iovec *tx, struct knot_xdp_msg *xdp_msg)
 {
        /* Create query processing parameter. */
        knotd_qdata_params_t params = {
                .remote = ss,
                .flags = KNOTD_QUERY_FLAG_NO_AXFR | KNOTD_QUERY_FLAG_NO_IXFR | /* No transfers. */
                         KNOTD_QUERY_FLAG_LIMIT_SIZE | /* Enforce UDP packet size limit. */
-                        KNOTD_QUERY_FLAG_LIMIT_ANY | /* Limit ANY over UDP (depends on zone as well). */
-                        (use_xdp ? KNOTD_QUERY_FLAG_XDP : 0), /* Mark XDP processing. */
+                        KNOTD_QUERY_FLAG_LIMIT_ANY, /* Limit ANY over UDP (depends on zone as well). */
                .socket = fd,
                .server = udp->server,
+               .xdp_msg = xdp_msg,
                .thread_id = udp->thread_id
        };
 
@@ -213,7 +213,7 @@ static int udp_recvfrom_handle(udp_context_t *ctx, void *d, void *unused)
        udp_pktinfo_handle(&rq->msg[RX], &rq->msg[TX]);
 
        /* Process received pkt. */
-       udp_handle(ctx, rq->fd, &rq->addr, &rq->iov[RX], &rq->iov[TX], false);
+       udp_handle(ctx, rq->fd, &rq->addr, &rq->iov[RX], &rq->iov[TX], NULL);
 
        return KNOT_EOK;
 }
@@ -321,7 +321,7 @@ static int udp_recvmmsg_handle(udp_context_t *ctx, void *d, void *unused)
 
                udp_pktinfo_handle(&rq->msgs[RX][i].msg_hdr, &rq->msgs[TX][i].msg_hdr);
 
-               udp_handle(ctx, rq->fd, rq->addrs + i, rx, tx, false);
+               udp_handle(ctx, rq->fd, rq->addrs + i, rx, tx, NULL);
                rq->msgs[TX][i].msg_len = tx->iov_len;
                rq->msgs[TX][i].msg_hdr.msg_namelen = 0;
                if (tx->iov_len > 0) {
@@ -416,7 +416,8 @@ static int xdp_recvmmsg_handle(udp_context_t *ctx, void *d, void *xdp_sock)
 
                udp_handle(ctx, knot_xdp_socket_fd(xdp_sock),
                           (struct sockaddr_storage *)&rq->msgs_rx[i].ip_from,
-                          &rq->msgs_rx[i].payload, &rq->msgs_tx[i].payload, true);
+                          &rq->msgs_rx[i].payload, &rq->msgs_tx[i].payload,
+                          &rq->msgs_rx[i]);
                responses++;
        }
 
index dc0538666cbafdf73d58bb1a58e3a5ebcb4397a1..f6408f3234502d5ef125dbaa5a502a70d793715a 100644 (file)
 #endif
 
 /*! \brief A packet with src & dst MAC & IP addrs + UDP payload. */
-typedef struct {
+typedef struct knot_xdp_msg knot_xdp_msg_t;
+struct knot_xdp_msg {
        struct sockaddr_in6 ip_from;
        struct sockaddr_in6 ip_to;
        uint8_t *eth_from;
        uint8_t *eth_to;
        struct iovec payload;
-} knot_xdp_msg_t;
+};
 
 /*!
  * \brief Styles of loading BPF program.