From 2bff2e76fe474de0d808eb8c69bab5d093910b45 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 13 Apr 2019 06:04:43 +0000 Subject: [PATCH] adding more dns parsing code --- mio/lib/dns.c | 118 +++++++++++++++++++++++++++++++++++++++++----- mio/lib/main.c | 7 +-- mio/lib/mio-dns.h | 37 +++++++++++++++ mio/lib/mio.h | 10 ++-- 4 files changed, 151 insertions(+), 21 deletions(-) diff --git a/mio/lib/dns.c b/mio/lib/dns.c index 87a99e3..2c61fcc 100644 --- a/mio/lib/dns.c +++ b/mio/lib/dns.c @@ -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->qclass = mio_hton16(rr[i].qclass); rrtr->ttl = mio_hton32(rr[i].ttl); - rrtr->dlen = mio_hton16(rr[i].dlen); - if (rr[i].dlen > 0) MIO_MEMCPY (rrtr + 1, rr[i].dptr, rr[i].dlen); + + 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); + if (rr[i].dlen > 0) MIO_MEMCPY (rrtr + 1, rr[i].dptr, 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; } -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_dns_bdns_t* bdns; - mio_uint16_t i; + mio_uint16_t i, rrc; mio_uint8_t* dn; + mio_uint8_t* pktend = (mio_uint8_t*)pkt + len; MIO_ASSERT (mio, len >= MIO_SIZEOF(*pkt)); - +return 0; /* TODO: */ 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); */ 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 - for (i = 0; i < bdns->qrcount; i++) - { - } - - for (i = 0; i < bdns->ancount; 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 + + return 0; } /* ----------------------------------------------------------------------- */ diff --git a/mio/lib/main.c b/mio/lib/main.c index 51e7775..8c48d7b 100644 --- a/mio/lib/main.c +++ b/mio/lib/main.c @@ -824,9 +824,10 @@ for (i = 0; i < 5; i++) }; mio_dns_brr_t rrs[] = { - { 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_AUTHORITY, "dns.miflux.com", MIO_DNS_QTYPE_NS, 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_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[] = diff --git a/mio/lib/mio-dns.h b/mio/lib/mio-dns.h index 7ed416b..97bfedf 100644 --- a/mio/lib/mio-dns.h +++ b/mio/lib/mio-dns.h @@ -263,6 +263,43 @@ struct 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 { mio_uint16_t code; diff --git a/mio/lib/mio.h b/mio/lib/mio.h index e99372e..c28c9b0 100644 --- a/mio/lib/mio.h +++ b/mio/lib/mio.h @@ -645,13 +645,13 @@ MIO_EXPORT int mio_setoption ( static MIO_INLINE mio_errnum_t mio_geterrnum (mio_t* mio) { return mio->errnum; } #else -# define mio_getmmgr(mio) ((mio)->mmgr) -# define mio_getxtn(mio) ((void*)((mio) + 1)) +# define mio_getmmgr(mio) (((mio_t*)(mio))->mmgr) +# define mio_getxtn(mio) ((void*)((mio_t*)(mio) + 1)) -# define mio_getcmgr(mio) ((mio)->cmgr) -# define mio_setcmgr(mio,mgr) ((mio)->cmgr = (mgr)) +# define mio_getcmgr(mio) (((mio_t*)(mio))->cmgr) +# 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 MIO_EXPORT void mio_seterrnum (