BUG/MINOR: Fix endiness issue in DNS header creation code
Alexander Lebedev reported that the response bit is set on SPARC when
DNS queries are sent. This has been tracked to the endianess issue, so
this patch makes the code portable.
Signed-off-by: Nenad Merdanovic <nmerdan@anine.io>
diff --git a/include/types/dns.h b/include/types/dns.h
index 50636fd..1b240fa 100644
--- a/include/types/dns.h
+++ b/include/types/dns.h
@@ -62,22 +62,13 @@
/* DNS request or response header structure */
struct dns_header {
- unsigned short id:16; /* identifier */
- unsigned char rd :1; /* recursion desired 0: no, 1: yes */
- unsigned char tc :1; /* truncation 0:no, 1: yes */
- unsigned char aa :1; /* authoritative answer 0: no, 1: yes */
- unsigned char opcode :4; /* operation code */
- unsigned char qr :1; /* query/response 0: query, 1: response */
- unsigned char rcode :4; /* response code */
- unsigned char cd :1; /* checking disabled */
- unsigned char ad :1; /* authentic data */
- unsigned char z :1; /* not used */
- unsigned char ra :1; /* recursion available 0: no, 1: yes */
- unsigned short qdcount :16; /* question count */
- unsigned short ancount :16; /* answer count */
- unsigned short nscount :16; /* authority count */
- unsigned short arcount :16; /* additional count */
-};
+ uint16_t id;
+ uint16_t flags;
+ uint16_t qdcount;
+ uint16_t ancount;
+ uint16_t nscount;
+ uint16_t arcount;
+} __attribute__ ((packed));
/* short structure to describe a DNS question */
struct dns_question {
diff --git a/src/dns.c b/src/dns.c
index bf5baa0..7f4c59a 100644
--- a/src/dns.c
+++ b/src/dns.c
@@ -988,14 +988,7 @@
/* set dns query headers */
dns = (struct dns_header *)ptr;
dns->id = (unsigned short) htons(query_id);
- dns->qr = 0; /* query */
- dns->opcode = 0;
- dns->aa = 0;
- dns->tc = 0;
- dns->rd = 1; /* recursion desired */
- dns->ra = 0;
- dns->z = 0;
- dns->rcode = 0;
+ dns->flags = htons(0x0100); /* qr=0, opcode=0, aa=0, tc=0, rd=1, ra=0, z=0, rcode=0 */
dns->qdcount = htons(1); /* 1 question */
dns->ancount = 0;
dns->nscount = 0;