[PATCH] NTP: Sync time correctly when receiving broadcast updates

Gedare Bloom gedare at rtems.org
Thu Jan 9 14:56:59 UTC 2014


http://git.rtems.org/rtems/commit/?id=2b03a62441d63d056dbbd6de17429ae05e4dfd04

On Fri, Nov 1, 2013 at 9:59 AM,  <gedare at rtems.org> wrote:
> From: Jim Panetta <panetta at slac.stanford.edu>
>
> 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 file 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 {
> --
> 1.7.9.5
>



More information about the devel mailing list