summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Santes <flavio.santes@intel.com>2016-08-04 12:02:35 -0500
committerInaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>2016-08-05 23:15:50 +0000
commita7362cf77fb26be0046da2f1080cfee0d185a91d (patch)
treeb210f276e21920952a9a940faebfb6cbadeb9738
parent0aa191389cbe79f3b2051b38937350b897e28b9b (diff)
dns: FIX: use byteorder.h functionsv1.5.0-rc1
The previous version of the DNS Client sample code assumes a little-endian machine as a target. In this patch we use the byteorder.h functions to handle the cpu to network order conversions. Theoretically, this code must run on little and big endian machines. Cosmetic changes are also applied to other files. Change-Id: I2b47f6252fa070e0a0253666fde1785530d6aebf Signed-off-by: Flavio Santes <flavio.santes@intel.com>
-rw-r--r--samples/net/dns_client/src/dns_pack.c50
-rw-r--r--samples/net/dns_client/src/dns_pack.h68
-rw-r--r--samples/net/dns_client/src/dns_utils.c2
-rw-r--r--samples/net/dns_client/src/dns_utils.h2
-rw-r--r--samples/net/dns_client/src/netz.c2
5 files changed, 82 insertions, 42 deletions
diff --git a/samples/net/dns_client/src/dns_pack.c b/samples/net/dns_client/src/dns_pack.c
index bceffaf0b..ab28c5f20 100644
--- a/samples/net/dns_client/src/dns_pack.c
+++ b/samples/net/dns_client/src/dns_pack.c
@@ -18,6 +18,14 @@
#include <string.h>
+static inline size_t dns_strlen(char *str)
+{
+ if (str == NULL) {
+ return 0;
+ }
+ return strlen(str);
+}
+
int dns_msg_pack_qname(int *len, uint8_t *buf, int size, char *domain_name)
{
int lb_index;
@@ -30,7 +38,7 @@ int dns_msg_pack_qname(int *len, uint8_t *buf, int size, char *domain_name)
lb_size = 0;
/* traverse the domain name str, including the null-terminator :) */
- for (i = 0; i < strlen(domain_name) + 1; i++) {
+ for (i = 0; i < dns_strlen(domain_name) + 1; i++) {
if (lb_index >= size) {
return -ENOMEM;
}
@@ -104,7 +112,8 @@ int dns_unpack_answer(struct dns_msg_t *dns_msg, int dname_ptr)
case DNS_RR_TYPE_AAAA:
dns_msg->response_type = DNS_RESPONSE_IP;
dns_msg->response_position = dns_msg->answer_offset + 12;
- dns_msg->response_length = dns_answer_rdlength(2, answer);
+ dns_msg->response_length = dns_unpack_answer_rdlength(2,
+ answer);
return 0;
@@ -112,7 +121,8 @@ int dns_unpack_answer(struct dns_msg_t *dns_msg, int dname_ptr)
dns_msg->response_type = DNS_RESPONSE_CNAME_NO_IP;
dns_msg->response_position = dns_msg->answer_offset + 12;
- dns_msg->response_length = dns_answer_rdlength(2, answer);
+ dns_msg->response_length = dns_unpack_answer_rdlength(2,
+ answer);
return 0;
@@ -130,6 +140,7 @@ int dns_unpack_response_header(struct dns_msg_t *msg, int src_id)
int size;
int qdcount;
int ancount;
+ int rcode;
dns_header = msg->msg;
size = msg->msg_size;
@@ -138,7 +149,7 @@ int dns_unpack_response_header(struct dns_msg_t *msg, int src_id)
return -ENOMEM;
}
- if (dns_header_id(dns_header) != src_id) {
+ if (dns_unpack_header_id(dns_header) != src_id) {
return -EINVAL;
}
@@ -154,16 +165,17 @@ int dns_unpack_response_header(struct dns_msg_t *msg, int src_id)
return -EINVAL;
}
- switch (dns_header_rcode(dns_header)) {
+ rcode = dns_header_rcode(dns_header);
+ switch (rcode) {
case DNS_HEADER_NOERROR:
break;
default:
- return dns_header_rcode(dns_header);
+ return rcode;
}
- qdcount = dns_header_qdcount(dns_header);
- ancount = dns_header_ancount(dns_header);
+ qdcount = dns_unpack_header_qdcount(dns_header);
+ ancount = dns_unpack_header_ancount(dns_header);
if (qdcount < 1 || ancount < 1) {
return -EINVAL;
}
@@ -177,7 +189,7 @@ static int dns_msg_pack_query_header(uint8_t *buf, int size, uint16_t id)
return -ENOMEM;
}
- *(uint16_t *)(buf + 0) = z_swap2(id);
+ *(uint16_t *)(buf + 0) = sys_cpu_to_be16(id);
/* RD = 1, TC = 0, AA = 0, Opcode = 0, QR = 0 <-> 0x01 (1B)
* RCode = 0, Z = 0, RA = 0 <-> 0x00 (1B)
@@ -185,9 +197,11 @@ static int dns_msg_pack_query_header(uint8_t *buf, int size, uint16_t id)
* QDCOUNT = 1 <-> 0x0001 (2B)
*/
- *(uint32_t *)(buf + 2) = 0x01000001;
- *(uint32_t *)(buf + 6) = 0;
- *(uint16_t *)(buf + 10) = 0;
+ *(buf + 2) = 0x01;
+ *(buf + 3) = 0x00;
+ *(uint16_t *)(buf + 4) = sys_cpu_to_be16(1);
+ *(uint32_t *)(buf + 6) = 0; /* ANCOUNT and NSCOUNT = 0 */
+ *(uint16_t *)(buf + 10) = 0; /* ARCOUNT = 0 */
return 0;
}
@@ -219,9 +233,9 @@ int dns_msg_pack_query(struct app_buf_t *buf, char *domain_name,
return rc;
}
/* QType */
- *(uint16_t *)(buf->buf + offset + 0) = z_swap2(qtype);
+ *(uint16_t *)(buf->buf + offset + 0) = sys_cpu_to_be16(qtype);
/* QClass */
- *(uint16_t *)(buf->buf + offset + 2) = z_swap2(DNS_CLASS_IN);
+ *(uint16_t *)(buf->buf + offset + 2) = sys_cpu_to_be16(DNS_CLASS_IN);
buf->length = offset + 4;
@@ -243,6 +257,7 @@ int dns_find_null(int *qname_size, uint8_t *buf, int size)
int dns_unpack_response_query(struct dns_msg_t *dns_msg)
{
uint8_t *dns_query;
+ uint8_t *buf;
int remaining_size;
int qname_size;
int offset;
@@ -265,12 +280,13 @@ int dns_unpack_response_query(struct dns_msg_t *dns_msg)
return -ENOMEM;
}
- if (dns_query_qtype(dns_query + qname_size) != DNS_RR_TYPE_A &&
- dns_query_qtype(dns_query + qname_size) != DNS_RR_TYPE_AAAA) {
+ buf = dns_query + qname_size;
+ if (dns_unpack_query_qtype(buf) != DNS_RR_TYPE_A &&
+ dns_unpack_query_qtype(buf) != DNS_RR_TYPE_AAAA) {
return -EINVAL;
}
- if (dns_query_qclass(dns_query + qname_size) != DNS_CLASS_IN) {
+ if (dns_unpack_query_qclass(buf) != DNS_CLASS_IN) {
return -EINVAL;
}
diff --git a/samples/net/dns_client/src/dns_pack.h b/samples/net/dns_client/src/dns_pack.h
index 67b74f339..2eddfc9e5 100644
--- a/samples/net/dns_client/src/dns_pack.h
+++ b/samples/net/dns_client/src/dns_pack.h
@@ -21,7 +21,9 @@
#include <stddef.h>
#include <errno.h>
-#include <app_buf.h>
+#include <misc/byteorder.h>
+
+#include "app_buf.h"
/**
* @brief dns_msg_t
@@ -104,22 +106,19 @@ enum dns_header_rcode {
*/
#define DNS_MSG_HEADER_SIZE 12
-static inline uint32_t z_swap4(uint32_t n)
-{
- return ((n&0x000000FF)<<24) + ((n&0x0000FF00)<<8)
- + ((n&0x00FF0000)>>8) + ((n&0xFF000000)>>24);
-}
-
-static inline uint16_t z_swap2(uint16_t n)
+/** It returns the ID field in the DNS msg header */
+static inline int dns_header_id(uint8_t *header)
{
- return (n>>8) + ((n & 0x00FF) << 8);
+ return sys_cpu_to_be16(*(uint16_t *)header);
}
-
-/** It returns the ID field in the DNS msg header */
-static inline int dns_header_id(uint8_t *header)
+/* inline unpack routines are used to unpack data from network
+ * order to cpu. Similar routines without the unpack prefix are
+ * used for cpu to network order.
+ */
+static inline int dns_unpack_header_id(uint8_t *header)
{
- return z_swap2(*(uint16_t *)header);
+ return sys_be16_to_cpu(*(uint16_t *)header);
}
/** It returns the QR field in the DNS msg header */
@@ -173,40 +172,61 @@ static inline int dns_header_rcode(uint8_t *header)
/** It returns the QDCOUNT field in the DNS msg header */
static inline int dns_header_qdcount(uint8_t *header)
{
- return z_swap2(*(uint16_t *)(header + 4));
+ return sys_cpu_to_be16(*(uint16_t *)(header + 4));
+}
+
+static inline int dns_unpack_header_qdcount(uint8_t *header)
+{
+ return sys_be16_to_cpu(*(uint16_t *)(header + 4));
}
/** It returns the ANCOUNT field in the DNS msg header */
static inline int dns_header_ancount(uint8_t *header)
{
- return z_swap2(*(uint16_t *)(header + 6));
+ return sys_cpu_to_be16(*(uint16_t *)(header + 6));
+}
+
+static inline int dns_unpack_header_ancount(uint8_t *header)
+{
+ return sys_be16_to_cpu(*(uint16_t *)(header + 6));
}
/** It returns the NSCOUNT field in the DNS msg header */
static inline int dns_header_nscount(uint8_t *header)
{
- return z_swap2(*(uint16_t *)(header + 8));
+ return sys_cpu_to_be16(*(uint16_t *)(header + 8));
}
/** It returns the ARCOUNT field in the DNS msg header */
static inline int dns_header_arcount(uint8_t *header)
{
- return z_swap2(*(uint16_t *)(header + 10));
+ return sys_cpu_to_be16(*(uint16_t *)(header + 10));
}
static inline int dns_query_qtype(uint8_t *question)
{
- return z_swap2(*((uint16_t *)(question + 0)));
+ return sys_cpu_to_be16(*((uint16_t *)(question + 0)));
+}
+
+static inline int dns_unpack_query_qtype(uint8_t *question)
+{
+ return sys_be16_to_cpu(*((uint16_t *)(question + 0)));
}
static inline int dns_query_qclass(uint8_t *question)
{
- return z_swap2(*((uint16_t *)(question + 2)));
+ return sys_cpu_to_be16(*((uint16_t *)(question + 2)));
+}
+
+static inline int dns_unpack_query_qclass(uint8_t *question)
+{
+ return sys_be16_to_cpu(*((uint16_t *)(question + 2)));
}
static inline int dns_response_type(int dname_size, uint8_t *answer)
{
/** Future versions must consider byte 0
+ * 4.1.3. Resource record format
* *(answer + dname_size + 0);
*/
return *(answer + dname_size + 1);
@@ -215,6 +235,7 @@ static inline int dns_response_type(int dname_size, uint8_t *answer)
static inline int dns_answer_class(int dname_size, uint8_t *answer)
{
/** Future versions must consider byte 2
+ * 4.1.3. Resource record format
* *(answer + dname_size + 2);
*/
return *(answer + dname_size + 3);
@@ -222,12 +243,17 @@ static inline int dns_answer_class(int dname_size, uint8_t *answer)
static inline int dns_answer_ttl(int dname_size, uint8_t *answer)
{
- return z_swap4(*(uint32_t *)(answer + dname_size + 4));
+ return sys_cpu_to_be32(*(uint32_t *)(answer + dname_size + 4));
}
static inline int dns_answer_rdlength(int dname_size, uint8_t *answer)
{
- return z_swap2(*(uint16_t *)(answer + dname_size + 8));
+ return sys_cpu_to_be16(*(uint16_t *)(answer + dname_size + 8));
+}
+
+static inline int dns_unpack_answer_rdlength(int dname_size, uint8_t *answer)
+{
+ return sys_be16_to_cpu(*(uint16_t *)(answer + dname_size + 8));
}
/**
diff --git a/samples/net/dns_client/src/dns_utils.c b/samples/net/dns_client/src/dns_utils.c
index 7ebccdcaa..7441c049d 100644
--- a/samples/net/dns_client/src/dns_utils.c
+++ b/samples/net/dns_client/src/dns_utils.c
@@ -137,7 +137,6 @@ int dns_print_readable_msg_label(int offset, uint8_t *buf, int size)
offset = next;
}
}
- printf("\n");
return 0;
}
@@ -149,7 +148,6 @@ int print_buf(uint8_t *buf, size_t size)
for (i = 0; i < size; i++) {
printf("%d ", buf[i]);
}
- printf("\n");
return 0;
}
diff --git a/samples/net/dns_client/src/dns_utils.h b/samples/net/dns_client/src/dns_utils.h
index 934e1978e..865d990e0 100644
--- a/samples/net/dns_client/src/dns_utils.h
+++ b/samples/net/dns_client/src/dns_utils.h
@@ -17,7 +17,7 @@
#ifndef _DNS_UTILS_H_
#define _DNS_UTILS_H_
-#include <app_buf.h>
+#include "app_buf.h"
#include <stdint.h>
int dns_print_msg_header(uint8_t *header, int size);
diff --git a/samples/net/dns_client/src/netz.c b/samples/net/dns_client/src/netz.c
index 329a92f18..b57932b22 100644
--- a/samples/net/dns_client/src/netz.c
+++ b/samples/net/dns_client/src/netz.c
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include <netz.h>
+#include "netz.h"
#include <net/net_core.h>
#include <net/net_socket.h>