--- /dev/null
+#
+# Copyright (C) 2006-2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=chrony
+PKG_VERSION:=2.1.1
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://download.tuxfamily.org/chrony/
+PKG_MD5SUM:=15e470a51ab6e09e65bc0a2fbc5299af
+
+PKG_MAINTAINER:=Miroslav Lichvar <mlichvar0@gmail.com>
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=COPYING
+
+PKG_BUILD_DEPENDS:=+pps-tools
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/chrony
+ SUBMENU:=Time Synchronization
+ SECTION:=net
+ CATEGORY:=Network
+ DEPENDS:=+libcap
+ USERID:=chrony=323:chrony=323
+ TITLE:=A versatile NTP client and server
+ URL:=http://chrony.tuxfamily.org/
+endef
+
+define Package/chrony/description
+ An NTP client and server designed to perform well in a wide range
+ of conditions. It can synchronize the system clock with NTP servers,
+ reference clocks, and manual input using wristwatch and keyboard.
+endef
+
+define Package/chrony/conffiles
+/etc/chrony/chrony.conf
+/etc/chrony/chrony.keys
+/etc/config/chrony
+endef
+
+CONFIGURE_ARGS+= \
+ --host-machine=$(shell echo $(GNU_TARGET_NAME) | sed -e 's/-.*//') \
+ --host-release="" \
+ --host-system=Linux \
+ --sysconfdir=/etc/chrony \
+ --prefix=/usr \
+ --disable-readline \
+ --disable-rtc \
+ --disable-asyncdns \
+ --with-user=chrony
+
+CONFIGURE_VARS+=CPPFLAGS=-DNDEBUG
+
+define Package/chrony/install
+ $(INSTALL_DIR) $(1)/usr/bin/
+ $(INSTALL_DIR) $(1)/usr/sbin/
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/chronyd $(1)/usr/sbin
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/chronyc $(1)/usr/bin
+ $(INSTALL_DIR) $(1)/etc/init.d
+ $(INSTALL_DIR) $(1)/etc/config
+ $(INSTALL_DIR) $(1)/etc/chrony
+ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+ $(INSTALL_BIN) ./files/chrony.hotplug $(1)/etc/hotplug.d/iface/20-chrony
+ $(INSTALL_BIN) ./files/chronyd.init $(1)/etc/init.d/chronyd
+ $(INSTALL_CONF) ./files/chrony.config $(1)/etc/config/chrony
+ $(INSTALL_CONF) ./files/chrony.conf $(1)/etc/chrony/chrony.conf
+ $(INSTALL_CONF) ./files/chrony.keys $(1)/etc/chrony/chrony.keys
+endef
+
+$(eval $(call BuildPackage,chrony))
--- /dev/null
+# This file is included from config file generated from /etc/config/chrony
+
+# Log clock errors above 0.5 seconds
+logchange 0.5
+
+# Don't log client accesses
+noclientlog
+
+# Password config for chronyc
+keyfile /etc/chrony/chrony.keys
+commandkey 1
+generatecommandkey
--- /dev/null
+config pool
+ option hostname '2.openwrt.pool.ntp.org'
+ option maxpoll '12'
+ option iburst 'yes'
+
+config allow
+ option interface 'lan'
+
+config makestep
+ option threshold '1.0'
+ option limit '3'
--- /dev/null
+COMMAND=/usr/bin/chronyc
+
+[ -x $COMMAND ] || exit 0
+
+[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && $COMMAND -a online
+[ "$ACTION" = "ifdown" -a "$INTERFACE" = "wan" ] && $COMMAND -a offline
--- /dev/null
+# Keys for NTP authentication and chronyc commands
--- /dev/null
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=60
+USE_PROCD=1
+PROG=/usr/sbin/chronyd
+CONFIGFILE=/var/etc/chrony.conf
+
+handle_source() {
+ local cfg=$1 sourcetype=$2 hostname minpoll maxpoll iburst
+
+ config_get hostname "$cfg" hostname
+ [ -z "$hostname" ] && return
+ config_get minpoll "$cfg" minpoll
+ config_get maxpoll "$cfg" maxpoll
+ config_get_bool iburst "$cfg" iburst 0
+ echo $(
+ echo $sourcetype $hostname
+ [ -n "$minpoll" ] && echo minpoll $minpoll
+ [ -n "$maxpoll" ] && echo maxpoll $maxpoll
+ [ "$iburst" = "1" ] && echo iburst
+ ) >> $CONFIGFILE
+}
+
+handle_allow() {
+ local cfg=$1 iface wan_iface wan6_iface subnet subnets subnets6
+
+ network_find_wan wan_iface true
+ network_find_wan6 wan6_iface true
+ config_get iface "$cfg" interface
+
+ if [ "$wan_iface" = "$iface" ]; then
+ echo allow >> $CONFIGFILE
+ else
+ network_get_subnets subnets $iface || \
+ network_get_subnets subnets6 $iface || continue
+ for subnet in $subnets $subnets6; do
+ echo allow $subnet >> $CONFIGFILE
+ done
+ fi
+}
+
+handle_makestep() {
+ local cfg=$1 threshold limit
+
+ config_get threshold "$cfg" threshold
+ config_get limit "$cfg" limit
+ [ -z "$threshold" -o -z "$limit" ] && return
+ echo makestep $threshold $limit >> $CONFIGFILE
+}
+
+start_service() {
+ . /lib/functions/network.sh
+
+ procd_open_instance
+ procd_set_param command $PROG -n -f $CONFIGFILE
+ procd_set_param file $CONFIGFILE
+ procd_set_param file /etc/chrony/chrony.conf
+ procd_close_instance
+
+ echo include /etc/chrony/chrony.conf > $CONFIGFILE
+
+ config_load ntpd
+ config_foreach handle_source server server
+ config_foreach handle_source pool pool
+ config_foreach handle_source peer peer
+ config_foreach handle_allow allow
+ config_foreach handle_makestep makestep
+}
--- /dev/null
+# Generic NTP configuration
+# Time servers and network(s) that may access the time service
+
+config ntpd
+ option TimeServers "0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org"
+ option ClientAccessFrom "lan"
--- /dev/null
+COMMAND=/usr/bin/chronyc
+
+[ -x $COMMAND ] || exit 0
+
+[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && $COMMAND -a online
+[ "$ACTION" = "ifdown" -a "$INTERFACE" = "wan" ] && $COMMAND -a offline
--- /dev/null
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2006 OpenWrt.org
+
+START=60
+
+start() {
+ [ ! -f /var/run/chronyd.pid ] && (
+ /usr/sbin/chronyd -f /etc/chrony/chrony.conf
+
+ local NTP_SERVERS
+ local NTP_SERVER
+ local CLIENT_NETWORKS
+ local NETNAME
+ config_load ntpd
+ config_get NTP_SERVERS $CONFIG_SECTION TimeServers
+ config_get CLIENT_NETWORKS $CONFIG_SECTION ClientAccessFrom
+
+ . /lib/functions/network.sh
+
+ # Define servers with the iburst option to speed up the initial
+ # synchronization and allow clients to access the server
+ (
+ for NTP_SERVER in $NTP_SERVERS; do
+ echo add server $NTP_SERVER iburst
+ done
+
+ for NETNAME in $CLIENT_NETWORKS; do
+ local subnet
+ if network_get_subnet subnet "$NETNAME"; then
+ echo allow $subnet
+ fi
+ done
+ ) | chronyc -a > /dev/null 2>&1
+ )
+}
+
+stop() {
+ [ -r /var/run/chronyd.pid ] && PID=$(cat /var/run/chronyd.pid)
+ [ -n "$PID" ] && kill $PID
+}
+
+restart() {
+ stop
+ while [ -r /var/run/chronyd.pid ] ; do sleep 1; done
+ start
+}
--- /dev/null
+--- a/configure
++++ b/configure
+@@ -254,6 +254,13 @@ do
+ --host-machine=* )
+ MACHINE=`echo $option | sed -e 's/^.*=//;'`
+ ;;
++ --target=* )
++ TARGET=`echo $option | sed -e 's/[^=]*=//;'`
++ OPERATINGSYSTEM=`echo $TARGET | sed -e 's/.*-//;'`
++ MACHINE=`echo $TARGET | sed -e 's/-.*//;'`
++ VERSION=""
++ SYSTEM=${OPERATINGSYSTEM}-${MACHINE}
++ ;;
+ --help | -h )
+ usage
+ exit 0
+@@ -287,7 +294,7 @@ case $SYSTEM in
+ ;;
+ esac
+ ;;
+- Linux* )
++ Linux* | linux* )
+ EXTRA_OBJECTS="sys_linux.o wrap_adjtimex.o"
+ try_linuxcaps=1
+ try_rtc=1
--- /dev/null
+--- a/ntp_io.c
++++ b/ntp_io.c
+@@ -355,6 +355,7 @@ read_from_socket(void *anything)
+ }
+ #endif
+
++#ifdef HAVE_IPV6
+ #ifdef IPV6_PKTINFO
+ if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
+ struct in6_pktinfo ipi;
+@@ -365,6 +366,7 @@ read_from_socket(void *anything)
+ remote_addr.local_ip_addr.family = IPADDR_INET6;
+ }
+ #endif
++#endif
+
+ #ifdef SO_TIMESTAMP
+ if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_TIMESTAMP) {
+@@ -466,6 +468,7 @@ send_packet(void *packet, int packetlen,
+ }
+ #endif
+
++#ifdef HAVE_IPV6
+ #ifdef IPV6_PKTINFO
+ if (remote_addr->local_ip_addr.family == IPADDR_INET6) {
+ struct cmsghdr *cmsg;
+@@ -484,6 +487,7 @@ send_packet(void *packet, int packetlen,
+ sizeof(ipi->ipi6_addr.s6_addr));
+ }
+ #endif
++#endif
+
+ #if 0
+ LOG(LOGS_INFO, LOGF_NtpIO, "sending to %s:%d from %s",