[rtems commit] NTP: Sync time correctly when receiving broadcast updates

Gedare Bloom gedare at rtems.org
Thu Jan 9 14:49:07 UTC 2014


Module:    rtems
Branch:    master
Commit:    2b03a62441d63d056dbbd6de17429ae05e4dfd04
Changeset: http://git.rtems.org/rtems/commit/?id=2b03a62441d63d056dbbd6de17429ae05e4dfd04

Author:    Jim Panetta <panetta at slac.stanford.edu>
Date:      Fri Nov  1 09:59:41 2013 -0400

NTP: Sync time correctly when receiving broadcast updates

1) The value of rtems_bsdnet_ntpserver_count is equal to 0 when no
   server is set, so the check for (rtems_bsdnet_ntpserver_count < 0)
   in rtems_bsdnet_get_ntp() is wrong.  The check should be "<= 0".

2) Binding the listening socket port to 0 does not work.  Packets
   appear on the interface, but the recvfrom in tryServer() never
   returns.  Changing this to the well known NTP socket 123 allows
   the packets to be seen.

3) In tryServer(), an explicit check for NTP version 3 packets is made.
   If the NTP server is version 4, this check fails even though the
   packets seem to be the right shape.

---

 cpukit/libnetworking/lib/rtems_bsdnet_ntp.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c b/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c
index 4f991ff..35092ea 100644
--- a/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c
+++ b/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c
@@ -140,7 +140,8 @@ tryServer (int i, int s, rtems_bsdnet_ntp_callback_t callback, void *usr_data)
 	}
 
 	if ( i >= sizeof packet &&
-		((packet.li_vn_mode & (0x7 << 3)) == (3 << 3)) &&
+    (((packet.li_vn_mode & (0x7 << 3)) == (3 << 3)) ||
+     ((packet.li_vn_mode & (0x7 << 3)) == (4 << 3))) &&
 	    ((packet.transmit_timestamp.integer != 0) || (packet.transmit_timestamp.fraction != 0)) &&
 		0 == callback( &packet, 0 , usr_data) )
 		return 0;
@@ -174,7 +175,7 @@ int ret;
 	}
 	memset (&myAddr, 0, sizeof myAddr);
 	myAddr.sin_family = AF_INET;
-	myAddr.sin_port = htons (0);
+	myAddr.sin_port = htons (123);
 	myAddr.sin_addr.s_addr = htonl (INADDR_ANY);
 	if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0) {
 		fprintf (stderr, "rtems_bsdnet_get_ntp() Can't bind socket: %s\n", strerror (errno));
@@ -190,7 +191,7 @@ int ret;
 		 * and hope that there's an NTP broadcast
 		 * server out there somewhere.
 		 */
-		if (rtems_bsdnet_ntpserver_count < 0) {
+		if (rtems_bsdnet_ntpserver_count <= 0) {
 			ret = tryServer (-1, sock, callback, usr_data);
 		}
 		else {




More information about the vc mailing list