more dns cookie handling code
This commit is contained in:
parent
fe478e954d
commit
5fdf4f780d
@ -164,8 +164,8 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/ac/ar-lib \
|
||||
$(top_srcdir)/ac/compile $(top_srcdir)/ac/config.guess \
|
||||
$(top_srcdir)/ac/config.sub $(top_srcdir)/ac/install-sh \
|
||||
$(top_srcdir)/ac/ltmain.sh $(top_srcdir)/ac/missing ac/ar-lib \
|
||||
ac/compile ac/config.guess ac/config.sub ac/install-sh \
|
||||
ac/ltmain.sh ac/missing
|
||||
ac/compile ac/config.guess ac/config.sub ac/depcomp \
|
||||
ac/install-sh ac/ltmain.sh ac/missing
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
|
130
mio/bin/t01.c
130
mio/bin/t01.c
@ -697,21 +697,28 @@ int z = 0;
|
||||
|
||||
static void on_dnc_resolve(mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum_t status, const void* data, mio_oow_t dlen)
|
||||
{
|
||||
mio_dns_pkt_info_t* pi = MIO_NULL;
|
||||
mio_dns_pkt_info_t* pi = (mio_dns_pkt_info_t*)data;
|
||||
|
||||
if (data) // status == MIO_ENOERR
|
||||
if (pi) // status == MIO_ENOERR
|
||||
{
|
||||
mio_uint32_t i;
|
||||
|
||||
pi = mio_dns_make_packet_info(mio_svc_dnc_getmio(dnc), data, dlen);
|
||||
if (!pi) goto no_data;
|
||||
|
||||
if (pi->hdr.rcode != MIO_DNS_RCODE_NOERROR) goto no_data;
|
||||
|
||||
if (pi->ancount < 0) goto no_data;
|
||||
|
||||
printf (">>>>>>>> RRDLEN = %d\n", (int)pi->_rrdlen);
|
||||
printf (">>>>>>>> RCODE %d EDNS exist %d uplen %d version %d dnssecok %d\n", pi->hdr.rcode, pi->edns.exist, pi->edns.uplen, pi->edns.version, pi->edns.dnssecok);
|
||||
if (pi->hdr.rcode == MIO_DNS_RCODE_BADCOOKIE)
|
||||
{
|
||||
/* TODO: must retry */
|
||||
}
|
||||
|
||||
if (pi->edns.cookie.client_len > 0 && !pi->edns.cookie_verified) /* TODO: do i need to check if cookie.server_len > 0? */
|
||||
{
|
||||
/* client cookie is bad.. */
|
||||
printf ("CLIENT COOKIE IS BAD>>>>>>>>>>>>>>>>>>>\n");
|
||||
}
|
||||
|
||||
//if (pi->hdr.rcode != MIO_DNS_RCODE_NOERROR) goto no_data;
|
||||
if (pi->ancount < 0) goto no_data;
|
||||
|
||||
for (i = 0; i < pi->ancount; i++)
|
||||
{
|
||||
@ -763,7 +770,8 @@ static void on_dnc_resolve(mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum
|
||||
}
|
||||
|
||||
done:
|
||||
if (pi) mio_dns_free_packet_info(mio_svc_dnc_getmio(dnc), pi);
|
||||
/* nothing special */
|
||||
return;
|
||||
}
|
||||
|
||||
static void on_dnc_resolve_brief (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum_t status, const void* data, mio_oow_t dlen)
|
||||
@ -971,6 +979,32 @@ static void handle_signal (int sig)
|
||||
if (g_mio) mio_stop (g_mio, MIO_STOPREQ_TERMINATION);
|
||||
}
|
||||
|
||||
static int schedule_timer_job_after (mio_t* mio, const mio_ntime_t* fire_after, mio_tmrjob_handler_t handler, void* ctx)
|
||||
{
|
||||
mio_tmrjob_t tmrjob;
|
||||
|
||||
memset (&tmrjob, 0, MIO_SIZEOF(tmrjob));
|
||||
tmrjob.ctx = ctx;
|
||||
|
||||
mio_gettime (mio, &tmrjob.when);
|
||||
MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, fire_after);
|
||||
|
||||
tmrjob.handler = handler;
|
||||
tmrjob.idxptr = MIO_NULL;
|
||||
|
||||
return mio_instmrjob(mio, &tmrjob);
|
||||
}
|
||||
|
||||
|
||||
static void send_test_query (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job)
|
||||
{
|
||||
//if (!mio_svc_dnc_resolve((mio_svc_dnc_t*)job->ctx, "www.microsoft.com", MIO_DNS_RRT_CNAME, MIO_SVC_DNC_RESOLVE_FLAG_COOKIE, on_dnc_resolve, 0))
|
||||
if (!mio_svc_dnc_resolve((mio_svc_dnc_t*)job->ctx, "mailserver.manyhost.net", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_COOKIE, on_dnc_resolve, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> mailserver.manyhost.net\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
@ -1183,7 +1217,9 @@ for (i = 0; i < 5; i++)
|
||||
reply_tmout.sec = 1;
|
||||
reply_tmout.nsec = 0;
|
||||
|
||||
mio_bcstrtoskad (mio, "8.8.8.8:53", &servaddr);
|
||||
//mio_bcstrtoskad (mio, "8.8.8.8:53", &servaddr);
|
||||
//mio_bcstrtoskad (mio, "130.59.31.29:53", &servaddr); // ns2.switch.ch
|
||||
mio_bcstrtoskad (mio, "134.119.216.86:53", &servaddr); // ns.manyhost.net
|
||||
//mio_bcstrtoskad (mio, "[fe80::c7e2:bd6e:1209:ac1b]:1153", &servaddr);
|
||||
//mio_bcstrtoskad (mio, "[fe80::c7e2:bd6e:1209:ac1b%eno1]:1153", &servaddr);
|
||||
|
||||
@ -1191,11 +1227,17 @@ for (i = 0; i < 5; i++)
|
||||
mio_bcstrtoskad (mio, "0.0.0.0:9988", &htts_bind_addr);
|
||||
|
||||
dnc = mio_svc_dnc_start(mio, &servaddr, MIO_NULL, &send_tmout, &reply_tmout, 2); /* option - send to all, send one by one */
|
||||
if (!dnc)
|
||||
{
|
||||
MIO_INFO1 (mio, "UNABLE TO START DNC - %js\n", mio_geterrmsg(mio));
|
||||
}
|
||||
|
||||
htts = mio_svc_htts_start(mio, &htts_bind_addr, process_http_request);
|
||||
if (htts) mio_svc_htts_setservernamewithbcstr (htts, "MIO-HTTP");
|
||||
else MIO_INFO1 (mio, "UNABLE TO START HTTS - %js\n", mio_geterrmsg(mio));
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
if (dnc)
|
||||
{
|
||||
mio_dns_bqr_t qrs[] =
|
||||
{
|
||||
@ -1275,42 +1317,48 @@ for (i = 0; i < 5; i++)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dnc)
|
||||
{
|
||||
mio_ntime_t x;
|
||||
MIO_INIT_NTIME (&x, 5, 0);
|
||||
schedule_timer_job_after (mio, &x, send_test_query, dnc);
|
||||
|
||||
if (!mio_svc_dnc_resolve(dnc, "b.wild.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_PREFER_TCP, on_dnc_resolve, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> a.wild.com\n");
|
||||
}
|
||||
if (!mio_svc_dnc_resolve(dnc, "b.wild.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_PREFER_TCP, on_dnc_resolve, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> a.wild.com\n");
|
||||
}
|
||||
|
||||
if (!mio_svc_dnc_resolve(dnc, "www.microsoft.com", MIO_DNS_RRT_CNAME, MIO_SVC_DNC_RESOLVE_FLAG_COOKIE, on_dnc_resolve, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> www.microsoft.com\n");
|
||||
}
|
||||
if (!mio_svc_dnc_resolve(dnc, "www.microsoft.com", MIO_DNS_RRT_CNAME, MIO_SVC_DNC_RESOLVE_FLAG_COOKIE, on_dnc_resolve, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> www.microsoft.com\n");
|
||||
}
|
||||
|
||||
|
||||
//if (!mio_svc_dnc_resolve(dnc, "www.microsoft.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
if (!mio_svc_dnc_resolve(dnc, "code.miflux.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF | MIO_SVC_DNC_RESOLVE_FLAG_PREFER_TCP, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> code.miflux.com\n");
|
||||
}
|
||||
//if (!mio_svc_dnc_resolve(dnc, "www.microsoft.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
if (!mio_svc_dnc_resolve(dnc, "code.miflux.com", MIO_DNS_RRT_A, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF | MIO_SVC_DNC_RESOLVE_FLAG_PREFER_TCP, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> code.miflux.com\n");
|
||||
}
|
||||
|
||||
if (!mio_svc_dnc_resolve(dnc, "45.77.246.105.in-addr.arpa", MIO_DNS_RRT_PTR, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> 45.77.246.105.in-addr.arpa.\n");
|
||||
}
|
||||
if (!mio_svc_dnc_resolve(dnc, "45.77.246.105.in-addr.arpa", MIO_DNS_RRT_PTR, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> 45.77.246.105.in-addr.arpa.\n");
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (!mio_svc_dnc_resolve(dnc, "1.1.1.1.in-addr.arpa", MIO_DNS_RRT_PTR, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> 1.1.1.1.in-addr.arpa\n");
|
||||
}
|
||||
#if 0
|
||||
if (!mio_svc_dnc_resolve(dnc, "1.1.1.1.in-addr.arpa", MIO_DNS_RRT_PTR, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> 1.1.1.1.in-addr.arpa\n");
|
||||
}
|
||||
|
||||
//if (!mio_svc_dnc_resolve(dnc, "ipv6.google.com", MIO_DNS_RRT_AAAA, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_SOA, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
//if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_NS, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> code.miflux.com\n");
|
||||
}
|
||||
#endif
|
||||
//if (!mio_svc_dnc_resolve(dnc, "ipv6.google.com", MIO_DNS_RRT_AAAA, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_SOA, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
//if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_NS, MIO_SVC_DNC_RESOLVE_FLAG_BRIEF, on_dnc_resolve_brief, 0))
|
||||
{
|
||||
printf ("resolve attempt failure ---> code.miflux.com\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
{
|
||||
@ -1342,7 +1390,7 @@ for (i = 0; i < 20; i++)
|
||||
|
||||
/* TODO: let mio close it ... dnc is svc. sck is dev. */
|
||||
if (htts) mio_svc_htts_stop (htts);
|
||||
mio_svc_dnc_stop (dnc);
|
||||
if (dnc) mio_svc_dnc_stop (dnc);
|
||||
}
|
||||
|
||||
g_mio = MIO_NULL;
|
||||
|
@ -1,3 +1,4 @@
|
||||
#if defined(MIO_ENABLE_MARIADB)
|
||||
|
||||
#include <mio.h>
|
||||
#include <mio-mar.h>
|
||||
@ -286,3 +287,16 @@ printf ("about to close mio...\n");
|
||||
if (mio) mio_close (mio);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#include <stdio.h>
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
printf ("mariadb not enabled\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -56,6 +56,8 @@ struct mio_svc_dnc_t
|
||||
* regardless of max_tries. */
|
||||
mio_oow_t max_tries;
|
||||
|
||||
mio_dns_cookie_t cookie;
|
||||
|
||||
mio_oow_t seq;
|
||||
mio_dns_msg_t* pending_req;
|
||||
};
|
||||
@ -843,6 +845,7 @@ struct dnc_dns_msg_resolve_xtn_t
|
||||
{
|
||||
mio_dns_rrt_t qtype;
|
||||
int flags;
|
||||
mio_uint8_t client_cookie[MIO_DNS_COOKIE_CLIENT_LEN];
|
||||
mio_svc_dnc_on_resolve_t on_resolve;
|
||||
};
|
||||
typedef struct dnc_dns_msg_resolve_xtn_t dnc_dns_msg_resolve_xtn_t;
|
||||
@ -857,14 +860,7 @@ static void on_dnc_resolve (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnu
|
||||
{
|
||||
mio_t* mio = mio_svc_dnc_getmio(dnc);
|
||||
mio_dns_pkt_info_t* pi = MIO_NULL;
|
||||
dnc_dns_msg_resolve_xtn_t* reqmsgxtn = dnc_dns_msg_resolve_getxtn(reqmsg);
|
||||
|
||||
if (!(reqmsgxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_BRIEF))
|
||||
{
|
||||
/* the full reply packet is requested. no transformation is required */
|
||||
if (reqmsgxtn->on_resolve) reqmsgxtn->on_resolve (dnc, reqmsg, status, data, dlen);
|
||||
return;
|
||||
}
|
||||
dnc_dns_msg_resolve_xtn_t* resolxtn = dnc_dns_msg_resolve_getxtn(reqmsg);
|
||||
|
||||
if (data)
|
||||
{
|
||||
@ -879,12 +875,46 @@ static void on_dnc_resolve (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnu
|
||||
goto no_data;
|
||||
}
|
||||
|
||||
/*
|
||||
if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
{
|
||||
// retry with server cookie received....
|
||||
}
|
||||
*/
|
||||
if (resolxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_COOKIE)
|
||||
{
|
||||
/* ------------------------------------------------- */
|
||||
if (pi->edns.cookie.client_len > 0)
|
||||
{
|
||||
if (MIO_MEMCMP(resolxtn->client_cookie, pi->edns.cookie.data.client, pi->edns.cookie.client_len) == 0)
|
||||
{
|
||||
pi->edns.cookie_verified = 1; /* UGLY to set data in mio_dns_pkt_info_t */
|
||||
}
|
||||
}
|
||||
|
||||
if (pi->edns.cookie.server_len > 0)
|
||||
{
|
||||
MIO_MEMCPY (dnc->cookie.data.server, pi->edns.cookie.data.server, pi->edns.cookie.server_len);
|
||||
dnc->cookie.server_len = pi->edns.cookie.server_len;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
if (pi->hdr.rcode == MIO_DNS_RCODE_BADCOOKIE)
|
||||
{
|
||||
/* TODO: retry it */
|
||||
#if 0
|
||||
if (mio_svc_dnc_resolve(dnc, qname, resolxtn->qtype, resolxtn->flags, on_dnc_resolve, resolxtn->xtnsize) <= -1)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
/*how to retry?*/
|
||||
}
|
||||
#endif
|
||||
/* ------------------------------------------------- */
|
||||
|
||||
}
|
||||
|
||||
if (!(resolxtn->flags & MIO_SVC_DNC_RESOLVE_FLAG_BRIEF))
|
||||
{
|
||||
/* the full reply packet is requested. */
|
||||
if (resolxtn->on_resolve) resolxtn->on_resolve (dnc, reqmsg, status, pi, 0);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (pi->hdr.rcode != MIO_DNS_RCODE_NOERROR)
|
||||
{
|
||||
@ -895,7 +925,7 @@ if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
if (pi->ancount < 0) goto no_data;
|
||||
|
||||
/* in the brief mode, we inspect the answer section only */
|
||||
if (reqmsgxtn->qtype == MIO_DNS_RRT_Q_ANY)
|
||||
if (resolxtn->qtype == MIO_DNS_RRT_Q_ANY)
|
||||
{
|
||||
/* return A or AAAA for ANY in the brief mode */
|
||||
for (i = 0; i < pi->ancount; i++)
|
||||
@ -903,7 +933,7 @@ if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
if (pi->rr.an[i].rrtype == MIO_DNS_RRT_A || pi->rr.an[i].rrtype == MIO_DNS_RRT_AAAA)
|
||||
{
|
||||
match_found:
|
||||
if (reqmsgxtn->on_resolve) reqmsgxtn->on_resolve (dnc, reqmsg, status, &pi->rr.an[i], MIO_SIZEOF(pi->rr.an[i]));
|
||||
if (resolxtn->on_resolve) resolxtn->on_resolve (dnc, reqmsg, status, &pi->rr.an[i], MIO_SIZEOF(pi->rr.an[i]));
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@ -914,7 +944,7 @@ if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
/* it is a bit time taking to retreive the query type from the packet
|
||||
* bundled in reqmsg as it requires parsing of the packet. let me use
|
||||
* the query type i stored in the extension space. */
|
||||
switch (reqmsgxtn->qtype)
|
||||
switch (resolxtn->qtype)
|
||||
{
|
||||
case MIO_DNS_RRT_Q_ANY:
|
||||
case MIO_DNS_RRT_Q_AFXR: /* AFXR doesn't make sense in the brief mode. just treat it like ANY */
|
||||
@ -933,7 +963,7 @@ if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
break;
|
||||
|
||||
default:
|
||||
if (pi->rr.an[i].rrtype == reqmsgxtn->qtype) goto match_found;
|
||||
if (pi->rr.an[i].rrtype == resolxtn->qtype) goto match_found;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -942,7 +972,7 @@ if (pi->hdr.code == MIO_DNS_RCODE_BADCOOKIE)
|
||||
else
|
||||
{
|
||||
no_data:
|
||||
if (reqmsgxtn->on_resolve) reqmsgxtn->on_resolve (dnc, reqmsg, status, MIO_NULL, 0);
|
||||
if (resolxtn->on_resolve) resolxtn->on_resolve (dnc, reqmsg, status, MIO_NULL, 0);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -988,10 +1018,10 @@ mio_dns_msg_t* mio_svc_dnc_resolve (mio_svc_dnc_t* dnc, const mio_bch_t* qname,
|
||||
|
||||
if (resolve_flags & MIO_SVC_DNC_RESOLVE_FLAG_COOKIE)
|
||||
{
|
||||
static mio_uint8_t dummy[48];
|
||||
beopt_cookie.code = MIO_DNS_EOPT_COOKIE;
|
||||
beopt_cookie.dlen = MIO_COUNTOF(dummy);
|
||||
beopt_cookie.dptr = dummy;
|
||||
beopt_cookie.dlen = MIO_DNS_COOKIE_CLIENT_LEN;
|
||||
if (dnc->cookie.server_len > 0) beopt_cookie.dlen += dnc->cookie.server_len;
|
||||
beopt_cookie.dptr = &dnc->cookie.data;
|
||||
|
||||
qedns.beonum = 1;
|
||||
qedns.beoptr = &beopt_cookie;
|
||||
@ -1002,9 +1032,12 @@ mio_dns_msg_t* mio_svc_dnc_resolve (mio_svc_dnc_t* dnc, const mio_bch_t* qname,
|
||||
{
|
||||
int send_flags;
|
||||
|
||||
if (resolve_flags & MIO_SVC_DNC_RESOLVE_FLAG_COOKIE)
|
||||
#if 0
|
||||
if ((resolve_flags & MIO_SVC_DNC_RESOLVE_FLAG_COOKIE) && dnc->cookie.server_len == 0)
|
||||
{
|
||||
/* ASSUMPTIONS:
|
||||
/* Exclude the server cookie from the packet when the server cookie is not available.
|
||||
*
|
||||
* ASSUMPTIONS:
|
||||
* the eopt entries are at the back of the packet.
|
||||
* only 1 eopt entry(MIO_DNS_EOPT_COOKIE) has been added.
|
||||
*
|
||||
@ -1014,25 +1047,25 @@ mio_dns_msg_t* mio_svc_dnc_resolve (mio_svc_dnc_t* dnc, const mio_bch_t* qname,
|
||||
mio_dns_rrtr_t* edns_rrtr;
|
||||
mio_dns_eopt_t* eopt;
|
||||
|
||||
/* TODO: generate the client cookie and copy it */
|
||||
/* if the server cookie is available, copy it to the packet. but the server cookike may still be shorter than 40. so some manipulation is still needed
|
||||
* if not, manipualte the length like below */
|
||||
edns_rrtr = (mio_dns_rrtr_t*)((mio_uint8_t*)mio_dns_msg_to_pkt(reqmsg) + reqmsg->ednsrrtroff);
|
||||
reqmsg->pktlen -= 40; /* maximum server cookie space */
|
||||
reqmsg->pktlen -= MIO_DNS_COOKIE_SERVER_MAX_LEN;
|
||||
|
||||
MIO_ASSERT (dnc->mio, edns_rrtr->rrtype == MIO_CONST_HTON16(MIO_DNS_RRT_OPT));
|
||||
MIO_ASSERT (dnc->mio, edns_rrtr->dlen == MIO_CONST_HTON16(52));
|
||||
MIO_ASSERT (dnc->mio, edns_rrtr->dlen == MIO_CONST_HTON16(MIO_SIZEOF(mio_dns_eopt_t) + MIO_DNS_COOKIE_MAX_LEN));
|
||||
edns_rrtr->dlen = MIO_CONST_HTON16(MIO_SIZEOF(mio_dns_eopt_t) + MIO_DNS_COOKIE_CLIENT_LEN);
|
||||
|
||||
edns_rrtr->dlen = MIO_CONST_HTON16(12);
|
||||
eopt = (mio_dns_eopt_t*)(edns_rrtr + 1);
|
||||
MIO_ASSERT (dnc->mio, eopt->dlen == MIO_CONST_HTON16(48));
|
||||
eopt->dlen = MIO_CONST_HTON16(8);
|
||||
MIO_ASSERT (dnc->mio, eopt->dlen == MIO_CONST_HTON16(MIO_DNS_COOKIE_MAX_LEN));
|
||||
eopt->dlen = MIO_CONST_HTON16(MIO_DNS_COOKIE_CLIENT_LEN);
|
||||
}
|
||||
#endif
|
||||
|
||||
resolxtn = dnc_dns_msg_resolve_getxtn(reqmsg);
|
||||
resolxtn->on_resolve = on_resolve;
|
||||
resolxtn->qtype = qtype;
|
||||
resolxtn->flags = resolve_flags;
|
||||
/* store in the extension area the client cookie set in the packet */
|
||||
MIO_MEMCPY (resolxtn->client_cookie, dnc->cookie.data.client, MIO_DNS_COOKIE_CLIENT_LEN);
|
||||
|
||||
send_flags = (resolve_flags & MIO_SVC_DNC_SEND_FLAG_ALL);
|
||||
if (MIO_UNLIKELY(qtype == MIO_DNS_RRT_Q_AFXR)) send_flags |= MIO_SVC_DNC_SEND_FLAG_PREFER_TCP;
|
||||
|
@ -277,7 +277,9 @@ static int parse_answer_rr (mio_t* mio, mio_dns_rr_part_t rr_part, mio_oow_t pos
|
||||
*/
|
||||
|
||||
/* TODO: do i need to check if rrname is <ROOT>? */
|
||||
pi->edns.exist = 1;
|
||||
/* TODO: do i need to check if rr_part is MIO_DNS_RR_PART_ADDITIONAL? the OPT pseudo-RR may exist in the ADDITIONAL section only */
|
||||
/* TODO: do i need to check if there is more than 1 OPT RRs */
|
||||
pi->edns.exist++; /* you may treat this as the number of OPT RRs */
|
||||
pi->edns.uplen = mio_ntoh16(rrtr->rrclass);
|
||||
pi->hdr.rcode |= (rrtr->ttl >> 24);
|
||||
pi->edns.version = (rrtr->ttl >> 16) & 0xFF;
|
||||
@ -295,8 +297,26 @@ static int parse_answer_rr (mio_t* mio, mio_dns_rr_part_t rr_part, mio_oow_t pos
|
||||
|
||||
if (eopt->code == MIO_CONST_HTON16(MIO_DNS_EOPT_COOKIE))
|
||||
{
|
||||
if (eopt_len < 8) goto oops; /* the client cookie must be 8 bytes */
|
||||
/* TODO: dns cookies */
|
||||
if (eopt_len == MIO_DNS_COOKIE_CLIENT_LEN)
|
||||
{
|
||||
/* client cookie only */
|
||||
MIO_MEMCPY (pi->edns.cookie.data.client, eopt + 1, eopt_len);
|
||||
pi->edns.cookie.client_len = eopt_len;
|
||||
pi->edns.cookie.server_len = 0;
|
||||
}
|
||||
else if (eopt_len >= (MIO_DNS_COOKIE_CLIENT_LEN + MIO_DNS_COOKIE_SERVER_MIN_LEN) &&
|
||||
eopt_len <= (MIO_DNS_COOKIE_CLIENT_LEN + MIO_DNS_COOKIE_SERVER_MAX_LEN))
|
||||
{
|
||||
/* both client and server cookie */
|
||||
MIO_MEMCPY (&pi->edns.cookie.data, eopt + 1, eopt_len);
|
||||
pi->edns.cookie.client_len = MIO_DNS_COOKIE_CLIENT_LEN;
|
||||
pi->edns.cookie.server_len = eopt_len - MIO_DNS_COOKIE_CLIENT_LEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* wrong cookie length */
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
eopt_tot_len -= MIO_SIZEOF(mio_dns_eopt_t) + eopt_len;
|
||||
|
@ -414,6 +414,29 @@ typedef enum mio_svc_dnc_resolve_flag_t mio_svc_dnc_resolve_flag_t;
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
#define MIO_DNS_COOKIE_CLIENT_LEN (8)
|
||||
#define MIO_DNS_COOKIE_SERVER_MIN_LEN (16)
|
||||
#define MIO_DNS_COOKIE_SERVER_MAX_LEN (40)
|
||||
#define MIO_DNS_COOKIE_MAX_LEN (MIO_DNS_COOKIE_CLIENT_LEN + MIO_DNS_COOKIE_SERVER_MAX_LEN)
|
||||
|
||||
typedef struct mio_dns_cookie_data_t mio_dns_cookie_data_t;
|
||||
#include <mio-pac1.h>
|
||||
struct mio_dns_cookie_data_t
|
||||
{
|
||||
mio_uint8_t client[MIO_DNS_COOKIE_CLIENT_LEN];
|
||||
mio_uint8_t server[MIO_DNS_COOKIE_SERVER_MAX_LEN];
|
||||
};
|
||||
#include <mio-upac.h>
|
||||
|
||||
typedef struct mio_dns_cookie_t mio_dns_cookie_t;
|
||||
struct mio_dns_cookie_t
|
||||
{
|
||||
mio_dns_cookie_data_t data;
|
||||
mio_uint8_t client_len;
|
||||
mio_uint8_t server_len;
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
struct mio_dns_pkt_info_t
|
||||
{
|
||||
@ -433,6 +456,8 @@ struct mio_dns_pkt_info_t
|
||||
mio_uint16_t uplen; /* udp payload len - will be placed in the qclass field of RR. */
|
||||
mio_uint8_t version;
|
||||
mio_uint8_t dnssecok;
|
||||
mio_dns_cookie_t cookie;
|
||||
int cookie_verified; /* UGLY: set via mio_svc_dnc_resolve() only. mio_dns_make_packet_info() doesn't set this */
|
||||
} edns;
|
||||
|
||||
mio_uint16_t qdcount; /* number of questions */
|
||||
@ -447,6 +472,7 @@ struct mio_dns_pkt_info_t
|
||||
mio_dns_brr_t* ns;
|
||||
mio_dns_brr_t* ar;
|
||||
} rr;
|
||||
|
||||
};
|
||||
typedef struct mio_dns_pkt_info_t mio_dns_pkt_info_t;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user