5 #define PKT_PREPEND_START(pe, size, body) do{ \
6 assert((pe)->ptr - (pe)->buf >= (size)); \
7 const uint8_t *pkt_prepend_orig = (pe)->ptr; \
8 uint8_t *pkt = (pe)->ptr -= (size); \
10 assert(pkt == pkt_prepend_orig); \
13 #define PKT_ADDB(byte) (*pkt++ = (byte))
14 #define PKT_ADDW(word) (*pkt++ = ((w) >> 8), *pkt++ = (w))
16 #define DNS_HDRLEN (6*2)
18 void dnsqueryenc_start(struct dnspacketenc *pe,
19 int mydompathlen, const char *mydompath) {
20 dnspacketenc_start(pe);
23 PKT_ADDW(QTYPE_CNAME);
27 return dnsdomainenc_start(&pe->dom, pe->buf,
28 pe->ptr - pe->buf - DNS_HDRLEN,
29 mydompathlen, mydompath);
32 void dnsqueryenc_finish(uint16_t qid, const uint8_t **result, int *reslen) {
33 pe->ptr = dnsdomainenc_getresult(&pe->dom);
35 PKT_PREPEND(pe, DNS_HDRLEN, {
37 PKT_ADDB(0x00); /* QR=0(q); Opcode=QUERY; !AA,!TC,!RD */
38 PKT_ADDB(0x00); /* !RA; Z; RCODE=NOERROR */
39 PKT_ADDW(0x01); /* QDCOUNT=1 */
40 PKT_ADDW(0x00); /* ANCOUNT=0 */
41 PKT_ADDW(0x00); /* NSCOUNT=0 */
42 PKT_ADDW(0x00); *hdr++ = 0x00; /* ARCOUNT=0 */
46 *reslen = (pe->buf + MAX_DNSPACKET_BYTES) - pe->ptr;