adding more dns parsing code
This commit is contained in:
parent
e5c82673a8
commit
2bff2e76fe
118
mio/lib/dns.c
118
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;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
@ -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[] =
|
||||
|
@ -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;
|
||||
|
@ -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 (
|
||||
|
Loading…
x
Reference in New Issue
Block a user