X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=net%2Fdns.c;h=ff9ddffc9d0a1f15e7febf808c5606f69ab48a3d;hb=95cb69faeb45f6396a1336bff201a50ea1677d85;hp=bb3e3f54e05d03f3f8799cc65a376d2788350188;hpb=28958b8bea4c66629c5a22fd3c8b0d49df90383d;p=u-boot diff --git a/net/dns.c b/net/dns.c index bb3e3f54e0..ff9ddffc9d 100644 --- a/net/dns.c +++ b/net/dns.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "dns.h" @@ -44,7 +45,7 @@ DnsSend(void) enum dns_query_type qtype = DNS_A_RECORD; name = NetDNSResolve; - pkt = p = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE); + pkt = p = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE); /* Prepare DNS packet header */ header = (struct header *) pkt; @@ -97,11 +98,11 @@ static void DnsTimeout(void) { puts("Timeout\n"); - NetState = NETLOOP_FAIL; + net_set_state(NETLOOP_FAIL); } static void -DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) +DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len) { struct header *header; const unsigned char *p, *e, *s; @@ -109,7 +110,6 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) int found, stop, dlen; char IPStr[22]; IPaddr_t IPAddress; - short tmp; debug("%s\n", __func__); @@ -120,15 +120,15 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) 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]); - /* We sent 1 query. We want to see more that 1 answer. */ + /* We sent one query. We want to have a single answer: */ header = (struct header *) pkt; if (ntohs(header->nqueries) != 1) return; /* Received 0 answers */ if (header->nanswers == 0) { - puts("DNS server returned no answers\n"); - NetState = NETLOOP_SUCCESS; + puts("DNS: host not found\n"); + net_set_state(NETLOOP_SUCCESS); return; } @@ -139,10 +139,9 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) continue; /* We sent query class 1, query type 1 */ - tmp = p[1] | (p[2] << 8); - if (&p[5] > e || ntohs(tmp) != DNS_A_RECORD) { - puts("DNS response was not A record\n"); - NetState = NETLOOP_SUCCESS; + if (&p[5] > e || get_unaligned_be16(p+1) != DNS_A_RECORD) { + puts("DNS: response was not an A record\n"); + net_set_state(NETLOOP_SUCCESS); return; } @@ -160,14 +159,12 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) } debug("Name (Offset in header): %d\n", p[1]); - tmp = p[2] | (p[3] << 8); - type = ntohs(tmp); + type = get_unaligned_be16(p+2); debug("type = %d\n", type); if (type == DNS_CNAME_RECORD) { /* CNAME answer. shift to the next section */ debug("Found canonical name\n"); - tmp = p[10] | (p[11] << 8); - dlen = ntohs(tmp); + dlen = get_unaligned_be16(p+10); debug("dlen = %d\n", dlen); p += 12 + dlen; } else if (type == DNS_A_RECORD) { @@ -181,8 +178,7 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) if (found && &p[12] < e) { - tmp = p[10] | (p[11] << 8); - dlen = ntohs(tmp); + dlen = get_unaligned_be16(p+10); p += 12; memcpy(&IPAddress, p, 4); @@ -195,7 +191,7 @@ DnsHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len) puts("server responded with invalid IP number\n"); } - NetState = NETLOOP_SUCCESS; + net_set_state(NETLOOP_SUCCESS); } void @@ -204,7 +200,7 @@ DnsStart(void) debug("%s\n", __func__); NetSetTimeout(DNS_TIMEOUT, DnsTimeout); - NetSetHandler(DnsHandler); + net_set_udp_handler(DnsHandler); DnsSend(); }