@@ -6633,11 +6633,25 @@ void wolfIP_recv_ex(struct wolfIP *s, unsigned int if_idx, void *buf, uint32_t l
66336633#define DNS_RESPONSE 0x80
66346634#define DNS_A 0x01 /* A record only */
66356635#define DNS_PTR 0x0C
6636+ #define DNS_CLASS_IN 0x01
66366637#define DNS_RD 0x0100 /* Recursion desired */
66376638#define DNS_TC 0x0200 /* Truncated response */
6639+ #define DNS_RCODE_MASK 0x000F
6640+ #define DNS_FLAGS_RESPONSE_RD (DNS_RD | ((uint16_t)DNS_RESPONSE << 8))
6641+ #define DNS_ID_NONE 0
6642+ #define DNS_QUESTION_COUNT 1
6643+ #define DNS_MIN_ID 1
66386644#define DNS_QUERY_TYPE_NONE 0
66396645#define DNS_QUERY_TYPE_A 1
66406646#define DNS_QUERY_TYPE_PTR 2
6647+ #define DNS_NAME_TERMINATOR 0x00
6648+ #define DNS_LABEL_SEPARATOR '.'
6649+ #define DNS_COMPRESSION_PTR_MASK 0xC0
6650+ #define DNS_COMPRESSION_PTR_VALUE 0xC0
6651+ #define DNS_COMPRESSION_OFFSET_MASK 0x3F
6652+ #define DNS_IPV4_RDATA_LEN 4
6653+ #define DNS_PTR_OCTET_COUNT 4
6654+ #define DNS_PTR_NAME_BUF_LEN 128
66416655#define MAX_DNS_NAME_LEN 255
66426656#define MAX_DNS_LABEL_LEN 63
66436657#define DNS_QUERY_TIMEOUT 2000U
@@ -6688,7 +6702,7 @@ static size_t dns_write_u8(char *dst, uint8_t val)
66886702
66896703static int dns_format_ptr_name (char * dst , size_t len , uint32_t ip )
66906704{
6691- uint8_t octets [4 ] = {
6705+ uint8_t octets [DNS_PTR_OCTET_COUNT ] = {
66926706 (uint8_t )(ip & 0xFF ),
66936707 (uint8_t )((ip >> 8 ) & 0xFF ),
66946708 (uint8_t )((ip >> 16 ) & 0xFF ),
@@ -6697,7 +6711,7 @@ static int dns_format_ptr_name(char *dst, size_t len, uint32_t ip)
66976711 size_t pos = 0 ;
66986712 size_t i ;
66996713 static const char suffix [] = "in-addr.arpa" ;
6700- for (i = 0 ; i < 4 ; i ++ ) {
6714+ for (i = 0 ; i < DNS_PTR_OCTET_COUNT ; i ++ ) {
67016715 uint8_t val = octets [i ];
67026716 size_t written ;
67036717 if (pos + 3 >= len )
@@ -6706,15 +6720,15 @@ static int dns_format_ptr_name(char *dst, size_t len, uint32_t ip)
67066720 pos += written ;
67076721 if (pos + 1 >= len )
67086722 return -1 ;
6709- dst [pos ++ ] = '.' ;
6723+ dst [pos ++ ] = DNS_LABEL_SEPARATOR ;
67106724 }
67116725 {
67126726 size_t suffix_len = sizeof (suffix );
67136727 if (pos + suffix_len >= len )
67146728 return -1 ;
67156729 memcpy (dst + pos , suffix , suffix_len );
67166730 pos += suffix_len - 1 ;
6717- dst [pos ] = '\0' ;
6731+ dst [pos ] = DNS_NAME_TERMINATOR ;
67186732 }
67196733 return 0 ;
67206734}
@@ -6725,9 +6739,9 @@ static int dns_skip_name(const uint8_t *buf, int len, int offset)
67256739 int loop = 0 ;
67266740 while (pos < len && loop ++ < len ) {
67276741 uint8_t c = buf [pos ++ ];
6728- if (c == 0 )
6742+ if (c == DNS_NAME_TERMINATOR )
67296743 break ;
6730- if ((c & 0xC0 ) == 0xC0 ) {
6744+ if ((c & DNS_COMPRESSION_PTR_MASK ) == DNS_COMPRESSION_PTR_VALUE ) {
67316745 if (pos >= len )
67326746 return -1 ;
67336747 pos ++ ;
@@ -6751,20 +6765,21 @@ static int dns_copy_name(const uint8_t *buf, int len, int offset, char *out,
67516765 int jumped = 0 ;
67526766 while (pos < len && loop ++ < len ) {
67536767 uint8_t c = buf [pos ];
6754- if (c == 0 ) {
6768+ if (c == DNS_NAME_TERMINATOR ) {
67556769 if (!jumped )
67566770 pos ++ ;
67576771 if (o >= out_len )
67586772 return -1 ;
6759- out [o ] = '\0' ;
6773+ out [o ] = DNS_NAME_TERMINATOR ;
67606774 return 0 ;
67616775 }
6762- if ((c & 0xC0 ) == 0xC0 ) {
6776+ if ((c & DNS_COMPRESSION_PTR_MASK ) == DNS_COMPRESSION_PTR_VALUE ) {
67636777 int ptr_pos = pos ;
67646778 if (pos + 1 >= len )
67656779 return -1 ;
67666780 {
6767- uint16_t ptr = ((c & 0x3F ) << 8 ) | buf [pos + 1 ];
6781+ uint16_t ptr = ((c & DNS_COMPRESSION_OFFSET_MASK ) << 8 ) |
6782+ buf [pos + 1 ];
67686783 if (ptr >= ptr_pos )
67696784 return -1 ;
67706785 pos = ptr ;
@@ -6778,7 +6793,7 @@ static int dns_copy_name(const uint8_t *buf, int len, int offset, char *out,
67786793 if (o != 0 ) {
67796794 if (o + 1 >= out_len )
67806795 return -1 ;
6781- out [o ++ ] = '.' ;
6796+ out [o ++ ] = DNS_LABEL_SEPARATOR ;
67826797 }
67836798 if (o + c >= out_len )
67846799 return -1 ;
@@ -6903,13 +6918,13 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69036918 return ;
69046919 flags = ee16 (hdr -> flags );
69056920 /* Parse DNS response */
6906- if ((flags & 0x8100 ) == 0x8100 ) {
6921+ if ((flags & DNS_FLAGS_RESPONSE_RD ) == DNS_FLAGS_RESPONSE_RD ) {
69076922 if ((flags & DNS_TC ) != 0 ) {
69086923 dns_abort_query (s );
69096924 return ;
69106925 }
69116926 /* RFC 1035 s4.1.1: RCODE != 0 is an error; abort query. */
6912- if ((flags & 0x000F ) != 0 ) {
6927+ if ((flags & DNS_RCODE_MASK ) != 0 ) {
69136928 dns_abort_query (s );
69146929 return ;
69156930 }
@@ -6939,9 +6954,11 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69396954 dns_abort_query (s );
69406955 return ;
69416956 }
6942- if (s -> dns_query_type == DNS_QUERY_TYPE_A && ee16 (rr -> type ) == DNS_A && rdlen >= 4 ) {
6957+ if (s -> dns_query_type == DNS_QUERY_TYPE_A &&
6958+ ee16 (rr -> type ) == DNS_A &&
6959+ rdlen >= DNS_IPV4_RDATA_LEN ) {
69436960 uint32_t ip ;
6944- if (pos + 4 > dns_len ) {
6961+ if (pos + DNS_IPV4_RDATA_LEN > dns_len ) {
69456962 dns_abort_query (s );
69466963 return ;
69476964 }
@@ -6971,7 +6988,7 @@ void dns_callback(int dns_sd, uint16_t ev, void *arg)
69716988static int dns_send_query (struct wolfIP * s , const char * dname , uint16_t * id ,
69726989 uint16_t qtype )
69736990{
6974- uint8_t buf [512 ];
6991+ uint8_t buf [MAX_DNS_RESPONSE ];
69756992 struct dns_header * hdr ;
69766993 struct dns_question * q ;
69776994 char * q_name , * tok_start , * tok_end ;
@@ -6991,20 +7008,21 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
69917008 }
69927009 s -> dns_id = (uint16_t )(wolfIP_getrandom () & 0xFFFF );
69937010 if (s -> dns_id == 0 )
6994- s -> dns_id = 1 ;
7011+ s -> dns_id = DNS_MIN_ID ;
69957012 * id = s -> dns_id ;
6996- memset (buf , 0 , 512 );
7013+ memset (buf , 0 , sizeof ( buf ) );
69977014 s -> dns_query_type = (qtype == DNS_PTR ) ? DNS_QUERY_TYPE_PTR : DNS_QUERY_TYPE_A ;
69987015 hdr = (struct dns_header * )buf ;
69997016 hdr -> id = ee16 (s -> dns_id );
7000- hdr -> qdcount = ee16 (1 );
7017+ hdr -> qdcount = ee16 (DNS_QUESTION_COUNT );
70017018 hdr -> flags = ee16 (DNS_QUERY | DNS_RD );
70027019 /* Prepare the DNS query name */
70037020 q_name = (char * )(buf + sizeof (struct dns_header ));
70047021 tok_start = (char * )dname ;
70057022 while (* tok_start ) {
70067023 tok_end = tok_start ;
7007- while ((* tok_end != '.' ) && (* tok_end != 0 )) {
7024+ while ((* tok_end != DNS_LABEL_SEPARATOR ) &&
7025+ (* tok_end != DNS_NAME_TERMINATOR )) {
70087026 tok_end ++ ;
70097027 }
70107028 label_len = (uint32_t )(tok_end - tok_start );
@@ -7015,15 +7033,15 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
70157033 memcpy (q_name , tok_start , label_len );
70167034 q_name += label_len ;
70177035 tok_len += label_len + 1 ;
7018- if (* tok_end == 0 )
7036+ if (* tok_end == DNS_NAME_TERMINATOR )
70197037 break ;
70207038 tok_start = tok_end + 1 ;
70217039 }
7022- * q_name = 0 ;
7040+ * q_name = DNS_NAME_TERMINATOR ;
70237041 tok_len ++ ;
70247042 q = (struct dns_question * )(buf + sizeof (struct dns_header ) + tok_len );
70257043 q -> qtype = ee16 (qtype );
7026- q -> qclass = ee16 (1 );
7044+ q -> qclass = ee16 (DNS_CLASS_IN );
70277045 s -> dns_query_len = (uint16_t )(sizeof (struct dns_header ) + tok_len + sizeof (struct dns_question ));
70287046 memcpy (s -> dns_query_buf , buf , s -> dns_query_len );
70297047 s -> dns_retry_count = 0 ;
@@ -7036,7 +7054,7 @@ static int dns_send_query(struct wolfIP *s, const char *dname, uint16_t *id,
70367054 if (ret < 0 ) {
70377055 /* Roll back the outstanding query state when the first send never queues. */
70387056 dns_abort_query (s );
7039- * id = 0 ;
7057+ * id = DNS_ID_NONE ;
70407058 return ret ;
70417059 }
70427060 dns_schedule_timer (s );
@@ -7055,14 +7073,14 @@ int nslookup(struct wolfIP *s, const char *dname, uint16_t *id, void (*lookup_cb
70557073
70567074int wolfIP_dns_ptr_lookup (struct wolfIP * s , uint32_t ip , uint16_t * id , void (* lookup_cb )(const char * name ))
70577075{
7058- char ptr_name [128 ];
7076+ char ptr_name [DNS_PTR_NAME_BUF_LEN ];
70597077 if (!s || !id || !lookup_cb )
70607078 return -22 ;
70617079 if (dns_format_ptr_name (ptr_name , sizeof (ptr_name ), ip ) < 0 )
70627080 return -22 ;
70637081 s -> dns_ptr_cb = lookup_cb ;
70647082 s -> dns_lookup_cb = NULL ;
7065- s -> dns_ptr_name [0 ] = '\0' ;
7083+ s -> dns_ptr_name [0 ] = DNS_NAME_TERMINATOR ;
70667084 s -> dns_query_type = DNS_QUERY_TYPE_PTR ;
70677085 return dns_send_query (s , ptr_name , id , DNS_PTR );
70687086}
0 commit comments