|
@@ -29,13 +29,12 @@
|
|
|
|
|
|
#include "dns.h"
|
|
|
|
|
|
-char *NetDNSResolve; /* The host to resolve */
|
|
|
-char *NetDNSenvvar; /* The envvar to store the answer in */
|
|
|
+char *net_dns_resolve; /* The host to resolve */
|
|
|
+char *net_dns_env_var; /* The envvar to store the answer in */
|
|
|
|
|
|
-static int DnsOurPort;
|
|
|
+static int dns_our_port;
|
|
|
|
|
|
-static void
|
|
|
-DnsSend(void)
|
|
|
+static void dns_send(void)
|
|
|
{
|
|
|
struct header *header;
|
|
|
int n, name_len;
|
|
@@ -44,12 +43,12 @@ DnsSend(void)
|
|
|
const char *name;
|
|
|
enum dns_query_type qtype = DNS_A_RECORD;
|
|
|
|
|
|
- name = NetDNSResolve;
|
|
|
+ name = net_dns_resolve;
|
|
|
pkt = (uchar *)(net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE);
|
|
|
p = pkt;
|
|
|
|
|
|
/* Prepare DNS packet header */
|
|
|
- header = (struct header *) pkt;
|
|
|
+ header = (struct header *)pkt;
|
|
|
header->tid = 1;
|
|
|
header->flags = htons(0x100); /* standard query */
|
|
|
header->nqueries = htons(1); /* Just one query */
|
|
@@ -59,7 +58,7 @@ DnsSend(void)
|
|
|
|
|
|
/* Encode DNS 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 {
|
|
|
s = strchr(name, '.');
|
|
@@ -88,15 +87,14 @@ DnsSend(void)
|
|
|
n = p - pkt; /* Total packet length */
|
|
|
debug("Packet size %d\n", n);
|
|
|
|
|
|
- DnsOurPort = random_port();
|
|
|
+ dns_our_port = random_port();
|
|
|
|
|
|
net_send_udp_packet(net_server_ethaddr, net_dns_server,
|
|
|
- DNS_SERVICE_PORT, DnsOurPort, n);
|
|
|
+ DNS_SERVICE_PORT, dns_our_port, n);
|
|
|
debug("DNS packet sent\n");
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-DnsTimeout(void)
|
|
|
+static void dns_timeout_handler(void)
|
|
|
{
|
|
|
puts("Timeout\n");
|
|
|
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;
|
|
|
u16 type, i;
|
|
|
int found, stop, dlen;
|
|
|
- char IPStr[22];
|
|
|
+ char ip_str[22];
|
|
|
struct in_addr ip_addr;
|
|
|
|
|
|
|
|
|
debug("%s\n", __func__);
|
|
|
- if (dest != DnsOurPort)
|
|
|
+ if (dest != dns_our_port)
|
|
|
return;
|
|
|
|
|
|
for (i = 0; i < len; i += 4)
|
|
|
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: */
|
|
|
- header = (struct header *) pkt;
|
|
|
+ header = (struct header *)pkt;
|
|
|
if (ntohs(header->nqueries) != 1)
|
|
|
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 */
|
|
|
for (found = stop = 0; !stop && &p[12] < e; ) {
|
|
|
-
|
|
|
/* Skip possible name in CNAME answer */
|
|
|
if (*p != 0xc0) {
|
|
|
while (*p && &p[12] < e)
|
|
@@ -170,7 +167,8 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
|
|
|
p += 12 + dlen;
|
|
|
} else if (type == DNS_A_RECORD) {
|
|
|
debug("Found A-record\n");
|
|
|
- found = stop = 1;
|
|
|
+ found = 1;
|
|
|
+ stop = 1;
|
|
|
} else {
|
|
|
debug("Unknown type\n");
|
|
|
stop = 1;
|
|
@@ -178,33 +176,32 @@ static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip,
|
|
|
}
|
|
|
|
|
|
if (found && &p[12] < e) {
|
|
|
-
|
|
|
dlen = get_unaligned_be16(p+10);
|
|
|
p += 12;
|
|
|
memcpy(&ip_addr, p, 4);
|
|
|
|
|
|
if (p + dlen <= e) {
|
|
|
- ip_to_string(ip_addr, IPStr);
|
|
|
- printf("%s\n", IPStr);
|
|
|
- if (NetDNSenvvar)
|
|
|
- setenv(NetDNSenvvar, IPStr);
|
|
|
- } else
|
|
|
+ ip_to_string(ip_addr, ip_str);
|
|
|
+ printf("%s\n", ip_str);
|
|
|
+ if (net_dns_env_var)
|
|
|
+ setenv(net_dns_env_var, ip_str);
|
|
|
+ } else {
|
|
|
puts("server responded with invalid IP number\n");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
net_set_state(NETLOOP_SUCCESS);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
-DnsStart(void)
|
|
|
+void dns_start(void)
|
|
|
{
|
|
|
debug("%s\n", __func__);
|
|
|
|
|
|
- NetSetTimeout(DNS_TIMEOUT, DnsTimeout);
|
|
|
+ NetSetTimeout(DNS_TIMEOUT, dns_timeout_handler);
|
|
|
net_set_udp_handler(dns_handler);
|
|
|
|
|
|
/* Clear a previous MAC address, the server IP might have changed. */
|
|
|
memset(net_server_ethaddr, 0, sizeof(net_server_ethaddr));
|
|
|
|
|
|
- DnsSend();
|
|
|
+ dns_send();
|
|
|
}
|