added mio_dns_rcode_to_bcstr(), mio_dns_find_client_cookie_in_msg.

deleted the cookie_verified field from mio_dns_pkt_info_t
added mio_svc_dnc_checkclientcookie()
This commit is contained in:
2020-07-04 08:03:36 +00:00
parent 26b95ba5f7
commit 8b1ccab4c8
4 changed files with 143 additions and 23 deletions

View File

@ -463,7 +463,7 @@ oops:
return -1;
}
mio_dns_pkt_info_t* mio_dns_make_packet_info (mio_t* mio, const mio_dns_pkt_t* pkt, mio_oow_t len)
mio_dns_pkt_info_t* mio_dns_make_pkt_info (mio_t* mio, const mio_dns_pkt_t* pkt, mio_oow_t len)
{
mio_uint16_t i;
mio_dns_pkt_info_t pib, * pii;
@ -544,7 +544,7 @@ oops:
return MIO_NULL;
}
void mio_dns_free_packet_info (mio_t* mio, mio_dns_pkt_info_t* pi)
void mio_dns_free_pkt_info (mio_t* mio, mio_dns_pkt_info_t* pi)
{
/* TODO: better management */
mio_freemem (mio, pi);
@ -874,3 +874,71 @@ void mio_dns_free_msg (mio_t* mio, mio_dns_msg_t* msg)
/* TODO: better management */
mio_freemem (mio, msg);
}
mio_uint8_t* mio_dns_find_client_cookie_in_msg (mio_dns_msg_t* reqmsg, mio_uint8_t (*cookie)[MIO_DNS_COOKIE_CLIENT_LEN])
{
mio_dns_rrtr_t* edns_rrtr;
mio_dns_eopt_t* eopt;
mio_uint16_t rem, dlen;
/* this function doesn't check malformed packet assuming
* reqmsg points to the packet message created with mio_dns_make_msg().
* such a packet message must be well-formed */
if (reqmsg->ednsrrtroff <= 0) return MIO_NULL; /* doesn't exist */
edns_rrtr = (mio_dns_rrtr_t*)((mio_uint8_t*)mio_dns_msg_to_pkt(reqmsg) + reqmsg->ednsrrtroff);
rem = mio_ntoh16(edns_rrtr->dlen);
eopt = (mio_dns_eopt_t*)(edns_rrtr + 1);
while (rem >= MIO_SIZEOF(mio_dns_eopt_t))
{
dlen = mio_ntoh16(eopt->dlen);
if (eopt->code == MIO_CONST_HTON16(MIO_DNS_EOPT_COOKIE))
{
if (cookie) MIO_MEMCPY (cookie, eopt + 1, MIO_DNS_COOKIE_CLIENT_LEN);
return (mio_uint8_t*)(eopt + 1);
}
rem -= dlen;
eopt = (mio_dns_eopt_t*)((mio_uint8_t*)(eopt + 1) + dlen);
}
return MIO_NULL;
}
mio_bch_t* mio_dns_rcode_to_bcstr (mio_dns_rcode_t rcode)
{
mio_bch_t* _errmsg[] =
{
"NOERR",
"FORMERR",
"SERVFAIL",
"NXDOMAIN",
"NOTIMPL",
"REFUSED",
"YXDOMAIN",
"YXRRSET",
"NXRRSET",
"NOAUTH",
"NOTZONE", /* 10 */
"UNKNOWNERR",
"UNKNOWNERR",
"UNKNOWNERR",
"UNKNOWNERR",
"UNKNOWNERR",
"UNKNOWNERR",
"BADVERS", /* 16 */
"BADSIG",
"BADTIME",
"BADMODE",
"BADNAME",
"BADALG",
"BADTRUNC",
"BADCOOKIE"
};
return rcode < MIO_COUNTOF(_errmsg)? _errmsg[rcode]: "UNKNOWNERR";
}