@ -29,13 +29,12 @@
# include "dns.h"
# include "dns.h"
char * NetDNSR esolve; /* The host to resolve */
char * net_dns_r esolve; /* The host to resolve */
char * NetDNSenv var; /* The envvar to store the answer in */
char * net_dns_env_ var; /* The envvar to store the answer in */
static int DnsOurP ort;
static int dns_our_p ort;
static void
static void dns_send ( void )
DnsSend ( void )
{
{
struct header * header ;
struct header * header ;
int n , name_len ;
int n , name_len ;
@ -44,12 +43,12 @@ DnsSend(void)
const char * name ;
const char * name ;
enum dns_query_type qtype = DNS_A_RECORD ;
enum dns_query_type qtype = DNS_A_RECORD ;
name = NetDNSR esolve;
name = net_dns_r esolve;
pkt = ( uchar * ) ( net_tx_packet + net_eth_hdr_size ( ) + IP_UDP_HDR_SIZE ) ;
pkt = ( uchar * ) ( net_tx_packet + net_eth_hdr_size ( ) + IP_UDP_HDR_SIZE ) ;
p = pkt ;
p = pkt ;
/* Prepare DNS packet header */
/* Prepare DNS packet header */
header = ( struct header * ) pkt ;
header = ( struct header * ) pkt ;
header - > tid = 1 ;
header - > tid = 1 ;
header - > flags = htons ( 0x100 ) ; /* standard query */
header - > flags = htons ( 0x100 ) ; /* standard query */
header - > nqueries = htons ( 1 ) ; /* Just one query */
header - > nqueries = htons ( 1 ) ; /* Just one query */
@ -59,7 +58,7 @@ DnsSend(void)
/* Encode DNS name */
/* Encode DNS name */
name_len = strlen ( name ) ;
name_len = strlen ( name ) ;
p = ( uchar * ) & header - > data ; /* For encoding host name into packet */
p = ( uchar * ) & header - > data ; /* For encoding host name into packet */
do {
do {
s = strchr ( name , ' . ' ) ;
s = strchr ( name , ' . ' ) ;
@ -88,15 +87,14 @@ DnsSend(void)
n = p - pkt ; /* Total packet length */
n = p - pkt ; /* Total packet length */
debug ( " Packet size %d \n " , n ) ;
debug ( " Packet size %d \n " , n ) ;
DnsOurP ort = random_port ( ) ;
dns_our_p ort = random_port ( ) ;
net_send_udp_packet ( net_server_ethaddr , net_dns_server ,
net_send_udp_packet ( net_server_ethaddr , net_dns_server ,
DNS_SERVICE_PORT , DnsOurP ort, n ) ;
DNS_SERVICE_PORT , dns_our_p ort, n ) ;
debug ( " DNS packet sent \n " ) ;
debug ( " DNS packet sent \n " ) ;
}
}
static void
static void dns_timeout_handler ( void )
DnsTimeout ( void )
{
{
puts ( " Timeout \n " ) ;
puts ( " Timeout \n " ) ;
net_set_state ( NETLOOP_FAIL ) ;
net_set_state ( NETLOOP_FAIL ) ;
@ -109,20 +107,20 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
const unsigned char * p , * e , * s ;
const unsigned char * p , * e , * s ;
u16 type , i ;
u16 type , i ;
int found , stop , dlen ;
int found , stop , dlen ;
char IPS tr[ 22 ] ;
char ip_s tr[ 22 ] ;
struct in_addr ip_addr ;
struct in_addr ip_addr ;
debug ( " %s \n " , __func__ ) ;
debug ( " %s \n " , __func__ ) ;
if ( dest ! = DnsOurP ort)
if ( dest ! = dns_our_p ort)
return ;
return ;
for ( i = 0 ; i < len ; i + = 4 )
for ( i = 0 ; i < len ; i + = 4 )
debug ( " 0x%p - 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n " ,
debug ( " 0x%p - 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n " ,
pkt + i , pkt [ i ] , pkt [ i + 1 ] , pkt [ i + 2 ] , pkt [ i + 3 ] ) ;
pkt + i , pkt [ i ] , pkt [ i + 1 ] , pkt [ i + 2 ] , pkt [ i + 3 ] ) ;
/* We sent one query. We want to have a single answer: */
/* We sent one query. We want to have a single answer: */
header = ( struct header * ) pkt ;
header = ( struct header * ) pkt ;
if ( ntohs ( header - > nqueries ) ! = 1 )
if ( ntohs ( header - > nqueries ) ! = 1 )
return ;
return ;
@ -151,7 +149,6 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
/* Loop through the answers, we want A type answer */
/* Loop through the answers, we want A type answer */
for ( found = stop = 0 ; ! stop & & & p [ 12 ] < e ; ) {
for ( found = stop = 0 ; ! stop & & & p [ 12 ] < e ; ) {
/* Skip possible name in CNAME answer */
/* Skip possible name in CNAME answer */
if ( * p ! = 0xc0 ) {
if ( * p ! = 0xc0 ) {
while ( * p & & & p [ 12 ] < e )
while ( * p & & & p [ 12 ] < e )
@ -170,7 +167,8 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
p + = 12 + dlen ;
p + = 12 + dlen ;
} else if ( type = = DNS_A_RECORD ) {
} else if ( type = = DNS_A_RECORD ) {
debug ( " Found A-record \n " ) ;
debug ( " Found A-record \n " ) ;
found = stop = 1 ;
found = 1 ;
stop = 1 ;
} else {
} else {
debug ( " Unknown type \n " ) ;
debug ( " Unknown type \n " ) ;
stop = 1 ;
stop = 1 ;
@ -178,33 +176,32 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
}
}
if ( found & & & p [ 12 ] < e ) {
if ( found & & & p [ 12 ] < e ) {
dlen = get_unaligned_be16 ( p + 10 ) ;
dlen = get_unaligned_be16 ( p + 10 ) ;
p + = 12 ;
p + = 12 ;
memcpy ( & ip_addr , p , 4 ) ;
memcpy ( & ip_addr , p , 4 ) ;
if ( p + dlen < = e ) {
if ( p + dlen < = e ) {
ip_to_string ( ip_addr , IPS tr) ;
ip_to_string ( ip_addr , ip_s tr) ;
printf ( " %s \n " , IPS tr) ;
printf ( " %s \n " , ip_s tr) ;
if ( NetDNSenv var)
if ( net_dns_env_ var)
setenv ( NetDNSenvvar , IPS tr) ;
setenv ( net_dns_env_var , ip_s tr) ;
} else
} else {
puts ( " server responded with invalid IP number \n " ) ;
puts ( " server responded with invalid IP number \n " ) ;
}
}
}
net_set_state ( NETLOOP_SUCCESS ) ;
net_set_state ( NETLOOP_SUCCESS ) ;
}
}
void
void dns_start ( void )
DnsStart ( void )
{
{
debug ( " %s \n " , __func__ ) ;
debug ( " %s \n " , __func__ ) ;
NetSetTimeout ( DNS_TIMEOUT , DnsTimeout ) ;
NetSetTimeout ( DNS_TIMEOUT , dns_timeout_handler ) ;
net_set_udp_handler ( dns_handler ) ;
net_set_udp_handler ( dns_handler ) ;
/* Clear a previous MAC address, the server IP might have changed. */
/* Clear a previous MAC address, the server IP might have changed. */
memset ( net_server_ethaddr , 0 , sizeof ( net_server_ethaddr ) ) ;
memset ( net_server_ethaddr , 0 , sizeof ( net_server_ethaddr ) ) ;
DnsS end( ) ;
dns_s end( ) ;
}
}