]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: track query in BEGIN and dst addr
authorMarek Vavrusa <marek@vavrusa.com>
Thu, 16 Jun 2016 17:39:07 +0000 (10:39 -0700)
committerMarek Vavrusa <marek@vavrusa.com>
Wed, 6 Jul 2016 06:33:38 +0000 (23:33 -0700)
* in the begin() layer, the incoming query is
  exposed as req->qsource.packet, it is invalidated
  after begin() and should not be modified
* the destination address (local interface) is
  also tracked for filtering purposes

daemon/lua/kres.lua
daemon/worker.c
daemon/worker.h
lib/resolve.c
lib/resolve.h

index e568172ff3d54269f2e604b2bd7d9f2ad42e5990..5c6fd505abc730e12fa04bf8fe88f00ef96b4592 100644 (file)
@@ -212,6 +212,8 @@ struct kr_request {
        struct {
                const knot_rrset_t *key;
                const struct sockaddr *addr;
+               const struct sockaddr *dst_addr;
+               const knot_pkt_t *packet;
        } qsource;
        struct {
            unsigned rtt;
@@ -467,7 +469,6 @@ local function rr2str(rr)
                dname2str(rr.owner), rr.ttl, rr.type, #rr.rdata, rdata)
 end
 
-
 -- Module API
 local kres = {
        -- Constants
index 00de593cce9b7a865dddd5194835ba413e58f77c..30cce83426631ec4b238b92791620e7222d3e7e8 100644 (file)
@@ -254,6 +254,7 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha
        task->on_complete = NULL;
        task->req.qsource.key = NULL;
        task->req.qsource.addr = NULL;
+       task->req.qsource.dst_addr = NULL;
        /* Remember query source addr */
        if (addr) {
                size_t addr_len = sizeof(struct sockaddr_in);
@@ -264,6 +265,21 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha
        } else {
                task->source.addr.ip4.sin_family = AF_UNSPEC;
        }
+       /* Remember the destination address. */
+       if (handle) {
+               int addr_len = sizeof(task->source.dst_addr);
+               struct sockaddr *dst_addr = (struct sockaddr *)&task->source.dst_addr;
+               task->source.dst_addr.ip4.sin_family = AF_UNSPEC;
+               if (handle->type == UV_UDP) {
+                       if (uv_udp_getsockname((uv_udp_t *)handle, dst_addr, &addr_len) == 0) {
+                               task->req.qsource.dst_addr = dst_addr;
+                       }
+               } else if (handle->type == UV_TCP) {
+                       if (uv_tcp_getsockname((uv_tcp_t *)handle, dst_addr, &addr_len) == 0) {
+                               task->req.qsource.dst_addr = dst_addr;
+                       }
+               }
+       }
        worker->stats.concurrent += 1;
        return task;
 }
index 27d6c184d5df64005c03f6d71d6e2225291434e9..e5527486e9a8f54ada0bb4451b8a3aac156b8738 100644 (file)
@@ -85,6 +85,10 @@ struct qr_task
                        struct sockaddr_in ip4;
                        struct sockaddr_in6 ip6;
                } addr;
+               union {
+                       struct sockaddr_in ip4;
+                       struct sockaddr_in6 ip6;
+               } dst_addr;
                uv_handle_t *handle;
        } source;
        uint32_t refs;
index bd9fce5f47203da24b55ad606fb887c0a84c9346..9ad5205d75abd12748afc7cbc69f85bd7b625403 100644 (file)
@@ -410,7 +410,9 @@ static int resolve_query(struct kr_request *request, const knot_pkt_t *packet)
        }
 
        /* Expect answer, pop if satisfied immediately */
+       request->qsource.packet = packet;
        ITERATE_LAYERS(request, qry, begin, request);
+       request->qsource.packet = NULL;
        if (request->state == KNOT_STATE_DONE) {
                kr_rplan_pop(rplan, qry);
        }
index 2896d54f277739a8d35ee16268d94462040c3495..563d85219dad8b4c6db1272ec3d43dc932a2365e 100644 (file)
@@ -112,6 +112,8 @@ struct kr_request {
     struct {
         const knot_rrset_t *key;
         const struct sockaddr *addr;
+        const struct sockaddr *dst_addr;
+        const knot_pkt_t *packet;
     } qsource;
     struct {
         unsigned rtt;                  /**< Current upstream RTT */