Changeset 126405d9 in rtems


Ignore:
Timestamp:
Apr 24, 2001, 9:02:03 PM (19 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
b2a1ea3
Parents:
f077f332
Message:

2000-04-24 Eric Norum <eric.norum@…>

  • lib/rtems_bsdnet_ntp.c: Modifications to make the RTEMS NTP synchronization a little more robust -- no NTP daemon yet, but at least it trys a little harder when the primary NTP server is down.
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libnetworking/ChangeLog

    rf077f332 r126405d9  
     12000-04-24      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/rtems_bsdnet_ntp.c: Modifications to make the RTEMS NTP
     4        synchronization a little more robust -- no NTP daemon yet, but
     5        at least it trys a little harder when the primary NTP server is down.
     6
    172001-04-20  Radzislaw Galler  <rgaller@et.put.poznan.pl>
    28
  • c/src/exec/libnetworking/lib/rtems_bsdnet_ntp.c

    rf077f332 r126405d9  
    8686}
    8787
     88static int
     89tryServer (int i, int s)
     90{
     91        int l;
     92        struct timeval tv;
     93        int farlen;
     94        struct sockaddr_in farAddr;
     95        struct ntpPacketSmall packet;
     96
     97        if (i < 0)
     98                tv.tv_sec = 80;
     99        else
     100                tv.tv_sec = 5;
     101        tv.tv_usec = 0;
     102        if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
     103                printf ("Can't set socket receive timeout: %s\n", strerror (errno));
     104                close (s);
     105                return -1;
     106        }
     107        if (i >= 0) {
     108                memset (&farAddr, 0, sizeof farAddr);
     109                farAddr.sin_family = AF_INET;
     110                farAddr.sin_port = htons (123);
     111                farAddr.sin_addr = rtems_bsdnet_ntpserver[i];
     112                memset (&packet, 0, sizeof packet);
     113                packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
     114                l = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
     115                if (l != sizeof packet) {
     116                        printf ("Can't send: %s\n", strerror (errno));
     117                        return -1;
     118                }
     119        }
     120        farlen = sizeof farAddr;
     121        i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &farlen);
     122        if (i == 0)
     123                printf ("Unexpected EOF");
     124        if (i < 0) {
     125                if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
     126                        return -1;
     127                printf ("Can't receive: %s\n", strerror (errno));
     128        }
     129        if ((i >= sizeof packet) && processPacket (&packet))
     130                return 0;
     131        return -1;
     132}
     133
    88134int
    89135rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority)
     
    91137        int s;
    92138        int i;
    93         static struct sockaddr_in myAddr, farAddr;
    94         int fromlen;
    95         struct ntpPacketSmall packet;
    96         struct timeval tv;
     139        int retry;
     140        struct sockaddr_in myAddr;
     141        int reuseFlag;
     142        int ret;
    97143
    98144        if (interval != 0) {
     
    106152                return -1;
    107153        }
    108         tv.tv_sec = 5;
    109         tv.tv_usec = 0;
    110         if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
    111                 printf ("Can't set socket receive timeout: %s", strerror (errno));
     154        reuseFlag = 1;
     155        if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuseFlag, sizeof reuseFlag) < 0) {
     156                printf ("Can't set socket reuse: %s\n", strerror (errno));
     157                close (s);
    112158                return -1;
    113159        }
     
    118164        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0) {
    119165                printf ("Can't bind socket: %s\n", strerror (errno));
     166                close (s);
    120167                return -1;
    121168        }
    122         for (;;) {
     169        ret = -1;
     170        for (retry = 0 ; (ret == -1) && (retry < 5) ; retry++) {
    123171                /*
    124172                 * If there's no server we just have to wait
     
    126174                 * server out there somewhere.
    127175                 */
    128                 if (rtems_bsdnet_ntpserver_count > 0) {
    129                         memset (&farAddr, 0, sizeof farAddr);
    130                         farAddr.sin_family = AF_INET;
    131                         farAddr.sin_port = htons (123);
    132                         /*
    133                          * For now, try only the first server.
    134                          */
    135                         farAddr.sin_addr = rtems_bsdnet_ntpserver[0];
    136                         memset (&packet, 0, sizeof packet);
    137                         packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
    138                         i = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
    139                         if (i != sizeof packet) {
    140                                 printf ("Can't send: %s\n", strerror (errno));
    141                                 return -1;
     176                if (rtems_bsdnet_ntpserver_count < 0) {
     177                        ret = tryServer (-1, s);
     178                }
     179                else {
     180                        for (i = 0 ; (ret == -1) && (i < rtems_bsdnet_ntpserver_count) ; i++) {
     181                                ret = tryServer (i, s);
    142182                        }
    143183                }
    144                 fromlen = sizeof farAddr;
    145                 i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &fromlen);
    146                 if (i == 0)
    147                         rtems_panic ("EOF");
    148                 if (i < 0) {
    149                         if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
    150                                 continue;
    151                         rtems_panic ("Can't receive: %s", strerror (errno));
    152                 }
    153                 if (i >= sizeof packet) {
    154                         if (processPacket (&packet))
    155                                 return 0;
    156                 }
    157184        }
     185        close (s);
     186        return ret;
    158187}
  • c/src/libnetworking/ChangeLog

    rf077f332 r126405d9  
     12000-04-24      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/rtems_bsdnet_ntp.c: Modifications to make the RTEMS NTP
     4        synchronization a little more robust -- no NTP daemon yet, but
     5        at least it trys a little harder when the primary NTP server is down.
     6
    172001-04-20  Radzislaw Galler  <rgaller@et.put.poznan.pl>
    28
  • c/src/libnetworking/lib/rtems_bsdnet_ntp.c

    rf077f332 r126405d9  
    8686}
    8787
     88static int
     89tryServer (int i, int s)
     90{
     91        int l;
     92        struct timeval tv;
     93        int farlen;
     94        struct sockaddr_in farAddr;
     95        struct ntpPacketSmall packet;
     96
     97        if (i < 0)
     98                tv.tv_sec = 80;
     99        else
     100                tv.tv_sec = 5;
     101        tv.tv_usec = 0;
     102        if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
     103                printf ("Can't set socket receive timeout: %s\n", strerror (errno));
     104                close (s);
     105                return -1;
     106        }
     107        if (i >= 0) {
     108                memset (&farAddr, 0, sizeof farAddr);
     109                farAddr.sin_family = AF_INET;
     110                farAddr.sin_port = htons (123);
     111                farAddr.sin_addr = rtems_bsdnet_ntpserver[i];
     112                memset (&packet, 0, sizeof packet);
     113                packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
     114                l = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
     115                if (l != sizeof packet) {
     116                        printf ("Can't send: %s\n", strerror (errno));
     117                        return -1;
     118                }
     119        }
     120        farlen = sizeof farAddr;
     121        i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &farlen);
     122        if (i == 0)
     123                printf ("Unexpected EOF");
     124        if (i < 0) {
     125                if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
     126                        return -1;
     127                printf ("Can't receive: %s\n", strerror (errno));
     128        }
     129        if ((i >= sizeof packet) && processPacket (&packet))
     130                return 0;
     131        return -1;
     132}
     133
    88134int
    89135rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority)
     
    91137        int s;
    92138        int i;
    93         static struct sockaddr_in myAddr, farAddr;
    94         int fromlen;
    95         struct ntpPacketSmall packet;
    96         struct timeval tv;
     139        int retry;
     140        struct sockaddr_in myAddr;
     141        int reuseFlag;
     142        int ret;
    97143
    98144        if (interval != 0) {
     
    106152                return -1;
    107153        }
    108         tv.tv_sec = 5;
    109         tv.tv_usec = 0;
    110         if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
    111                 printf ("Can't set socket receive timeout: %s", strerror (errno));
     154        reuseFlag = 1;
     155        if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuseFlag, sizeof reuseFlag) < 0) {
     156                printf ("Can't set socket reuse: %s\n", strerror (errno));
     157                close (s);
    112158                return -1;
    113159        }
     
    118164        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0) {
    119165                printf ("Can't bind socket: %s\n", strerror (errno));
     166                close (s);
    120167                return -1;
    121168        }
    122         for (;;) {
     169        ret = -1;
     170        for (retry = 0 ; (ret == -1) && (retry < 5) ; retry++) {
    123171                /*
    124172                 * If there's no server we just have to wait
     
    126174                 * server out there somewhere.
    127175                 */
    128                 if (rtems_bsdnet_ntpserver_count > 0) {
    129                         memset (&farAddr, 0, sizeof farAddr);
    130                         farAddr.sin_family = AF_INET;
    131                         farAddr.sin_port = htons (123);
    132                         /*
    133                          * For now, try only the first server.
    134                          */
    135                         farAddr.sin_addr = rtems_bsdnet_ntpserver[0];
    136                         memset (&packet, 0, sizeof packet);
    137                         packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
    138                         i = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
    139                         if (i != sizeof packet) {
    140                                 printf ("Can't send: %s\n", strerror (errno));
    141                                 return -1;
     176                if (rtems_bsdnet_ntpserver_count < 0) {
     177                        ret = tryServer (-1, s);
     178                }
     179                else {
     180                        for (i = 0 ; (ret == -1) && (i < rtems_bsdnet_ntpserver_count) ; i++) {
     181                                ret = tryServer (i, s);
    142182                        }
    143183                }
    144                 fromlen = sizeof farAddr;
    145                 i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &fromlen);
    146                 if (i == 0)
    147                         rtems_panic ("EOF");
    148                 if (i < 0) {
    149                         if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
    150                                 continue;
    151                         rtems_panic ("Can't receive: %s", strerror (errno));
    152                 }
    153                 if (i >= sizeof packet) {
    154                         if (processPacket (&packet))
    155                                 return 0;
    156                 }
    157184        }
     185        close (s);
     186        return ret;
    158187}
  • cpukit/libnetworking/ChangeLog

    rf077f332 r126405d9  
     12000-04-24      Eric Norum <eric.norum@usask.ca>
     2
     3        * lib/rtems_bsdnet_ntp.c: Modifications to make the RTEMS NTP
     4        synchronization a little more robust -- no NTP daemon yet, but
     5        at least it trys a little harder when the primary NTP server is down.
     6
    172001-04-20  Radzislaw Galler  <rgaller@et.put.poznan.pl>
    28
  • cpukit/libnetworking/lib/rtems_bsdnet_ntp.c

    rf077f332 r126405d9  
    8686}
    8787
     88static int
     89tryServer (int i, int s)
     90{
     91        int l;
     92        struct timeval tv;
     93        int farlen;
     94        struct sockaddr_in farAddr;
     95        struct ntpPacketSmall packet;
     96
     97        if (i < 0)
     98                tv.tv_sec = 80;
     99        else
     100                tv.tv_sec = 5;
     101        tv.tv_usec = 0;
     102        if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
     103                printf ("Can't set socket receive timeout: %s\n", strerror (errno));
     104                close (s);
     105                return -1;
     106        }
     107        if (i >= 0) {
     108                memset (&farAddr, 0, sizeof farAddr);
     109                farAddr.sin_family = AF_INET;
     110                farAddr.sin_port = htons (123);
     111                farAddr.sin_addr = rtems_bsdnet_ntpserver[i];
     112                memset (&packet, 0, sizeof packet);
     113                packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
     114                l = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
     115                if (l != sizeof packet) {
     116                        printf ("Can't send: %s\n", strerror (errno));
     117                        return -1;
     118                }
     119        }
     120        farlen = sizeof farAddr;
     121        i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &farlen);
     122        if (i == 0)
     123                printf ("Unexpected EOF");
     124        if (i < 0) {
     125                if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
     126                        return -1;
     127                printf ("Can't receive: %s\n", strerror (errno));
     128        }
     129        if ((i >= sizeof packet) && processPacket (&packet))
     130                return 0;
     131        return -1;
     132}
     133
    88134int
    89135rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority)
     
    91137        int s;
    92138        int i;
    93         static struct sockaddr_in myAddr, farAddr;
    94         int fromlen;
    95         struct ntpPacketSmall packet;
    96         struct timeval tv;
     139        int retry;
     140        struct sockaddr_in myAddr;
     141        int reuseFlag;
     142        int ret;
    97143
    98144        if (interval != 0) {
     
    106152                return -1;
    107153        }
    108         tv.tv_sec = 5;
    109         tv.tv_usec = 0;
    110         if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
    111                 printf ("Can't set socket receive timeout: %s", strerror (errno));
     154        reuseFlag = 1;
     155        if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuseFlag, sizeof reuseFlag) < 0) {
     156                printf ("Can't set socket reuse: %s\n", strerror (errno));
     157                close (s);
    112158                return -1;
    113159        }
     
    118164        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0) {
    119165                printf ("Can't bind socket: %s\n", strerror (errno));
     166                close (s);
    120167                return -1;
    121168        }
    122         for (;;) {
     169        ret = -1;
     170        for (retry = 0 ; (ret == -1) && (retry < 5) ; retry++) {
    123171                /*
    124172                 * If there's no server we just have to wait
     
    126174                 * server out there somewhere.
    127175                 */
    128                 if (rtems_bsdnet_ntpserver_count > 0) {
    129                         memset (&farAddr, 0, sizeof farAddr);
    130                         farAddr.sin_family = AF_INET;
    131                         farAddr.sin_port = htons (123);
    132                         /*
    133                          * For now, try only the first server.
    134                          */
    135                         farAddr.sin_addr = rtems_bsdnet_ntpserver[0];
    136                         memset (&packet, 0, sizeof packet);
    137                         packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */
    138                         i = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr);
    139                         if (i != sizeof packet) {
    140                                 printf ("Can't send: %s\n", strerror (errno));
    141                                 return -1;
     176                if (rtems_bsdnet_ntpserver_count < 0) {
     177                        ret = tryServer (-1, s);
     178                }
     179                else {
     180                        for (i = 0 ; (ret == -1) && (i < rtems_bsdnet_ntpserver_count) ; i++) {
     181                                ret = tryServer (i, s);
    142182                        }
    143183                }
    144                 fromlen = sizeof farAddr;
    145                 i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &fromlen);
    146                 if (i == 0)
    147                         rtems_panic ("EOF");
    148                 if (i < 0) {
    149                         if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
    150                                 continue;
    151                         rtems_panic ("Can't receive: %s", strerror (errno));
    152                 }
    153                 if (i >= sizeof packet) {
    154                         if (processPacket (&packet))
    155                                 return 0;
    156                 }
    157184        }
     185        close (s);
     186        return ret;
    158187}
Note: See TracChangeset for help on using the changeset viewer.