attempting to implement retries in dnc resolve

This commit is contained in:
hyung-hwan 2020-02-14 16:55:04 +00:00
parent 20de4ae2db
commit 5b9fb40ba5
3 changed files with 63 additions and 26 deletions

View File

@ -609,7 +609,7 @@ static void on_dnc_resolve(mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum
mio_dns_pkt_info_t* pi = MIO_NULL; mio_dns_pkt_info_t* pi = MIO_NULL;
if (status == MIO_ENOERR) if (data) // status == MIO_ENOERR
{ {
mio_uint32_t i; mio_uint32_t i;
@ -659,7 +659,8 @@ static void on_dnc_resolve(mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnum
else else
{ {
no_valid_reply: no_valid_reply:
printf ("XXXXXXXXXXXXXXXXx NO REPLY XXXXXXXXXXXXXXXXXXXXXXXXX\n"); if (status == MIO_ETMOUT) printf ("XXXXXXXXXXXXXXXX TIMED OUT XXXXXXXXXXXXXXXXX\n");
else printf ("XXXXXXXXXXXXXXXXx NO REPLY XXXXXXXXXXXXXXXXXXXXXXXXX\n");
} }
done: done:
@ -668,7 +669,7 @@ done:
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) 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)
{ {
if (status == MIO_ENOERR) if (data) /* status must be HAWK_ENOERR */
{ {
mio_dns_brr_t* brr = (mio_dns_brr_t*)data; mio_dns_brr_t* brr = (mio_dns_brr_t*)data;
@ -700,7 +701,8 @@ static void on_dnc_resolve_brief (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio
} }
else else
{ {
printf ("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ NO REPLY QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQq\n"); if (status == MIO_ETMOUT) printf ("QQQQQQQQQQQQQQQQQQQ TIMED OUT QQQQQQQQQQQQQQQQQ\n");
else printf ("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ NO REPLY QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQq\n");
} }
} }
@ -918,7 +920,12 @@ for (i = 0; i < 5; i++)
{ {
mio_svc_dnc_t* dnc; mio_svc_dnc_t* dnc;
dnc = mio_svc_dnc_start (mio/*, "8.8.8.8:53,1.1.1.1:53"*/); /* option - send to all, send one by one */ mio_ntime_t reply_tmout;
reply_tmout.sec = 1;
reply_tmout.nsec = 0;
dnc = mio_svc_dnc_start (mio/*, "8.8.8.8:53,1.1.1.1:53"*/, &reply_tmout, 3); /* option - send to all, send one by one */
{ {
mio_dns_bqr_t qrs[] = mio_dns_bqr_t qrs[] =
{ {

View File

@ -44,6 +44,10 @@ struct mio_svc_dnc_t
mio_dev_sck_t* sck; mio_dev_sck_t* sck;
mio_sckaddr_t serveraddr; mio_sckaddr_t serveraddr;
mio_ntime_t reply_tmout; /* default reply timeout */
mio_oow_t reply_tmout_retries;
mio_oow_t seq; mio_oow_t seq;
mio_dns_msg_t* pending_req; mio_dns_msg_t* pending_req;
}; };
@ -450,7 +454,7 @@ MIO_DEBUG0 (mio, "unknown dns response... \n"); /* TODO: add source info */
return 0; return 0;
} }
static void dnc_on_read_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job) static void dnc_on_reply_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job)
{ {
mio_dns_msg_t* reqmsg = (mio_dns_msg_t*)job->ctx; mio_dns_msg_t* reqmsg = (mio_dns_msg_t*)job->ctx;
dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(reqmsg); dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(reqmsg);
@ -479,21 +483,23 @@ MIO_DEBUG1 (mio, "sent dns message %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->i
MIO_ASSERT (mio, dev == (mio_dev_sck_t*)msg->dev); MIO_ASSERT (mio, dev == (mio_dev_sck_t*)msg->dev);
if (dns_msg_to_pkt(msg)->qr == 0) if (wrlen <= -1)
{
/* write has timed out or an error has occurred */
if (MIO_LIKELY(msgxtn->on_reply))
msgxtn->on_reply (dnc, msg, mio_geterrnum(mio), MIO_NULL, 0);
release_dns_msg (dnc, msg);
}
else if (dns_msg_to_pkt(msg)->qr == 0)
{ {
/* question. schedule to wait for response */ /* question. schedule to wait for response */
mio_tmrjob_t tmrjob; mio_tmrjob_t tmrjob;
mio_ntime_t tmout;
/* TODO: make this configurable. or accept dnc->config.read_timeout... */
tmout.sec = 3;
tmout.nsec = 0;
MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob)); MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob));
tmrjob.ctx = msg; tmrjob.ctx = msg;
mio_gettime (mio, &tmrjob.when); mio_gettime (mio, &tmrjob.when);
MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &tmout); MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &dnc->reply_tmout);
tmrjob.handler = dnc_on_read_timeout; tmrjob.handler = dnc_on_reply_timeout;
tmrjob.idxptr = &msg->rtmridx; tmrjob.idxptr = &msg->rtmridx;
msg->rtmridx = mio_instmrjob(mio, &tmrjob); msg->rtmridx = mio_instmrjob(mio, &tmrjob);
if (msg->rtmridx == MIO_TMRIDX_INVALID) if (msg->rtmridx == MIO_TMRIDX_INVALID)
@ -504,18 +510,18 @@ MIO_DEBUG1 (mio, "sent dns message %d\n", (int)mio_ntoh16(dns_msg_to_pkt(msg)->i
release_dns_msg (dnc, msg); release_dns_msg (dnc, msg);
MIO_DEBUG0 (mio, "unable to schedule timeout...\n"); MIO_DEBUG0 (mio, "unable to schedule timeout...\n");
return 0;
} }
else
/* TODO: improve performance. hashing by id? */
/* chain it to the peing request list */
if (dnc->pending_req)
{ {
dnc->pending_req->prev = msg; /* TODO: improve performance. hashing by id? */
msg->next = dnc->pending_req; /* chain it to the peing request list */
if (dnc->pending_req)
{
dnc->pending_req->prev = msg;
msg->next = dnc->pending_req;
}
dnc->pending_req = msg;
} }
dnc->pending_req = msg;
} }
else else
{ {
@ -535,7 +541,7 @@ static void dnc_on_disconnect (mio_dev_sck_t* dev)
{ {
} }
mio_svc_dnc_t* mio_svc_dnc_start (mio_t* mio) mio_svc_dnc_t* mio_svc_dnc_start (mio_t* mio, const mio_ntime_t* reply_tmout, mio_oow_t reply_tmout_retries)
{ {
mio_svc_dnc_t* dnc = MIO_NULL; mio_svc_dnc_t* dnc = MIO_NULL;
mio_dev_sck_make_t mkinfo; mio_dev_sck_make_t mkinfo;
@ -546,6 +552,8 @@ mio_svc_dnc_t* mio_svc_dnc_start (mio_t* mio)
dnc->mio = mio; dnc->mio = mio;
dnc->stop = mio_svc_dnc_stop; dnc->stop = mio_svc_dnc_stop;
dnc->reply_tmout = *reply_tmout;
dnc->reply_tmout_retries = reply_tmout_retries;
MIO_MEMSET (&mkinfo, 0, MIO_SIZEOF(mkinfo)); MIO_MEMSET (&mkinfo, 0, MIO_SIZEOF(mkinfo));
mkinfo.type = MIO_DEV_SCK_UDP4; /* or UDP6 depending on the binding address */ mkinfo.type = MIO_DEV_SCK_UDP4; /* or UDP6 depending on the binding address */
@ -593,6 +601,7 @@ mio_dns_msg_t* mio_svc_dnc_sendmsg (mio_svc_dnc_t* dnc, mio_dns_bhdr_t* bdns, mi
/* send a request or a response */ /* send a request or a response */
mio_dns_msg_t* msg; mio_dns_msg_t* msg;
dnc_dns_msg_xtn_t* msgxtn; dnc_dns_msg_xtn_t* msgxtn;
mio_ntime_t* tmout;
msg = make_dns_msg(dnc, bdns, qr, qr_count, rr, rr_count, edns, MIO_SIZEOF(*msgxtn) + xtnsize); msg = make_dns_msg(dnc, bdns, qr, qr_count, rr, rr_count, edns, MIO_SIZEOF(*msgxtn) + xtnsize);
if (!msg) return MIO_NULL; if (!msg) return MIO_NULL;
@ -601,6 +610,18 @@ mio_dns_msg_t* mio_svc_dnc_sendmsg (mio_svc_dnc_t* dnc, mio_dns_bhdr_t* bdns, mi
msgxtn->on_reply = on_reply; msgxtn->on_reply = on_reply;
/* TODO: optionally, override dnc->serveraddr and use the target address passed as a parameter */ /* TODO: optionally, override dnc->serveraddr and use the target address passed as a parameter */
tmout = MIO_IS_POS_NTIME(&dnc->reply_tmout)? &dnc->reply_tmout: MIO_NULL;
if (mio_dev_sck_timedwrite(dnc->sck, dns_msg_to_pkt(msg), msg->pktlen, tmout, msg, &dnc->serveraddr) <= -1)
{
release_dns_msg (dnc, msg);
return MIO_NULL;
}
return msg;
}
mio_dns_msg_t* mio_svc_dnc_resendmsg (mio_svc_dnc_t* dnc, mio_dns_msg_t* msg)
{
if (mio_dev_sck_write(dnc->sck, dns_msg_to_pkt(msg), msg->pktlen, msg, &dnc->serveraddr) <= -1) if (mio_dev_sck_write(dnc->sck, dns_msg_to_pkt(msg), msg->pktlen, msg, &dnc->serveraddr) <= -1)
{ {
release_dns_msg (dnc, msg); release_dns_msg (dnc, msg);
@ -653,10 +674,12 @@ static void on_dnc_resolve (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg, mio_errnu
return; return;
} }
if (status == MIO_ENOERR) if (data)
{ {
mio_uint32_t i; mio_uint32_t i;
MIO_ASSERT (mio, status == MIO_ENOERR);
pi = mio_dns_make_packet_info(mio, data, dlen); pi = mio_dns_make_packet_info(mio, data, dlen);
if (!pi) if (!pi)
{ {

View File

@ -446,7 +446,9 @@ extern "C" {
#endif #endif
MIO_EXPORT mio_svc_dnc_t* mio_svc_dnc_start ( MIO_EXPORT mio_svc_dnc_t* mio_svc_dnc_start (
mio_t* mio mio_t* mio,
const mio_ntime_t* reply_tmout,
mio_oow_t reply_tmout_retries
); );
MIO_EXPORT void mio_svc_dnc_stop ( MIO_EXPORT void mio_svc_dnc_stop (
@ -465,6 +467,11 @@ MIO_EXPORT mio_dns_msg_t* mio_svc_dnc_sendmsg (
mio_oow_t xtnsize mio_oow_t xtnsize
); );
MIO_EXPORT mio_dns_msg_t* mio_svc_dnc_resendmsg (
mio_svc_dnc_t* dnc,
mio_dns_msg_t* msg
);
MIO_EXPORT mio_dns_msg_t* mio_svc_dnc_sendreq ( MIO_EXPORT mio_dns_msg_t* mio_svc_dnc_sendreq (
mio_svc_dnc_t* dnc, mio_svc_dnc_t* dnc,
mio_dns_bhdr_t* bdns, mio_dns_bhdr_t* bdns,