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

Reply via email to