Dear BusyBox maintainers, I am writing to propose a patch for udhcpc6 that adds support for retrieving SNTP (Simple Network Time Protocol) servers. Currently, udhcpc6 does not support this function, which limits its usefulness in certain environments. My patch extends the existing -O option in udhcpc6 to include a new option, -O sntpsrv. When the -O sntpsrv option is used, udhcpc6 will request SNTP servers from the DHCPv6 server, and will configure the system's time accordingly. I have tested this patch on my own system, and have verified that it works as expected. I believe that this patch will be useful to other users who need to retrieve SNTP servers using udhcpc6. Thank you for your time and consideration. Best regards, Zhou
>From 57e404b2a227e40fffe4d56045885939fa0e00d6 Mon Sep 17 00:00:00 2001 From: Zhou Siqi <zhousi...@huawei.com> Date: Tue, 6 Jun 2023 15:46:36 +0800 Subject: [PATCH] The sntp server helps synchronize clock signals between the client and the server. Most DHCP software in the industry supports this function.Currently, udhcpc6 does not support the function of obtaining the SNTP server.This modification enables udhcpc6 to support this function. Signed-off-by: Zhou Siqi <zhousi...@huawei.com> --- examples/var_service/dhcp_if/convert2sntpconf | 30 +++++++++++++ networking/udhcp/Config.src | 8 ++++ networking/udhcp/d6_common.h | 3 ++ networking/udhcp/d6_dhcpc.c | 61 +++++++++++++++++---------- 4 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 examples/var_service/dhcp_if/convert2sntpconf diff --git a/examples/var_service/dhcp_if/convert2sntpconf b/examples/var_service/dhcp_if/convert2sntpconf new file mode 100644 index 0000000..c23e914 --- /dev/null +++ b/examples/var_service/dhcp_if/convert2sntpconf @@ -0,0 +1,30 @@ +#!/bin/sh +# This example shows how to obtain the SNTP server information from the configuration information obtained by the client. +# convert: +# (Client configuration information) +# dhcptype=5 +# lease=97200 +# interface=eth0 +# ip=2000:192:168::64:84/64 +# mask=64 +# dns=fec0:70:4000::22:33:40 fec0:70:4000::22:33:41 +fec0:70:4000::22:33:42 # domain=lab.example.com example.com # +sntpsrv=fec0:0:0:23::43 fec0:0:0:23::44 + +# into: + +#let cfg=cfg+1 +#sntpip[$cfg]=... + +exec >/dev/null +exec 2>&1 + +test "$interface" || exit 1 +test "$ip" || exit 1 + +{ +for n in $sntpsrv; do + echo "let cfg=cfg+1" + echo "sntpip[\$cfg]='$n'" +done +} >"$1" diff --git a/networking/udhcp/Config.src b/networking/udhcp/Config.src index 8c8c11c..574c33c 100644 --- a/networking/udhcp/Config.src +++ b/networking/udhcp/Config.src @@ -171,3 +171,11 @@ config FEATURE_UDHCP_8021Q help If selected, both client and server will support passing of VLAN ID and priority via options 132 and 133 as per 802.1Q. + +config FEATURE_UDHCPC6_RFC4075 + bool "Support udhcpc6 obtain the SNTP servers." + default y + depends on UDHCPC6 + help + If selected, the IPv6 client udhcpc6 can obtain the SNTP servers. + diff --git a/networking/udhcp/d6_common.h b/networking/udhcp/d6_common.h index 9dfde77..49e1b5b 100644 --- a/networking/udhcp/d6_common.h +++ b/networking/udhcp/d6_common.h @@ -87,6 +87,9 @@ struct d6_option { #define D6_OPT_IA_PD 25 #define D6_OPT_IAPREFIX 26 +/* Adapted from dhcp */ +#define D6_OPT_SNTP_SERVERS 31 + /* RFC 4704 "The DHCPv6 Client FQDN Option" * uint16 option-code OPTION_CLIENT_FQDN (39) * uint16 option-len 1 + length of domain name diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index 8d11a75..8707da1 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c @@ -81,6 +81,9 @@ static const struct dhcp_optflag d6_optflags[] = { { OPTION_STRING, D6_OPT_BOOT_URL }, { OPTION_STRING, D6_OPT_BOOT_PARAM }, #endif +#if ENABLE_FEATURE_UDHCPC6_RFC4075 + { OPTION_6RD | OPTION_LIST | OPTION_REQ, D6_OPT_SNTP_SERVERS }, +#endif { OPTION_STRING, 0xd1 }, /* DHCP_PXE_CONF_FILE */ { OPTION_STRING, 0xd2 }, /* DHCP_PXE_PATH_PREFIX */ { 0, 0 } @@ -102,6 +105,9 @@ static const char d6_option_strings[] ALIGN1 = "bootfile_url" "\0" /* D6_OPT_BOOT_URL */ "bootfile_param" "\0" /* D6_OPT_BOOT_PARAM */ #endif +#if ENABLE_FEATURE_UDHCPC6_RFC4075 + "sntpsrv" "\0" /* D6_OPT_SNTP_SERVERS */ +#endif "pxeconffile" "\0" /* DHCP_PXE_CONF_FILE */ "pxepathprefix" "\0" /* DHCP_PXE_PATH_PREFIX */ "\0"; @@ -243,10 +249,34 @@ static char *string_option_to_env(const uint8_t *option, return xasprintf("%s=%.*s", name, val_len, (char*)option + 4); } +static void handle_server_info(char *dev_key, const uint8_t *option, +int addrs, int option_offset) { + char *dlist; + + /* Make sure payload-size is a multiple of 16 */ + if ((option[3] & 0x0f) != 0) + return; + + /* Get the number of addresses on the option */ + addrs = option[3] >> 4; + + /* Setup environment variable */ + *new_env() = dlist = xmalloc(strlen(dev_key) + addrs * 40 - 1); + dlist = stpcpy(dlist, dev_key); + option_offset = 0; + + while (addrs--) { + dlist += sprint_nip6(dlist, option + 4 + option_offset); + option_offset += 16; + if (addrs) + *dlist++ = ' '; + } +} + /* put all the parameters into the environment */ static void option_to_env(const uint8_t *option, const uint8_t *option_end) { -#if ENABLE_FEATURE_UDHCPC6_RFC3646 +#if ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4075 int addrs, option_offset; #endif /* "length minus 4" */ @@ -339,28 +369,7 @@ static void option_to_env(const uint8_t *option, const uint8_t *option_end) break; #if ENABLE_FEATURE_UDHCPC6_RFC3646 case D6_OPT_DNS_SERVERS: { - char *dlist; - - /* Make sure payload-size is a multiple of 16 */ - if ((option[3] & 0x0f) != 0) - break; - - /* Get the number of addresses on the option */ - addrs = option[3] >> 4; - - /* Setup environment variable */ - *new_env() = dlist = xmalloc(4 + addrs * 40 - 1); - dlist = stpcpy(dlist, "dns="); - option_offset = 0; - - while (addrs--) { - sprint_nip6(dlist, option + 4 + option_offset); - dlist += 39; - option_offset += 16; - if (addrs) - *dlist++ = ' '; - } - + handle_server_info("dns=",option,addrs,option_offset); break; } case D6_OPT_DOMAIN_LIST: { @@ -406,6 +415,12 @@ static void option_to_env(const uint8_t *option, const uint8_t *option_end) *new_env() = xasprintf("tz_name=%.*s", (int)option[3], (char*)option + 4); break; #endif +#if ENABLE_FEATURE_UDHCPC6_RFC4075 + case D6_OPT_SNTP_SERVERS: { + handle_server_info("sntpsrv=",option,addrs,option_offset); + break; + } +#endif case D6_OPT_BOOT_URL: case D6_OPT_BOOT_PARAM: case 0xd1: /* DHCP_PXE_CONF_FILE */ -- 2.12.3 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox