some code for edns
This commit is contained in:
parent
9cc53fc237
commit
9217fcec55
@ -28,11 +28,13 @@
|
|||||||
#include <mio-sck.h>
|
#include <mio-sck.h>
|
||||||
#include "mio-prv.h"
|
#include "mio-prv.h"
|
||||||
|
|
||||||
|
typedef struct mio_dns_t mio_dns_t;
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define DN_AT_END(ptr) (ptr[0] == '\0' || (ptr[0] == '.' && ptr[1] == '\0'))
|
#define DN_AT_END(ptr) (ptr[0] == '\0' || (ptr[0] == '.' && ptr[1] == '\0'))
|
||||||
|
|
||||||
static mio_oow_t to_dn (const mio_bch_t* str, mio_uint8_t* buf, mio_oow_t bufsz)
|
static mio_oow_t to_dn (mio_dns_t* dns, const mio_bch_t* str, mio_uint8_t* buf, mio_oow_t bufsz)
|
||||||
{
|
{
|
||||||
mio_uint8_t* bp = buf, * be = buf + bufsz;
|
mio_uint8_t* bp = buf, * be = buf + bufsz;
|
||||||
|
|
||||||
@ -97,14 +99,25 @@ static mio_oow_t dn_length (mio_uint8_t* ptr, mio_oow_t len)
|
|||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*#define MIO_DNS_HEADERS mio_htl_t* dncache;*/
|
||||||
|
#define MIO_DNS_HEADERS void* dncache;
|
||||||
|
|
||||||
|
struct mio_dns_t
|
||||||
|
{
|
||||||
|
MIO_SVC_HEADERS;
|
||||||
|
MIO_DNS_HEADERS;
|
||||||
|
};
|
||||||
|
|
||||||
struct mio_dnss_t
|
struct mio_dnss_t
|
||||||
{
|
{
|
||||||
MIO_SVC_HEADERS;
|
MIO_SVC_HEADERS;
|
||||||
|
MIO_DNS_HEADERS;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mio_dnsc_t
|
struct mio_dnsc_t
|
||||||
{
|
{
|
||||||
MIO_SVC_HEADERS;
|
MIO_SVC_HEADERS;
|
||||||
|
MIO_DNS_HEADERS;
|
||||||
|
|
||||||
mio_dev_sck_t* sck;
|
mio_dev_sck_t* sck;
|
||||||
mio_sckaddr_t serveraddr;
|
mio_sckaddr_t serveraddr;
|
||||||
@ -216,7 +229,7 @@ static void release_req_msg (mio_dnsc_t* dnsc, mio_dns_msg_t* msg)
|
|||||||
mio_freemem (mio, msgbuf);
|
mio_freemem (mio, msgbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static mio_dns_msg_t* build_req_msg (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_oow_t* xmsglen)
|
static mio_dns_msg_t* build_req_msg (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oow_t qr_count, mio_dns_brr_t* rr, mio_oow_t rr_count, mio_dns_bedns_t* edns, mio_oow_t* xmsglen)
|
||||||
{
|
{
|
||||||
mio_t* mio = dnsc->mio;
|
mio_t* mio = dnsc->mio;
|
||||||
mio_oow_t dnlen, msgbufsz, i;
|
mio_oow_t dnlen, msgbufsz, i;
|
||||||
@ -257,7 +270,7 @@ static mio_dns_msg_t* build_req_msg (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oo
|
|||||||
for (i = 0; i < qr_count; i++)
|
for (i = 0; i < qr_count; i++)
|
||||||
{
|
{
|
||||||
/* dnlen includes the ending <zero> */
|
/* dnlen includes the ending <zero> */
|
||||||
dnlen = to_dn(qr[i].qname, dn, mio_count_bcstr(qr[i].qname) + 2);
|
dnlen = to_dn((mio_dns_t*)dnsc, qr[i].qname, dn, mio_count_bcstr(qr[i].qname) + 2);
|
||||||
if (dnlen <= 0)
|
if (dnlen <= 0)
|
||||||
{
|
{
|
||||||
release_req_msg (dnsc, msg);
|
release_req_msg (dnsc, msg);
|
||||||
@ -272,14 +285,14 @@ static mio_dns_msg_t* build_req_msg (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oo
|
|||||||
dn = (mio_uint8_t*)(qrtr + 1);
|
dn = (mio_uint8_t*)(qrtr + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (rr_sect = MIO_DNS_RRR_PART_ANSWER; rr_sect <= MIO_DNS_RRR_PART_ADDITIONAL;)
|
for (rr_sect = MIO_DNS_RR_PART_ANSWER; rr_sect <= MIO_DNS_RR_PART_ADDITIONAL;)
|
||||||
{
|
{
|
||||||
mio_oow_t match_count = 0;
|
mio_oow_t match_count = 0;
|
||||||
for (i = 0; i < rr_count; i++)
|
for (i = 0; i < rr_count; i++)
|
||||||
{
|
{
|
||||||
if (rr[i].part == rr_sect)
|
if (rr[i].part == rr_sect)
|
||||||
{
|
{
|
||||||
dnlen = to_dn(rr[i].qname, dn, mio_count_bcstr(rr[i].qname) + 2);
|
dnlen = to_dn((mio_dns_t*)dnsc, rr[i].qname, dn, mio_count_bcstr(rr[i].qname) + 2);
|
||||||
if (dnlen <= 0)
|
if (dnlen <= 0)
|
||||||
{
|
{
|
||||||
release_req_msg (dnsc, msg);
|
release_req_msg (dnsc, msg);
|
||||||
@ -330,7 +343,7 @@ static MIO_INLINE int send_req_with_single_rr (mio_dnsc_t* dnsc, mio_dns_bqr_t*
|
|||||||
mio_dns_msg_t* msg;
|
mio_dns_msg_t* msg;
|
||||||
mio_oow_t msglen;
|
mio_oow_t msglen;
|
||||||
|
|
||||||
msg = build_req_msg(dnsc, qr, 1, MIO_NULL, 0, &msglen);
|
msg = build_req_msg(dnsc, qr, 1, MIO_NULL, 0, MIO_NULL, &msglen);
|
||||||
if (!msg) return -1;
|
if (!msg) return -1;
|
||||||
|
|
||||||
msg->rd = 1;
|
msg->rd = 1;
|
||||||
@ -359,7 +372,7 @@ int mio_dnsc_sendreq (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oow_t count)
|
|||||||
mio_dns_msg_t* msg;
|
mio_dns_msg_t* msg;
|
||||||
mio_oow_t msglen;
|
mio_oow_t msglen;
|
||||||
|
|
||||||
msg = build_req_msg(dnsc, qr, count, &msglen);
|
msg = build_req_msg(dnsc, qr, count, MIO_NULL, &msglen);
|
||||||
if (!msg) return -1;
|
if (!msg) return -1;
|
||||||
|
|
||||||
msg->rd = 1;
|
msg->rd = 1;
|
||||||
@ -379,7 +392,7 @@ int mio_dnsc_sendrep (mio_dnsc_t* dnsc, mio_dns_bqr_t* qr, mio_oow_t qr_count, m
|
|||||||
mio_dns_msg_t* msg;
|
mio_dns_msg_t* msg;
|
||||||
mio_oow_t msglen;
|
mio_oow_t msglen;
|
||||||
|
|
||||||
msg = build_req_msg(dnsc, qr, qr_count, rr, rr_count, &msglen);
|
msg = build_req_msg(dnsc, qr, qr_count, rr, rr_count, MIO_NULL, &msglen);
|
||||||
if (!msg) return -1;
|
if (!msg) return -1;
|
||||||
|
|
||||||
msg->rd = 1;
|
msg->rd = 1;
|
||||||
|
@ -820,9 +820,9 @@ for (i = 0; i < 5; i++)
|
|||||||
};
|
};
|
||||||
mio_dns_brr_t rrs[] =
|
mio_dns_brr_t rrs[] =
|
||||||
{
|
{
|
||||||
{ MIO_DNS_RRR_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_RRR_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_RRR_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_dnsc_sendreq (dnsc, qrs, MIO_COUNTOF(qrs));
|
mio_dnsc_sendreq (dnsc, qrs, MIO_COUNTOF(qrs));
|
||||||
|
@ -173,6 +173,7 @@ typedef struct mio_dns_rrtr_t mio_dns_rrtr_t;
|
|||||||
typedef struct mio_dnss_t mio_dnss_t;
|
typedef struct mio_dnss_t mio_dnss_t;
|
||||||
typedef struct mio_dnsc_t mio_dnsc_t;
|
typedef struct mio_dnsc_t mio_dnsc_t;
|
||||||
|
|
||||||
|
/* breakdown of question record */
|
||||||
struct mio_dns_bqr_t
|
struct mio_dns_bqr_t
|
||||||
{
|
{
|
||||||
mio_bch_t* qname;
|
mio_bch_t* qname;
|
||||||
@ -181,17 +182,19 @@ struct mio_dns_bqr_t
|
|||||||
};
|
};
|
||||||
typedef struct mio_dns_bqr_t mio_dns_bqr_t;
|
typedef struct mio_dns_bqr_t mio_dns_bqr_t;
|
||||||
|
|
||||||
|
|
||||||
enum mio_dns_rr_part_t
|
enum mio_dns_rr_part_t
|
||||||
{
|
{
|
||||||
MIO_DNS_RRR_PART_ANSWER,
|
MIO_DNS_RR_PART_ANSWER,
|
||||||
MIO_DNS_RRR_PART_AUTHORITY,
|
MIO_DNS_RR_PART_AUTHORITY,
|
||||||
MIO_DNS_RRR_PART_ADDITIONAL
|
MIO_DNS_RR_PART_ADDITIONAL
|
||||||
};
|
};
|
||||||
typedef enum mio_dns_rr_part_t mio_dns_rr_part_t;
|
typedef enum mio_dns_rr_part_t mio_dns_rr_part_t;
|
||||||
|
|
||||||
|
/* breakdown of resource record */
|
||||||
struct mio_dns_brr_t
|
struct mio_dns_brr_t
|
||||||
{
|
{
|
||||||
mio_dns_rr_part_t part;
|
mio_dns_rr_part_t part;
|
||||||
mio_bch_t* qname;
|
mio_bch_t* qname;
|
||||||
mio_uint16_t qtype;
|
mio_uint16_t qtype;
|
||||||
mio_uint16_t qclass;
|
mio_uint16_t qclass;
|
||||||
@ -201,6 +204,24 @@ 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;
|
||||||
|
|
||||||
|
struct mio_dns_bedns_opt_t
|
||||||
|
{
|
||||||
|
mio_uint16_t dlen;
|
||||||
|
void* dptr;
|
||||||
|
};
|
||||||
|
typedef struct mio_dns_bedns_opt_t mio_dns_bedns_opt_t;
|
||||||
|
|
||||||
|
struct mio_dns_bedns_t
|
||||||
|
{
|
||||||
|
mio_uint16_t uplen; /* udp payload len */
|
||||||
|
mio_uint8_t version;
|
||||||
|
|
||||||
|
mio_oow_t olen;
|
||||||
|
mio_dns_bedns_opt_t* optr;
|
||||||
|
};
|
||||||
|
typedef struct mio_dns_bedns_t mio_dns_bedns_t;
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -215,15 +236,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_bqr_t* qr,
|
mio_dns_bqr_t* qr,
|
||||||
mio_oow_t qr_count
|
mio_oow_t qr_count
|
||||||
);
|
);
|
||||||
|
|
||||||
MIO_EXPORT int mio_dnsc_sendrep (
|
MIO_EXPORT int mio_dnsc_sendrep (
|
||||||
mio_dnsc_t* dnsc,
|
mio_dnsc_t* dnsc,
|
||||||
mio_dns_bqr_t* qr,
|
mio_dns_bqr_t* qr,
|
||||||
mio_oow_t qr_count,
|
mio_oow_t qr_count,
|
||||||
mio_dns_brr_t* rr,
|
mio_dns_brr_t* rr,
|
||||||
mio_oow_t rr_count
|
mio_oow_t rr_count
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user