adding more dns parsing code

This commit is contained in:
hyung-hwan 2019-04-13 06:04:43 +00:00
parent e5c82673a8
commit 2bff2e76fe
4 changed files with 151 additions and 21 deletions

View File

@ -264,8 +264,52 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
rrtr->qtype = mio_hton16(rr[i].qtype); rrtr->qtype = mio_hton16(rr[i].qtype);
rrtr->qclass = mio_hton16(rr[i].qclass); rrtr->qclass = mio_hton16(rr[i].qclass);
rrtr->ttl = mio_hton32(rr[i].ttl); rrtr->ttl = mio_hton32(rr[i].ttl);
switch (rr[i].qtype)
{
case MIO_DNS_QTYPE_A:
break;
case MIO_DNS_QTYPE_AAAA:
break;
case MIO_DNS_QTYPE_WKS:
break;
case MIO_DNS_QTYPE_MX:
/* preference, exchange */
break;
case MIO_DNS_QTYPE_CNAME:
/*case MIO_DNS_QTYPE_MB:
case MIO_DNS_QTYPE_MD:
case MIO_DNS_QTYPE_MF:
case MIO_DNS_QTYPE_MG:
case MIO_DNS_QTYPE_MR:*/
case MIO_DNS_QTYPE_NS:
case MIO_DNS_QTYPE_PTR:
/* just a normal domain name */
break;
case MIO_DNS_QTYPE_HINFO:
/* cpu, os */
break;
case MIO_DNS_QTYPE_MINFO:
/* rmailbx, emailbx */
break;
case MIO_DNS_QTYPE_SOA:
/* soa */
break;
case MIO_DNS_QTYPE_TXT:
case MIO_DNS_QTYPE_NULL:
default:
/* TODO: custom transformator? */
rrtr->dlen = mio_hton16(rr[i].dlen); rrtr->dlen = mio_hton16(rr[i].dlen);
if (rr[i].dlen > 0) MIO_MEMCPY (rrtr + 1, rr[i].dptr, rr[i].dlen); if (rr[i].dlen > 0) MIO_MEMCPY (rrtr + 1, rr[i].dptr, rr[i].dlen);
}
dn = (mio_uint8_t*)(rrtr + 1) + rr[i].dlen; dn = (mio_uint8_t*)(rrtr + 1) + rr[i].dlen;
@ -335,16 +379,17 @@ static mio_dns_msg_t* build_dns_msg (mio_dnsc_t* dnsc, mio_dns_bdns_t* bdns, mio
return msg; return msg;
} }
static void parse_dns_pkt (mio_dnsc_t* dnsc, mio_dns_pkt_t* pkt, mio_oow_t len) static int parse_dns_pkt (mio_dnsc_t* dnsc, mio_dns_pkt_t* pkt, mio_oow_t len)
{ {
mio_t* mio = dnsc->mio; mio_t* mio = dnsc->mio;
mio_dns_bdns_t* bdns; mio_dns_bdns_t* bdns;
mio_uint16_t i; mio_uint16_t i, rrc;
mio_uint8_t* dn; mio_uint8_t* dn;
mio_uint8_t* pktend = (mio_uint8_t*)pkt + len;
MIO_ASSERT (mio, len >= MIO_SIZEOF(*pkt)); MIO_ASSERT (mio, len >= MIO_SIZEOF(*pkt));
return 0;
/* TODO: */ /* TODO: */
bdns->id = mio_ntoh16(pkt->id); bdns->id = mio_ntoh16(pkt->id);
@ -365,15 +410,60 @@ static void parse_dns_pkt (mio_dnsc_t* dnsc, mio_dns_pkt_t* pkt, mio_oow_t len)
bdns->arcount = mio_ntoh16(pkt->arcount); bdns->arcount = mio_ntoh16(pkt->arcount);
*/ */
dn = (mio_uint8_t*)(pkt + 1); dn = (mio_uint8_t*)(pkt + 1);
rrc = mio_ntoh16(pkt->qdcount);
for (i = 0; i < rrc; i++)
{
mio_oow_t totlen, seglen;
mio_dns_qrtr_t* qrtr;
if (dn >= pktend)
{
mio_seterrbfmt (mio, MIO_EINVAL, "invalid packet");
return -1;
}
totlen = 0;
while ((seglen = *dn++) > 0)
{
if (seglen > 64)
{
/* compressed. pointer to somewhere else */
/* TODO: */
}
totlen += seglen;
dn += seglen;
}
qrtr = (mio_dns_qrtr_t*)dn;
dn += MIO_SIZEOF(*qrtr);
}
rrc = mio_ntoh16(pkt->ancount);
for (i = 0; i < rrc; i++)
{
mio_oow_t totlen, seglen;
mio_dns_rrtr_t* rrtr;
if (dn >= pktend)
{
mio_seterrbfmt (mio, MIO_EINVAL, "invalid packet");
return -1;
}
totlen = 0;
while ((seglen = *dn++) > 0)
{
totlen += seglen;
dn += seglen;
}
rrtr = (mio_dns_rrtr_t*)dn;
dn += MIO_SIZEOF(*rrtr) + rrtr->dlen;
}
#if 0 #if 0
for (i = 0; i < bdns->qrcount; i++)
{
}
for (i = 0; i < bdns->ancount; i++)
{
}
for (i = 0; i < bdns->nscount; i++) for (i = 0; i < bdns->nscount; i++)
{ {
} }
@ -392,6 +482,8 @@ static void parse_dns_pkt (mio_dnsc_t* dnsc, mio_dns_pkt_t* pkt, mio_oow_t len)
#endif #endif
} }
#endif #endif
return 0;
} }
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -826,7 +826,8 @@ for (i = 0; i < 5; i++)
{ {
{ MIO_DNS_RR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_A, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL }, { MIO_DNS_RR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_A, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL },
{ MIO_DNS_RR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_AAAA, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL }, { MIO_DNS_RR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_AAAA, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL },
{ MIO_DNS_RR_PART_AUTHORITY, "dns.miflux.com", MIO_DNS_QTYPE_NS, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL } { MIO_DNS_RR_PART_AUTHORITY, "dns.miflux.com", MIO_DNS_QTYPE_NS, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL }//,
//{ MIO_DNS_RR_PART_ANSERT, "www.miflux.com", MIO_DNS_QTYPE_CNAME, MIO_DNS_QCLASS_IN, 60, 15, "code.miflux.com" }
}; };
mio_dns_beopt_t beopt[] = mio_dns_beopt_t beopt[] =

View File

@ -263,6 +263,43 @@ struct mio_dns_brr_t
}; };
typedef struct mio_dns_brr_t mio_dns_brr_t; typedef struct mio_dns_brr_t mio_dns_brr_t;
#if 0
/* A RDATA */
struct mio_dns_brd_a_t
{
};
typedef struct mio_dns_brd_a_t mio_dns_brd_a_t;
/* 3.3.1 CNAME RDATA format */
struct mio_dns_brd_cname_t
{
};
typedef struct mio_dns_brd_cname_t mio_dns_brc_cname_t;
/* 3.3.9 MX RDATA format */
struct mio_dns_brd_mx_t
{
mio_uint16_t preference;
mio_bch_t* exchange;
};
typedef struct mio_dns_brd_mx_t mio_dns_brd_mx_t;
struct mio_dns_brd_soa_t
{
mio_bch_t* mname;
mio_bch_t* rname;
mio_uint32_t serial
mio_uint32_t refresh;
mio_uint32_t retry;
mio_uint32_t expire;
mio_uint32_t minimum;
};
typedef struct mio_dns_brd_soa_t mio_dns_brd_soa_t;
#endif
struct mio_dns_beopt_t struct mio_dns_beopt_t
{ {
mio_uint16_t code; mio_uint16_t code;

View File

@ -645,13 +645,13 @@ MIO_EXPORT int mio_setoption (
static MIO_INLINE mio_errnum_t mio_geterrnum (mio_t* mio) { return mio->errnum; } static MIO_INLINE mio_errnum_t mio_geterrnum (mio_t* mio) { return mio->errnum; }
#else #else
# define mio_getmmgr(mio) ((mio)->mmgr) # define mio_getmmgr(mio) (((mio_t*)(mio))->mmgr)
# define mio_getxtn(mio) ((void*)((mio) + 1)) # define mio_getxtn(mio) ((void*)((mio_t*)(mio) + 1))
# define mio_getcmgr(mio) ((mio)->cmgr) # define mio_getcmgr(mio) (((mio_t*)(mio))->cmgr)
# define mio_setcmgr(mio,mgr) ((mio)->cmgr = (mgr)) # define mio_setcmgr(mio,mgr) (((mio_t*)(mio))->cmgr = (mgr))
# define mio_geterrnum(mio) ((mio)->errnum) # define mio_geterrnum(mio) (((mio_t*)(mio))->errnum)
#endif #endif
MIO_EXPORT void mio_seterrnum ( MIO_EXPORT void mio_seterrnum (