diff --git a/subsys/net/lib/config/Kconfig b/subsys/net/lib/config/Kconfig index c74193fec9..c9ebc9ca3e 100644 --- a/subsys/net/lib/config/Kconfig +++ b/subsys/net/lib/config/Kconfig @@ -234,6 +234,14 @@ config NET_CONFIG_SNTP_INIT_SERVER e.g. server information at https://support.ntp.org/bin/view/Servers/NTPPoolServers +config NET_CONFIG_SNTP_INIT_SERVER_USE_DHCPV4_OPTION + bool "SNTP server to use for system clock init is set using DHCPv4 option" + default y + depends on NET_DHCPV4_OPTION_NTP_SERVER + help + If this option is set, then the SNTP server to use for system + clock init can be set using DHCPv4 option. + config NET_CONFIG_SNTP_INIT_TIMEOUT int "SNTP timeout to init system clock (ms)" default 3000 diff --git a/subsys/net/lib/config/init_clock_sntp.c b/subsys/net/lib/config/init_clock_sntp.c index a6509e1e12..49f1ad8586 100644 --- a/subsys/net/lib/config/init_clock_sntp.c +++ b/subsys/net/lib/config/init_clock_sntp.c @@ -11,12 +11,30 @@ LOG_MODULE_DECLARE(net_config, CONFIG_NET_CONFIG_LOG_LEVEL); #include #include +static int sntp_init_helper(struct sntp_time *tm) +{ +#ifdef CONFIG_NET_CONFIG_SNTP_INIT_SERVER_USE_DHCPV4_OPTION + struct net_if *iface = net_if_get_default(); + + if (!net_ipv4_is_addr_unspecified(&iface->config.dhcpv4.ntp_addr)) { + struct sockaddr_in sntp_addr = {0}; + + sntp_addr.sin_family = AF_INET; + sntp_addr.sin_addr.s_addr = iface->config.dhcpv4.ntp_addr.s_addr; + return sntp_simple_addr((struct sockaddr *)&sntp_addr, sizeof(sntp_addr), + CONFIG_NET_CONFIG_SNTP_INIT_TIMEOUT, tm); + } + LOG_INF("SNTP address not set by DHCPv4, using Kconfig defaults"); +#endif /* NET_CONFIG_SNTP_INIT_SERVER_USE_DHCPV4_OPTION */ + return sntp_simple(CONFIG_NET_CONFIG_SNTP_INIT_SERVER, + CONFIG_NET_CONFIG_SNTP_INIT_TIMEOUT, tm); +} + int net_init_clock_via_sntp(void) { struct sntp_time ts; struct timespec tspec; - int res = sntp_simple(CONFIG_NET_CONFIG_SNTP_INIT_SERVER, - CONFIG_NET_CONFIG_SNTP_INIT_TIMEOUT, &ts); + int res = sntp_init_helper(&ts); if (res < 0) { LOG_ERR("Cannot set time using SNTP");