This is the mail archive of the
ecos-maintainers@sources.redhat.com
mailing list for the eCos project.
FWD: SNTP client package
- From: Andrew Lunn <andrew dot lunn at ascom dot ch>
- To: eCos Maintainers <ecos-maintainers at sources dot redhat dot com>
- Date: Tue, 25 Feb 2003 10:42:53 +0100
- Subject: FWD: SNTP client package
Hi Folks
I guess you are all busy with beta 2.0.
If you have some spare time please could you take a look at this.
Andrew
----- Forwarded message from Andrew Lunn <andrew dot lunn at ascom dot ch> -----
Date: Mon, 17 Feb 2003 17:28:29 +0100
From: Andrew Lunn <andrew dot lunn at ascom dot ch>
To: eCos Patches <ecos-patches at sources dot redhat dot com>
Subject: SNTP client package
Hi Folks
Attached is an SNTP client package. The client will listen for SNTP
broadcast from a time server and set the system clock.
Comments welcome.
Andrew
Index: packages/ecos.db
===================================================================
RCS file: /cvs/ecos/ecos/packages/ecos.db,v
retrieving revision 1.89
diff -u -r1.89 ecos.db
--- packages/ecos.db 14 Feb 2003 01:42:19 -0000 1.89
+++ packages/ecos.db 17 Feb 2003 16:22:54 -0000
@@ -1145,6 +1145,17 @@
script dns.cdl
description "DNS client support."
}
+
+package CYGPKG_NET_SNTP {
+ alias { "SNTP support" sntp }
+ directory net/sntp
+ script sntp.cdl
+ description "
+This package provides a SNTP client which can recieve broadcast time
+information and set the system clock."
+}
+
+
package CYGPKG_DEVS_ETH_ARM_EDB7XXX {
alias { "Cirrus Logic ethernet driver for EP7xxx boards" edb7xxx_eth_driver }
hardware
Index: packages/NEWS
===================================================================
RCS file: /cvs/ecos/ecos/packages/NEWS,v
retrieving revision 1.64
diff -u -r1.64 NEWS
--- packages/NEWS 14 Feb 2003 01:42:52 -0000 1.64
+++ packages/NEWS 17 Feb 2003 16:22:54 -0000
@@ -1,3 +1,4 @@
+* Simple Network Time Protocol (SNTP) client contributed by Andrew Lunn.
* Port added for IDT MIPS IDT79RC32334 reference platform, including Flash,
ethernet, and serial drivers as well as RedBoot support. Contributed by
Tim Michals working for IDT.
Index: packages/net/common/current/src/getserv.c
===================================================================
RCS file: /cvs/ecos/ecos-opt/net/net/common/current/src/getserv.c,v
retrieving revision 1.2
diff -u -r1.2 getserv.c
--- packages/net/common/current/src/getserv.c 14 Aug 2002 18:10:05 -0000 1.2
+++ packages/net/common/current/src/getserv.c 17 Feb 2003 16:22:54 -0000
@@ -47,6 +47,7 @@
{ "ftp-data", 0, 20 , "tcp" },
{ "domain", 0, 53 , "udp" },
{ "tftp", 0, 69 , "udp" },
+ { "ntp", 0, 123 , "udp" },
{ "snmp", 0, 161 , "udp" },
{ NULL, 0, 0 , NULL }
Index: doc/sgml/doclist
===================================================================
RCS file: /cvs/ecos/ecos/doc/sgml/doclist,v
retrieving revision 1.7
diff -u -r1.7 doclist
--- doc/sgml/doclist 3 Feb 2003 16:35:33 -0000 1.7
+++ doc/sgml/doclist 17 Feb 2003 16:22:54 -0000
@@ -21,6 +21,7 @@
net/ns/dns/current/doc/dns.sgml
net/httpd/current/doc/httpd.sgml
net/ftpclient/current/doc/ftpclient.sgml
+net/sntp/current/doc/sntp.sgml
services/crc/current/doc/crc.sgml
services/cpuload/current/doc/cpuload.sgml
services/profile/gprof/current/doc/profile.sgml
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/ChangeLog Mon Feb 17 12:00:46 2003
@@ -0,0 +1,42 @@
+2003-02-16 Andrew Lunn <andrew dot lunn at ascom dot ch>
+
+ * src/sntp.c: First import of SNTP client code.
+ * include/sntp.c: Ditto
+ * test/sntp1.c: Ditto
+ * cdl/sntp.cdl: Ditto
+ * doc/sntp.sgml: Ditto
+
+//===========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2003 Andrew Lunn
+//
+// 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
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/src/sntp.c Mon Feb 17 12:00:49 2003
@@ -0,0 +1,197 @@
+//=============================================================================
+//
+// sntp.c
+//
+// Simple Network Time Protocol
+//
+//=============================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2003 Andrew Lunn
+//
+// 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
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): andrew.lunn
+// Contributors:
+// Date: 2003-02-12
+// Description: Provides a Simple Network Time Protocol Client
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <network.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/infra/cyg_ass.h>
+#include <cyg/sntp/sntp.h>
+#include <time.h>
+
+#define VERSION_MASK 0x38000000
+#define VERSION_SHIFT 27
+#define MODE_MASK 0x07000000
+#define MODE_SHIFT 24
+#define STRATUM_MASK 0x00ff0000
+#define STRATUM_SHIFT 16
+
+#define MODE_BROADCAST 5
+
+struct sntp_srv_s {
+ struct sockaddr_in addr;
+ int stratum;
+ int version;
+ cyg_uint32 timestamp;
+};
+
+#define SECONDSPERMINUTE (cyg_uint32)60
+#define SECONDSPERHOUR (cyg_uint32)(SECONDSPERMINUTE * 60)
+#define SECONDSPERDAY (cyg_uint32)(SECONDSPERHOUR * 24)
+#define SECONDSPERYEAR (cyg_uint32)(SECONDSPERDAY * 365)
+
+/* Convert a SNTP timestamp to a time_t. timestamps are seconds from
+ 1/1/1900. time_t is 1/1/1970. That equates to 70 years, or which
+ 17 were leap years.*/
+static time_t timestamp2time(cyg_uint32 timestamp) {
+
+ return timestamp -
+ (SECONDSPERYEAR * (cyg_uint32)(70)) -
+ (SECONDSPERDAY * (cyg_uint32)(17));
+}
+
+/* Is the new server better than the current one? If its the same as
+ the current, its always better. If the stratum is lower its better.
+ If we have not heard from the old server for more than 10 minutes,
+ the new server is better. */
+
+static int is_better(struct sntp_srv_s *newer, struct sntp_srv_s *old) {
+
+ time_t last_time, diff;
+
+ if (newer->addr.sin_addr.s_addr == old->addr.sin_addr.s_addr) return 1;
+ if (newer->stratum < old->stratum) return 1;
+
+ if (old->timestamp != 0xffffffff) {
+ last_time = timestamp2time(old->timestamp);
+
+ diff = time(NULL) - last_time;
+ if (diff > 600) return 1;
+
+ return 0;
+ }
+ return 1;
+}
+
+static void sntp_fn(cyg_addrword_t data) {
+ int fd;
+ int ret;
+ struct sockaddr_in local;
+ struct servent *serv;
+ cyg_uint32 buf[12];
+ struct sntp_srv_s new_srv;
+ struct sntp_srv_s best_srv;
+ int mode;
+ int len;
+ time_t new_time, current_time, diff;
+
+ memset(&best_srv,0xff,sizeof(best_srv));
+
+ fd = socket(AF_INET,SOCK_DGRAM,0);
+ CYG_ASSERT(-1 != fd,"Failed to open socket");
+
+ serv = getservbyname("ntp","udp");
+ CYG_ASSERT(serv,"getservbyname(sntp,udp)");
+
+ memset(&local,0,sizeof(local));
+ local.sin_family = AF_INET;
+ local.sin_port = serv->s_port;
+ local.sin_addr.s_addr = INADDR_ANY;
+
+ ret=bind(fd,(struct sockaddr *)&local,sizeof(local));
+ CYG_ASSERT(0 == ret, "Bind failed");
+
+ while (1) {
+ len = sizeof(new_srv.addr);
+ ret=recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&new_srv.addr,&len);
+ CYG_ASSERT(0 < ret,"recvfrom");
+
+ /* We expect at least enough bytes to fill the buffer. There could
+ be more if there is a digest, but we ignore that. */
+ if (ret < sizeof(buf))
+ continue;
+
+ new_srv.version = (htonl(buf[0]) & VERSION_MASK) >> VERSION_SHIFT;
+ new_srv.stratum = (htonl(buf[0]) & STRATUM_MASK) >> STRATUM_SHIFT;
+ new_srv.timestamp = htonl(buf[10]);
+ mode = (htonl(buf[0]) & MODE_MASK) >> MODE_SHIFT;
+
+ /* Only support protocol versions 3 or 4 */
+ if (new_srv.version < 3 || new_srv.version > 4)
+ continue;
+
+ /* Only process broadcast packet */
+ if (mode != MODE_BROADCAST)
+ continue;
+
+ /* Is the packet from a better server than our current one */
+ if (is_better(&new_srv,&best_srv)) {
+ best_srv = new_srv;
+
+ /* Work out the difference between server and our time */
+ new_time = timestamp2time(best_srv.timestamp);
+ current_time = time(NULL);
+ diff = current_time - new_time;
+
+ if (diff < 0)
+ diff = -diff;
+
+ if (diff > 2)
+ cyg_libc_time_settime(new_time);
+ }
+ }
+}
+
+/* Start the SNTP server */
+void cyg_sntp_start(void) {
+
+ static char sntp_stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
+ static cyg_thread sntp_thread_data;
+ static cyg_handle_t sntp_handle;
+
+ cyg_thread_create(CYGPKG_NET_THREAD_PRIORITY+1,
+ sntp_fn, // entry
+ 0, // entry parameter
+ "sntp", // Name
+ &sntp_stack, // stack
+ sizeof(sntp_stack), // stack size
+ &sntp_handle, // Handle
+ &sntp_thread_data); // Thread data structure
+
+ cyg_thread_resume(sntp_handle);
+}
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/include/sntp.h Mon Feb 17 12:00:48 2003
@@ -0,0 +1,56 @@
+#ifndef CYGONCE_SNTP_SNTP_H
+#define CYGONCE_SNTP_SNTP_H
+//=============================================================================
+//
+// sntp.h
+//
+// SNTP - Simple Network Time Protocol
+//
+//=============================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2003 Andrew Lunn
+//
+// 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
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): andrew.lunn
+// Contributors:
+// Date: 2003-02-11
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+/* Call this function to start the SNTP Client */
+void cyg_sntp_start(void);
+
+#endif
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/cdl/sntp.cdl Mon Feb 17 16:45:56 2003
@@ -0,0 +1,102 @@
+# ====================================================================
+#
+# sntp.cdl
+#
+# Simple Network Time Protocol
+#
+# ====================================================================
+######ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 2003 Andrew Lunn
+##
+## 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
+## Software Foundation; either version 2 or (at your option) any later version.
+##
+## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+## WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+## for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+##
+## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+## at http://sources.redhat.com/ecos/ecos-license/
+## -------------------------------------------
+######ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s): Andrew Lunn
+# Contributors:
+# Date: 2003-02-11
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+
+cdl_package CYGPKG_NET_SNTP {
+ display "Simple Network Time Protocol Client (SNTP)"
+ description "
+ This package provides an SNTP client which will recieve
+ SNTP broadcasts and set the system clock to the correct
+ time."
+ include_dir cyg/sntp
+
+ requires CYGPKG_NET
+ requires CYGPKG_ISO_TIME
+
+ compile sntp.c
+
+ cdl_component CYGPKG_NET_SNTP_OPTIONS {
+ display "SNTP support build options"
+ flavor none
+ no_define
+
+ cdl_option CYGPKG_NET_SNTP_CFLAGS_ADD {
+ display "Additional compiler flags"
+ flavor data
+ no_define
+ default_value { "-D_KERNEL -D__ECOS" }
+ description "
+ This option modifies the set of compiler flags for
+ building the SNTP package.
+ These flags are used in addition
+ to the set of global flags."
+ }
+
+ cdl_option CYGPKG_NET_SNTP_CFLAGS_REMOVE {
+ display "Suppressed compiler flags"
+ flavor data
+ no_define
+ default_value { "" }
+ description "
+ This option modifies the set of compiler flags for
+ building the SNTP package. These flags are removed from
+ the set of global flags if present."
+ }
+ }
+
+ cdl_option CYGPKG_NET_SNTP_TESTS {
+ display "sntp tests"
+ flavor data
+ no_define
+ calculated { "tests/sntp1.c" }
+ }
+}
+
+# ====================================================================
+# EOF sntp.cdl
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/tests/sntp1.c Mon Feb 17 12:00:50 2003
@@ -0,0 +1,135 @@
+//=================================================================
+//
+// sntp1.c
+//
+// Simple Network Time Protocol test 1
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2003 Andrew Lunn
+//
+// 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
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): Andrew Lunn
+// Contributors:
+// Date: 2003-02-11
+// Description: Tests the sntp client
+//####DESCRIPTIONEND####
+
+#include <network.h>
+#include <cyg/infra/testcase.h>
+#include <time.h>
+#include <cyg/sntp/sntp.h>
+#include <stdio.h>
+
+#define SECONDSPERMINUTE (cyg_uint32)60
+#define SECONDSPERHOUR (cyg_uint32)(SECONDSPERMINUTE * 60)
+#define SECONDSPERDAY (cyg_uint32)(SECONDSPERHOUR * 24)
+#define SECONDSPERYEAR (cyg_uint32)(SECONDSPERDAY * 365)
+
+void
+net_test(cyg_addrword_t param)
+{
+ int seconds;
+ time_t now, build_time;
+ struct tm tm={ 0,0,0,0,0,0,0,0,0 };
+ int i;
+ char month[4];
+ char months[12][4] = { "Jan", "Feb", "Mar",
+ "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep",
+ "Oct", "Nov", "Dec" };
+
+ CYG_TEST_INIT();
+
+ CYG_TEST_INFO("sntp1 test build " __DATE__);
+
+ init_all_network_interfaces();
+
+ cyg_sntp_start();
+
+ for (seconds = 120; seconds > 0; seconds--) {
+ now = time(NULL);
+ CYG_TEST_INFO(ctime(&now));
+ cyg_thread_delay(100);
+ }
+
+ now = time(NULL);
+
+ if ( now < (5 * 60)) {
+ CYG_TEST_FAIL_FINISH("Nothing recieved from the SNTP server");
+ } else {
+
+ i=sscanf(__DATE__, "%s %d %d",month,&tm.tm_mday,&tm.tm_year);
+ CYG_ASSERT(3==i,"sscanf did not return enough results");
+ for (i=0; i < 12; i++) {
+ if (!strcmp(month,months[i]))
+ break;
+ }
+ tm.tm_mon = i;
+ tm.tm_mday++;
+
+ build_time = mktime(&tm);
+ CYG_ASSERT(-1 != build_time,"mktime returned -1");
+
+ if (build_time > time(NULL)) {
+ CYG_TEST_FAIL_FINISH("Build time is ahead of SNTP time");
+ } else {
+ if ((build_time + 60 * 60 * 24 * 10) > time(NULL)) {
+ CYG_TEST_FAIL_FINISH("Build time is more than 10 days old");
+ }
+ }
+ }
+ CYG_TEST_FINISH("sntp1 test is complete");
+}
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL*2)
+static char thread_stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+void
+cyg_user_start(void)
+{
+ // Create a main thread, so we can run the scheduler and have time 'pass'
+ cyg_thread_create(10, // Priority - just a number
+ net_test, // entry
+ 0, // entry parameter
+ "Network test", // Name
+ thread_stack, // Stack
+ STACK_SIZE, // Size
+ &thread_handle, // Handle
+ &thread_data // Thread data structure
+ );
+ cyg_thread_resume(thread_handle); // Start it
+}
--- /dev/null Fri Oct 11 13:37:09 2002
+++ packages/net/sntp/current/doc/sntp.sgml Mon Feb 17 12:00:47 2003
@@ -0,0 +1,100 @@
+<PART ID="net-sntp">
+<TITLE>Simple Network Time Protocol Client</TITLE>
+<PARTINTRO>
+<PARA>
+The SNTP package provides implementation of a client for RFC 2030, the
+Simple Network Time Protocol (SNTP). The client listens for broadcasts
+from an NTP server and uses the information received to set the system
+clock.
+</PARA>
+</PARTINTRO>
+<CHAPTER id="sntp-the">
+<TITLE>The SNTP Client</TITLE>
+<SECT1 id="sntp-starting">
+<TITLE>Starting the SNTP client</TITLE>
+<para>
+The sntp client is implemented as a thread which listens for NTP
+broadcasts. This thread is not automatically start by the
+system. Instead it must be started by the user application. The header
+file <filename>cyg/sntp/sntp.h</filename> declares the function to be
+called. The thread is then started by calling the function:
+</para>
+<programlisting>
+void cyg_sntp_start(void);
+</programlisting>
+<para>
+
+Once started, the thread will run forever.
+</sect1>
+
+<sect1 id="net-sntp-operation">
+<title>What it does</title>
+<para>
+The SNTP client listens for NTP broadcasts from any NTP servers. Such
+broadcasts contain a timestamp indicating the current time. The packet
+also contains information about where the server is in the hierarchy
+of time servers. A server at the root of the time server tree normally
+has an atomic clock. Such a server is said to be at stratum 0. A time
+server which is synchronised to a stratum 0 server is said to be at
+stratum 1 etc. The client will accept any NTP broadcast packets from
+servers using version 3 or 4 of the protocol. When receiving packets
+from multiple servers, it will use the packets from the server with
+the lowest stratum. However, if there are no packets from this server
+for 10 minute and another server is broadcasting, the client will
+change server.
+</para>
+<para>
+The system clock in eCos is accurate to 1 second. The SNTP client will
+change the system clock when the time difference with the received
+timestamp is greater than 2 seconds. The change is made as a step.
+</para>
+</sect1>
+
+<sect1 id="net-sntp-warning">
+<title>Warning: timestamp wrap around</title>
+<para>
+The timestamp in the NTP packet is a 32bit integer which represents
+the number of seconds after 00:00 01/01/1900. This 32bit number will
+wrap around at 06:28:16 Feb 7 2036. At this point in time, the eCos
+time will jump back to around 00:00:00 Jan 1 1900 when the next
+broadcast is received.
+</para>
+<para>
+YOU HAVE BEEN WARNED!
+</para>
+</SECT1>
+<sect1 id="net-sntp-testing">
+<title>The SNTP test program</title>
+<para>
+The SNTP package contains a simple test program. Testing an SNTP
+client is not easy, so the test program should be considered as more a
+proof of concept. It shows that a broadcast packet has been received,
+at is accurate to within a few days.
+</para>
+<para>
+The test program starts the network interfaces using the standard
+call. It then starts the SNTP thread. A loop is then entered printing
+the current system time every second for two minutes. When the client
+receives a broadcast the time will jump from 1970 to hopefully the
+present day. Once the two minutes have expired, two simple tests are
+made. If the time is still less than 5 minutes since 00:00:00
+01/01/1970 the test fails. This indicates no broadcast messages have
+been received. Check that the server is actually broadcasting, using
+the correct port (123), and at a sufficiently frequent rate that the
+target has a chance to receive a message within the 2 minute
+interval. If all this is correct, assume the target is broken.
+</para>
+<para>
+The second test is that the current system time is compared with the
+build time as reported by the CPP macro __DATE__. If the build date is
+in the future relative to the system time, the test fails. If the
+build date is more than 10 days in the past relative to the system
+time the test also fails. If such failures are seen, use walk-clock
+time to verify the time printed during the test. If this seems correct
+check the build date for the test. This is printed at startup. If all
+else fails check that the computer used to build the test has the
+correct time.
+</para>
+</SECT1>
+</CHAPTER>
+</PART>
\ No newline at end of file
----- End forwarded message -----