[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [Patch] Enable udhcpc6 in the busybox to obtain the SNTP server.
From:       "zhousiqi (A)" <zhousiqi5 () huawei ! com>
Date:       2023-07-03 3:22:59
Message-ID: 3e1151e8c82a4efd8f97a2fe495c45eb () huawei ! com
[Download RAW message or body]

Gentle ping... Is this function easy to use and is the community willing to accept \
it? In addition, can the community provide a default6.script for udhcpc6?
------------------------------------------------------

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 <zhousiqi5@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 <zhousiqi5@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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic