X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=net%2Fdns.c;h=7017bac75af5faf7a99ce2e17ee088bcc6fd5a32;hb=b99eeba37a1c4eceb22458c68b36abe1fa6c0e5f;hp=ff9ddffc9d0a1f15e7febf808c5606f69ab48a3d;hpb=1e362dc3e799fd86722a60f5639e52a67dfc0658;p=karo-tx-uboot.git diff --git a/net/dns.c b/net/dns.c index ff9ddffc9d..7017bac75a 100644 --- a/net/dns.c +++ b/net/dns.c @@ -5,7 +5,7 @@ * Copyright (c) 2009 Robin Getz * * This is a simple DNS implementation for U-Boot. It will use the first IP - * in the DNS response as NetServerIP. This can then be used for any other + * in the DNS response as net_server_ip. This can then be used for any other * network related activities. * * The packet handling is partly based on TADNS, original copyrights @@ -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,11 +43,12 @@ DnsSend(void) const char *name; enum dns_query_type qtype = DNS_A_RECORD; - name = NetDNSResolve; - pkt = p = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE); + 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 */ @@ -58,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, '.'); @@ -87,41 +87,40 @@ DnsSend(void) n = p - pkt; /* Total packet length */ debug("Packet size %d\n", n); - DnsOurPort = random_port(); + dns_our_port = random_port(); - NetSendUDPPacket(NetServerEther, NetOurDNSIP, DNS_SERVICE_PORT, - DnsOurPort, n); + net_send_udp_packet(net_server_ethaddr, net_dns_server, + 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); } -static void -DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len) +static void dns_handler(uchar *pkt, unsigned dest, struct in_addr sip, + unsigned src, unsigned len) { struct header *header; const unsigned char *p, *e, *s; u16 type, i; int found, stop, dlen; - char IPStr[22]; - IPaddr_t IPAddress; + 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; @@ -150,7 +149,6 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len) /* 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) @@ -169,7 +167,8 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len) 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; @@ -177,30 +176,32 @@ DnsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len) } if (found && &p[12] < e) { - dlen = get_unaligned_be16(p+10); p += 12; - memcpy(&IPAddress, p, 4); + memcpy(&ip_addr, p, 4); if (p + dlen <= e) { - ip_to_string(IPAddress, 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); - net_set_udp_handler(DnsHandler); + net_set_timeout_handler(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(); }