chiark / gitweb /
WIP dns transport packets etc.
[secnet.git] / dns-transp-client.c
1 /**/
2
3 uint8_t qid[2];
4
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);                 \
9     { body; }                                           \
10     assert(pkt == pkt_prepend_orig);                    \
11   }while(0)
12
13 #define PKT_ADDB(byte) (*pkt++ = (byte))
14 #define PKT_ADDW(word) (*pkt++ = ((w) >> 8), *pkt++ = (w))
15
16 #define DNS_HDRLEN (6*2)
17
18 void dnsqueryenc_start(struct dnspacketenc *pe,
19                        int mydompathlen, const char *mydompath) {
20     dnspacketenc_start(pe);
21     
22     PKT_PREPEND(pe, 4, {
23         PKT_ADDW(QTYPE_CNAME);
24         PKT_ADDW(QCLASS_IN);
25     });
26
27     return dnsdomainenc_start(&pe->dom, pe->buf,
28                               pe->ptr - pe->buf - DNS_HDRLEN,
29                               mydompathlen, mydompath);
30 }
31
32 void dnsqueryenc_finish(uint16_t qid, const uint8_t **result, int *reslen) {
33     pe->ptr = dnsdomainenc_getresult(&pe->dom);
34
35     PKT_PREPEND(pe, DNS_HDRLEN, {
36         PKT_ADDW(qid);
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 */
43     });
44
45     *result = pe->ptr;
46     *reslen = (pe->buf + MAX_DNSPACKET_BYTES) - pe->ptr;
47 }
48