@@ -113,6 +113,9 @@ void menuNTP()
113
113
systemPrint (" 5) Reference ID: " );
114
114
systemPrintln (settings.ntpReferenceId );
115
115
116
+ systemPrint (" 6) NTP Port: " );
117
+ systemPrintln (settings.ethernetNtpPort );
118
+
116
119
systemPrintln (" x) Exit" );
117
120
118
121
byte incoming = getUserInputCharacterNumber ();
@@ -168,6 +171,15 @@ void menuNTP()
168
171
else
169
172
systemPrintln (" Error: invalid Reference ID" );
170
173
}
174
+ else if (incoming == 6 )
175
+ {
176
+ systemPrint (" Enter new NTP port: " );
177
+ long newVal = getUserInputNumber ();
178
+ if ((newVal >= 0 ) && (newVal <= 65535 ))
179
+ settings.ethernetNtpPort = newVal;
180
+ else
181
+ systemPrintln (" Error: port number out of range" );
182
+ }
171
183
else if (incoming == ' x' )
172
184
break ;
173
185
else if (incoming == INPUT_RESPONSE_GETCHARACTERNUMBER_EMPTY)
@@ -484,15 +496,14 @@ bool ntpProcessOneRequest(bool process, const timeval *recTv, const timeval *syn
484
496
if (ntpDiag != nullptr )
485
497
*ntpDiag = 0 ; // Clear any existing diagnostics
486
498
487
- gettimeofday ((timeval *)ðernetNtpTv, nullptr ); // Record the possible time of the NTP request
488
-
489
- int packetDataSize = 0 ;
499
+ ntpServer->parsePacket ();
490
500
491
- if (ntpServer->available () > 0 )
492
- packetDataSize = ntpServer->parsePacket ();
501
+ int packetDataSize = ntpServer->available ();
493
502
494
- if (packetDataSize >= NTPpacket::NTPpacketSize )
503
+ if (packetDataSize > 0 )
495
504
{
505
+ gettimeofday ((timeval *)ðernetNtpTv, nullptr ); // Record the possible time of the NTP request
506
+
496
507
IPAddress remoteIP = ntpServer->remoteIP ();
497
508
uint16_t remotePort = ntpServer->remotePort ();
498
509
@@ -502,149 +513,161 @@ bool ntpProcessOneRequest(bool process, const timeval *recTv, const timeval *syn
502
513
remoteIP[1 ], remoteIP[2 ], remoteIP[3 ], remotePort);
503
514
}
504
515
505
- // Read the NTP packet
506
- NTPpacket packet;
516
+ if (packetDataSize >= NTPpacket::NTPpacketSize)
517
+ {
518
+ // Read the NTP packet
519
+ NTPpacket packet;
507
520
508
- ntpServer->read ((char *)&packet.packet , NTPpacket::NTPpacketSize); // Copy the NTP data into our packet
521
+ ntpServer->read ((char *)&packet.packet , NTPpacket::NTPpacketSize); // Copy the NTP data into our packet
509
522
510
- // If process is false, return now
511
- if (!process)
512
- {
513
- char tmpbuf[128 ];
514
- snprintf (tmpbuf, sizeof (tmpbuf),
515
- " NTP request ignored. Time has not been synchronized - or not in NTP mode.\r\n " );
516
- strlcat (ntpDiag, tmpbuf, ntpDiagSize);
517
- return false ;
518
- }
523
+ // If process is false, return now
524
+ if (!process)
525
+ {
526
+ char tmpbuf[128 ];
527
+ snprintf (tmpbuf, sizeof (tmpbuf),
528
+ " NTP request ignored. Time has not been synchronized - or not in NTP mode.\r\n " );
529
+ strlcat (ntpDiag, tmpbuf, ntpDiagSize);
530
+ return false ;
531
+ }
519
532
520
- packet.extract (); // Extract the raw data into fields
521
-
522
- packet.LI (packet.defaultLeapInd ); // Clear the leap second adjustment. TODO: set this correctly using
523
- // getLeapSecondEvent from the GNSS
524
- packet.VN (packet.defaultVersion ); // Set the version number
525
- packet.mode (packet.defaultMode ); // Set the mode
526
- packet.stratum = packet.defaultStratum ; // Set the stratum
527
- packet.pollExponent = settings.ntpPollExponent ; // Set the poll interval
528
- packet.precision = settings.ntpPrecision ; // Set the precision
529
- packet.rootDelay = packet.convertMicrosToSecsAndFraction (settings.ntpRootDelay ); // Set the Root Delay
530
- packet.rootDispersion =
531
- packet.convertMicrosToSecsAndFraction (settings.ntpRootDispersion ); // Set the Root Dispersion
532
- for (uint8_t i = 0 ; i < packet.referenceIdLen ; i++)
533
- packet.referenceId [i] = settings.ntpReferenceId [i]; // Set the reference Id
534
-
535
- // REF: http://support.ntp.org/bin/view/Support/DraftRfc2030
536
- // '.. the client sets the Transmit Timestamp field in the request
537
- // to the time of day according to the client clock in NTP timestamp format.'
538
- // '.. The server copies this field to the originate timestamp in the reply and
539
- // sets the Receive Timestamp and Transmit Timestamp fields to the time of day
540
- // according to the server clock in NTP timestamp format.'
541
-
542
- // Important note: the NTP Era started January 1st 1900.
543
- // tv will contain the time based on the Unix epoch (January 1st 1970)
544
- // We need to adjust...
545
-
546
- // First, add the client transmit timestamp to our diagnostics
547
- if (ntpDiag != nullptr )
548
- {
549
- char tmpbuf[128 ];
550
- snprintf (tmpbuf, sizeof (tmpbuf), " Originate Timestamp (Client Transmit): %u.%06u\r\n " ,
551
- packet.transmitTimestampSeconds , packet.convertFractionToMicros (packet.transmitTimestampFraction ));
552
- strlcat (ntpDiag, tmpbuf, ntpDiagSize);
553
- }
533
+ packet.extract (); // Extract the raw data into fields
534
+
535
+ packet.LI (packet.defaultLeapInd ); // Clear the leap second adjustment. TODO: set this correctly using
536
+ // getLeapSecondEvent from the GNSS
537
+ packet.VN (packet.defaultVersion ); // Set the version number
538
+ packet.mode (packet.defaultMode ); // Set the mode
539
+ packet.stratum = packet.defaultStratum ; // Set the stratum
540
+ packet.pollExponent = settings.ntpPollExponent ; // Set the poll interval
541
+ packet.precision = settings.ntpPrecision ; // Set the precision
542
+ packet.rootDelay = packet.convertMicrosToSecsAndFraction (settings.ntpRootDelay ); // Set the Root Delay
543
+ packet.rootDispersion =
544
+ packet.convertMicrosToSecsAndFraction (settings.ntpRootDispersion ); // Set the Root Dispersion
545
+ for (uint8_t i = 0 ; i < packet.referenceIdLen ; i++)
546
+ packet.referenceId [i] = settings.ntpReferenceId [i]; // Set the reference Id
547
+
548
+ // REF: http://support.ntp.org/bin/view/Support/DraftRfc2030
549
+ // '.. the client sets the Transmit Timestamp field in the request
550
+ // to the time of day according to the client clock in NTP timestamp format.'
551
+ // '.. The server copies this field to the originate timestamp in the reply and
552
+ // sets the Receive Timestamp and Transmit Timestamp fields to the time of day
553
+ // according to the server clock in NTP timestamp format.'
554
+
555
+ // Important note: the NTP Era started January 1st 1900.
556
+ // tv will contain the time based on the Unix epoch (January 1st 1970)
557
+ // We need to adjust...
558
+
559
+ // First, add the client transmit timestamp to our diagnostics
560
+ if (ntpDiag != nullptr )
561
+ {
562
+ char tmpbuf[128 ];
563
+ snprintf (tmpbuf, sizeof (tmpbuf), " Originate Timestamp (Client Transmit): %u.%06u\r\n " ,
564
+ packet.transmitTimestampSeconds , packet.convertFractionToMicros (packet.transmitTimestampFraction ));
565
+ strlcat (ntpDiag, tmpbuf, ntpDiagSize);
566
+ }
554
567
555
- // Copy the client transmit timestamp into the originate timestamp
556
- packet.originateTimestampSeconds = packet.transmitTimestampSeconds ;
557
- packet.originateTimestampFraction = packet.transmitTimestampFraction ;
568
+ // Copy the client transmit timestamp into the originate timestamp
569
+ packet.originateTimestampSeconds = packet.transmitTimestampSeconds ;
570
+ packet.originateTimestampFraction = packet.transmitTimestampFraction ;
558
571
559
- // Set the receive timestamp to the time we received the packet (logged by the W5500 interrupt)
560
- uint32_t recUnixSeconds = recTv->tv_sec ;
561
- recUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
562
- recUnixSeconds -= settings.timeZoneMinutes * 60 ;
563
- recUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
564
- packet.receiveTimestampSeconds = packet.convertUnixSecondsToNTP (recUnixSeconds); // Unix -> NTP
565
- packet.receiveTimestampFraction = packet.convertMicrosToFraction (recTv->tv_usec ); // Micros to 1/2^32
572
+ // Set the receive timestamp to the time we received the packet (logged by the W5500 interrupt)
573
+ uint32_t recUnixSeconds = recTv->tv_sec ;
574
+ recUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
575
+ recUnixSeconds -= settings.timeZoneMinutes * 60 ;
576
+ recUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
577
+ packet.receiveTimestampSeconds = packet.convertUnixSecondsToNTP (recUnixSeconds); // Unix -> NTP
578
+ packet.receiveTimestampFraction = packet.convertMicrosToFraction (recTv->tv_usec ); // Micros to 1/2^32
566
579
567
- // Add the receive timestamp to the diagnostics
568
- if (ntpDiag != nullptr )
569
- {
570
- char tmpbuf[128 ];
571
- snprintf (tmpbuf, sizeof (tmpbuf), " Received Timestamp: %u.%06u\r\n " ,
572
- packet.receiveTimestampSeconds , packet.convertFractionToMicros (packet.receiveTimestampFraction ));
573
- strlcat (ntpDiag, tmpbuf, ntpDiagSize);
574
- }
580
+ // Add the receive timestamp to the diagnostics
581
+ if (ntpDiag != nullptr )
582
+ {
583
+ char tmpbuf[128 ];
584
+ snprintf (tmpbuf, sizeof (tmpbuf), " Received Timestamp: %u.%06u\r\n " ,
585
+ packet.receiveTimestampSeconds , packet.convertFractionToMicros (packet.receiveTimestampFraction ));
586
+ strlcat (ntpDiag, tmpbuf, ntpDiagSize);
587
+ }
575
588
576
- // Add when our clock was last sync'd
577
- uint32_t syncUnixSeconds = syncTv->tv_sec ;
578
- syncUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
579
- syncUnixSeconds -= settings.timeZoneMinutes * 60 ;
580
- syncUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
581
- packet.referenceTimestampSeconds = packet.convertUnixSecondsToNTP (syncUnixSeconds); // Unix -> NTP
582
- packet.referenceTimestampFraction = packet.convertMicrosToFraction (syncTv->tv_usec ); // Micros to 1/2^32
589
+ // Add when our clock was last sync'd
590
+ uint32_t syncUnixSeconds = syncTv->tv_sec ;
591
+ syncUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
592
+ syncUnixSeconds -= settings.timeZoneMinutes * 60 ;
593
+ syncUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
594
+ packet.referenceTimestampSeconds = packet.convertUnixSecondsToNTP (syncUnixSeconds); // Unix -> NTP
595
+ packet.referenceTimestampFraction = packet.convertMicrosToFraction (syncTv->tv_usec ); // Micros to 1/2^32
583
596
584
- // Add that to the diagnostics
585
- if (ntpDiag != nullptr )
586
- {
597
+ // Add that to the diagnostics
598
+ if (ntpDiag != nullptr )
599
+ {
600
+ char tmpbuf[128 ];
601
+ snprintf (tmpbuf, sizeof (tmpbuf), " Reference Timestamp (Last Sync): %u.%06u\r\n " ,
602
+ packet.referenceTimestampSeconds ,
603
+ packet.convertFractionToMicros (packet.referenceTimestampFraction ));
604
+ strlcat (ntpDiag, tmpbuf, ntpDiagSize);
605
+ }
606
+
607
+ // Add the transmit time - i.e. now!
608
+ timeval txTime;
609
+ gettimeofday (&txTime, nullptr );
610
+ uint32_t nowUnixSeconds = txTime.tv_sec ;
611
+ nowUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
612
+ nowUnixSeconds -= settings.timeZoneMinutes * 60 ;
613
+ nowUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
614
+ packet.transmitTimestampSeconds = packet.convertUnixSecondsToNTP (nowUnixSeconds); // Unix -> NTP
615
+ packet.transmitTimestampFraction = packet.convertMicrosToFraction (txTime.tv_usec ); // Micros to 1/2^32
616
+
617
+ packet.insert (); // Copy the data fields back into the buffer
618
+
619
+ // Now transmit the response to the client.
620
+ ntpServer->beginPacket (remoteIP, remotePort);
621
+ ntpServer->write (packet.packet , NTPpacket::NTPpacketSize);
622
+ int result = ntpServer->endPacket ();
623
+ processed = true ;
624
+
625
+ // Add our server transmit time to the diagnostics
626
+ if (ntpDiag != nullptr )
627
+ {
628
+ char tmpbuf[128 ];
629
+ snprintf (tmpbuf, sizeof (tmpbuf), " Transmit Timestamp: %u.%06u\r\n " ,
630
+ packet.transmitTimestampSeconds , packet.convertFractionToMicros (packet.transmitTimestampFraction ));
631
+ strlcat (ntpDiag, tmpbuf, ntpDiagSize);
632
+ }
633
+
634
+ /*
635
+ // Add the socketSendUDP result to the diagnostics
636
+ if (ntpDiag != nullptr)
637
+ {
587
638
char tmpbuf[128];
588
- snprintf (tmpbuf, sizeof (tmpbuf), " Reference Timestamp (Last Sync): %u.%06u\r\n " ,
589
- packet.referenceTimestampSeconds ,
590
- packet.convertFractionToMicros (packet.referenceTimestampFraction ));
639
+ snprintf(tmpbuf, sizeof(tmpbuf), "socketSendUDP result: %d\r\n", result);
591
640
strlcat(ntpDiag, tmpbuf, ntpDiagSize);
592
- }
641
+ }
642
+ */
593
643
594
- // Add the transmit time - i.e. now!
595
- timeval txTime;
596
- gettimeofday (&txTime, nullptr );
597
- uint32_t nowUnixSeconds = txTime.tv_sec ;
598
- nowUnixSeconds -= settings.timeZoneSeconds ; // Subtract the time zone offset to convert recTv to Unix time
599
- nowUnixSeconds -= settings.timeZoneMinutes * 60 ;
600
- nowUnixSeconds -= settings.timeZoneHours * 60 * 60 ;
601
- packet.transmitTimestampSeconds = packet.convertUnixSecondsToNTP (nowUnixSeconds); // Unix -> NTP
602
- packet.transmitTimestampFraction = packet.convertMicrosToFraction (txTime.tv_usec ); // Micros to 1/2^32
603
-
604
- packet.insert (); // Copy the data fields back into the buffer
605
-
606
- // Now transmit the response to the client.
607
- ntpServer->beginPacket (remoteIP, remotePort);
608
- ntpServer->write (packet.packet , NTPpacket::NTPpacketSize);
609
- // int result = ntpServer->endPacket();
610
- processed = true ;
611
-
612
- // Add our server transmit time to the diagnostics
613
- if (ntpDiag != nullptr )
614
- {
644
+ /*
645
+ // Add the packet to the diagnostics
646
+ if (ntpDiag != nullptr)
647
+ {
615
648
char tmpbuf[128];
616
- snprintf (tmpbuf, sizeof (tmpbuf), " Transmit Timestamp: %u.%06u\r\n " ,
617
- packet.transmitTimestampSeconds , packet.convertFractionToMicros (packet.transmitTimestampFraction ));
649
+ snprintf(tmpbuf, sizeof(tmpbuf), "Packet: ");
618
650
strlcat(ntpDiag, tmpbuf, ntpDiagSize);
651
+ for (int i = 0; i < NTPpacket::NTPpacketSize; i++)
652
+ {
653
+ snprintf(tmpbuf, sizeof(tmpbuf), "%02X ", packet.packet[i]);
654
+ strlcat(ntpDiag, tmpbuf, ntpDiagSize);
655
+ }
656
+ snprintf(tmpbuf, sizeof(tmpbuf), "\r\n");
657
+ strlcat(ntpDiag, tmpbuf, ntpDiagSize);
658
+ }
659
+ */
619
660
}
620
-
621
- /*
622
- // Add the socketSendUDP result to the diagnostics
623
- if (ntpDiag != nullptr)
624
- {
625
- char tmpbuf[128];
626
- snprintf(tmpbuf, sizeof(tmpbuf), "socketSendUDP result: %d\r\n", result);
627
- strlcat(ntpDiag, tmpbuf, ntpDiagSize);
628
- }
629
- */
630
-
631
- /*
632
- // Add the packet to the diagnostics
633
- if (ntpDiag != nullptr)
634
- {
635
- char tmpbuf[128];
636
- snprintf(tmpbuf, sizeof(tmpbuf), "Packet: ");
637
- strlcat(ntpDiag, tmpbuf, ntpDiagSize);
638
- for (int i = 0; i < NTPpacket::NTPpacketSize; i++)
639
- {
640
- snprintf(tmpbuf, sizeof(tmpbuf), "%02X ", packet.packet[i]);
661
+ else
662
+ {
663
+ char tmpbuf[64 ];
664
+ snprintf (tmpbuf, sizeof (tmpbuf), " Invalid size: %d\r\n " , packetDataSize);
641
665
strlcat (ntpDiag, tmpbuf, ntpDiagSize);
642
- }
643
- snprintf(tmpbuf, sizeof(tmpbuf), "\r\n");
644
- strlcat(ntpDiag, tmpbuf, ntpDiagSize);
645
- }
646
- */
666
+ }
647
667
}
668
+
669
+ ntpServer->clear ();
670
+
648
671
return processed;
649
672
}
650
673
@@ -872,15 +895,16 @@ void ntpServerUpdate()
872
895
// Check for new NTP requests - if the time has been sync'd
873
896
bool processed = ntpProcessOneRequest (systemState == STATE_NTPSERVER_SYNC, (const timeval *)ðernetNtpTv,
874
897
(const timeval *)&gnssSyncTv, ntpDiag, sizeof (ntpDiag));
875
- if (processed)
898
+
899
+ // Print the diagnostics - if enabled
900
+ if ((settings.debugNtp || PERIODIC_DISPLAY (PD_NTP_SERVER_DATA)) && (strlen (ntpDiag) > 0 ) && (!inMainMenu))
876
901
{
877
- // Print the diagnostics - if enabled
878
- if ((settings.debugNtp || PERIODIC_DISPLAY (PD_NTP_SERVER_DATA)) && (!inMainMenu))
879
- {
880
- PERIODIC_CLEAR (PD_NTP_SERVER_DATA);
881
- systemPrint (ntpDiag);
882
- }
902
+ PERIODIC_CLEAR (PD_NTP_SERVER_DATA);
903
+ systemPrint (ntpDiag);
904
+ }
883
905
906
+ if (processed)
907
+ {
884
908
// Log the NTP request to file - if enabled
885
909
if (settings.enableNTPFile )
886
910
{
0 commit comments