Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b
Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/include/re_dns.h b/include/re_dns.h
new file mode 100644
index 0000000..73ecd08
--- /dev/null
+++ b/include/re_dns.h
@@ -0,0 +1,218 @@
+/**
+ * @file re_dns.h Interface to DNS module
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+
+
+enum {
+ DNS_PORT = 53,
+ DNS_HEADER_SIZE = 12
+};
+
+
+/** DNS Opcodes */
+enum {
+ DNS_OPCODE_QUERY = 0,
+ DNS_OPCODE_IQUERY = 1,
+ DNS_OPCODE_STATUS = 2,
+ DNS_OPCODE_NOTIFY = 4
+};
+
+
+/** DNS Response codes */
+enum {
+ DNS_RCODE_OK = 0,
+ DNS_RCODE_FMT_ERR = 1,
+ DNS_RCODE_SRV_FAIL = 2,
+ DNS_RCODE_NAME_ERR = 3,
+ DNS_RCODE_NOT_IMPL = 4,
+ DNS_RCODE_REFUSED = 5,
+ DNS_RCODE_NOT_AUTH = 9
+};
+
+
+/** DNS Resource Record types */
+enum {
+ DNS_TYPE_A = 0x0001,
+ DNS_TYPE_NS = 0x0002,
+ DNS_TYPE_CNAME = 0x0005,
+ DNS_TYPE_SOA = 0x0006,
+ DNS_TYPE_PTR = 0x000c,
+ DNS_TYPE_MX = 0x000f,
+ DNS_TYPE_AAAA = 0x001c,
+ DNS_TYPE_SRV = 0x0021,
+ DNS_TYPE_NAPTR = 0x0023,
+ DNS_QTYPE_IXFR = 0x00fb,
+ DNS_QTYPE_AXFR = 0x00fc,
+ DNS_QTYPE_ANY = 0x00ff
+};
+
+
+/** DNS Classes */
+enum {
+ DNS_CLASS_IN = 0x0001,
+ DNS_QCLASS_ANY = 0x00ff
+};
+
+
+/** Defines a DNS Header */
+struct dnshdr {
+ uint16_t id;
+ bool qr;
+ uint8_t opcode;
+ bool aa;
+ bool tc;
+ bool rd;
+ bool ra;
+ uint8_t z;
+ uint8_t rcode;
+ uint16_t nq;
+ uint16_t nans;
+ uint16_t nauth;
+ uint16_t nadd;
+};
+
+
+/** Defines a DNS Resource Record (RR) */
+struct dnsrr {
+ struct le le;
+ struct le le_priv;
+ char *name;
+ uint16_t type;
+ uint16_t dnsclass;
+ int64_t ttl;
+ uint16_t rdlen;
+ union {
+ struct {
+ uint32_t addr;
+ } a;
+ struct {
+ char *nsdname;
+ } ns;
+ struct {
+ char *cname;
+ } cname;
+ struct {
+ char *mname;
+ char *rname;
+ uint32_t serial;
+ uint32_t refresh;
+ uint32_t retry;
+ uint32_t expire;
+ uint32_t ttlmin;
+ } soa;
+ struct {
+ char *ptrdname;
+ } ptr;
+ struct {
+ uint16_t pref;
+ char *exchange;
+ } mx;
+ struct {
+ uint8_t addr[16];
+ } aaaa;
+ struct {
+ uint16_t pri;
+ uint16_t weight;
+ uint16_t port;
+ char *target;
+ } srv;
+ struct {
+ uint16_t order;
+ uint16_t pref;
+ char *flags;
+ char *services;
+ char *regexp;
+ char *replace;
+ } naptr;
+ } rdata;
+};
+
+struct hash;
+
+/**
+ * Defines the DNS Query handler
+ *
+ * @param err 0 if success, otherwise errorcode
+ * @param hdr DNS Header
+ * @param ansl List of Answer records
+ * @param authl List of Authoritive records
+ * @param addl List of Additional records
+ * @param arg Handler argument
+ */
+typedef void(dns_query_h)(int err, const struct dnshdr *hdr,
+ struct list *ansl, struct list *authl,
+ struct list *addl, void *arg);
+
+/**
+ * Defines the DNS Resource Record list handler
+ *
+ * @param rr DNS Resource Record
+ * @param arg Handler argument
+ *
+ * @return True to stop traversing, False to continue
+ */
+typedef bool(dns_rrlist_h)(struct dnsrr *rr, void *arg);
+
+int dns_hdr_encode(struct mbuf *mb, const struct dnshdr *hdr);
+int dns_hdr_decode(struct mbuf *mb, struct dnshdr *hdr);
+const char *dns_hdr_opcodename(uint8_t opcode);
+const char *dns_hdr_rcodename(uint8_t rcode);
+struct dnsrr *dns_rr_alloc(void);
+int dns_rr_encode(struct mbuf *mb, const struct dnsrr *rr, int64_t ttl_offs,
+ struct hash *ht_dname, size_t start);
+int dns_rr_decode(struct mbuf *mb, struct dnsrr **rr, size_t start);
+bool dns_rr_cmp(const struct dnsrr *rr1, const struct dnsrr *rr2, bool rdata);
+const char *dns_rr_typename(uint16_t type);
+const char *dns_rr_classname(uint16_t dnsclass);
+int dns_rr_print(struct re_printf *pf, const struct dnsrr *rr);
+int dns_dname_encode(struct mbuf *mb, const char *name,
+ struct hash *ht_dname, size_t start, bool comp);
+int dns_dname_decode(struct mbuf *mb, char **name, size_t start);
+int dns_cstr_encode(struct mbuf *mb, const char *str);
+int dns_cstr_decode(struct mbuf *mb, char **str);
+void dns_rrlist_sort(struct list *rrl, uint16_t type, size_t key);
+void dns_rrlist_sort_addr(struct list *rrl, size_t key);
+struct dnsrr *dns_rrlist_apply(struct list *rrl, const char *name,
+ uint16_t type, uint16_t dnsclass,
+ bool recurse, dns_rrlist_h *rrlh, void *arg);
+struct dnsrr *dns_rrlist_apply2(struct list *rrl, const char *name,
+ uint16_t type1, uint16_t type2,
+ uint16_t dnsclass, bool recurse,
+ dns_rrlist_h *rrlh, void *arg);
+struct dnsrr *dns_rrlist_find(struct list *rrl, const char *name,
+ uint16_t type, uint16_t dnsclass, bool recurse);
+
+
+/* DNS Client */
+struct sa;
+struct dnsc;
+struct dns_query;
+
+/** DNS Client configuration */
+struct dnsc_conf {
+ uint32_t query_hash_size;
+ uint32_t tcp_hash_size;
+ uint32_t conn_timeout; /* in [ms] */
+ uint32_t idle_timeout; /* in [ms] */
+};
+
+int dnsc_alloc(struct dnsc **dcpp, const struct dnsc_conf *conf,
+ const struct sa *srvv, uint32_t srvc);
+int dnsc_srv_set(struct dnsc *dnsc, const struct sa *srvv, uint32_t srvc);
+int dnsc_query(struct dns_query **qp, struct dnsc *dnsc, const char *name,
+ uint16_t type, uint16_t dnsclass,
+ bool rd, dns_query_h *qh, void *arg);
+int dnsc_query_srv(struct dns_query **qp, struct dnsc *dnsc, const char *name,
+ uint16_t type, uint16_t dnsclass, int proto,
+ const struct sa *srvv, const uint32_t *srvc,
+ bool rd, dns_query_h *qh, void *arg);
+int dnsc_notify(struct dns_query **qp, struct dnsc *dnsc, const char *name,
+ uint16_t type, uint16_t dnsclass, const struct dnsrr *ans_rr,
+ int proto, const struct sa *srvv, const uint32_t *srvc,
+ dns_query_h *qh, void *arg);
+
+
+/* DNS System functions */
+int dns_srv_get(char *domain, size_t dsize, struct sa *srvv, uint32_t *n);