changeset 1322:69a4719c04ad

* src/dhcp_prot.c (set_default_dhcp_tags): * src/bootp_support.c (show_bootp): Added support for TAG_NTP_SERVER
author asl
date Tue, 21 Oct 2003 17:50:58 +0000
parents 83e860bfbcaa
children 16a975af0355
files packages/net/common/current/ChangeLog packages/net/common/current/src/bootp_support.c packages/net/common/current/src/dhcp_prot.c
diffstat 3 files changed, 65 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/packages/net/common/current/ChangeLog
+++ b/packages/net/common/current/ChangeLog
@@ -1,3 +1,8 @@
+2003-10-21  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+        * src/dhcp_prot.c (set_default_dhcp_tags): 
+        * src/bootp_support.c (show_bootp): Added support for TAG_NTP_SERVER
+
 2003-10-13  Jay Foster  <jay@systech.com>
 
         * include/dhcp.h: Added prototype for dhcp_set_hostname().
--- a/packages/net/common/current/src/bootp_support.c
+++ b/packages/net/common/current/src/bootp_support.c
@@ -68,6 +68,9 @@
 #ifdef CYGINT_ISO_DNS
 #include <netdb.h>
 #endif
+#ifdef CYGPKG_NET_SNTP
+#include <cyg/sntp/sntp.h>
+#endif
 
 #ifndef CYGPKG_LIBC_STDIO
 #define perror(s) diag_printf(#s ": %s\n", strerror(errno))
@@ -361,7 +364,15 @@ show_bootp(const char *intf, struct boot
                         diag_printf(" %d",op[i]);
                 diag_printf("\n");
                 break;
-
+            case TAG_NTP_SERVER:
+              diag_printf("        NTP servers: ");
+              for ( i = 0 ; i < op[1]/4 ; i++) {
+                diag_printf("%d.%d.%d.%d ",
+                            op[1+i*4+1], op[1+i*4+2], 
+                            op[1+i*4+3], op[1+i*4+4]);
+              }
+              diag_printf("\n");
+              break;
             default:
                 diag_printf("Unknown option: %x/%d.%d:", *op, *op, *(op+1));
                 for ( i = 2; i < 2 + op[1]; i++ )
@@ -536,6 +547,47 @@ init_net(const char *intf, struct bootp 
         }
     }
 #endif
+
+#ifdef CYGNUM_NET_SNTP_UNICAST_MAXDHCP
+    {
+        struct in_addr dhcp_addrs[CYGNUM_NET_SNTP_UNICAST_MAXDHCP];
+
+        /* Removed any previously registered addresses */
+        cyg_sntp_set_servers(NULL, 0);
+
+        /* See if we received any NTP servers from DHCP */
+        length = sizeof(dhcp_addrs);
+        if (get_bootp_option(bp, TAG_NTP_SERVER, &dhcp_addrs[0], &length))
+        {
+        	static struct sockaddr ntp_servers[CYGNUM_NET_SNTP_UNICAST_MAXDHCP];
+            struct servent *service;
+        	cyg_uint32 num;
+
+            /* See how many addresses we got.  The length should always
+             * be a multiple of 4, but cut off any extra bytes and
+             * use what we got.
+             */
+            length /= sizeof(struct in_addr);
+
+            /* Fill out a sockaddr array for the NTP client */
+            service = getservbyname("ntp", "udp");
+            CYG_CHECK_DATA_PTR(service, "NTP service not found.");
+            memset(&ntp_servers[0], 0, sizeof(ntp_servers));
+            for (num = 0; num < length; num++)
+            {
+				struct sockaddr_in *saddr = (struct sockaddr_in *)&ntp_servers[num];
+
+                saddr->sin_len = sizeof(*saddr);
+                saddr->sin_family = AF_INET;
+                saddr->sin_port = service->s_port;  /* Already network-endian */
+                saddr->sin_addr = dhcp_addrs[num];  /* Already network-endian */
+            }
+
+            /* Configure the client with the array */
+            cyg_sntp_set_servers(&ntp_servers[0], num);
+        }
+    }
+#endif /* CYGNUM_NET_SNTP_UNICAST_MAXDHCP */
     return true;
 }
 
--- a/packages/net/common/current/src/dhcp_prot.c
+++ b/packages/net/common/current/src/dhcp_prot.c
@@ -56,6 +56,10 @@
 
 #ifdef CYGPKG_NET_DHCP
 
+#ifdef CYGPKG_NET_SNTP
+#include <pkgconf/net_sntp.h>
+#endif /* CYGPKG_NET_SNTP */
+
 #if 0
 #define perror( txt ) // nothing
 #endif
@@ -544,6 +548,9 @@ static void set_default_dhcp_tags( struc
         TAG_DOMAIN_NAME       ,     //     domain name: hmt10.cambridge.redhat.com
         TAG_IP_BROADCAST      ,     //     IP broadcast: 10.16.19.255
 #endif
+#ifdef CYGNUM_NET_SNTP_UNICAST_MAXDHCP
+        TAG_NTP_SERVER        ,     //     NTP Server Addresses(es)
+#endif
 #ifdef CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL
         CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL ,
 #endif