+
+/**
+ * A few common DNS classes (ok, only one is common, but I list a
+ * couple more to make it clear what we're talking about here).
+ */
+#define GNUNET_TUN_DNS_CLASS_INTERNET 1
+#define GNUNET_TUN_DNS_CLASS_CHAOS 3
+#define GNUNET_TUN_DNS_CLASS_HESIOD 4
+
+#define GNUNET_TUN_DNS_OPCODE_QUERY 0
+#define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY 1
+#define GNUNET_TUN_DNS_OPCODE_STATUS 2
+
+
+/**
+ * RFC 1035 codes.
+ */
+#define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR 0
+#define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR 1
+#define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE 2
+#define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR 3
+#define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED 4
+#define GNUNET_TUN_DNS_RETURN_CODE_REFUSED 5
+
+/**
+ * RFC 2136 codes
+ */
+#define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN 6
+#define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET 7
+#define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET 8
+#define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH 9
+#define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE 10
+
+
+/**
+ * DNS flags (largely RFC 1035 / RFC 2136).
+ */
+struct GNUNET_TUN_DnsFlags
+{
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ /**
+ * Set to 1 if recursion is desired (client -> server)
+ */
+ unsigned int recursion_desired : 1 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if message is truncated
+ */
+ unsigned int message_truncated : 1 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if this is an authoritative answer
+ */
+ unsigned int authoritative_answer : 1 GNUNET_PACKED;
+
+ /**
+ * See GNUNET_TUN_DNS_OPCODE_ defines.
+ */
+ unsigned int opcode : 4 GNUNET_PACKED;
+
+ /**
+ * query:0, response:1
+ */
+ unsigned int query_or_response : 1 GNUNET_PACKED;
+
+ /**
+ * See GNUNET_TUN_DNS_RETURN_CODE_ defines.
+ */
+ unsigned int return_code : 4 GNUNET_PACKED;
+
+ /**
+ * See RFC 4035.
+ */
+ unsigned int checking_disabled : 1 GNUNET_PACKED;
+
+ /**
+ * Response has been cryptographically verified, RFC 4035.
+ */
+ unsigned int authenticated_data : 1 GNUNET_PACKED;
+
+ /**
+ * Always zero.
+ */
+ unsigned int zero : 1 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if recursion is available (server -> client)
+ */
+ unsigned int recursion_available : 1 GNUNET_PACKED;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+
+ /**
+ * query:0, response:1
+ */
+ unsigned int query_or_response : 1 GNUNET_PACKED;
+
+ /**
+ * See GNUNET_TUN_DNS_OPCODE_ defines.
+ */
+ unsigned int opcode : 4 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if this is an authoritative answer
+ */
+ unsigned int authoritative_answer : 1 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if message is truncated
+ */
+ unsigned int message_truncated : 1 GNUNET_PACKED;
+
+ /**
+ * Set to 1 if recursion is desired (client -> server)
+ */
+ unsigned int recursion_desired : 1 GNUNET_PACKED;
+
+
+ /**
+ * Set to 1 if recursion is available (server -> client)
+ */
+ unsigned int recursion_available : 1 GNUNET_PACKED;
+
+ /**
+ * Always zero.
+ */
+ unsigned int zero : 1 GNUNET_PACKED;
+
+ /**
+ * Response has been cryptographically verified, RFC 4035.
+ */
+ unsigned int authenticated_data : 1 GNUNET_PACKED;
+
+ /**
+ * See RFC 4035.
+ */
+ unsigned int checking_disabled : 1 GNUNET_PACKED;
+
+ /**
+ * See GNUNET_TUN_DNS_RETURN_CODE_ defines.
+ */
+ unsigned int return_code : 4 GNUNET_PACKED;
+#else
+ #error byteorder undefined
+#endif
+
+} GNUNET_GCC_STRUCT_LAYOUT;
+
+
+