]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Rdns: Add more functions for TCP based requests
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 2 Jan 2022 21:29:28 +0000 (21:29 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 2 Jan 2022 21:29:28 +0000 (21:29 +0000)
contrib/librdns/dns_private.h
contrib/librdns/rdns.h
contrib/librdns/rdns_ev.h
contrib/librdns/rdns_event.h
contrib/librdns/resolver.c
contrib/librdns/util.c

index 75fb5a3fabb9cd74eb36eb1fb6f1fa85b40e9394..38b6c8cc1afe6e22928468dadfb18234014a48a1 100644 (file)
@@ -34,7 +34,7 @@
 
 static const int dns_port = 53;
 static const int default_io_cnt = 8;
-static const int default_tcp_io_cnt = 2;
+static const int default_tcp_io_cnt = 1;
 
 #define UDP_PACKET_SIZE (4096 * 2)
 
@@ -174,10 +174,12 @@ struct rdns_tcp_channel {
 };
 
 KHASH_DECLARE(rdns_requests_hash, int, struct rdns_request *);
+#define RDNS_IO_CHANNEL_TAG UINT64_C(0xe190a5ba12f094c8)
 /**
  * IO channel for a specific DNS server
  */
 struct rdns_io_channel {
+       uint64_t struct_magic; /**< tag for this structure */
        struct rdns_server *srv;
        struct rdns_resolver *resolver;
        struct sockaddr *saddr;
index 266ccabc2d3cb7d408548f0a1fe1cba4a9a46d4a..2e00951ea386884fe5cfaffca45312bc38e9af79 100644 (file)
@@ -480,7 +480,7 @@ bool rdns_format_dns_name (struct rdns_resolver *resolver,
 
 void rdns_process_read (int fd, void *arg);
 void rdns_process_timer (void *arg);
-void rdns_process_retransmit (int fd, void *arg);
+void rdns_process_write (int fd, void *arg);
 
 #ifdef  __cplusplus
 }
index 3827bcde284d10c04321beee2e4d451863f955da..35f532ae3723a31a8c4e6761f853c6ecd8322ead 100644 (file)
@@ -88,7 +88,7 @@ rdns_libev_read_event (struct ev_loop *loop, ev_io *ev, int revents)
 static void
 rdns_libev_write_event (struct ev_loop *loop, ev_io *ev, int revents)
 {
-       rdns_process_retransmit (ev->fd, ev->data);
+       rdns_process_write(ev->fd, ev->data);
 }
 
 static void
index b3fc64aedadfe369ebc6452cd41a548123f51342..027181a0b6ed80bbeb5cf2cf68433833a93a323d 100644 (file)
@@ -85,7 +85,7 @@ rdns_libevent_read_event (int fd, short what, void *ud)
 static void
 rdns_libevent_write_event (int fd, short what, void *ud)
 {
-       rdns_process_retransmit (fd, ud);
+       rdns_process_write (fd, ud);
 }
 
 static void
index c27d9afcc77dd8cde85dca9849ee77613df55a59..520e85588226922c7b2d342fbd375cac7b076e57 100644 (file)
@@ -562,10 +562,9 @@ rdns_process_ioc_refresh (void *arg)
        }
 }
 
-void
-rdns_process_retransmit (int fd, void *arg)
+static void
+rdns_process_udp_retransmit (int fd, struct rdns_request *req)
 {
-       struct rdns_request *req = (struct rdns_request *)arg;
        struct rdns_resolver *resolver;
        struct rdns_reply *rep;
        int r;
@@ -589,7 +588,7 @@ rdns_process_retransmit (int fd, void *arg)
        if (r == 0) {
                /* Retransmit one more time */
                req->async_event = req->async->add_write (req->async->data,
-                                               fd, req);
+                               fd, req);
                req->state = RDNS_REQUEST_WAIT_SEND;
        }
        else if (r == -1) {
@@ -608,11 +607,50 @@ rdns_process_retransmit (int fd, void *arg)
        }
        else {
                req->async_event = req->async->add_timer (req->async->data,
-                       req->timeout, req);
+                               req->timeout, req);
                req->state = RDNS_REQUEST_WAIT_REPLY;
        }
 }
 
+static void
+rdns_process_tcp_write (int fd, struct rdns_io_channel *ioc)
+{
+
+}
+
+void
+rdns_process_write (int fd, void *arg)
+{
+       /*
+        * We first need to dispatch *arg to understand what has caused the write
+        * readiness event.
+        * The one possibility is that it was a UDP retransmit request, so our
+        * arg will be struct rdns_request *
+        * Another possibility is that write event was triggered by some TCP related
+        * stuff. In this case the only possibility is that our arg is struct rdns_io_channel *
+        * To distinguish these two cases (due to flaws in the rdns architecture in the first
+        * place) we compare the first 8 bytes with RDNS_IO_CHANNEL_TAG
+        */
+       uint64_t tag;
+
+       memcpy (&tag, arg, sizeof(tag));
+
+       if (tag == RDNS_IO_CHANNEL_TAG) {
+               struct rdns_io_channel *ioc = (struct rdns_io_channel *) arg;
+
+               if (IS_CHANNEL_CONNECTED(ioc)) {
+                       rdns_process_tcp_write(fd, ioc);
+               }
+               else {
+                       rdns_process_tcp_connect(fd, ioc);
+               }
+       }
+       else {
+               struct rdns_request *req = (struct rdns_request *) arg;
+               rdns_process_udp_retransmit(fd, req);
+       }
+}
+
 struct rdns_server *
 rdns_select_request_upstream (struct rdns_resolver *resolver,
                                                          struct rdns_request *req,
@@ -1116,6 +1154,7 @@ rdns_resolver_free (struct rdns_resolver *resolver)
                        }
                        UPSTREAM_DEL (resolver->servers, serv);
                        free (serv->io_channels);
+                       free (serv->tcp_io_channels);
                        free (serv->name);
                        free (serv);
                }
index 2fc9ec6c36d555cf27d2b785f38fe0f58f47f9aa..e33ab709cbe7647388fece01e23569dad569bb79 100644 (file)
@@ -540,6 +540,7 @@ rdns_ioc_new (struct rdns_server *serv,
                return NULL;
        }
 
+       nioc->struct_magic = RDNS_IO_CHANNEL_TAG;
        nioc->sock = rdns_make_client_socket (serv->name, serv->port,
                        is_tcp ? SOCK_STREAM : SOCK_DGRAM, &nioc->saddr, &nioc->slen);
        if (nioc->sock == -1) {