]> source.dussan.org Git - rspamd.git/commitdiff
Add support for edns0 in rspamd.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 2 Jan 2014 17:43:35 +0000 (17:43 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 2 Jan 2014 17:43:35 +0000 (17:43 +0000)
src/dns.c
src/dns.h

index cf70a6a86398b8b35941e9b1a17197bc7e72fc64..f8f44489315a92c769a15425cda39732622709a2 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -294,7 +294,8 @@ allocate_packet (struct rspamd_dns_request *req, guint namelen)
 {
        namelen += 96 /* header */
                + 2 /* Trailing label */
-               + 4; /* Resource type */
+               + 4 /* Resource type */
+               + 11; /* EDNS0 RR */
        req->packet = memory_pool_alloc (req->pool, namelen);
        req->pos = 0;
        req->packet_len = namelen;
@@ -311,6 +312,7 @@ make_dns_header (struct rspamd_dns_request *req)
        header->qid = dns_permutor_generate_id (req->resolver->permutor);
        header->rd = 1;
        header->qdcount = htons (1);
+       header->arcount = htons (1);
        req->pos += sizeof (struct dns_header);
        req->id = header->qid;
 }
@@ -575,6 +577,29 @@ make_spf_req (struct rspamd_dns_request *req, const gchar *name)
        req->requested_name = name;
 }
 
+static void
+rspamd_dns_add_edns0 (struct rspamd_dns_request *req)
+{
+       guint8 *p8;
+       guint16 *p16;
+
+       p8 = (guint8 *)(req->packet + req->pos);
+       *p8 = '\0'; /* Name is root */
+       p16 = (guint16 *)(req->packet + req->pos + 1);
+       *p16++ = htons (DNS_T_OPT);
+       /* UDP packet length */
+       *p16++ = htons (UDP_PACKET_SIZE);
+       /* Extended rcode 00 00 */
+       *p16++ = 0;
+       /* Z 10000000 00000000 to allow dnssec */
+       p8 = (guint8 *)p16++;
+       /* Not a good time for DNSSEC */
+       *p8 = 0x00;
+       /* Length */
+       *p16 = 0;
+       req->pos += sizeof (guint8) + sizeof (guint16) * 5;
+}
+
 static gint
 send_dns_request (struct rspamd_dns_request *req)
 {
@@ -1294,6 +1319,9 @@ make_dns_request (struct rspamd_dns_resolver *resolver,
        }
        va_end (args);
 
+       /* Add EDNS RR */
+       rspamd_dns_add_edns0 (req);
+
        req->retransmits = 0;
        req->time = time (NULL);
        if (resolver->is_master_slave) {
index 68aa17e82231445f6bb15f261dec48e01c9b74a4..1c88e5a187afc87cb787e6451d57bc003c5abe10 100644 (file)
--- a/src/dns.h
+++ b/src/dns.h
@@ -36,7 +36,7 @@
 #define DNS_D_MAXLABEL 63      /* + 1 '\0' */
 #define DNS_D_MAXNAME  255     /* + 1 '\0' */
 
-#define MAX_ADDRS 1
+#define MAX_ADDRS 10
 
 struct rspamd_dns_reply;
 struct config_file;
@@ -240,6 +240,7 @@ enum dns_type {
        DNS_T_TXT       = 16,
        DNS_T_AAAA      = 28,
        DNS_T_SRV       = 33,
+       DNS_T_OPT       = 41,
        DNS_T_SSHFP     = 44,
        DNS_T_SPF       = 99,