more code to handle rrdata

This commit is contained in:
hyung-hwan 2020-02-12 15:23:36 +00:00
parent d0906bb8ac
commit 192e64b65c
2 changed files with 77 additions and 28 deletions

View File

@ -720,16 +720,75 @@ oops:
static mio_uint8_t* parse_answer (mio_t* mio, mio_uint8_t* ptr, mio_uint8_t* pktstart, mio_uint8_t* pktend) static mio_uint8_t* parse_answer (mio_t* mio, mio_uint8_t* ptr, mio_uint8_t* pktstart, mio_uint8_t* pktend)
{ {
mio_dns_rrtr_t* rrtr; mio_dns_rrtr_t* rrtr;
mio_uint16_t qtype, dlen;
mio_oow_t remsize;
//printf ("pktstart = %p pktend = %p, ptr = %p\n", pktstart, pktend, ptr); //printf ("pktstart = %p pktend = %p, ptr = %p\n", pktstart, pktend, ptr);
ptr = parse_domain_name(mio, ptr, pktstart, pktend); ptr = parse_domain_name(mio, ptr, pktstart, pktend);
if (!ptr) return MIO_NULL; if (!ptr) return MIO_NULL;
rrtr = (mio_dns_rrtr_t*)ptr; rrtr = (mio_dns_rrtr_t*)ptr;
ptr += MIO_SIZEOF(*rrtr) + mio_ntoh16(rrtr->dlen); if (MIO_UNLIKELY(pktend - ptr < MIO_SIZEOF(*rrtr))) goto oops;
if (MIO_UNLIKELY(ptr >= pktend)) goto oops; ptr += MIO_SIZEOF(*rrtr);
//printf ("rrtr->dlen => %d\n", mio_ntoh16(rrtr->dlen)); dlen = mio_ntoh16(rrtr->dlen);
if (MIO_UNLIKELY(pktend - ptr < dlen)) goto oops;
//printf ("rrtr->dlen => %d\n", dlen);
qtype = mio_ntoh16(rrtr->qtype);
remsize = pktend - ptr;
switch (qtype)
{
case MIO_DNS_QTYPE_OPT:
{
/* RFC 6891
The extended RCODE and flags, which OPT stores in the RR Time to Live
(TTL) field, are structured as follows:
+0 (MSB) +1 (LSB)
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
0: | EXTENDED-RCODE | VERSION |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
2: | DO| Z |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
*
EXTENDED-RCODE
Forms the upper 8 bits of extended 12-bit RCODE (together with the
4 bits defined in [RFC1035]. Note that EXTENDED-RCODE value 0
indicates that an unextended RCODE is in use (values 0 through
15).
*/
printf ("OPT RR included....>>>>>>>>>>>>>>>>>>>>>>>>%d\n", (rrtr->ttl >> 24));
/*rcode |= (rrtr->ttl >> 24);*/
if (((rrtr->ttl >> 16) & 0xFF) != 0) goto oops; /* version not 0 */
/* dnsok -> ((rrtr->ttl & 0x8000) >> 15) */
/*if ((rrtr->ttl & 0x7FFF) != 0) goto oops;*/ /* Z not 0 - ignore this for now */
break;
}
case MIO_DNS_QTYPE_A:
if (MIO_UNLIKELY(remsize < 4)) goto oops;
break;
case MIO_DNS_QTYPE_AAAA:
if (MIO_UNLIKELY(remsize < 16)) goto oops;
break;
case MIO_DNS_QTYPE_CNAME:
{
mio_uint8_t* xptr;
printf ("\t");
xptr = parse_domain_name(mio, ptr, pktstart, pktend);
if (!xptr) return MIO_NULL;
MIO_ASSERT (mio, xptr == ptr + dlen);
break;
}
}
ptr += dlen;
return ptr; return ptr;
oops: oops:
@ -792,22 +851,5 @@ printf ("additional %d\n", rrc);
if (!ptr) return -1; if (!ptr) return -1;
} }
printf ("packet ok...\n");
#if 0
for (i = 0; i < bdns->arcount; i++)
{
#if 0
if (*ptr == 0)
{
rrtr = (mio_ptrs_rrtr_t*)(ptr + 1);
if (rrtr->qtype == MIO_CONST_HTON16(MIO_DNS_QTYPE_OPT)
{
/* edns */
}
}
#endif
}
#endif
return 0; return 0;
} }

View File

@ -265,29 +265,29 @@ typedef struct mio_dns_brr_t mio_dns_brr_t;
#if 0 #if 0
/* A RDATA */ /* A RDATA */
struct mio_dns_brd_a_t struct mio_dns_brrd_a_t
{ {
}; };
typedef struct mio_dns_brd_a_t mio_dns_brd_a_t; typedef struct mio_dns_brrd_a_t mio_dns_brrd_a_t;
/* 3.3.1 CNAME RDATA format */ /* 3.3.1 CNAME RDATA format */
struct mio_dns_brd_cname_t struct mio_dns_brrd_cname_t
{ {
}; };
typedef struct mio_dns_brd_cname_t mio_dns_brc_cname_t; typedef struct mio_dns_brrd_cname_t mio_dns_brc_cname_t;
/* 3.3.9 MX RDATA format */ /* 3.3.9 MX RDATA format */
struct mio_dns_brd_mx_t struct mio_dns_brrd_mx_t
{ {
mio_uint16_t preference; mio_uint16_t preference;
mio_bch_t* exchange; mio_bch_t* exchange;
}; };
typedef struct mio_dns_brd_mx_t mio_dns_brd_mx_t; typedef struct mio_dns_brrd_mx_t mio_dns_brrd_mx_t;
struct mio_dns_brd_soa_t struct mio_dns_brrd_soa_t
{ {
mio_bch_t* mname; mio_bch_t* mname;
mio_bch_t* rname; mio_bch_t* rname;
@ -297,7 +297,7 @@ struct mio_dns_brd_soa_t
mio_uint32_t expire; mio_uint32_t expire;
mio_uint32_t minimum; mio_uint32_t minimum;
}; };
typedef struct mio_dns_brd_soa_t mio_dns_brd_soa_t; typedef struct mio_dns_brrd_soa_t mio_dns_brrd_soa_t;
#endif #endif
struct mio_dns_beopt_t struct mio_dns_beopt_t
@ -376,6 +376,13 @@ MIO_EXPORT int mio_svc_dnc_resolve (
mio_svc_dnc_on_reply_t on_reply mio_svc_dnc_on_reply_t on_reply
); );
MIO_EXPORT int mio_dns_parse_packet (
mio_svc_dnc_t* dnc,
mio_dns_pkt_t* pkt,
mio_oow_t len,
mio_dns_bdns_t* bdns
);
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif