changeset 1357:7b0dae4bd7a9

Use DNS server from DHCP info if present
author gthomas
date Fri, 07 Nov 2003 18:14:10 +0000
parents 6a23e2474d97
children 2f92828821dc
files packages/redboot/current/ChangeLog packages/redboot/current/include/net/net.h packages/redboot/current/src/net/bootp.c packages/redboot/current/src/net/dns.c
diffstat 4 files changed, 32 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/packages/redboot/current/ChangeLog
+++ b/packages/redboot/current/ChangeLog
@@ -1,5 +1,10 @@
 2003-11-07  Gary Thomas  <gary@mlbassoc.com>
 
+	* src/net/dns.c: 
+	* src/net/bootp.c: 
+	* include/net/net.h: Use DNS server address from DHCP if provided.
+	Inspired by John Newlin <jnewlin@rawbw.com>
+
 	* src/flash.c (fis_init): Take out misleading warning - since the
 	new [default] behaviour of "fis free" means free space need not
 	be necessarily erased on the device.
--- a/packages/redboot/current/include/net/net.h
+++ b/packages/redboot/current/include/net/net.h
@@ -359,6 +359,12 @@ extern ip_addr_t   __local_ip_gate;
 extern ip_addr_t   __local_ip_mask;
 #endif
 
+#ifdef CYGPKG_REDBOOT_NETWORKING_DNS
+extern struct in_addr __bootp_dns_addr;
+extern cyg_bool __bootp_dns_set;
+#endif
+
+
 /*
  * Set a timer. Caller is responsible for providing the timer_t struct.
  */
--- a/packages/redboot/current/src/net/bootp.c
+++ b/packages/redboot/current/src/net/bootp.c
@@ -288,6 +288,13 @@ int
                                 memcpy(__local_ip_gate,p,4); 
                                 break;
 #endif
+#ifdef CYGPKG_REDBOOT_NETWORKING_DNS
+			    case TAG_DOMAIN_SERVER:
+				diag_printf(" DNS server found!\n");
+				memcpy(&__bootp_dns_addr, p, 4);
+				__bootp_dns_set = 1;
+				break;
+#endif
                             default:
                                 break;
                             }
--- a/packages/redboot/current/src/net/dns.c
+++ b/packages/redboot/current/src/net/dns.c
@@ -9,6 +9,7 @@
 // -------------------------------------------
 // This file is part of eCos, the Embedded Configurable Operating System.
 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2003 Gary Thomas
 //
 // eCos is free software; you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free
@@ -82,6 +83,10 @@ static int get_port = 7700;
 /* Some magic to make dns_impl.inl compile under RedBoot */
 #define sprintf diag_sprintf
 
+/* DNS server address possibly returned from bootp */
+struct in_addr __bootp_dns_addr;
+cyg_bool __bootp_dns_set = false;
+
 struct sockaddr_in server;
 
 /* static buffers so we can make do without malloc */
@@ -252,6 +257,12 @@ redboot_dns_res_init(void)
     server.sin_port = htons(DOMAIN_PORT);
     cyg_drv_mutex_init(&dns_mutex);
 
+    /* If we got a DNS server address from the DHCP/BOOTP, then use that address */
+    if ( __bootp_dns_set ) {
+	memcpy(&server.sin_addr, &__bootp_dns_addr, sizeof(__bootp_dns_addr) );
+	s = 0;
+    }
+    else {
 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
     {
         ip_addr_t dns_ip;
@@ -264,9 +275,10 @@ redboot_dns_res_init(void)
         s = 0;
     }
 #else
-    // Use static configuration
-    set_dns(__Xstr(CYGPKG_REDBOOT_NETWORKING_DNS_IP));
+      // Use static configuration
+	set_dns(__Xstr(CYGPKG_REDBOOT_NETWORKING_DNS_IP));
 #endif
+    }
 
     return 0;
 }