summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Panetta <panetta@slac.stanford.edu>2013-11-01 09:59:41 -0400
committerGedare Bloom <gedare@rtems.org>2014-01-09 09:56:03 -0500
commit2b03a62441d63d056dbbd6de17429ae05e4dfd04 (patch)
tree69884909942a4ef6332c901d72f68a6492d0e50e
parentPR 1548: ERC32 console stops working when UART error flags are set (diff)
downloadrtems-2b03a62441d63d056dbbd6de17429ae05e4dfd04.tar.bz2
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.
-rw-r--r--cpukit/libnetworking/lib/rtems_bsdnet_ntp.c7
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 4f991ff5b8..35092ea631 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 {