implemented low-level dns packet maker

This commit is contained in:
hyung-hwan 2019-02-14 10:08:32 +00:00
parent af86c6a95e
commit be68e4ec80
2 changed files with 59 additions and 12 deletions

View File

@ -811,11 +811,23 @@ for (i = 0; i < 5; i++)
mio_dnsc_t* dnsc; mio_dnsc_t* dnsc;
dnsc = mio_dnsc_start (mio/*, "8.8.8.8:53,1.1.1.1:53"*/); /* option - send to all, send one by one */ dnsc = mio_dnsc_start (mio/*, "8.8.8.8:53,1.1.1.1:53"*/); /* option - send to all, send one by one */
{ {
mio_dns_bqrr_t qrr; mio_dns_bqrr_t qrrs[] =
qrr.name = "code.miflux.com"; {
qrr.qclass = MIO_DNS_QCLASS_IN; { "code.miflux.com", MIO_DNS_QTYPE_A, MIO_DNS_QCLASS_IN },
qrr.qtype = MIO_DNS_QTYPE_A; { "code.miflux.com", MIO_DNS_QTYPE_AAAA, MIO_DNS_QCLASS_IN },
mio_dnsc_sendreq (dnsc, &qrr, 1); { "code.abiyo.net", MIO_DNS_QTYPE_A, MIO_DNS_QCLASS_IN },
{ "code6.abiyo.net", MIO_DNS_QTYPE_AAAA, MIO_DNS_QCLASS_IN },
{ "abiyo.net", MIO_DNS_QTYPE_MX, MIO_DNS_QCLASS_IN }
};
mio_dns_brrr_t rrrs[] =
{
{ MIO_DNS_RRR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_A, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL },
{ MIO_DNS_RRR_PART_ANSWER, "code.miflux.com", MIO_DNS_QTYPE_AAAA, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL },
{ MIO_DNS_RRR_PART_AUTHORITY, "dns.miflux.com", MIO_DNS_QTYPE_NS, MIO_DNS_QCLASS_IN, 86400, 0, MIO_NULL }
};
mio_dnsc_sendreq (dnsc, qrrs, MIO_COUNTOF(qrrs));
mio_dnsc_sendrep (dnsc, qrrs, MIO_COUNTOF(qrrs), rrrs, MIO_COUNTOF(rrrs));
} }
mio_loop (mio); mio_loop (mio);

View File

@ -127,12 +127,19 @@ struct mio_dns_msg_t
#endif #endif
mio_uint16_t qdcount; /* number of questions */ mio_uint16_t qdcount; /* number of questions */
mio_uint16_t ancount; /* number of answers (answer section) */ mio_uint16_t ancount; /* number of answers (answer part) */
mio_uint16_t nscount; /* number of name servers (authority section. only NS types) */ mio_uint16_t nscount; /* number of name servers (authority part. only NS types) */
mio_uint16_t arcount; /* number of additional resource (additional section) */ mio_uint16_t arcount; /* number of additional resource (additional part) */
}; };
typedef struct mio_dns_msg_t mio_dns_msg_t; typedef struct mio_dns_msg_t mio_dns_msg_t;
struct mio_dns_msg_alt_t
{
mio_uint16_t id;
mio_uint16_t flags;
mio_uint16_t rrcount[4];
};
typedef struct mio_dns_msg_alt_t mio_dns_msg_alt_t;
/* question /* question
* name, qtype, qclass * name, qtype, qclass
* answer * answer
@ -149,7 +156,7 @@ struct mio_dns_qrrtr_t
typedef struct mio_dns_qrrtr_t mio_dns_qrrtr_t; typedef struct mio_dns_qrrtr_t mio_dns_qrrtr_t;
/* trailing part after the domain name in a resource record in an answer */ /* trailing part after the domain name in a resource record in an answer */
struct mio_dns_arrtr_t struct mio_dns_rrrtr_t
{ {
/* qname upto 64 bytes */ /* qname upto 64 bytes */
mio_uint16_t qtype; mio_uint16_t qtype;
@ -158,7 +165,7 @@ struct mio_dns_arrtr_t
mio_uint16_t dlen; /* data length */ mio_uint16_t dlen; /* data length */
/* actual data if if dlen > 0 */ /* actual data if if dlen > 0 */
}; };
typedef struct mio_dns_arrtr_t mio_dns_arrtr_t; typedef struct mio_dns_rrrtr_t mio_dns_rrrtr_t;
#include <mio-upac.h> #include <mio-upac.h>
@ -168,12 +175,32 @@ typedef struct mio_dnsc_t mio_dnsc_t;
struct mio_dns_bqrr_t struct mio_dns_bqrr_t
{ {
mio_bch_t* name; mio_bch_t* qname;
mio_uint16_t qtype; mio_uint16_t qtype;
mio_uint16_t qclass; mio_uint16_t qclass;
}; };
typedef struct mio_dns_bqrr_t mio_dns_bqrr_t; typedef struct mio_dns_bqrr_t mio_dns_bqrr_t;
enum mio_dns_rrr_part_t
{
MIO_DNS_RRR_PART_ANSWER,
MIO_DNS_RRR_PART_AUTHORITY,
MIO_DNS_RRR_PART_ADDITIONAL
};
typedef enum mio_dns_rrr_part_t mio_dns_rrr_part_t;
struct mio_dns_brrr_t
{
mio_dns_rrr_part_t part;
mio_bch_t* qname;
mio_uint16_t qtype;
mio_uint16_t qclass;
mio_uint32_t ttl;
mio_uint16_t dlen;
void* dptr;
};
typedef struct mio_dns_brrr_t mio_dns_brrr_t;
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
@ -189,7 +216,15 @@ MIO_EXPORT void mio_dnsc_stop (
MIO_EXPORT int mio_dnsc_sendreq ( MIO_EXPORT int mio_dnsc_sendreq (
mio_dnsc_t* dnsc, mio_dnsc_t* dnsc,
mio_dns_bqrr_t* qrr, mio_dns_bqrr_t* qrr,
mio_oow_t count mio_oow_t qrr_count
);
MIO_EXPORT int mio_dnsc_sendrep (
mio_dnsc_t* dnsc,
mio_dns_bqrr_t* qrr,
mio_oow_t qrr_count,
mio_dns_brrr_t* rrr,
mio_oow_t rrr_count
); );
#if defined(__cplusplus) #if defined(__cplusplus)