diff --git a/repos/dde_linux/lib/mk/wireguard.inc b/repos/dde_linux/lib/mk/wireguard.inc
index 75d6fa1d50..5c19c1b8cf 100644
--- a/repos/dde_linux/lib/mk/wireguard.inc
+++ b/repos/dde_linux/lib/mk/wireguard.inc
@@ -4,9 +4,12 @@ LIBS += base net jitterentropy wireguard_lx_inc_dirs
DDE_LINUX_DIR := $(subst /src/include/lx_kit,,$(call select_from_repositories,src/include/lx_kit))
+MUSL_TM_DIR = $(call select_from_repositories,src/lib/musl_tm)
+
INC_DIR += $(REP_DIR)/src/app/wireguard
INC_DIR += $(DDE_LINUX_DIR)/src/include/virt_linux
INC_DIR += $(DDE_LINUX_DIR)/src/include
+INC_DIR += $(MUSL_TM_DIR)
ifeq ($(filter-out $(SPECS),x86_64),)
SPEC_ARCH := x86_64
@@ -17,6 +20,7 @@ endif
INC_DIR += $(DDE_LINUX_DIR)/src/include/spec/$(SPEC_ARCH)
+SRC_C += tm_to_secs.c
SRC_CC += arp_cache.cc
SRC_CC += arp_waiter.cc
@@ -30,5 +34,6 @@ SRC_CC += main.cc
SRC_CC += nic_connection.cc
SRC_CC += uplink_connection.cc
+vpath tm_to_secs.c $(MUSL_TM_DIR)
vpath %.cc $(REP_DIR)/src/app/wireguard
vpath %.cc $(DDE_LINUX_DIR)/src/lib
diff --git a/repos/dde_linux/recipes/src/wireguard/content.mk b/repos/dde_linux/recipes/src/wireguard/content.mk
index e4d9f71ccf..a04a0e1860 100644
--- a/repos/dde_linux/recipes/src/wireguard/content.mk
+++ b/repos/dde_linux/recipes/src/wireguard/content.mk
@@ -12,6 +12,11 @@ content: $(MIRRORED_FROM_REP_DIR)
$(MIRRORED_FROM_REP_DIR):
$(mirror_from_rep_dir)
+content: src/lib/musl_tm
+src/lib/musl_tm:
+ mkdir -p src/lib
+ cp -r $(GENODE_DIR)/repos/libports/$@ $@
+
content: LICENSE
LICENSE:
( echo "GNU General Public License version 2, see:"; \
diff --git a/repos/dde_linux/recipes/src/wireguard/used_apis b/repos/dde_linux/recipes/src/wireguard/used_apis
index 160e8a41ad..ac26b84bef 100644
--- a/repos/dde_linux/recipes/src/wireguard/used_apis
+++ b/repos/dde_linux/recipes/src/wireguard/used_apis
@@ -1,8 +1,9 @@
base
-os
-nic_session
-uplink_session
-timer_session
jitterentropy
net
+nic_session
+os
+rtc_session
+timer_session
+uplink_session
virt_linux
diff --git a/repos/dde_linux/src/app/wireguard/main.cc b/repos/dde_linux/src/app/wireguard/main.cc
index 924544cb7a..cf8279e3b4 100644
--- a/repos/dde_linux/src/app/wireguard/main.cc
+++ b/repos/dde_linux/src/app/wireguard/main.cc
@@ -19,13 +19,18 @@
#include
#include
#include
+#include
#include
+/* musl-tm includes */
+#include
+
/* lx-kit includes */
#include
/* lx-emul includes */
#include
+#include
/* lx-user includes */
#include
@@ -62,10 +67,13 @@ class Wireguard::Main : private Entrypoint::Io_progress_handler,
Lx_kit::env().scheduler.execute();
}
- void _handle_config() { _config_rom.update(); }
+ void _set_initial_time_only_once();
+ void _handle_config();
void _handle_nic_ip_config();
+ int64_t _rtc_timestamp_to_seconds(Rtc::Timestamp const &ts);
+
/*****************************
** Nic_connection_notifier **
@@ -140,6 +148,49 @@ class Wireguard::Main : private Entrypoint::Io_progress_handler,
};
+int64_t Wireguard::Main::_rtc_timestamp_to_seconds(Rtc::Timestamp const &ts)
+{
+ tm tm { .tm_sec = static_cast(ts.second),
+ .tm_min = static_cast(ts.minute),
+ .tm_hour = static_cast(ts.hour),
+ .tm_mday = static_cast(ts.day),
+ .tm_mon = static_cast(ts.month - 1),
+ .tm_year = static_cast(ts.year - 1900),
+ .tm_wday = 0,
+ .tm_yday = 0,
+ .tm_isdst = 0,
+ .__tm_gmtoff = 0,
+ .__tm_zone = 0 };
+
+ return tm_to_secs(&tm);
+}
+
+void Wireguard::Main::_set_initial_time_only_once()
+{
+ static bool time_already_set { false };
+
+ if (!time_already_set) {
+ Rtc::Connection rtc { _env };
+ Rtc::Timestamp const rtc_current_time { rtc.current_time() };
+
+ lx_emul_time_initial(_rtc_timestamp_to_seconds(rtc_current_time));
+ time_already_set = true;
+ }
+}
+
+void Wireguard::Main::_handle_config()
+{
+ _config_rom.update();
+
+ if (!_config_rom.valid()) return;
+
+ if (_config_rom.xml().attribute_value("use_rtc", false) == true) {
+ _set_initial_time_only_once();
+ }
+
+}
+
+
void Wireguard::Main::_handle_nic_ip_config()
{
if (_nic_connection.ip_config().valid()) {