[PATCH rtems-lwip v1 8/8] rtemslwip: Add ntp01.exe test
Kinsey Moore
kinsey.moore at oarcorp.com
Tue Aug 23 19:47:41 UTC 2022
The bulk of this test was sourced from the same location as the content
of the sebhbsd directory with some significant modifications to make it
operate with rtems-lwip.
---
lwip.py | 7 +
rtemslwip/test/ntp01/test_main.c | 451 +++++++++++++++++++++++++++++++
2 files changed, 458 insertions(+)
create mode 100644 rtemslwip/test/ntp01/test_main.c
diff --git a/lwip.py b/lwip.py
index 2eccb0b..2b3aaf4 100644
--- a/lwip.py
+++ b/lwip.py
@@ -198,6 +198,13 @@ def build(bld):
cflags='-g -Wall -O0',
includes=drv_incl + common_includes + './rtemslwip/test/ ' + os.path.relpath(os.path.join(arch_lib_path,'include')))
+ bld.program(features='c',
+ target='ntp01.exe',
+ source='./rtemslwip/test/ntp01/test_main.c',
+ use='ntp m lwip rtemstest',
+ cflags='-g -Wall -O0',
+ includes=ntp_incl + drv_incl + bsd_compat_incl + common_includes + './rtemslwip/test/ ' + os.path.relpath(os.path.join(arch_lib_path,'include')))
+
def add_flags(flags, new_flags):
for flag in new_flags:
if flag not in flags:
diff --git a/rtemslwip/test/ntp01/test_main.c b/rtemslwip/test/ntp01/test_main.c
new file mode 100644
index 0000000..a585965
--- /dev/null
+++ b/rtemslwip/test/ntp01/test_main.c
@@ -0,0 +1,451 @@
+/**
+ * @file
+ *
+ * @brief Code used to test the NTP deamon.
+ */
+
+/*
+ * Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/stat.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include <rtems/console.h>
+#include <rtems/imfs.h>
+#include <rtems/ntpd.h>
+#include <rtems/shell.h>
+
+#include <lwip/dhcp.h>
+#include <arch/sys_arch.h>
+
+#include <tmacros.h>
+
+#include <netstart.h>
+#include <bsd_compat.h>
+
+const char rtems_test_name[] = "NTP 1";
+
+struct netif net_interface;
+
+static const char etc_resolv_conf[] =
+ "nameserver 8.8.8.8\n";
+
+static const char etc_ntp_conf[] =
+ "tos minclock 3 maxclock 6\n"
+ "pool 0.freebsd.pool.ntp.org iburst\n"
+ "restrict default limited kod nomodify notrap noquery nopeer\n"
+ "restrict source limited kod nomodify notrap noquery\n"
+ "restrict 10.0.0.0 mask 255.0.0.0\n"
+ "restrict 172.16.0.0 mask 255.240.0.0\n"
+ "restrict 192.168.0.0 mask 255.255.0.0\n"
+ "restrict 127.0.0.1\n"
+ "restrict ::1\n"
+ "leapfile \"/etc/leap-seconds\"\n";
+
+static const char etc_leap_seconds[] =
+ "#\n"
+ "# In the following text, the symbol '#' introduces\n"
+ "# a comment, which continues from that symbol until\n"
+ "# the end of the line. A plain comment line has a\n"
+ "# whitespace character following the comment indicator.\n"
+ "# There are also special comment lines defined below.\n"
+ "# A special comment will always have a non-whitespace\n"
+ "# character in column 2.\n"
+ "#\n"
+ "# A blank line should be ignored.\n"
+ "#\n"
+ "# The following table shows the corrections that must\n"
+ "# be applied to compute International Atomic Time (TAI)\n"
+ "# from the Coordinated Universal Time (UTC) values that\n"
+ "# are transmitted by almost all time services.\n"
+ "#\n"
+ "# The first column shows an epoch as a number of seconds\n"
+ "# since 1 January 1900, 00:00:00 (1900.0 is also used to\n"
+ "# indicate the same epoch.) Both of these time stamp formats\n"
+ "# ignore the complexities of the time scales that were\n"
+ "# used before the current definition of UTC at the start\n"
+ "# of 1972. (See note 3 below.)\n"
+ "# The second column shows the number of seconds that\n"
+ "# must be added to UTC to compute TAI for any timestamp\n"
+ "# at or after that epoch. The value on each line is\n"
+ "# valid from the indicated initial instant until the\n"
+ "# epoch given on the next one or indefinitely into the\n"
+ "# future if there is no next line.\n"
+ "# (The comment on each line shows the representation of\n"
+ "# the corresponding initial epoch in the usual\n"
+ "# day-month-year format. The epoch always begins at\n"
+ "# 00:00:00 UTC on the indicated day. See Note 5 below.)\n"
+ "#\n"
+ "# Important notes:\n"
+ "#\n"
+ "# 1. Coordinated Universal Time (UTC) is often referred to\n"
+ "# as Greenwich Mean Time (GMT). The GMT time scale is no\n"
+ "# longer used, and the use of GMT to designate UTC is\n"
+ "# discouraged.\n"
+ "#\n"
+ "# 2. The UTC time scale is realized by many national\n"
+ "# laboratories and timing centers. Each laboratory\n"
+ "# identifies its realization with its name: Thus\n"
+ "# UTC(NIST), UTC(USNO), etc. The differences among\n"
+ "# these different realizations are typically on the\n"
+ "# order of a few nanoseconds (i.e., 0.000 000 00x s)\n"
+ "# and can be ignored for many purposes. These differences\n"
+ "# are tabulated in Circular T, which is published monthly\n"
+ "# by the International Bureau of Weights and Measures\n"
+ "# (BIPM). See www.bipm.org for more information.\n"
+ "#\n"
+ "# 3. The current definition of the relationship between UTC\n"
+ "# and TAI dates from 1 January 1972. A number of different\n"
+ "# time scales were in use before that epoch, and it can be\n"
+ "# quite difficult to compute precise timestamps and time\n"
+ "# intervals in those \"prehistoric\" days. For more information,\n"
+ "# consult:\n"
+ "#\n"
+ "# The Explanatory Supplement to the Astronomical\n"
+ "# Ephemeris.\n"
+ "# or\n"
+ "# Terry Quinn, \"The BIPM and the Accurate Measurement\n"
+ "# of Time,\" Proc. of the IEEE, Vol. 79, pp. 894-905,\n"
+ "# July, 1991. <http://dx.doi.org/10.1109/5.84965>\n"
+ "# reprinted in:\n"
+ "# Christine Hackman and Donald B Sullivan (eds.)\n"
+ "# Time and Frequency Measurement\n"
+ "# American Association of Physics Teachers (1996)\n"
+ "# <http://tf.nist.gov/general/pdf/1168.pdf>, pp. 75-86\n"
+ "#\n"
+ "# 4. The decision to insert a leap second into UTC is currently\n"
+ "# the responsibility of the International Earth Rotation and\n"
+ "# Reference Systems Service. (The name was changed from the\n"
+ "# International Earth Rotation Service, but the acronym IERS\n"
+ "# is still used.)\n"
+ "#\n"
+ "# Leap seconds are announced by the IERS in its Bulletin C.\n"
+ "#\n"
+ "# See www.iers.org for more details.\n"
+ "#\n"
+ "# Every national laboratory and timing center uses the\n"
+ "# data from the BIPM and the IERS to construct UTC(lab),\n"
+ "# their local realization of UTC.\n"
+ "#\n"
+ "# Although the definition also includes the possibility\n"
+ "# of dropping seconds (\"negative\" leap seconds), this has\n"
+ "# never been done and is unlikely to be necessary in the\n"
+ "# foreseeable future.\n"
+ "#\n"
+ "# 5. If your system keeps time as the number of seconds since\n"
+ "# some epoch (e.g., NTP timestamps), then the algorithm for\n"
+ "# assigning a UTC time stamp to an event that happens during a positive\n"
+ "# leap second is not well defined. The official name of that leap\n"
+ "# second is 23:59:60, but there is no way of representing that time\n"
+ "# in these systems.\n"
+ "# Many systems of this type effectively stop the system clock for\n"
+ "# one second during the leap second and use a time that is equivalent\n"
+ "# to 23:59:59 UTC twice. For these systems, the corresponding TAI\n"
+ "# timestamp would be obtained by advancing to the next entry in the\n"
+ "# following table when the time equivalent to 23:59:59 UTC\n"
+ "# is used for the second time. Thus the leap second which\n"
+ "# occurred on 30 June 1972 at 23:59:59 UTC would have TAI\n"
+ "# timestamps computed as follows:\n"
+ "#\n"
+ "# ...\n"
+ "# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds\n"
+ "# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds\n"
+ "# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds\n"
+ "# ...\n"
+ "#\n"
+ "# If your system realizes the leap second by repeating 00:00:00 UTC twice\n"
+ "# (this is possible but not usual), then the advance to the next entry\n"
+ "# in the table must occur the second time that a time equivalent to\n"
+ "# 00:00:00 UTC is used. Thus, using the same example as above:\n"
+ "#\n"
+ "# ...\n"
+ "# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds\n"
+ "# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds\n"
+ "# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds\n"
+ "# ...\n"
+ "#\n"
+ "# in both cases the use of timestamps based on TAI produces a smooth\n"
+ "# time scale with no discontinuity in the time interval. However,\n"
+ "# although the long-term behavior of the time scale is correct in both\n"
+ "# methods, the second method is technically not correct because it adds\n"
+ "# the extra second to the wrong day.\n"
+ "#\n"
+ "# This complexity would not be needed for negative leap seconds (if they\n"
+ "# are ever used). The UTC time would skip 23:59:59 and advance from\n"
+ "# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by\n"
+ "# 1 second at the same instant. This is a much easier situation to deal\n"
+ "# with, since the difficulty of unambiguously representing the epoch\n"
+ "# during the leap second does not arise.\n"
+ "#\n"
+ "# Some systems implement leap seconds by amortizing the leap second\n"
+ "# over the last few minutes of the day. The frequency of the local\n"
+ "# clock is decreased (or increased) to realize the positive (or\n"
+ "# negative) leap second. This method removes the time step described\n"
+ "# above. Although the long-term behavior of the time scale is correct\n"
+ "# in this case, this method introduces an error during the adjustment\n"
+ "# period both in time and in frequency with respect to the official\n"
+ "# definition of UTC.\n"
+ "#\n"
+ "# Questions or comments to:\n"
+ "# Judah Levine\n"
+ "# Time and Frequency Division\n"
+ "# NIST\n"
+ "# Boulder, Colorado\n"
+ "# Judah.Levine at nist.gov\n"
+ "#\n"
+ "# Last Update of leap second values: 8 July 2016\n"
+ "#\n"
+ "# The following line shows this last update date in NTP timestamp\n"
+ "# format. This is the date on which the most recent change to\n"
+ "# the leap second data was added to the file. This line can\n"
+ "# be identified by the unique pair of characters in the first two\n"
+ "# columns as shown below.\n"
+ "#\n"
+ "#$ 3676924800\n"
+ "#\n"
+ "# The NTP timestamps are in units of seconds since the NTP epoch,\n"
+ "# which is 1 January 1900, 00:00:00. The Modified Julian Day number\n"
+ "# corresponding to the NTP time stamp, X, can be computed as\n"
+ "#\n"
+ "# X/86400 + 15020\n"
+ "#\n"
+ "# where the first term converts seconds to days and the second\n"
+ "# term adds the MJD corresponding to the time origin defined above.\n"
+ "# The integer portion of the result is the integer MJD for that\n"
+ "# day, and any remainder is the time of day, expressed as the\n"
+ "# fraction of the day since 0 hours UTC. The conversion from day\n"
+ "# fraction to seconds or to hours, minutes, and seconds may involve\n"
+ "# rounding or truncation, depending on the method used in the\n"
+ "# computation.\n"
+ "#\n"
+ "# The data in this file will be updated periodically as new leap\n"
+ "# seconds are announced. In addition to being entered on the line\n"
+ "# above, the update time (in NTP format) will be added to the basic\n"
+ "# file name leap-seconds to form the name leap-seconds.<NTP TIME>.\n"
+ "# In addition, the generic name leap-seconds.list will always point to\n"
+ "# the most recent version of the file.\n"
+ "#\n"
+ "# This update procedure will be performed only when a new leap second\n"
+ "# is announced.\n"
+ "#\n"
+ "# The following entry specifies the expiration date of the data\n"
+ "# in this file in units of seconds since the origin at the instant\n"
+ "# 1 January 1900, 00:00:00. This expiration date will be changed\n"
+ "# at least twice per year whether or not a new leap second is\n"
+ "# announced. These semi-annual changes will be made no later\n"
+ "# than 1 June and 1 December of each year to indicate what\n"
+ "# action (if any) is to be taken on 30 June and 31 December,\n"
+ "# respectively. (These are the customary effective dates for new\n"
+ "# leap seconds.) This expiration date will be identified by a\n"
+ "# unique pair of characters in columns 1 and 2 as shown below.\n"
+ "# In the unlikely event that a leap second is announced with an\n"
+ "# effective date other than 30 June or 31 December, then this\n"
+ "# file will be edited to include that leap second as soon as it is\n"
+ "# announced or at least one month before the effective date\n"
+ "# (whichever is later).\n"
+ "# If an announcement by the IERS specifies that no leap second is\n"
+ "# scheduled, then only the expiration date of the file will\n"
+ "# be advanced to show that the information in the file is still\n"
+ "# current -- the update time stamp, the data and the name of the file\n"
+ "# will not change.\n"
+ "#\n"
+ "# Updated through IERS Bulletin C62\n"
+ "# File expires on: 28 June 2022\n"
+ "#\n"
+ "#@ 3865363200\n"
+ "#\n"
+ "2272060800 10 # 1 Jan 1972\n"
+ "2287785600 11 # 1 Jul 1972\n"
+ "2303683200 12 # 1 Jan 1973\n"
+ "2335219200 13 # 1 Jan 1974\n"
+ "2366755200 14 # 1 Jan 1975\n"
+ "2398291200 15 # 1 Jan 1976\n"
+ "2429913600 16 # 1 Jan 1977\n"
+ "2461449600 17 # 1 Jan 1978\n"
+ "2492985600 18 # 1 Jan 1979\n"
+ "2524521600 19 # 1 Jan 1980\n"
+ "2571782400 20 # 1 Jul 1981\n"
+ "2603318400 21 # 1 Jul 1982\n"
+ "2634854400 22 # 1 Jul 1983\n"
+ "2698012800 23 # 1 Jul 1985\n"
+ "2776982400 24 # 1 Jan 1988\n"
+ "2840140800 25 # 1 Jan 1990\n"
+ "2871676800 26 # 1 Jan 1991\n"
+ "2918937600 27 # 1 Jul 1992\n"
+ "2950473600 28 # 1 Jul 1993\n"
+ "2982009600 29 # 1 Jul 1994\n"
+ "3029443200 30 # 1 Jan 1996\n"
+ "3076704000 31 # 1 Jul 1997\n"
+ "3124137600 32 # 1 Jan 1999\n"
+ "3345062400 33 # 1 Jan 2006\n"
+ "3439756800 34 # 1 Jan 2009\n"
+ "3550089600 35 # 1 Jul 2012\n"
+ "3644697600 36 # 1 Jul 2015\n"
+ "3692217600 37 # 1 Jan 2017\n"
+ "#\n"
+ "# the following special comment contains the\n"
+ "# hash value of the data in this file computed\n"
+ "# use the secure hash algorithm as specified\n"
+ "# by FIPS 180-1. See the files in ~/pub/sha for\n"
+ "# the details of how this hash value is\n"
+ "# computed. Note that the hash computation\n"
+ "# ignores comments and whitespace characters\n"
+ "# in data lines. It includes the NTP values\n"
+ "# of both the last modification time and the\n"
+ "# expiration time of the file, but not the\n"
+ "# white space on those lines.\n"
+ "# the hash line is also ignored in the\n"
+ "# computation.\n"
+ "#\n"
+ "#h 599d45bf accd4b4f 8b60e46 49b623 7d13b825\n";
+
+static const char etc_services[] =
+ "ntp 123/tcp # Network Time Protocol [Dave_Mills] [RFC5905]\n"
+ "ntp 123/udp # Network Time Protocol [Dave_Mills] [RFC5905]\n";
+
+static void setup_etc(void)
+{
+ int rv;
+
+ rv = IMFS_make_linearfile("/etc/resolv.conf", S_IWUSR | S_IRUSR |
+ S_IRGRP | S_IROTH, etc_resolv_conf, sizeof(etc_resolv_conf));
+ assert(rv == 0);
+
+ rv = IMFS_make_linearfile("/etc/ntp.conf", S_IWUSR | S_IRUSR |
+ S_IRGRP | S_IROTH, etc_ntp_conf, sizeof(etc_ntp_conf));
+ assert(rv == 0);
+
+ rv = IMFS_make_linearfile("/etc/leap-seconds", S_IWUSR | S_IRUSR |
+ S_IRGRP | S_IROTH, etc_leap_seconds, sizeof(etc_leap_seconds));
+ assert(rv == 0);
+
+ rv = IMFS_make_linearfile("/etc/services", S_IWUSR | S_IRUSR |
+ S_IRGRP | S_IROTH, etc_services, sizeof(etc_services));
+ assert(rv == 0);
+
+}
+
+static void run_test(void)
+{
+ rtems_status_code sc;
+ char *argv[] = {
+ "ntpd",
+ "-g",
+ NULL
+ };
+
+ setup_etc();
+
+ sc = rtems_shell_init("SHLL", 16 * 1024, 1, CONSOLE_DEVICE_NAME,
+ false, false, NULL);
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ (void)rtems_ntpd_run(2, argv);
+}
+
+static rtems_task Init( rtems_task_argument argument )
+{
+ int ret;
+
+ TEST_BEGIN();
+
+ ip_addr_t ipaddr, netmask, gw;
+
+ IP_ADDR4( &ipaddr, 10, 0, 2, 14 );
+ IP_ADDR4( &netmask, 255, 255, 255, 0 );
+ IP_ADDR4( &gw, 10, 0, 2, 3 );
+ unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x22, 0x01 };
+
+ rtems_bsd_compat_initialize();
+
+ ret = start_networking(
+ &net_interface,
+ &ipaddr,
+ &netmask,
+ &gw,
+ mac_ethernet_address
+ );
+
+ if ( ret != 0 ) {
+ return;
+ }
+
+ rtems_shell_init_environment();
+
+ dhcp_start( &net_interface );
+
+ run_test();
+
+ TEST_END();
+ rtems_test_exit( 0 );
+}
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000
+
+#define CONFIGURE_SHELL_COMMANDS_INIT
+#define CONFIGURE_SHELL_COMMANDS_ALL
+
+#include <bsp/irq-info.h>
+
+#define CONFIGURE_SHELL_USER_COMMANDS \
+ &bsp_interrupt_shell_command, \
+ &rtems_shell_DATE_Command, \
+ &rtems_shell_SHUTDOWN_Command
+
+#define CONFIGURE_SHELL_COMMAND_CPUINFO
+#define CONFIGURE_SHELL_COMMAND_CPUUSE
+#define CONFIGURE_SHELL_COMMAND_PERIODUSE
+#define CONFIGURE_SHELL_COMMAND_STACKUSE
+#define CONFIGURE_SHELL_COMMAND_PROFREPORT
+#define CONFIGURE_SHELL_COMMAND_RTC
+
+#include <rtems/shellconfig.h>
+
+#define CONFIGURE_INIT
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
+
+#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 32
+
+#define CONFIGURE_MAXIMUM_TASKS 12
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 20
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 10
+
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_UNLIMITED_OBJECTS
+#define CONFIGURE_UNIFIED_WORK_AREAS
+
+#include <rtems/confdefs.h>
--
2.30.2
More information about the devel
mailing list